diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 3a3c9a4b..2e76527e 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -21872,6 +21872,9 @@ }, "Treat double tap on supported accelerometers as a user button press." : { + }, + "TriggerType" : { + }, "Triple Click Ad Hoc Ping" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index e870495b..c82b37b5 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ D9C983A22B79D1A600BDBE6A /* RequestPositionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C983A12B79D1A600BDBE6A /* RequestPositionButton.swift */; }; DD007BAE2AA4E91200F5FA12 /* MyInfoEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD007BAD2AA4E91200F5FA12 /* MyInfoEntityExtension.swift */; }; DD007BB02AA5981000F5FA12 /* NodeInfoEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD007BAF2AA5981000F5FA12 /* NodeInfoEntityExtension.swift */; }; + DD0BE3102CB9FDC4000BA445 /* DetectionSensorEnums.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD0BE30F2CB9FDC4000BA445 /* DetectionSensorEnums.swift */; }; DD0D3D222A55CEB10066DB71 /* CocoaMQTT in Frameworks */ = {isa = PBXBuildFile; productRef = DD0D3D212A55CEB10066DB71 /* CocoaMQTT */; }; DD0E21012B8A6F1300F2D100 /* DeviceHardware.json in Resources */ = {isa = PBXBuildFile; fileRef = DD0E21002B8A6BC500F2D100 /* DeviceHardware.json */; }; DD13AA492AB73BF400BA0C98 /* PositionPopover.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD13AA482AB73BF400BA0C98 /* PositionPopover.swift */; }; @@ -300,6 +301,7 @@ DD007BAF2AA5981000F5FA12 /* NodeInfoEntityExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeInfoEntityExtension.swift; sourceTree = ""; }; DD05296F2B77F454008E44CD /* MeshtasticDataModelV 26.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 26.xcdatamodel"; sourceTree = ""; }; DD0BE30C2CB785D8000BA445 /* MeshtasticDataModelV 46.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 46.xcdatamodel"; sourceTree = ""; }; + DD0BE30F2CB9FDC4000BA445 /* DetectionSensorEnums.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetectionSensorEnums.swift; sourceTree = ""; }; DD0E20FF2B892E1300F2D100 /* MeshtasticDataModelV 28.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 28.xcdatamodel"; sourceTree = ""; }; DD0E21002B8A6BC500F2D100 /* DeviceHardware.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = DeviceHardware.json; sourceTree = ""; }; DD0E9C222A30CE3A00580CBB /* MeshtasticDataModelV14.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeshtasticDataModelV14.xcdatamodel; sourceTree = ""; }; @@ -797,6 +799,7 @@ DDB6ABD828B0A4BA00384BA1 /* BluetoothModes.swift */, DD1925B628CDA5A400720036 /* CannedMessagesConfigEnums.swift */, DDA1C48D28DB49D3009933EC /* ChannelRoles.swift */, + DD0BE30F2CB9FDC4000BA445 /* DetectionSensorEnums.swift */, DDB6ABDF28B13AC700384BA1 /* DeviceEnums.swift */, DDB6ABE328B13FFF00384BA1 /* DisplayEnums.swift */, DD5D0A9B2931B9F200F7EA61 /* EthernetModes.swift */, @@ -1395,6 +1398,7 @@ DD2553572855B02500E55709 /* LoRaConfig.swift in Sources */, DDB6ABD928B0A4BA00384BA1 /* BluetoothModes.swift in Sources */, DD1BD0EE2C603C91008C0C70 /* CustomFormatters.swift in Sources */, + DD0BE3102CB9FDC4000BA445 /* DetectionSensorEnums.swift in Sources */, DDD9E4E4284B208E003777C5 /* UserEntityExtension.swift in Sources */, DD2553592855B52700E55709 /* PositionConfig.swift in Sources */, DD97E96828EFE9A00056DDA4 /* About.swift in Sources */, diff --git a/Meshtastic/Enums/DetectionSensorEnums.swift b/Meshtastic/Enums/DetectionSensorEnums.swift new file mode 100644 index 00000000..34401a82 --- /dev/null +++ b/Meshtastic/Enums/DetectionSensorEnums.swift @@ -0,0 +1,53 @@ +// +// DetectionSensorEnums.swift +// Meshtastic +// +// Copyright(c) Garth Vander Houwen 10/11/24. +// +import MeshtasticProtobufs + +enum TriggerTypes: Int, CaseIterable, Identifiable { + + case logicLow = 0 + case logicHigh = 1 + case fallingEdge = 2 + case risingEdge = 3 + case eitherEdgeActiveLow = 4 + case eitherEdgeActiveHigh = 5 + + var id: Int { self.rawValue } + + var name: String { + switch self { + case .logicLow: + return "Low" + case .logicHigh: + return "High" + case .fallingEdge: + return "Falling Edge" + case .risingEdge: + return "Rising Edge" + case .eitherEdgeActiveLow: + return "Either Edge Low" + case .eitherEdgeActiveHigh: + return "Either Edge Hight" + } + } + func protoEnumValue() -> ModuleConfig.DetectionSensorConfig.TriggerType { + + switch self { + case .logicLow: + return ModuleConfig.DetectionSensorConfig.TriggerType.logicLow + case .logicHigh: + return ModuleConfig.DetectionSensorConfig.TriggerType.logicHigh + case .fallingEdge: + return ModuleConfig.DetectionSensorConfig.TriggerType.fallingEdge + case .risingEdge: + return ModuleConfig.DetectionSensorConfig.TriggerType.risingEdge + case .eitherEdgeActiveLow: + return ModuleConfig.DetectionSensorConfig.TriggerType.eitherEdgeActiveLow + case .eitherEdgeActiveHigh: + return ModuleConfig.DetectionSensorConfig.TriggerType.eitherEdgeActiveHigh + } + } +} diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV 46.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV 46.xcdatamodel/contents index 8ebdb9e2..bc188564 100644 --- a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV 46.xcdatamodel/contents +++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV 46.xcdatamodel/contents @@ -47,13 +47,13 @@ - + diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 548ead43..6ddd664c 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -989,7 +989,7 @@ func upsertDetectionSensorModuleConfigPacket(config: ModuleConfig.DetectionSenso newConfig.sendBell = config.sendBell newConfig.name = config.name newConfig.monitorPin = Int32(config.monitorPin) - newConfig.detectionTriggeredHigh = config.detectionTriggerType == .logicHigh ? true : false + newConfig.triggerType = Int32(config.detectionTriggerType.rawValue) newConfig.usePullup = config.usePullup newConfig.minimumBroadcastSecs = Int32(truncatingIfNeeded: config.minimumBroadcastSecs) newConfig.stateBroadcastSecs = Int32(truncatingIfNeeded: config.stateBroadcastSecs) @@ -1000,7 +1000,7 @@ func upsertDetectionSensorModuleConfigPacket(config: ModuleConfig.DetectionSenso fetchedNode[0].detectionSensorConfig?.name = config.name fetchedNode[0].detectionSensorConfig?.monitorPin = Int32(config.monitorPin) fetchedNode[0].detectionSensorConfig?.usePullup = config.usePullup - fetchedNode[0].detectionSensorConfig?.detectionTriggeredHigh = config.detectionTriggerType == .logicHigh ? true : false + fetchedNode[0].detectionSensorConfig?.triggerType = Int32(config.detectionTriggerType.rawValue) fetchedNode[0].detectionSensorConfig?.minimumBroadcastSecs = Int32(truncatingIfNeeded: config.minimumBroadcastSecs) fetchedNode[0].detectionSensorConfig?.stateBroadcastSecs = Int32(truncatingIfNeeded: config.stateBroadcastSecs) } diff --git a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift index 076cb016..aff3dfea 100644 --- a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift @@ -36,7 +36,7 @@ struct DetectionSensorConfig: View { @State var enabled = false @State var sendBell: Bool = false @State var name: String = "" - @State var detectionTriggeredHigh: Bool = true + @State var triggerType = 0 @State var usePullup: Bool = false @State var minimumBroadcastSecs = 0 @State var stateBroadcastSecs = 0 @@ -116,11 +116,13 @@ struct DetectionSensorConfig: View { } .pickerStyle(DefaultPickerStyle()) -// Toggle(isOn: $detectionTriggeredHigh) { -// Label("Detection trigger High", systemImage: "dial.high") -// Text("Whether or not the GPIO pin state detection is triggered on HIGH (1) or LOW (0)") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) + Picker("TriggerType", selection: $triggerType) { + ForEach(TriggerTypes.allCases) { tt in + Text(tt.name).tag(tt.rawValue) + } + } + .pickerStyle(DefaultPickerStyle()) + .listRowSeparator(.hidden) Toggle(isOn: $usePullup) { Label("Uses pullup resistor", systemImage: "arrow.up.to.line") @@ -166,7 +168,7 @@ struct DetectionSensorConfig: View { dsc.sendBell = self.sendBell dsc.name = self.name dsc.monitorPin = UInt32(self.monitorPin) - // dsc.detectionTriggeredHigh = self.detectionTriggeredHigh + dsc.detectionTriggerType = TriggerTypes(rawValue: triggerType)!.protoEnumValue() dsc.usePullup = self.usePullup dsc.minimumBroadcastSecs = UInt32(self.minimumBroadcastSecs) dsc.stateBroadcastSecs = UInt32(self.stateBroadcastSecs) @@ -216,8 +218,8 @@ struct DetectionSensorConfig: View { .onChange(of: sendBell) { _, newSendBell in if newSendBell != node?.detectionSensorConfig?.sendBell { hasChanges = true } } - .onChange(of: detectionTriggeredHigh) { _, newDetectionTriggeredHigh in - // if newDetectionTriggeredHigh != node?.detectionSensorConfig?.detectionTriggeredHigh { hasChanges = true } + .onChange(of: triggerType) { _, newTriggerType in + if newTriggerType != node?.detectionSensorConfig?.triggerType ?? 0 { hasChanges = true } } .onChange(of: usePullup) { _, newUsePullup in if newUsePullup != node?.detectionSensorConfig?.usePullup { hasChanges = true } @@ -244,7 +246,7 @@ struct DetectionSensorConfig: View { self.name = (node?.detectionSensorConfig?.name ?? "") self.monitorPin = Int(node?.detectionSensorConfig?.monitorPin ?? 0) self.usePullup = (node?.detectionSensorConfig?.usePullup ?? false) - // self.detectionTriggeredHigh = (node?.detectionSensorConfig?.detectionTriggeredHigh ?? true) + self.triggerType = Int(node?.detectionSensorConfig?.triggerType ?? 0) self.minimumBroadcastSecs = Int(node?.detectionSensorConfig?.minimumBroadcastSecs ?? 45) self.stateBroadcastSecs = Int(node?.detectionSensorConfig?.stateBroadcastSecs ?? 0)