From 9059ceba55f0e12c53503301c7d4457a24cd509a Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 19 Mar 2023 18:37:23 -0700 Subject: [PATCH] Fix real time loading of all remote admin view --- .../Views/Map/Custom/MapViewSwiftUI.swift | 1 + .../Settings/Config/BluetoothConfig.swift | 14 ++- .../Views/Settings/Config/DeviceConfig.swift | 102 +++++++++--------- .../Views/Settings/Config/DisplayConfig.swift | 23 ++-- .../Views/Settings/Config/LoRaConfig.swift | 34 +++--- .../Config/Module/CannedMessagesConfig.swift | 32 +++--- .../Module/ExternalNotificationConfig.swift | 36 ++++--- .../Settings/Config/Module/MQTTConfig.swift | 21 ++-- .../Config/Module/RangeTestConfig.swift | 14 ++- .../Settings/Config/Module/SerialConfig.swift | 23 ++-- .../Config/Module/TelemetryConfig.swift | 18 ++-- .../Views/Settings/Config/NetworkConfig.swift | 19 ++-- .../Settings/Config/PositionConfig.swift | 51 +++++---- 13 files changed, 232 insertions(+), 156 deletions(-) diff --git a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift index 7ce5e4d6..32bed165 100644 --- a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift +++ b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift @@ -348,6 +348,7 @@ struct MapViewSwiftUI: UIViewRepresentable { return MKTileOverlayRenderer(tileOverlay: tileOverlay) } else { if let routePolyline = overlay as? MKPolyline { + let renderer = MKPolylineRenderer(polyline: routePolyline) renderer.strokeColor = UIColor.systemIndigo renderer.lineWidth = 5 diff --git a/Meshtastic/Views/Settings/Config/BluetoothConfig.swift b/Meshtastic/Views/Settings/Config/BluetoothConfig.swift index 3ec63ef3..3dc03f42 100644 --- a/Meshtastic/Views/Settings/Config/BluetoothConfig.swift +++ b/Meshtastic/Views/Settings/Config/BluetoothConfig.swift @@ -40,6 +40,9 @@ struct BluetoothConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setBluetoothValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -135,10 +138,7 @@ struct BluetoothConfig: View { }) .onAppear { self.bleManager.context = context - self.enabled = node?.bluetoothConfig?.enabled ?? true - self.mode = Int(node?.bluetoothConfig?.mode ?? 0) - self.fixedPin = String(node?.bluetoothConfig?.fixedPin ?? 123456) - self.hasChanges = false + setBluetoothValues() // Need to request a BluetoothConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.bluetoothConfig == nil { print("empty bluetooth config") @@ -164,4 +164,10 @@ struct BluetoothConfig: View { } } } + func setBluetoothValues() { + self.enabled = node?.bluetoothConfig?.enabled ?? true + self.mode = Int(node?.bluetoothConfig?.mode ?? 0) + self.fixedPin = String(node?.bluetoothConfig?.fixedPin ?? 123456) + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index 1210cc99..468e770d 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -7,35 +7,35 @@ import SwiftUI struct DeviceConfig: View { - + @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager @Environment(\.dismiss) private var goBack - + var node: NodeInfoEntity? - + @State private var isPresentingNodeDBResetConfirm = false @State private var isPresentingFactoryResetConfirm = false @State private var isPresentingSaveConfirm = false @State var hasChanges = false - + @State var deviceRole = 0 @State var buzzerGPIO = 0 @State var buttonGPIO = 0 @State var serialEnabled = true @State var debugLogEnabled = false @State var rebroadcastMode = 0 - + var body: some View { - + VStack { - + Form { if node != nil && node?.metadata == nil && node?.num ?? 0 != bleManager.connectedPeripheral?.num ?? 0 { Text("There has been no response to a request for device metadata over the admin channel for this node.") .font(.callout) .foregroundColor(.orange) - + } else if node != nil && node?.num ?? 0 != bleManager.connectedPeripheral?.num ?? 0 { // Let users know what is going on if they are using remote admin and don't have the config yet if node?.deviceConfig == nil { @@ -45,6 +45,9 @@ struct DeviceConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setDeviceValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -55,7 +58,7 @@ struct DeviceConfig: View { .foregroundColor(.orange) } Section(header: Text("options")) { - + Picker("Device Role", selection: $deviceRole ) { ForEach(DeviceRoles.allCases) { dr in Text(dr.name) @@ -66,7 +69,7 @@ struct DeviceConfig: View { Text(DeviceRoles(rawValue: deviceRole)?.description ?? "") .foregroundColor(.gray) .font(.caption) - + Picker("Rebroadcast Mode", selection: $rebroadcastMode ) { ForEach(RebroadcastModes.allCases) { rm in Text(rm.name) @@ -78,24 +81,24 @@ struct DeviceConfig: View { .foregroundColor(.gray) .font(.caption) } - + Section(header: Text("Debug")) { - + Toggle(isOn: $serialEnabled) { - + Label("Serial Console", systemImage: "terminal") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) - + Toggle(isOn: $debugLogEnabled) { - + Label("Debug Log", systemImage: "ant.fill") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } - + Section(header: Text("GPIO")) { - + Picker("Button GPIO", selection: $buttonGPIO) { ForEach(0..<40) { if $0 == 0 { @@ -117,14 +120,14 @@ struct DeviceConfig: View { } .pickerStyle(DefaultPickerStyle()) } - + } .disabled(self.bleManager.connectedPeripheral == nil || node?.deviceConfig == nil) - + // Only show these buttons for the BLE connected node if bleManager.connectedPeripheral != nil && node?.num ?? -1 == bleManager.connectedPeripheral.num { HStack { - + Button("Reset NodeDB", role: .destructive) { isPresentingNodeDBResetConfirm = true } @@ -139,7 +142,7 @@ struct DeviceConfig: View { titleVisibility: .visible ) { Button("Erase all device and app data?", role: .destructive) { - + if bleManager.sendNodeDBReset(fromUser: node!.user!, toUser: node!.user!) { bleManager.disconnectPeripheral() clearCoreDataDatabase(context: context) @@ -162,23 +165,23 @@ struct DeviceConfig: View { titleVisibility: .visible ) { Button("Factory reset your device and app? ", role: .destructive) { - + if bleManager.sendFactoryReset(fromUser: node!.user!, toUser: node!.user!) { bleManager.disconnectPeripheral() clearCoreDataDatabase(context: context) } else { print("Factory Reset Failed") - + } } } } } HStack { - + Button { isPresentingSaveConfirm = true - + } label: { Label("save", systemImage: "square.and.arrow.down") } @@ -188,7 +191,7 @@ struct DeviceConfig: View { .controlSize(.large) .padding() .confirmationDialog( - + "are.you.sure", isPresented: $isPresentingSaveConfirm, titleVisibility: .visible @@ -204,7 +207,7 @@ struct DeviceConfig: View { dc.debugLogEnabled = debugLogEnabled dc.buttonGpio = UInt32(buttonGPIO) dc.buzzerGpio = UInt32(buzzerGPIO) - + let adminMessageId = bleManager.saveDeviceConfig(config: dc, fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode?.myInfo?.adminIndex ?? 0) if adminMessageId > 0 { // Should show a saved successfully alert once I know that to be true @@ -215,26 +218,21 @@ struct DeviceConfig: View { } } } - message: { - Text("config.save.confirm") - } + message: { + Text("config.save.confirm") + } } Spacer() } .navigationTitle("device.config") .navigationBarItems(trailing: - ZStack { + ZStack { ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "????") }) .onAppear { self.bleManager.context = context - self.deviceRole = Int(node?.deviceConfig?.role ?? 0) - self.serialEnabled = (node?.deviceConfig?.serialEnabled ?? true) - self.debugLogEnabled = node?.deviceConfig?.debugLogEnabled ?? false - self.buttonGPIO = Int(node?.deviceConfig?.buttonGpio ?? 0) - self.buzzerGPIO = Int(node?.deviceConfig?.buzzerGpio ?? 0) - self.hasChanges = false - + setDeviceValues() + // Need to request a LoRaConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.deviceConfig == nil { print("empty device config") @@ -245,39 +243,47 @@ struct DeviceConfig: View { } } .onChange(of: deviceRole) { newRole in - + if node != nil && node!.deviceConfig != nil { - + if newRole != node!.deviceConfig!.role { hasChanges = true } } } .onChange(of: serialEnabled) { newSerial in - + if node != nil && node!.deviceConfig != nil { - + if newSerial != node!.deviceConfig!.serialEnabled { hasChanges = true } } } .onChange(of: debugLogEnabled) { newDebugLog in - + if node != nil && node!.deviceConfig != nil { - + if newDebugLog != node!.deviceConfig!.debugLogEnabled { hasChanges = true } } } .onChange(of: buttonGPIO) { newButtonGPIO in - + if node != nil && node!.deviceConfig != nil { - + if newButtonGPIO != node!.deviceConfig!.buttonGpio { hasChanges = true } } } .onChange(of: buzzerGPIO) { newBuzzerGPIO in - + if node != nil && node!.deviceConfig != nil { - + if newBuzzerGPIO != node!.deviceConfig!.buttonGpio { hasChanges = true } } } } + func setDeviceValues() { + self.deviceRole = Int(node?.deviceConfig?.role ?? 0) + self.serialEnabled = (node?.deviceConfig?.serialEnabled ?? true) + self.debugLogEnabled = node?.deviceConfig?.debugLogEnabled ?? false + self.buttonGPIO = Int(node?.deviceConfig?.buttonGpio ?? 0) + self.buzzerGPIO = Int(node?.deviceConfig?.buzzerGpio ?? 0) + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/DisplayConfig.swift b/Meshtastic/Views/Settings/Config/DisplayConfig.swift index e45fe011..8a595a11 100644 --- a/Meshtastic/Views/Settings/Config/DisplayConfig.swift +++ b/Meshtastic/Views/Settings/Config/DisplayConfig.swift @@ -43,6 +43,9 @@ struct DisplayConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setDisplayValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -173,14 +176,7 @@ struct DisplayConfig: View { }) .onAppear { self.bleManager.context = context - self.gpsFormat = Int(node?.displayConfig?.gpsFormat ?? 0) - self.screenOnSeconds = Int(node?.displayConfig?.screenOnSeconds ?? 0) - self.screenCarouselInterval = Int(node?.displayConfig?.screenCarouselInterval ?? 0) - self.compassNorthTop = node?.displayConfig?.compassNorthTop ?? false - self.flipScreen = node?.displayConfig?.flipScreen ?? false - self.oledType = Int(node?.displayConfig?.oledType ?? 0) - self.displayMode = Int(node?.displayConfig?.displayMode ?? 0) - self.hasChanges = false + setDisplayValues() // Need to request a LoRaConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.displayConfig == nil { @@ -227,4 +223,15 @@ struct DisplayConfig: View { } } } + func setDisplayValues() { + + self.gpsFormat = Int(node?.displayConfig?.gpsFormat ?? 0) + self.screenOnSeconds = Int(node?.displayConfig?.screenOnSeconds ?? 0) + self.screenCarouselInterval = Int(node?.displayConfig?.screenCarouselInterval ?? 0) + self.compassNorthTop = node?.displayConfig?.compassNorthTop ?? false + self.flipScreen = node?.displayConfig?.flipScreen ?? false + self.oledType = Int(node?.displayConfig?.oledType ?? 0) + self.displayMode = Int(node?.displayConfig?.displayMode ?? 0) + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/LoRaConfig.swift b/Meshtastic/Views/Settings/Config/LoRaConfig.swift index 751fb1ee..3eb061da 100644 --- a/Meshtastic/Views/Settings/Config/LoRaConfig.swift +++ b/Meshtastic/Views/Settings/Config/LoRaConfig.swift @@ -30,7 +30,7 @@ struct LoRaConfig: View { @State var isPresentingSaveConfirm = false @State var hasChanges = false - @State var region = 0 + @State var region: Int = 0 @State var modemPreset = 0 @State var hopLimit = 0 @State var txPower = 0 @@ -57,9 +57,13 @@ struct LoRaConfig: View { Text("LoRa config data was requested over the admin channel but no response has been returned from the remote node. You can check the status of admin message requests in the admin message log.") .font(.callout) .foregroundColor(.orange) + } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setLoRaValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -228,19 +232,7 @@ struct LoRaConfig: View { .onAppear { self.bleManager.context = context - self.hopLimit = Int(node?.loRaConfig?.hopLimit ?? 3) - self.region = Int(node?.loRaConfig?.regionCode ?? 0) - self.usePreset = node?.loRaConfig?.usePreset ?? true - self.modemPreset = Int(node?.loRaConfig?.modemPreset ?? 0) - self.txEnabled = node?.loRaConfig?.txEnabled ?? true - self.txPower = Int(node?.loRaConfig?.txPower ?? 0) - self.channelNum = Int(node?.loRaConfig?.channelNum ?? 0) - self.bandwidth = Int(node?.loRaConfig?.bandwidth ?? 0) - self.codingRate = Int(node?.loRaConfig?.codingRate ?? 0) - self.spreadFactor = Int(node?.loRaConfig?.spreadFactor ?? 0) - self.rxBoostedGain = node?.loRaConfig?.sx126xRxBoostedGain ?? false - print(rxBoostedGain) - self.hasChanges = false + setLoRaValues() // Need to request a LoRaConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.loRaConfig == nil { @@ -297,4 +289,18 @@ struct LoRaConfig: View { } } } + func setLoRaValues() { + self.hopLimit = Int(node?.loRaConfig?.hopLimit ?? 3) + self.region = Int(node?.loRaConfig?.regionCode ?? 0) + self.usePreset = node?.loRaConfig?.usePreset ?? true + self.modemPreset = Int(node?.loRaConfig?.modemPreset ?? 0) + self.txEnabled = node?.loRaConfig?.txEnabled ?? true + self.txPower = Int(node?.loRaConfig?.txPower ?? 0) + self.channelNum = Int(node?.loRaConfig?.channelNum ?? 0) + self.bandwidth = Int(node?.loRaConfig?.bandwidth ?? 0) + self.codingRate = Int(node?.loRaConfig?.codingRate ?? 0) + self.spreadFactor = Int(node?.loRaConfig?.spreadFactor ?? 0) + self.rxBoostedGain = node?.loRaConfig?.sx126xRxBoostedGain ?? false + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift b/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift index 386683c8..38debac0 100644 --- a/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift @@ -53,6 +53,9 @@ struct CannedMessagesConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setCannedMessagesValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -263,19 +266,7 @@ struct CannedMessagesConfig: View { }) .onAppear { self.bleManager.context = context - self.enabled = node?.cannedMessageConfig?.enabled ?? false - self.sendBell = node?.cannedMessageConfig?.sendBell ?? false - self.rotary1Enabled = node?.cannedMessageConfig?.rotary1Enabled ?? false - self.updown1Enabled = node?.cannedMessageConfig?.updown1Enabled ?? false - self.inputbrokerPinA = Int(node?.cannedMessageConfig?.inputbrokerPinA ?? 0) - self.inputbrokerPinB = Int(node?.cannedMessageConfig?.inputbrokerPinB ?? 0) - self.inputbrokerPinPress = Int(node?.cannedMessageConfig?.inputbrokerPinPress ?? 0) - self.inputbrokerEventCw = Int(node?.cannedMessageConfig?.inputbrokerEventCw ?? 0) - self.inputbrokerEventCcw = Int(node?.cannedMessageConfig?.inputbrokerEventCcw ?? 0) - self.inputbrokerEventPress = Int(node?.cannedMessageConfig?.inputbrokerEventPress ?? 0) - self.messages = node?.cannedMessageConfig?.messages ?? "" - self.hasChanges = false - self.hasMessagesChanges = false + setCannedMessagesValues() // Need to request a CannedMessagesModuleConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.cannedMessageConfig == nil { @@ -367,4 +358,19 @@ struct CannedMessagesConfig: View { } } } + func setCannedMessagesValues() { + self.enabled = node?.cannedMessageConfig?.enabled ?? false + self.sendBell = node?.cannedMessageConfig?.sendBell ?? false + self.rotary1Enabled = node?.cannedMessageConfig?.rotary1Enabled ?? false + self.updown1Enabled = node?.cannedMessageConfig?.updown1Enabled ?? false + self.inputbrokerPinA = Int(node?.cannedMessageConfig?.inputbrokerPinA ?? 0) + self.inputbrokerPinB = Int(node?.cannedMessageConfig?.inputbrokerPinB ?? 0) + self.inputbrokerPinPress = Int(node?.cannedMessageConfig?.inputbrokerPinPress ?? 0) + self.inputbrokerEventCw = Int(node?.cannedMessageConfig?.inputbrokerEventCw ?? 0) + self.inputbrokerEventCcw = Int(node?.cannedMessageConfig?.inputbrokerEventCcw ?? 0) + self.inputbrokerEventPress = Int(node?.cannedMessageConfig?.inputbrokerEventPress ?? 0) + self.messages = node?.cannedMessageConfig?.messages ?? "" + self.hasChanges = false + self.hasMessagesChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift index 5c2c3527..2765b46d 100644 --- a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift @@ -48,6 +48,9 @@ struct ExternalNotificationConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setExternalNotificationValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -215,21 +218,7 @@ struct ExternalNotificationConfig: View { }) .onAppear { self.bleManager.context = context - self.enabled = node?.externalNotificationConfig?.enabled ?? false - self.alertBell = node?.externalNotificationConfig?.alertBell ?? false - self.alertBellBuzzer = node?.externalNotificationConfig?.alertBellBuzzer ?? false - self.alertBellVibra = node?.externalNotificationConfig?.alertBellVibra ?? false - self.alertMessage = node?.externalNotificationConfig?.alertMessage ?? false - self.alertMessageBuzzer = node?.externalNotificationConfig?.alertMessageBuzzer ?? false - self.alertMessageVibra = node?.externalNotificationConfig?.alertMessageVibra ?? false - self.active = node?.externalNotificationConfig?.active ?? false - self.output = Int(node?.externalNotificationConfig?.output ?? 0) - self.outputBuzzer = Int(node?.externalNotificationConfig?.outputBuzzer ?? 0) - self.outputVibra = Int(node?.externalNotificationConfig?.outputVibra ?? 0) - self.outputMilliseconds = Int(node?.externalNotificationConfig?.outputMilliseconds ?? 0) - self.nagTimeout = Int(node?.externalNotificationConfig?.nagTimeout ?? 0) - self.usePWM = node?.externalNotificationConfig?.usePWM ?? false - self.hasChanges = false + setExternalNotificationValues() // Need to request a TelemetryModuleConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.externalNotificationConfig == nil { @@ -311,4 +300,21 @@ struct ExternalNotificationConfig: View { } } } + func setExternalNotificationValues() { + self.enabled = node?.externalNotificationConfig?.enabled ?? false + self.alertBell = node?.externalNotificationConfig?.alertBell ?? false + self.alertBellBuzzer = node?.externalNotificationConfig?.alertBellBuzzer ?? false + self.alertBellVibra = node?.externalNotificationConfig?.alertBellVibra ?? false + self.alertMessage = node?.externalNotificationConfig?.alertMessage ?? false + self.alertMessageBuzzer = node?.externalNotificationConfig?.alertMessageBuzzer ?? false + self.alertMessageVibra = node?.externalNotificationConfig?.alertMessageVibra ?? false + self.active = node?.externalNotificationConfig?.active ?? false + self.output = Int(node?.externalNotificationConfig?.output ?? 0) + self.outputBuzzer = Int(node?.externalNotificationConfig?.outputBuzzer ?? 0) + self.outputVibra = Int(node?.externalNotificationConfig?.outputVibra ?? 0) + self.outputMilliseconds = Int(node?.externalNotificationConfig?.outputMilliseconds ?? 0) + self.nagTimeout = Int(node?.externalNotificationConfig?.nagTimeout ?? 0) + self.usePWM = node?.externalNotificationConfig?.usePWM ?? false + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 7389c152..33a57063 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -38,6 +38,9 @@ struct MQTTConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setMqttValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -198,13 +201,7 @@ struct MQTTConfig: View { }) .onAppear { self.bleManager.context = context - self.enabled = (node?.mqttConfig?.enabled ?? false) - self.address = node?.mqttConfig?.address ?? "" - self.username = node?.mqttConfig?.username ?? "" - self.password = node?.mqttConfig?.password ?? "" - self.encryptionEnabled = (node?.mqttConfig?.encryptionEnabled ?? false) - self.jsonEnabled = (node?.mqttConfig?.jsonEnabled ?? false) - self.hasChanges = false + setMqttValues() // Need to request a TelemetryModuleConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.mqttConfig == nil { @@ -231,4 +228,14 @@ struct MQTTConfig: View { } } } + + func setMqttValues() { + self.enabled = (node?.mqttConfig?.enabled ?? false) + self.address = node?.mqttConfig?.address ?? "" + self.username = node?.mqttConfig?.username ?? "" + self.password = node?.mqttConfig?.password ?? "" + self.encryptionEnabled = (node?.mqttConfig?.encryptionEnabled ?? false) + self.jsonEnabled = (node?.mqttConfig?.jsonEnabled ?? false) + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift index 9d6ed6de..44d03ee9 100644 --- a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift @@ -37,6 +37,9 @@ struct RangeTestConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setRangeTestValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -115,10 +118,7 @@ struct RangeTestConfig: View { }) .onAppear { self.bleManager.context = context - self.enabled = node?.rangeTestConfig?.enabled ?? false - self.save = node?.rangeTestConfig?.save ?? false - self.sender = Int(node?.rangeTestConfig?.sender ?? 0) - self.hasChanges = false + setRangeTestValues() // Need to request a RangeTestModule Config from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.rangeTestConfig == nil { @@ -146,4 +146,10 @@ struct RangeTestConfig: View { } } } + func setRangeTestValues() { + self.enabled = node?.rangeTestConfig?.enabled ?? false + self.save = node?.rangeTestConfig?.save ?? false + self.sender = Int(node?.rangeTestConfig?.sender ?? 0) + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift index c5d1e900..6f5cc238 100644 --- a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift @@ -44,6 +44,9 @@ struct SerialConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setSerialValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -177,15 +180,7 @@ struct SerialConfig: View { .onAppear { self.bleManager.context = context - self.enabled = node?.serialConfig?.enabled ?? false - self.echo = node?.serialConfig?.echo ?? false - self.rxd = Int(node?.serialConfig?.rxd ?? 0) - self.txd = Int(node?.serialConfig?.txd ?? 0) - self.baudRate = Int(node?.serialConfig?.baudRate ?? 0) - self.timeout = Int(node?.serialConfig?.timeout ?? 0) - self.mode = Int(node?.serialConfig?.mode ?? 0) - self.hasChanges = false - + setSerialValues() // Need to request a SerialModuleConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.serialConfig == nil { print("empty serial module config") @@ -247,4 +242,14 @@ struct SerialConfig: View { } } } + func setSerialValues() { + self.enabled = node?.serialConfig?.enabled ?? false + self.echo = node?.serialConfig?.echo ?? false + self.rxd = Int(node?.serialConfig?.rxd ?? 0) + self.txd = Int(node?.serialConfig?.txd ?? 0) + self.baudRate = Int(node?.serialConfig?.baudRate ?? 0) + self.timeout = Int(node?.serialConfig?.timeout ?? 0) + self.mode = Int(node?.serialConfig?.mode ?? 0) + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift index 3d5910b7..93c67b89 100644 --- a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift @@ -40,6 +40,9 @@ struct TelemetryConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setTelemetryValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -131,12 +134,7 @@ struct TelemetryConfig: View { }) .onAppear { self.bleManager.context = context - self.deviceUpdateInterval = Int(node?.telemetryConfig?.deviceUpdateInterval ?? 0) - self.environmentUpdateInterval = Int(node?.telemetryConfig?.environmentUpdateInterval ?? 0) - self.environmentMeasurementEnabled = node?.telemetryConfig?.environmentMeasurementEnabled ?? false - self.environmentScreenEnabled = node?.telemetryConfig?.environmentScreenEnabled ?? false - self.environmentDisplayFahrenheit = node?.telemetryConfig?.environmentDisplayFahrenheit ?? false - self.hasChanges = false + setTelemetryValues() // Need to request a TelemetryModuleConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.telemetryConfig == nil { @@ -174,4 +172,12 @@ struct TelemetryConfig: View { } } } + func setTelemetryValues() { + self.deviceUpdateInterval = Int(node?.telemetryConfig?.deviceUpdateInterval ?? 0) + self.environmentUpdateInterval = Int(node?.telemetryConfig?.environmentUpdateInterval ?? 0) + self.environmentMeasurementEnabled = node?.telemetryConfig?.environmentMeasurementEnabled ?? false + self.environmentScreenEnabled = node?.telemetryConfig?.environmentScreenEnabled ?? false + self.environmentDisplayFahrenheit = node?.telemetryConfig?.environmentDisplayFahrenheit ?? false + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index 95521a6d..21c48653 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -43,6 +43,9 @@ struct NetworkConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setNetworkValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -161,12 +164,7 @@ struct NetworkConfig: View { }) .onAppear { self.bleManager.context = context - self.wifiEnabled = node?.networkConfig?.wifiEnabled ?? false - self.wifiSsid = node?.networkConfig?.wifiSsid ?? "" - self.wifiPsk = node?.networkConfig?.wifiPsk ?? "" - self.wifiMode = Int(node?.networkConfig?.wifiMode ?? 0) - self.ethEnabled = node?.networkConfig?.ethEnabled ?? false - self.hasChanges = false + setNetworkValues() // Need to request a NetworkConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.networkConfig == nil { @@ -203,4 +201,13 @@ struct NetworkConfig: View { } } } + + func setNetworkValues() { + self.wifiEnabled = node?.networkConfig?.wifiEnabled ?? false + self.wifiSsid = node?.networkConfig?.wifiSsid ?? "" + self.wifiPsk = node?.networkConfig?.wifiPsk ?? "" + self.wifiMode = Int(node?.networkConfig?.wifiMode ?? 0) + self.ethEnabled = node?.networkConfig?.ethEnabled ?? false + self.hasChanges = false + } } diff --git a/Meshtastic/Views/Settings/Config/PositionConfig.swift b/Meshtastic/Views/Settings/Config/PositionConfig.swift index b275f77d..25a91a69 100644 --- a/Meshtastic/Views/Settings/Config/PositionConfig.swift +++ b/Meshtastic/Views/Settings/Config/PositionConfig.swift @@ -86,6 +86,9 @@ struct PositionConfig: View { } else { Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") .font(.title3) + .onAppear { + setPositionValues() + } } } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral?.num ?? 0 { Text("Configuration for: \(node?.user?.longName ?? "Unknown")") @@ -277,28 +280,7 @@ struct PositionConfig: View { .onAppear { self.bleManager.context = context - self.smartPositionEnabled = node?.positionConfig?.smartPositionEnabled ?? true - self.deviceGpsEnabled = node?.positionConfig?.deviceGpsEnabled ?? true - self.fixedPosition = node?.positionConfig?.fixedPosition ?? false - self.gpsUpdateInterval = Int(node?.positionConfig?.gpsUpdateInterval ?? 30) - self.gpsAttemptTime = Int(node?.positionConfig?.gpsAttemptTime ?? 30) - self.positionBroadcastSeconds = Int(node?.positionConfig?.positionBroadcastSeconds ?? 900) - self.positionFlags = Int(node?.positionConfig?.positionFlags ?? 3) - - let pf = PositionFlags(rawValue: self.positionFlags) - - if pf.contains(.Altitude) { self.includeAltitude = true } else { self.includeAltitude = false } - if pf.contains(.AltitudeMsl) { self.includeAltitudeMsl = true } else { self.includeAltitudeMsl = false } - if pf.contains(.GeoidalSeparation) { self.includeGeoidalSeparation = true } else { self.includeGeoidalSeparation = false } - if pf.contains(.Dop) { self.includeDop = true } else { self.includeDop = false } - if pf.contains(.Hvdop) { self.includeHvdop = true } else { self.includeHvdop = false } - if pf.contains(.Satsinview) { self.includeSatsinview = true } else { self.includeSatsinview = false } - if pf.contains(.SeqNo) { self.includeSeqNo = true } else { self.includeSeqNo = false } - if pf.contains(.Timestamp) { self.includeTimestamp = true } else { self.includeTimestamp = false } - if pf.contains(.Speed) { self.includeSpeed = true } else { self.includeSpeed = false } - if pf.contains(.Heading) { self.includeHeading = true } else { self.includeHeading = false } - - self.hasChanges = false + setPositionValues() // Need to request a PositionConfig from the remote node before allowing changes if bleManager.connectedPeripheral != nil && node?.positionConfig == nil { @@ -395,4 +377,29 @@ struct PositionConfig: View { if existingValue != hvdopFlag { hasChanges = true } } } + + func setPositionValues() { + + self.smartPositionEnabled = node?.positionConfig?.smartPositionEnabled ?? true + self.deviceGpsEnabled = node?.positionConfig?.deviceGpsEnabled ?? true + self.fixedPosition = node?.positionConfig?.fixedPosition ?? false + self.gpsUpdateInterval = Int(node?.positionConfig?.gpsUpdateInterval ?? 30) + self.gpsAttemptTime = Int(node?.positionConfig?.gpsAttemptTime ?? 30) + self.positionBroadcastSeconds = Int(node?.positionConfig?.positionBroadcastSeconds ?? 900) + self.positionFlags = Int(node?.positionConfig?.positionFlags ?? 3) + + let pf = PositionFlags(rawValue: self.positionFlags) + if pf.contains(.Altitude) { self.includeAltitude = true } else { self.includeAltitude = false } + if pf.contains(.AltitudeMsl) { self.includeAltitudeMsl = true } else { self.includeAltitudeMsl = false } + if pf.contains(.GeoidalSeparation) { self.includeGeoidalSeparation = true } else { self.includeGeoidalSeparation = false } + if pf.contains(.Dop) { self.includeDop = true } else { self.includeDop = false } + if pf.contains(.Hvdop) { self.includeHvdop = true } else { self.includeHvdop = false } + if pf.contains(.Satsinview) { self.includeSatsinview = true } else { self.includeSatsinview = false } + if pf.contains(.SeqNo) { self.includeSeqNo = true } else { self.includeSeqNo = false } + if pf.contains(.Timestamp) { self.includeTimestamp = true } else { self.includeTimestamp = false } + if pf.contains(.Speed) { self.includeSpeed = true } else { self.includeSpeed = false } + if pf.contains(.Heading) { self.includeHeading = true } else { self.includeHeading = false } + + self.hasChanges = false + } }