From b34200286831bf96c22382e244083281f6d1e2ea Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 2 Jul 2022 13:25:34 -0700 Subject: [PATCH] Telemetry Config --- Meshtastic/Helpers/MeshPackets.swift | 95 +++++++++++++++++++ .../contents | 16 +++- .../Config/Module/TelemetryConfig.swift | 3 +- 3 files changed, 112 insertions(+), 2 deletions(-) diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index a79c7534..6f30c135 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -680,6 +680,101 @@ func moduleConfig (config: ModuleConfig, meshlogging: Bool, context:NSManagedObj } } + + if config.payloadVariant == ModuleConfig.OneOf_PayloadVariant.telemetry(config.telemetry) { + + var isDefault = false + + if (try! config.telemetry.jsonString()) == "{}" { + + isDefault = true + print("📈 Default Telemetry Module config") + } + + 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 Telemetry Config + if !fetchedNode.isEmpty { + + if fetchedNode[0].telemetryConfig == nil { + + let newTelemetryConfig = TelemetryConfigEntity(context: context) + + if isDefault { + + newTelemetryConfig.deviceUpdateInterval = 0 + newTelemetryConfig.environmentUpdateInterval = 0 + newTelemetryConfig.environmentMeasurementEnabled = false + newTelemetryConfig.environmentSensorType = 0 + newTelemetryConfig.environmentScreenEnabled = false + newTelemetryConfig.environmentDisplayFahrenheit = false + newTelemetryConfig.environmentRecoveryInterval = 0 + newTelemetryConfig.environmentReadErrorCountThreshold = 0 + + } else { + + newTelemetryConfig.deviceUpdateInterval = Int32(config.telemetry.deviceUpdateInterval) + newTelemetryConfig.environmentUpdateInterval = Int32(config.telemetry.environmentUpdateInterval) + newTelemetryConfig.environmentMeasurementEnabled = config.telemetry.environmentMeasurementEnabled + newTelemetryConfig.environmentSensorType = Int32(config.telemetry.environmentSensorType.rawValue) + newTelemetryConfig.environmentScreenEnabled = config.telemetry.environmentScreenEnabled + newTelemetryConfig.environmentDisplayFahrenheit = config.telemetry.environmentDisplayFahrenheit + newTelemetryConfig.environmentRecoveryInterval = Int32(config.telemetry.environmentRecoveryInterval) + newTelemetryConfig.environmentReadErrorCountThreshold = Int32(config.telemetry.environmentReadErrorCountThreshold) + + } + + fetchedNode[0].telemetryConfig = newTelemetryConfig + + } else { + + if isDefault { + + fetchedNode[0].telemetryConfig?.deviceUpdateInterval = 0 + fetchedNode[0].telemetryConfig?.environmentUpdateInterval = 0 + fetchedNode[0].telemetryConfig?.environmentMeasurementEnabled = false + fetchedNode[0].telemetryConfig?.environmentSensorType = 0 + fetchedNode[0].telemetryConfig?.environmentScreenEnabled = false + fetchedNode[0].telemetryConfig?.environmentDisplayFahrenheit = false + fetchedNode[0].telemetryConfig?.environmentRecoveryInterval = 0 + fetchedNode[0].telemetryConfig?.environmentReadErrorCountThreshold = 0 + + + } else { + + fetchedNode[0].telemetryConfig?.deviceUpdateInterval = Int32(config.telemetry.deviceUpdateInterval) + fetchedNode[0].telemetryConfig?.environmentUpdateInterval = Int32(config.telemetry.environmentUpdateInterval) + fetchedNode[0].telemetryConfig?.environmentMeasurementEnabled = config.telemetry.environmentMeasurementEnabled + fetchedNode[0].telemetryConfig?.environmentSensorType = Int32(config.telemetry.environmentSensorType.rawValue) + fetchedNode[0].telemetryConfig?.environmentScreenEnabled = config.telemetry.environmentScreenEnabled + fetchedNode[0].telemetryConfig?.environmentDisplayFahrenheit = config.telemetry.environmentDisplayFahrenheit + fetchedNode[0].telemetryConfig?.environmentRecoveryInterval = Int32(config.telemetry.environmentRecoveryInterval) + fetchedNode[0].telemetryConfig?.environmentReadErrorCountThreshold = Int32(config.telemetry.environmentReadErrorCountThreshold) + } + } + + do { + + try context.save() + if meshlogging { MeshLogger.log("💾 Updated Telemetry Module Config for node number: \(String(nodeNum))") } + + } catch { + + context.rollback() + + let nsError = error as NSError + print("💥 Error Updating Core Data TelemetryConfigEntity: \(nsError)") + } + } + + } catch { + + } + } } func myInfoPacket (myInfo: MyNodeInfo, meshLogging: Bool, context: NSManagedObjectContext) -> MyInfoEntity? { diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents index 3ed68240..16c9eca6 100644 --- a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents +++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 4.xcdatamodel/contents @@ -103,6 +103,7 @@ + @@ -146,6 +147,18 @@ + + + + + + + + + + + + @@ -181,7 +194,7 @@ - + @@ -189,5 +202,6 @@ + \ No newline at end of file diff --git a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift index eeaf4fa0..90cea043 100644 --- a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift @@ -187,7 +187,6 @@ struct TelemetryConfig: View { @State var deviceUpdateInterval = 0 @State var environmentUpdateInterval = 0 - @State var environmentMeasurementEnabled = false @State var environmentSensorType = 0 @State var environmentScreenEnabled = false @@ -303,6 +302,8 @@ struct TelemetryConfig: View { Button("Save Telemetry Module Config to \(bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral.longName : "Unknown")?") { var tc = ModuleConfig.TelemetryConfig() + tc.deviceUpdateInterval = UInt32(deviceUpdateInterval) + tc.environmentUpdateInterval = UInt32(environmentUpdateInterval) tc.environmentMeasurementEnabled = environmentMeasurementEnabled tc.environmentSensorType = SensorTypes(rawValue: environmentSensorType)!.protoEnumValue() tc.environmentScreenEnabled = environmentScreenEnabled