diff --git a/Meshtastic/Protobufs/meshtastic/config.pb.swift b/Meshtastic/Protobufs/meshtastic/config.pb.swift index 32949e89..b8d6d267 100644 --- a/Meshtastic/Protobufs/meshtastic/config.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/config.pb.swift @@ -533,6 +533,10 @@ struct Config { /// 0 for default of 10 seconds var minWakeSecs: UInt32 = 0 + /// + /// I2C address of INA_2XX to use for reading device battery voltage + var deviceBatteryInaAddress: UInt32 = 0 + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} @@ -1805,6 +1809,7 @@ extension Config.PowerConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImple 6: .standard(proto: "sds_secs"), 7: .standard(proto: "ls_secs"), 8: .standard(proto: "min_wake_secs"), + 9: .standard(proto: "device_battery_ina_address"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1821,6 +1826,7 @@ extension Config.PowerConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImple case 6: try { try decoder.decodeSingularUInt32Field(value: &self.sdsSecs) }() case 7: try { try decoder.decodeSingularUInt32Field(value: &self.lsSecs) }() case 8: try { try decoder.decodeSingularUInt32Field(value: &self.minWakeSecs) }() + case 9: try { try decoder.decodeSingularUInt32Field(value: &self.deviceBatteryInaAddress) }() default: break } } @@ -1851,6 +1857,9 @@ extension Config.PowerConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImple if self.minWakeSecs != 0 { try visitor.visitSingularUInt32Field(value: self.minWakeSecs, fieldNumber: 8) } + if self.deviceBatteryInaAddress != 0 { + try visitor.visitSingularUInt32Field(value: self.deviceBatteryInaAddress, fieldNumber: 9) + } try unknownFields.traverse(visitor: &visitor) } @@ -1863,6 +1872,7 @@ extension Config.PowerConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImple if lhs.sdsSecs != rhs.sdsSecs {return false} if lhs.lsSecs != rhs.lsSecs {return false} if lhs.minWakeSecs != rhs.minWakeSecs {return false} + if lhs.deviceBatteryInaAddress != rhs.deviceBatteryInaAddress {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/Meshtastic/Protobufs/meshtastic/localonly.pb.swift b/Meshtastic/Protobufs/meshtastic/localonly.pb.swift index 7f16ac02..219e3728 100644 --- a/Meshtastic/Protobufs/meshtastic/localonly.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/localonly.pb.swift @@ -222,6 +222,17 @@ struct LocalModuleConfig { /// Clears the value of `remoteHardware`. Subsequent reads from it will return its default value. mutating func clearRemoteHardware() {_uniqueStorage()._remoteHardware = nil} + /// + /// The part of the config that is specific to the Neighbor Info module + var neighborInfo: ModuleConfig.NeighborInfoConfig { + get {return _storage._neighborInfo ?? ModuleConfig.NeighborInfoConfig()} + set {_uniqueStorage()._neighborInfo = newValue} + } + /// Returns true if `neighborInfo` has been explicitly set. + var hasNeighborInfo: Bool {return _storage._neighborInfo != nil} + /// Clears the value of `neighborInfo`. Subsequent reads from it will return its default value. + mutating func clearNeighborInfo() {_uniqueStorage()._neighborInfo = nil} + /// /// A version integer used to invalidate old save files when we make /// incompatible changes This integer is set at build time and is private to @@ -383,6 +394,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem 7: .standard(proto: "canned_message"), 9: .same(proto: "audio"), 10: .standard(proto: "remote_hardware"), + 11: .standard(proto: "neighbor_info"), 8: .same(proto: "version"), ] @@ -396,6 +408,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem var _cannedMessage: ModuleConfig.CannedMessageConfig? = nil var _audio: ModuleConfig.AudioConfig? = nil var _remoteHardware: ModuleConfig.RemoteHardwareConfig? = nil + var _neighborInfo: ModuleConfig.NeighborInfoConfig? = nil var _version: UInt32 = 0 static let defaultInstance = _StorageClass() @@ -412,6 +425,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem _cannedMessage = source._cannedMessage _audio = source._audio _remoteHardware = source._remoteHardware + _neighborInfo = source._neighborInfo _version = source._version } } @@ -441,6 +455,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem case 8: try { try decoder.decodeSingularUInt32Field(value: &_storage._version) }() case 9: try { try decoder.decodeSingularMessageField(value: &_storage._audio) }() case 10: try { try decoder.decodeSingularMessageField(value: &_storage._remoteHardware) }() + case 11: try { try decoder.decodeSingularMessageField(value: &_storage._neighborInfo) }() default: break } } @@ -483,6 +498,9 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem try { if let v = _storage._remoteHardware { try visitor.visitSingularMessageField(value: v, fieldNumber: 10) } }() + try { if let v = _storage._neighborInfo { + try visitor.visitSingularMessageField(value: v, fieldNumber: 11) + } }() } try unknownFields.traverse(visitor: &visitor) } @@ -501,6 +519,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem if _storage._cannedMessage != rhs_storage._cannedMessage {return false} if _storage._audio != rhs_storage._audio {return false} if _storage._remoteHardware != rhs_storage._remoteHardware {return false} + if _storage._neighborInfo != rhs_storage._neighborInfo {return false} if _storage._version != rhs_storage._version {return false} return true } diff --git a/Meshtastic/Protobufs/meshtastic/mesh.pb.swift b/Meshtastic/Protobufs/meshtastic/mesh.pb.swift index 841396e0..8d164bac 100644 --- a/Meshtastic/Protobufs/meshtastic/mesh.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/mesh.pb.swift @@ -106,6 +106,10 @@ enum HardwareModel: SwiftProtobuf.Enum { /// B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station case stationG1 // = 25 + /// + /// RAK11310 (RP2040 + SX1262) + case rak11310 // = 26 + /// /// --------------------------------------------------------------------------- /// Less common/prototype boards listed here (needs one more byte over the air) @@ -168,6 +172,10 @@ enum HardwareModel: SwiftProtobuf.Enum { /// BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU case betafpv900NanoTx // = 46 + /// + /// Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module + case rpiPico // = 47 + /// /// ------------------------------------------------------------------------------------------------------------------------------------------ /// Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. @@ -200,6 +208,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case 16: self = .tloraT3S3 case 17: self = .nanoG1Explorer case 25: self = .stationG1 + case 26: self = .rak11310 case 32: self = .loraRelayV1 case 33: self = .nrf52840Dk case 34: self = .ppr @@ -215,6 +224,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case 44: self = .heltecWslV3 case 45: self = .betafpv2400Tx case 46: self = .betafpv900NanoTx + case 47: self = .rpiPico case 255: self = .privateHw default: self = .UNRECOGNIZED(rawValue) } @@ -241,6 +251,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case .tloraT3S3: return 16 case .nanoG1Explorer: return 17 case .stationG1: return 25 + case .rak11310: return 26 case .loraRelayV1: return 32 case .nrf52840Dk: return 33 case .ppr: return 34 @@ -256,6 +267,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case .heltecWslV3: return 44 case .betafpv2400Tx: return 45 case .betafpv900NanoTx: return 46 + case .rpiPico: return 47 case .privateHw: return 255 case .UNRECOGNIZED(let i): return i } @@ -287,6 +299,7 @@ extension HardwareModel: CaseIterable { .tloraT3S3, .nanoG1Explorer, .stationG1, + .rak11310, .loraRelayV1, .nrf52840Dk, .ppr, @@ -302,6 +315,7 @@ extension HardwareModel: CaseIterable { .heltecWslV3, .betafpv2400Tx, .betafpv900NanoTx, + .rpiPico, .privateHw, ] } @@ -2385,6 +2399,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding { 16: .same(proto: "TLORA_T3_S3"), 17: .same(proto: "NANO_G1_EXPLORER"), 25: .same(proto: "STATION_G1"), + 26: .same(proto: "RAK11310"), 32: .same(proto: "LORA_RELAY_V1"), 33: .same(proto: "NRF52840DK"), 34: .same(proto: "PPR"), @@ -2400,6 +2415,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding { 44: .same(proto: "HELTEC_WSL_V3"), 45: .same(proto: "BETAFPV_2400_TX"), 46: .same(proto: "BETAFPV_900_NANO_TX"), + 47: .same(proto: "RPI_PICO"), 255: .same(proto: "PRIVATE_HW"), ] } diff --git a/Meshtastic/Protobufs/meshtastic/module_config.pb.swift b/Meshtastic/Protobufs/meshtastic/module_config.pb.swift index 5df77866..58c173fa 100644 --- a/Meshtastic/Protobufs/meshtastic/module_config.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/module_config.pb.swift @@ -174,6 +174,16 @@ struct ModuleConfig { set {payloadVariant = .remoteHardware(newValue)} } + /// + /// TODO: REPLACE + var neighborInfo: ModuleConfig.NeighborInfoConfig { + get { + if case .neighborInfo(let v)? = payloadVariant {return v} + return ModuleConfig.NeighborInfoConfig() + } + set {payloadVariant = .neighborInfo(newValue)} + } + var unknownFields = SwiftProtobuf.UnknownStorage() /// @@ -206,6 +216,9 @@ struct ModuleConfig { /// /// TODO: REPLACE case remoteHardware(ModuleConfig.RemoteHardwareConfig) + /// + /// TODO: REPLACE + case neighborInfo(ModuleConfig.NeighborInfoConfig) #if !swift(>=4.1) static func ==(lhs: ModuleConfig.OneOf_PayloadVariant, rhs: ModuleConfig.OneOf_PayloadVariant) -> Bool { @@ -249,6 +262,10 @@ struct ModuleConfig { guard case .remoteHardware(let l) = lhs, case .remoteHardware(let r) = rhs else { preconditionFailure() } return l == r }() + case (.neighborInfo, .neighborInfo): return { + guard case .neighborInfo(let l) = lhs, case .neighborInfo(let r) = rhs else { preconditionFailure() } + return l == r + }() default: return false } } @@ -333,6 +350,27 @@ struct ModuleConfig { init() {} } + /// + /// NeighborInfoModule Config + struct NeighborInfoConfig { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + /// Whether the Module is enabled + var enabled: Bool = false + + /// + /// Interval in seconds of how often we should try to send our + /// Neighbor Info to the mesh + var updateInterval: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + } + /// /// Audio Config for codec2 voice struct AudioConfig { @@ -433,7 +471,6 @@ struct ModuleConfig { /// /// Preferences for the SerialModule - /// FIXME - Move this out of UserPreferences and into a section for module configuration. var enabled: Bool = false /// @@ -441,15 +478,15 @@ struct ModuleConfig { var echo: Bool = false /// - /// TODO: REPLACE + /// RX pin (should match Arduino gpio pin number) var rxd: UInt32 = 0 /// - /// TODO: REPLACE + /// TX pin (should match Arduino gpio pin number) var txd: UInt32 = 0 /// - /// TODO: REPLACE + /// Serial baud rate var baud: ModuleConfig.SerialConfig.Serial_Baud = .baudDefault /// @@ -457,9 +494,15 @@ struct ModuleConfig { var timeout: UInt32 = 0 /// - /// TODO: REPLACE + /// Mode for serial module operation var mode: ModuleConfig.SerialConfig.Serial_Mode = .default + /// + /// Overrides the platform's defacto Serial port instance to use with Serial module config settings + /// This is currently only usable in output modes like NMEA / CalTopo and may behave strangely or not work at all in other modes + /// Existing logging over the Serial Console will still be present + var overrideConsoleSerialPort: Bool = false + var unknownFields = SwiftProtobuf.UnknownStorage() /// @@ -543,6 +586,9 @@ struct ModuleConfig { case proto // = 2 case textmsg // = 3 case nmea // = 4 + + /// NMEA messages specifically tailored for CalTopo + case caltopo // = 5 case UNRECOGNIZED(Int) init() { @@ -556,6 +602,7 @@ struct ModuleConfig { case 2: self = .proto case 3: self = .textmsg case 4: self = .nmea + case 5: self = .caltopo default: self = .UNRECOGNIZED(rawValue) } } @@ -567,6 +614,7 @@ struct ModuleConfig { case .proto: return 2 case .textmsg: return 3 case .nmea: return 4 + case .caltopo: return 5 case .UNRECOGNIZED(let i): return i } } @@ -933,6 +981,7 @@ extension ModuleConfig.SerialConfig.Serial_Mode: CaseIterable { .proto, .textmsg, .nmea, + .caltopo, ] } @@ -982,6 +1031,7 @@ extension ModuleConfig: @unchecked Sendable {} extension ModuleConfig.OneOf_PayloadVariant: @unchecked Sendable {} extension ModuleConfig.MQTTConfig: @unchecked Sendable {} extension ModuleConfig.RemoteHardwareConfig: @unchecked Sendable {} +extension ModuleConfig.NeighborInfoConfig: @unchecked Sendable {} extension ModuleConfig.AudioConfig: @unchecked Sendable {} extension ModuleConfig.AudioConfig.Audio_Baud: @unchecked Sendable {} extension ModuleConfig.SerialConfig: @unchecked Sendable {} @@ -1020,6 +1070,7 @@ extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat 7: .standard(proto: "canned_message"), 8: .same(proto: "audio"), 9: .standard(proto: "remote_hardware"), + 10: .standard(proto: "neighbor_info"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1145,6 +1196,19 @@ extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat self.payloadVariant = .remoteHardware(v) } }() + case 10: try { + var v: ModuleConfig.NeighborInfoConfig? + var hadOneofValue = false + if let current = self.payloadVariant { + hadOneofValue = true + if case .neighborInfo(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v { + if hadOneofValue {try decoder.handleConflictingOneOf()} + self.payloadVariant = .neighborInfo(v) + } + }() default: break } } @@ -1192,6 +1256,10 @@ extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat guard case .remoteHardware(let v)? = self.payloadVariant else { preconditionFailure() } try visitor.visitSingularMessageField(value: v, fieldNumber: 9) }() + case .neighborInfo?: try { + guard case .neighborInfo(let v)? = self.payloadVariant else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 10) + }() case nil: break } try unknownFields.traverse(visitor: &visitor) @@ -1322,6 +1390,44 @@ extension ModuleConfig.RemoteHardwareConfig: SwiftProtobuf.Message, SwiftProtobu } } +extension ModuleConfig.NeighborInfoConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = ModuleConfig.protoMessageName + ".NeighborInfoConfig" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "enabled"), + 2: .standard(proto: "update_interval"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.enabled) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.updateInterval) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.enabled != false { + try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1) + } + if self.updateInterval != 0 { + try visitor.visitSingularUInt32Field(value: self.updateInterval, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: ModuleConfig.NeighborInfoConfig, rhs: ModuleConfig.NeighborInfoConfig) -> Bool { + if lhs.enabled != rhs.enabled {return false} + if lhs.updateInterval != rhs.updateInterval {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + extension ModuleConfig.AudioConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = ModuleConfig.protoMessageName + ".AudioConfig" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ @@ -1414,6 +1520,7 @@ extension ModuleConfig.SerialConfig: SwiftProtobuf.Message, SwiftProtobuf._Messa 5: .same(proto: "baud"), 6: .same(proto: "timeout"), 7: .same(proto: "mode"), + 8: .standard(proto: "override_console_serial_port"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1429,6 +1536,7 @@ extension ModuleConfig.SerialConfig: SwiftProtobuf.Message, SwiftProtobuf._Messa case 5: try { try decoder.decodeSingularEnumField(value: &self.baud) }() case 6: try { try decoder.decodeSingularUInt32Field(value: &self.timeout) }() case 7: try { try decoder.decodeSingularEnumField(value: &self.mode) }() + case 8: try { try decoder.decodeSingularBoolField(value: &self.overrideConsoleSerialPort) }() default: break } } @@ -1456,6 +1564,9 @@ extension ModuleConfig.SerialConfig: SwiftProtobuf.Message, SwiftProtobuf._Messa if self.mode != .default { try visitor.visitSingularEnumField(value: self.mode, fieldNumber: 7) } + if self.overrideConsoleSerialPort != false { + try visitor.visitSingularBoolField(value: self.overrideConsoleSerialPort, fieldNumber: 8) + } try unknownFields.traverse(visitor: &visitor) } @@ -1467,6 +1578,7 @@ extension ModuleConfig.SerialConfig: SwiftProtobuf.Message, SwiftProtobuf._Messa if lhs.baud != rhs.baud {return false} if lhs.timeout != rhs.timeout {return false} if lhs.mode != rhs.mode {return false} + if lhs.overrideConsoleSerialPort != rhs.overrideConsoleSerialPort {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } @@ -1500,6 +1612,7 @@ extension ModuleConfig.SerialConfig.Serial_Mode: SwiftProtobuf._ProtoNameProvidi 2: .same(proto: "PROTO"), 3: .same(proto: "TEXTMSG"), 4: .same(proto: "NMEA"), + 5: .same(proto: "CALTOPO"), ] }