diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 2063cddb..808b9bd7 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -779,9 +779,10 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { var success = false let fromNodeNum = connectedPeripheral.num - if fromNodeNum <= 0 || (LocationHelper.currentLocation.latitude == LocationHelper.DefaultLocation.latitude && LocationHelper.currentLocation.longitude == LocationHelper.DefaultLocation.longitude) { + if fromNodeNum <= 0 || LocationHelper.currentLocation.distance(from: LocationHelper.DefaultLocation) == 0.0 { return false } + var positionPacket = Position() positionPacket.latitudeI = Int32(LocationHelper.currentLocation.latitude * 1e7) positionPacket.longitudeI = Int32(LocationHelper.currentLocation.longitude * 1e7) @@ -826,7 +827,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { if userSettings!.provideLocation { let success = sendPosition(destNum: connectedPeripheral.num, wantResponse: false) if !success { - print("Failed to send positon to device") + print("Failed to send position to device") } } } @@ -1247,7 +1248,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { return 0 } - public func saveWiFiConfig(config: Config.NetworkConfig, fromUser: UserEntity, toUser: UserEntity) -> Int64 { + public func saveNetworkConfig(config: Config.NetworkConfig, fromUser: UserEntity, toUser: UserEntity) -> Int64 { var adminPacket = AdminMessage() adminPacket.setConfig.network = config diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 628339b8..ae101ad9 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -38,7 +38,7 @@ func generateMessageMarkdown (message: String) -> String { func localConfig (config: Config, context:NSManagedObjectContext, nodeNum: Int64, nodeLongName: String) { - // We don't care about any of the Power settings, config is available for everyting else + // We don't care about any of the Power settings, config is available for everything else if config.payloadVariant == Config.OneOf_PayloadVariant.bluetooth(config.bluetooth) { upsertBluetoothConfigPacket(config: config, nodeNum: nodeNum, context: context) } else if config.payloadVariant == Config.OneOf_PayloadVariant.device(config.device) { @@ -519,7 +519,7 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, context: NS do { let fetchedNode = try context.fetch(fetchedNodeRequest) as! [NodeInfoEntity] - if fetchedNode.count == 1 { + if fetchedNode.count > 0 { let newMetadata = DeviceMetadataEntity(context: context) newMetadata.firmwareVersion = metadata.firmwareVersion newMetadata.deviceStateVersion = Int32(metadata.deviceStateVersion) @@ -529,7 +529,6 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, context: NS newMetadata.hasEthernet = metadata.hasEthernet_p newMetadata.role = Int32(metadata.role.rawValue) newMetadata.positionFlags = Int32(metadata.positionFlags) - fetchedNode[0].metadata = newMetadata do { @@ -806,6 +805,12 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { } else if config.payloadVariant == Config.OneOf_PayloadVariant.lora(config.lora) { upsertLoRaConfigPacket(config: config, nodeNum: Int64(packet.from), context: context) + } else if config.payloadVariant == Config.OneOf_PayloadVariant.network(config.network) { + upsertNetworkConfigPacket(config: config, nodeNum: Int64(packet.from), context: context) + + } else if config.payloadVariant == Config.OneOf_PayloadVariant.position(config.position) { + upsertPositionConfigPacket(config: config, nodeNum: Int64(packet.from), context: context) + } } } else { diff --git a/Meshtastic/Views/Settings/Config/LoRaConfig.swift b/Meshtastic/Views/Settings/Config/LoRaConfig.swift index bf96724a..7895d3ee 100644 --- a/Meshtastic/Views/Settings/Config/LoRaConfig.swift +++ b/Meshtastic/Views/Settings/Config/LoRaConfig.swift @@ -120,7 +120,6 @@ struct LoRaConfig: View { print("empty lora config") let adminMessageId = bleManager.requestLoRaConfig(fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode?.myInfo?.adminIndex ?? 0) } - print(node?.loRaConfig?.regionCode) } .onChange(of: region) { newRegion in if node != nil && node!.loRaConfig != nil { diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index 65e73b2c..58710789 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -118,7 +118,7 @@ struct NetworkConfig: View { network.ethEnabled = self.ethEnabled //network.addressMode = Config.NetworkConfig.AddressMode.dhcp - let adminMessageId = bleManager.saveWiFiConfig(config: network, fromUser: node!.user!, toUser: node!.user!) + let adminMessageId = bleManager.saveNetworkConfig(config: network, fromUser: node!.user!, toUser: node!.user!) if adminMessageId > 0 { // Should show a saved successfully alert once I know that to be true // for now just disable the button after a successful save diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 8420efb6..ea7d6d05 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -18,6 +18,30 @@ struct Settings: View { @State private var connectedNodeNum: Int = 0 @State private var initialLoad: Bool = true + @State private var selection: SettingsSidebar = .about + + enum SettingsSidebar { + case appSettings + case shareChannels + case userConfig + case loraConfig + case channelConfig + case bluetoothConfig + case deviceConfig + case displayConfig + case networkConfig + case positionConfig + case cannedMessagesConfig + case externalNotificationConfig + case mqttConfig + case rangeTestConfig + case serialConfig + case telemetryConfig + case meshLog + case adminMessageLog + case about + } + var body: some View { NavigationSplitView { List { @@ -28,6 +52,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("app.settings") } + .tag(SettingsSidebar.appSettings) let node = nodes.first(where: { $0.num == connectedNodeNum }) if node?.myInfo?.adminIndex ?? 0 > 0 { Section("Configure") { @@ -51,19 +76,19 @@ struct Settings: View { .pickerStyle(.menu) .labelsHidden() .onChange(of: selectedNode) { newValue in - if selectedNode > 0 { - let node = nodes.first(where: { $0.num == newValue }) - let connectedNode = nodes.first(where: { $0.num == connectedNodeNum }) - connectedNodeNum = Int(bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral.num : 0) - - if node?.metadata == nil && node!.num != connectedNodeNum { - let adminMessageId = bleManager.requestDeviceMetadata(fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode!.myInfo!.adminIndex, context: context) - - if adminMessageId > 0 { - print("Saved node metadata") - } - } - } +// if selectedNode > 0 { +// let node = nodes.first(where: { $0.num == newValue }) +// let connectedNode = nodes.first(where: { $0.num == connectedNodeNum }) +// connectedNodeNum = Int(bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral.num : 0) +// +// if node?.metadata == nil && node!.num != connectedNodeNum { +// let adminMessageId = bleManager.requestDeviceMetadata(fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode!.myInfo!.adminIndex, context: context) +// +// if adminMessageId > 0 { +// print("Saved node metadata") +// } +// } +// } } } } @@ -77,7 +102,9 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("share.channels") } + .tag(SettingsSidebar.shareChannels) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) + NavigationLink { UserConfig(node: nodes.first(where: { $0.num == selectedNode }), connectedNode: nodes.first(where: { $0.num == connectedNodeNum })) } label: { @@ -86,6 +113,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("user") } + .tag(SettingsSidebar.userConfig) .disabled(selectedNode == 0) NavigationLink() { @@ -95,7 +123,9 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("lora") } - .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) + .tag(SettingsSidebar.loraConfig) + .disabled(selectedNode == 0) + //.disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink() { Channels(node: nodes.first(where: { $0.num == connectedNodeNum })) @@ -104,6 +134,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("channels") } + .tag(SettingsSidebar.channelConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink() { @@ -113,6 +144,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("bluetooth") } + .tag(SettingsSidebar.bluetoothConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -122,6 +154,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("device") } + .tag(SettingsSidebar.deviceConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -131,6 +164,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("display") } + .tag(SettingsSidebar.displayConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -141,6 +175,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("network") } + .tag(SettingsSidebar.networkConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -151,6 +186,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("position") } + .tag(SettingsSidebar.positionConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) } @@ -165,6 +201,7 @@ struct Settings: View { Text("canned.messages") } + .tag(SettingsSidebar.cannedMessagesConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -174,6 +211,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("external.notification") } + .tag(SettingsSidebar.externalNotificationConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -183,6 +221,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("mqtt") } + .tag(SettingsSidebar.mqttConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -192,6 +231,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("range.test") } + .tag(SettingsSidebar.rangeTestConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -201,6 +241,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("serial") } + .tag(SettingsSidebar.serialConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) NavigationLink { @@ -210,6 +251,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("telemetry") } + .tag(SettingsSidebar.telemetryConfig) .disabled(selectedNode > 0 && selectedNode != connectedNodeNum) } Section(header: Text("logging")) { @@ -220,6 +262,8 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("mesh.log") } + .tag(SettingsSidebar.meshLog) + NavigationLink { let connectedNode = nodes.first(where: { $0.num == connectedNodeNum }) AdminMessageList(user: connectedNode?.user) @@ -228,6 +272,7 @@ struct Settings: View { .symbolRenderingMode(.hierarchical) Text("admin.log") } + .tag(SettingsSidebar.adminMessageLog) } Section(header: Text("about")) { NavigationLink { @@ -238,6 +283,7 @@ struct Settings: View { Text("about.meshtastic") } + .tag(SettingsSidebar.about) } } .onAppear {