From acb8e6b2800eb4fcd84e9c50873c3e16c2885cee Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 21 Jun 2022 13:10:30 -0700 Subject: [PATCH] Position Config --- MeshtasticApple/Helpers/MeshPackets.swift | 85 +++++++++++++++++++ .../contents | 20 ++++- .../Views/Settings/PositionConfig.swift | 74 +++++++++++++++- 3 files changed, 174 insertions(+), 5 deletions(-) diff --git a/MeshtasticApple/Helpers/MeshPackets.swift b/MeshtasticApple/Helpers/MeshPackets.swift index 4d91a654..644ac847 100644 --- a/MeshtasticApple/Helpers/MeshPackets.swift +++ b/MeshtasticApple/Helpers/MeshPackets.swift @@ -254,6 +254,91 @@ func localConfig (config: Config, meshlogging: Bool, context:NSManagedObjectCont } } + + if config.payloadVariant == Config.OneOf_PayloadVariant.position(config.position) { + + var isDefault = false + + if (try! config.position.jsonString()) == "{}" { + + isDefault = true + } + + let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) + + do { + + let fetchedNode = try context.fetch(fetchNodeInfoRequest) as! [NodeInfoEntity] + // Found a node, save LoRa Config + if !fetchedNode.isEmpty { + + if fetchedNode[0].positionConfig == nil { + + let newPositionConfig = PositionConfigEntity(context: context) + + if isDefault { + + newPositionConfig.smartPositionEnabled = true + newPositionConfig.deviceGpsEnabled = true + newPositionConfig.fixedPosition = false + newPositionConfig.gpsUpdateInterval = 0 + newPositionConfig.gpsAttemptTime = 0 + newPositionConfig.positionBroadcastSeconds = 0 + + } else { + + newPositionConfig.smartPositionEnabled = !config.position.positionBroadcastSmartDisabled + newPositionConfig.deviceGpsEnabled = !config.position.gpsDisabled + newPositionConfig.fixedPosition = config.position.fixedPosition + newPositionConfig.gpsUpdateInterval = Int32(config.position.gpsUpdateInterval) + newPositionConfig.gpsAttemptTime = Int32(config.position.gpsAttemptTime) + newPositionConfig.positionBroadcastSeconds = Int32(config.position.positionBroadcastSecs) + } + + fetchedNode[0].positionConfig = newPositionConfig + + } else { + + if isDefault { + + fetchedNode[0].positionConfig?.smartPositionEnabled = true + fetchedNode[0].positionConfig?.deviceGpsEnabled = true + fetchedNode[0].positionConfig?.fixedPosition = false + fetchedNode[0].positionConfig?.gpsUpdateInterval = 0 + fetchedNode[0].positionConfig?.gpsAttemptTime = 0 + fetchedNode[0].positionConfig?.positionBroadcastSeconds = 0 + + } else { + + fetchedNode[0].positionConfig?.smartPositionEnabled = !config.position.positionBroadcastSmartDisabled + fetchedNode[0].positionConfig?.deviceGpsEnabled = !config.position.gpsDisabled + fetchedNode[0].positionConfig?.fixedPosition = config.position.fixedPosition + fetchedNode[0].positionConfig?.gpsUpdateInterval = Int32(config.position.gpsUpdateInterval) + fetchedNode[0].positionConfig?.gpsAttemptTime = Int32(config.position.gpsAttemptTime) + fetchedNode[0].positionConfig?.positionBroadcastSeconds = Int32(config.position.positionBroadcastSecs) + + } + } + + do { + + try context.save() + if meshlogging { MeshLogger.log("💾 Updated Position Config for node number: \(String(nodeNum))") } + + } catch { + + context.rollback() + + let nsError = error as NSError + print("💥 Error Updating Core Data PositionConfigEntity: \(nsError)") + } + } + + } catch { + + } + } } func myInfoPacket (myInfo: MyNodeInfo, meshLogging: Bool, context: NSManagedObjectContext) -> MyInfoEntity? { diff --git a/MeshtasticApple/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents b/MeshtasticApple/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents index 5a300379..c32d279b 100644 --- a/MeshtasticApple/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents +++ b/MeshtasticApple/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents @@ -2,14 +2,14 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -71,6 +71,7 @@ + @@ -80,6 +81,16 @@ + + + + + + + + + + @@ -120,11 +131,12 @@ - + + \ No newline at end of file diff --git a/MeshtasticApple/Views/Settings/PositionConfig.swift b/MeshtasticApple/Views/Settings/PositionConfig.swift index 92bfb732..c16d99c9 100644 --- a/MeshtasticApple/Views/Settings/PositionConfig.swift +++ b/MeshtasticApple/Views/Settings/PositionConfig.swift @@ -258,6 +258,46 @@ struct PositionConfig: View { .listRowSeparator(.visible) } } + + Button { + + isPresentingSaveConfirm = true + + } label: { + + Label("Save", systemImage: "square.and.arrow.down") + } + .disabled(bleManager.connectedPeripheral == nil || !hasChanges) + .buttonStyle(.bordered) + .buttonBorderShape(.capsule) + .controlSize(.large) + .padding() + .confirmationDialog( + + "Are you sure?", + isPresented: $isPresentingSaveConfirm + ) { + Button("Save Position Config to \(bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral.longName : "Unknown")?") { + + var pc = Config.PositionConfig() + pc.positionBroadcastSmartDisabled = !smartPositionEnabled + pc.gpsDisabled = !deviceGpsEnabled + pc.fixedPosition = fixedPosition + pc.gpsUpdateInterval = UInt32(gpsUpdateInterval) + pc.gpsAttemptTime = UInt32(gpsAttemptTime) + pc.positionBroadcastSecs = UInt32(positionBroadcastSeconds) + + if bleManager.savePositionConfig(config: pc, destNum: bleManager.connectedPeripheral.num, wantResponse: false) { + + // Should show a saved successfully alert once I know that to be true + // for now just disable the button after a successful save + hasChanges = false + + } else { + + } + } + } } .navigationTitle("Position Config") .navigationBarItems(trailing: @@ -268,7 +308,39 @@ struct PositionConfig: View { }) .onAppear { - self.bleManager.context = context + if self.initialLoad{ + + 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 ?? 0) + self.gpsAttemptTime = Int(node.positionConfig?.gpsAttemptTime ?? 0) + self.positionBroadcastSeconds = Int(node.positionConfig?.positionBroadcastSeconds ?? 0) + self.hasChanges = false + self.initialLoad = false + } + } + .onChange(of: smartPositionEnabled) { newSmartPosition in + + if newSmartPosition != node.positionConfig!.smartPositionEnabled { + + hasChanges = true + } + } + .onChange(of: deviceGpsEnabled) { newDeviceGps in + + if newDeviceGps != node.positionConfig!.deviceGpsEnabled { + + hasChanges = true + } + } + .onChange(of: fixedPosition) { newFixed in + + if newFixed != node.positionConfig!.fixedPosition { + + hasChanges = true + } } .navigationViewStyle(StackNavigationViewStyle()) }