From 8b8108c5a34b9990eb8c22c67a3583fba91a2c95 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 9 Jan 2023 18:01:27 -0800 Subject: [PATCH] Update protobufs Don't allow leading zero for BLE fixed pin Comment out ethMode --- Meshtastic/Enums/EthernetModes.swift | 6 +- Meshtastic/Protobufs/admin.pb.swift | 98 +++++++++++++++ Meshtastic/Protobufs/config.pb.swift | 108 +++++++++++++++-- Meshtastic/Protobufs/localonly.pb.swift | 19 +++ Meshtastic/Protobufs/mesh.pb.swift | 114 ++++++++++++++++++ Meshtastic/Protobufs/module_config.pb.swift | 84 +++++++++++++ .../Settings/Config/BluetoothConfig.swift | 4 + .../Views/Settings/Config/NetworkConfig.swift | 2 +- 8 files changed, 420 insertions(+), 15 deletions(-) diff --git a/Meshtastic/Enums/EthernetModes.swift b/Meshtastic/Enums/EthernetModes.swift index 2297cd04..352586bd 100644 --- a/Meshtastic/Enums/EthernetModes.swift +++ b/Meshtastic/Enums/EthernetModes.swift @@ -24,14 +24,14 @@ enum EthernetMode: Int, CaseIterable, Identifiable { } } } - func protoEnumValue() -> Config.NetworkConfig.EthMode { + func protoEnumValue() -> Config.NetworkConfig.AddressMode { switch self { case .dhcp: - return Config.NetworkConfig.EthMode.dhcp + return Config.NetworkConfig.AddressMode.dhcp case .staticip: - return Config.NetworkConfig.EthMode.static + return Config.NetworkConfig.AddressMode.static } } } diff --git a/Meshtastic/Protobufs/admin.pb.swift b/Meshtastic/Protobufs/admin.pb.swift index 21b5f2a0..ec6d69a8 100644 --- a/Meshtastic/Protobufs/admin.pb.swift +++ b/Meshtastic/Protobufs/admin.pb.swift @@ -154,6 +154,26 @@ struct AdminMessage { set {payloadVariant = .getDeviceMetadataResponse(newValue)} } + /// + /// Get the Ringtone in the response to this message. + var getRingtoneRequest: Bool { + get { + if case .getRingtoneRequest(let v)? = payloadVariant {return v} + return false + } + set {payloadVariant = .getRingtoneRequest(newValue)} + } + + /// + /// Get the Ringtone in the response to this message. + var getRingtoneResponse: String { + get { + if case .getRingtoneResponse(let v)? = payloadVariant {return v} + return String() + } + set {payloadVariant = .getRingtoneResponse(newValue)} + } + /// /// Set the owner for this node var setOwner: User { @@ -208,6 +228,16 @@ struct AdminMessage { set {payloadVariant = .setCannedMessageModuleMessages(newValue)} } + /// + /// Set the ringtone for ExternalNotification. + var setRingtoneMessage: String { + get { + if case .setRingtoneMessage(let v)? = payloadVariant {return v} + return String() + } + set {payloadVariant = .setRingtoneMessage(newValue)} + } + /// /// Begins an edit transaction for config, module config, owner, and channel settings changes /// This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings) @@ -357,6 +387,12 @@ struct AdminMessage { /// Device metadata response case getDeviceMetadataResponse(DeviceMetadata) /// + /// Get the Ringtone in the response to this message. + case getRingtoneRequest(Bool) + /// + /// Get the Ringtone in the response to this message. + case getRingtoneResponse(String) + /// /// Set the owner for this node case setOwner(User) /// @@ -376,6 +412,9 @@ struct AdminMessage { /// Set the Canned Message Module messages text. case setCannedMessageModuleMessages(String) /// + /// Set the ringtone for ExternalNotification. + case setRingtoneMessage(String) + /// /// Begins an edit transaction for config, module config, owner, and channel settings changes /// This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings) case beginEditSettings(Bool) @@ -466,6 +505,14 @@ struct AdminMessage { guard case .getDeviceMetadataResponse(let l) = lhs, case .getDeviceMetadataResponse(let r) = rhs else { preconditionFailure() } return l == r }() + case (.getRingtoneRequest, .getRingtoneRequest): return { + guard case .getRingtoneRequest(let l) = lhs, case .getRingtoneRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getRingtoneResponse, .getRingtoneResponse): return { + guard case .getRingtoneResponse(let l) = lhs, case .getRingtoneResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() case (.setOwner, .setOwner): return { guard case .setOwner(let l) = lhs, case .setOwner(let r) = rhs else { preconditionFailure() } return l == r @@ -486,6 +533,10 @@ struct AdminMessage { guard case .setCannedMessageModuleMessages(let l) = lhs, case .setCannedMessageModuleMessages(let r) = rhs else { preconditionFailure() } return l == r }() + case (.setRingtoneMessage, .setRingtoneMessage): return { + guard case .setRingtoneMessage(let l) = lhs, case .setRingtoneMessage(let r) = rhs else { preconditionFailure() } + return l == r + }() case (.beginEditSettings, .beginEditSettings): return { guard case .beginEditSettings(let l) = lhs, case .beginEditSettings(let r) = rhs else { preconditionFailure() } return l == r @@ -634,6 +685,10 @@ struct AdminMessage { /// /// TODO: REPLACE case audioConfig // = 7 + + /// + /// TODO: REPLACE + case remotehardwareConfig // = 8 case UNRECOGNIZED(Int) init() { @@ -650,6 +705,7 @@ struct AdminMessage { case 5: self = .telemetryConfig case 6: self = .cannedmsgConfig case 7: self = .audioConfig + case 8: self = .remotehardwareConfig default: self = .UNRECOGNIZED(rawValue) } } @@ -664,6 +720,7 @@ struct AdminMessage { case .telemetryConfig: return 5 case .cannedmsgConfig: return 6 case .audioConfig: return 7 + case .remotehardwareConfig: return 8 case .UNRECOGNIZED(let i): return i } } @@ -699,6 +756,7 @@ extension AdminMessage.ModuleConfigType: CaseIterable { .telemetryConfig, .cannedmsgConfig, .audioConfig, + .remotehardwareConfig, ] } @@ -728,11 +786,14 @@ extension AdminMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat 11: .standard(proto: "get_canned_message_module_messages_response"), 12: .standard(proto: "get_device_metadata_request"), 13: .standard(proto: "get_device_metadata_response"), + 14: .standard(proto: "get_ringtone_request"), + 15: .standard(proto: "get_ringtone_response"), 32: .standard(proto: "set_owner"), 33: .standard(proto: "set_channel"), 34: .standard(proto: "set_config"), 35: .standard(proto: "set_module_config"), 36: .standard(proto: "set_canned_message_module_messages"), + 37: .standard(proto: "set_ringtone_message"), 64: .standard(proto: "begin_edit_settings"), 65: .standard(proto: "commit_edit_settings"), 66: .standard(proto: "confirm_set_channel"), @@ -872,6 +933,22 @@ extension AdminMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat self.payloadVariant = .getDeviceMetadataResponse(v) } }() + case 14: try { + var v: Bool? + try decoder.decodeSingularBoolField(value: &v) + if let v = v { + if self.payloadVariant != nil {try decoder.handleConflictingOneOf()} + self.payloadVariant = .getRingtoneRequest(v) + } + }() + case 15: try { + var v: String? + try decoder.decodeSingularStringField(value: &v) + if let v = v { + if self.payloadVariant != nil {try decoder.handleConflictingOneOf()} + self.payloadVariant = .getRingtoneResponse(v) + } + }() case 32: try { var v: User? var hadOneofValue = false @@ -932,6 +1009,14 @@ extension AdminMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat self.payloadVariant = .setCannedMessageModuleMessages(v) } }() + case 37: try { + var v: String? + try decoder.decodeSingularStringField(value: &v) + if let v = v { + if self.payloadVariant != nil {try decoder.handleConflictingOneOf()} + self.payloadVariant = .setRingtoneMessage(v) + } + }() case 64: try { var v: Bool? try decoder.decodeSingularBoolField(value: &v) @@ -1071,6 +1156,14 @@ extension AdminMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat guard case .getDeviceMetadataResponse(let v)? = self.payloadVariant else { preconditionFailure() } try visitor.visitSingularMessageField(value: v, fieldNumber: 13) }() + case .getRingtoneRequest?: try { + guard case .getRingtoneRequest(let v)? = self.payloadVariant else { preconditionFailure() } + try visitor.visitSingularBoolField(value: v, fieldNumber: 14) + }() + case .getRingtoneResponse?: try { + guard case .getRingtoneResponse(let v)? = self.payloadVariant else { preconditionFailure() } + try visitor.visitSingularStringField(value: v, fieldNumber: 15) + }() case .setOwner?: try { guard case .setOwner(let v)? = self.payloadVariant else { preconditionFailure() } try visitor.visitSingularMessageField(value: v, fieldNumber: 32) @@ -1091,6 +1184,10 @@ extension AdminMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat guard case .setCannedMessageModuleMessages(let v)? = self.payloadVariant else { preconditionFailure() } try visitor.visitSingularStringField(value: v, fieldNumber: 36) }() + case .setRingtoneMessage?: try { + guard case .setRingtoneMessage(let v)? = self.payloadVariant else { preconditionFailure() } + try visitor.visitSingularStringField(value: v, fieldNumber: 37) + }() case .beginEditSettings?: try { guard case .beginEditSettings(let v)? = self.payloadVariant else { preconditionFailure() } try visitor.visitSingularBoolField(value: v, fieldNumber: 64) @@ -1165,5 +1262,6 @@ extension AdminMessage.ModuleConfigType: SwiftProtobuf._ProtoNameProviding { 5: .same(proto: "TELEMETRY_CONFIG"), 6: .same(proto: "CANNEDMSG_CONFIG"), 7: .same(proto: "AUDIO_CONFIG"), + 8: .same(proto: "REMOTEHARDWARE_CONFIG"), ] } diff --git a/Meshtastic/Protobufs/config.pb.swift b/Meshtastic/Protobufs/config.pb.swift index 3c300b12..bc6b37eb 100644 --- a/Meshtastic/Protobufs/config.pb.swift +++ b/Meshtastic/Protobufs/config.pb.swift @@ -474,7 +474,7 @@ struct Config { /// /// acquire an address via DHCP or assign static - var ethMode: Config.NetworkConfig.EthMode = .dhcp + var addressMode: Config.NetworkConfig.AddressMode = .dhcp /// /// struct to keep static address @@ -489,7 +489,7 @@ struct Config { var unknownFields = SwiftProtobuf.UnknownStorage() - enum EthMode: SwiftProtobuf.Enum { + enum AddressMode: SwiftProtobuf.Enum { typealias RawValue = Int /// @@ -592,6 +592,14 @@ struct Config { /// Override auto-detect in screen var oled: Config.DisplayConfig.OledType = .oledAuto + /// + /// Display Mode + var displaymode: Config.DisplayConfig.DisplayMode = .default + + /// + /// Print first line in pseudo-bold? FALSE is original style, TRUE is bold + var headingBold: Bool = false + var unknownFields = SwiftProtobuf.UnknownStorage() /// @@ -739,6 +747,52 @@ struct Config { } + enum DisplayMode: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// + /// Default. The old style for the 128x64 OLED screen + case `default` // = 0 + + /// + /// Rearrange display elements to cater for bicolor OLED displays + case twocolor // = 1 + + /// + /// Same as TwoColor, but with inverted top bar. Not so good for Epaper displays + case inverted // = 2 + + /// + /// TFT Full Color Displays (not implemented yet) + case color // = 3 + case UNRECOGNIZED(Int) + + init() { + self = .default + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .default + case 1: self = .twocolor + case 2: self = .inverted + case 3: self = .color + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .default: return 0 + case .twocolor: return 1 + case .inverted: return 2 + case .color: return 3 + case .UNRECOGNIZED(let i): return i + } + } + + } + init() {} } @@ -1099,9 +1153,9 @@ extension Config.PositionConfig.PositionFlags: CaseIterable { ] } -extension Config.NetworkConfig.EthMode: CaseIterable { +extension Config.NetworkConfig.AddressMode: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. - static var allCases: [Config.NetworkConfig.EthMode] = [ + static var allCases: [Config.NetworkConfig.AddressMode] = [ .dhcp, .static, ] @@ -1136,6 +1190,16 @@ extension Config.DisplayConfig.OledType: CaseIterable { ] } +extension Config.DisplayConfig.DisplayMode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Config.DisplayConfig.DisplayMode] = [ + .default, + .twocolor, + .inverted, + .color, + ] +} + extension Config.LoRaConfig.RegionCode: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. static var allCases: [Config.LoRaConfig.RegionCode] = [ @@ -1189,12 +1253,13 @@ extension Config.PositionConfig: @unchecked Sendable {} extension Config.PositionConfig.PositionFlags: @unchecked Sendable {} extension Config.PowerConfig: @unchecked Sendable {} extension Config.NetworkConfig: @unchecked Sendable {} -extension Config.NetworkConfig.EthMode: @unchecked Sendable {} +extension Config.NetworkConfig.AddressMode: @unchecked Sendable {} extension Config.NetworkConfig.IpV4Config: @unchecked Sendable {} extension Config.DisplayConfig: @unchecked Sendable {} extension Config.DisplayConfig.GpsCoordinateFormat: @unchecked Sendable {} extension Config.DisplayConfig.DisplayUnits: @unchecked Sendable {} extension Config.DisplayConfig.OledType: @unchecked Sendable {} +extension Config.DisplayConfig.DisplayMode: @unchecked Sendable {} extension Config.LoRaConfig: @unchecked Sendable {} extension Config.LoRaConfig.RegionCode: @unchecked Sendable {} extension Config.LoRaConfig.ModemPreset: @unchecked Sendable {} @@ -1607,7 +1672,7 @@ extension Config.NetworkConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp 4: .standard(proto: "wifi_psk"), 5: .standard(proto: "ntp_server"), 6: .standard(proto: "eth_enabled"), - 7: .standard(proto: "eth_mode"), + 7: .standard(proto: "address_mode"), 8: .standard(proto: "ipv4_config"), ] @@ -1622,7 +1687,7 @@ extension Config.NetworkConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp case 4: try { try decoder.decodeSingularStringField(value: &self.wifiPsk) }() case 5: try { try decoder.decodeSingularStringField(value: &self.ntpServer) }() case 6: try { try decoder.decodeSingularBoolField(value: &self.ethEnabled) }() - case 7: try { try decoder.decodeSingularEnumField(value: &self.ethMode) }() + case 7: try { try decoder.decodeSingularEnumField(value: &self.addressMode) }() case 8: try { try decoder.decodeSingularMessageField(value: &self._ipv4Config) }() default: break } @@ -1649,8 +1714,8 @@ extension Config.NetworkConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp if self.ethEnabled != false { try visitor.visitSingularBoolField(value: self.ethEnabled, fieldNumber: 6) } - if self.ethMode != .dhcp { - try visitor.visitSingularEnumField(value: self.ethMode, fieldNumber: 7) + if self.addressMode != .dhcp { + try visitor.visitSingularEnumField(value: self.addressMode, fieldNumber: 7) } try { if let v = self._ipv4Config { try visitor.visitSingularMessageField(value: v, fieldNumber: 8) @@ -1664,14 +1729,14 @@ extension Config.NetworkConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp if lhs.wifiPsk != rhs.wifiPsk {return false} if lhs.ntpServer != rhs.ntpServer {return false} if lhs.ethEnabled != rhs.ethEnabled {return false} - if lhs.ethMode != rhs.ethMode {return false} + if lhs.addressMode != rhs.addressMode {return false} if lhs._ipv4Config != rhs._ipv4Config {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } } -extension Config.NetworkConfig.EthMode: SwiftProtobuf._ProtoNameProviding { +extension Config.NetworkConfig.AddressMode: SwiftProtobuf._ProtoNameProviding { static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ 0: .same(proto: "DHCP"), 1: .same(proto: "STATIC"), @@ -1738,6 +1803,8 @@ extension Config.DisplayConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp 5: .standard(proto: "flip_screen"), 6: .same(proto: "units"), 7: .same(proto: "oled"), + 8: .same(proto: "displaymode"), + 9: .standard(proto: "heading_bold"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1753,6 +1820,8 @@ extension Config.DisplayConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp case 5: try { try decoder.decodeSingularBoolField(value: &self.flipScreen) }() case 6: try { try decoder.decodeSingularEnumField(value: &self.units) }() case 7: try { try decoder.decodeSingularEnumField(value: &self.oled) }() + case 8: try { try decoder.decodeSingularEnumField(value: &self.displaymode) }() + case 9: try { try decoder.decodeSingularBoolField(value: &self.headingBold) }() default: break } } @@ -1780,6 +1849,12 @@ extension Config.DisplayConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp if self.oled != .oledAuto { try visitor.visitSingularEnumField(value: self.oled, fieldNumber: 7) } + if self.displaymode != .default { + try visitor.visitSingularEnumField(value: self.displaymode, fieldNumber: 8) + } + if self.headingBold != false { + try visitor.visitSingularBoolField(value: self.headingBold, fieldNumber: 9) + } try unknownFields.traverse(visitor: &visitor) } @@ -1791,6 +1866,8 @@ extension Config.DisplayConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImp if lhs.flipScreen != rhs.flipScreen {return false} if lhs.units != rhs.units {return false} if lhs.oled != rhs.oled {return false} + if lhs.displaymode != rhs.displaymode {return false} + if lhs.headingBold != rhs.headingBold {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } @@ -1822,6 +1899,15 @@ extension Config.DisplayConfig.OledType: SwiftProtobuf._ProtoNameProviding { ] } +extension Config.DisplayConfig.DisplayMode: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "DEFAULT"), + 1: .same(proto: "TWOCOLOR"), + 2: .same(proto: "INVERTED"), + 3: .same(proto: "COLOR"), + ] +} + extension Config.LoRaConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = Config.protoMessageName + ".LoRaConfig" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ diff --git a/Meshtastic/Protobufs/localonly.pb.swift b/Meshtastic/Protobufs/localonly.pb.swift index 2c89a577..741b8e2d 100644 --- a/Meshtastic/Protobufs/localonly.pb.swift +++ b/Meshtastic/Protobufs/localonly.pb.swift @@ -211,6 +211,17 @@ struct LocalModuleConfig { /// Clears the value of `audio`. Subsequent reads from it will return its default value. mutating func clearAudio() {_uniqueStorage()._audio = nil} + /// + /// The part of the config that is specific to the Remote Hardware module + var remoteHardware: ModuleConfig.RemoteHardwareConfig { + get {return _storage._remoteHardware ?? ModuleConfig.RemoteHardwareConfig()} + set {_uniqueStorage()._remoteHardware = newValue} + } + /// Returns true if `remoteHardware` has been explicitly set. + var hasRemoteHardware: Bool {return _storage._remoteHardware != nil} + /// Clears the value of `remoteHardware`. Subsequent reads from it will return its default value. + mutating func clearRemoteHardware() {_uniqueStorage()._remoteHardware = 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 @@ -369,6 +380,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem 6: .same(proto: "telemetry"), 7: .standard(proto: "canned_message"), 9: .same(proto: "audio"), + 10: .standard(proto: "remote_hardware"), 8: .same(proto: "version"), ] @@ -381,6 +393,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem var _telemetry: ModuleConfig.TelemetryConfig? = nil var _cannedMessage: ModuleConfig.CannedMessageConfig? = nil var _audio: ModuleConfig.AudioConfig? = nil + var _remoteHardware: ModuleConfig.RemoteHardwareConfig? = nil var _version: UInt32 = 0 static let defaultInstance = _StorageClass() @@ -396,6 +409,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem _telemetry = source._telemetry _cannedMessage = source._cannedMessage _audio = source._audio + _remoteHardware = source._remoteHardware _version = source._version } } @@ -424,6 +438,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem case 7: try { try decoder.decodeSingularMessageField(value: &_storage._cannedMessage) }() 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) }() default: break } } @@ -463,6 +478,9 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem try { if let v = _storage._audio { try visitor.visitSingularMessageField(value: v, fieldNumber: 9) } }() + try { if let v = _storage._remoteHardware { + try visitor.visitSingularMessageField(value: v, fieldNumber: 10) + } }() } try unknownFields.traverse(visitor: &visitor) } @@ -480,6 +498,7 @@ extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem if _storage._telemetry != rhs_storage._telemetry {return false} 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._version != rhs_storage._version {return false} return true } diff --git a/Meshtastic/Protobufs/mesh.pb.swift b/Meshtastic/Protobufs/mesh.pb.swift index f0671f23..05e93acc 100644 --- a/Meshtastic/Protobufs/mesh.pb.swift +++ b/Meshtastic/Protobufs/mesh.pb.swift @@ -154,6 +154,10 @@ enum HardwareModel: SwiftProtobuf.Enum { /// New Heltec Wireless Stick Lite with ESP32-S3 CPU case heltecWslV3 // = 44 + /// + /// New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU + case betafpv2400Tx // = 45 + /// /// 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. case privateHw // = 255 @@ -196,6 +200,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case 42: self = .m5Stack case 43: self = .heltecV3 case 44: self = .heltecWslV3 + case 45: self = .betafpv2400Tx case 255: self = .privateHw default: self = .UNRECOGNIZED(rawValue) } @@ -234,6 +239,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case .m5Stack: return 42 case .heltecV3: return 43 case .heltecWslV3: return 44 + case .betafpv2400Tx: return 45 case .privateHw: return 255 case .UNRECOGNIZED(let i): return i } @@ -277,6 +283,7 @@ extension HardwareModel: CaseIterable { .m5Stack, .heltecV3, .heltecWslV3, + .betafpv2400Tx, .privateHw, ] } @@ -1772,6 +1779,28 @@ extension LogRecord.Level: CaseIterable { #endif // swift(>=4.2) +struct QueueStatus { + // 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. + + /// Last attempt to queue status, ErrorCode + var res: Int32 = 0 + + /// Free entries in the outgoing queue + var free: UInt32 = 0 + + /// Maximum entries in the outgoing queue + var maxlen: UInt32 = 0 + + /// What was mesh packet id that generated this response? + var meshPacketID: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + /// /// Packets from the radio to the phone will appear on the fromRadio characteristic. /// It will support READ and NOTIFY. When a new packet arrives the device will BLE notify? @@ -1895,6 +1924,15 @@ struct FromRadio { set {_uniqueStorage()._payloadVariant = .channel(newValue)} } + /// Queue status info + var queueStatus: QueueStatus { + get { + if case .queueStatus(let v)? = _storage._payloadVariant {return v} + return QueueStatus() + } + set {_uniqueStorage()._payloadVariant = .queueStatus(newValue)} + } + var unknownFields = SwiftProtobuf.UnknownStorage() /// @@ -1935,6 +1973,8 @@ struct FromRadio { /// /// One packet is sent for each channel case channel(Channel) + /// Queue status info + case queueStatus(QueueStatus) #if !swift(>=4.1) static func ==(lhs: FromRadio.OneOf_PayloadVariant, rhs: FromRadio.OneOf_PayloadVariant) -> Bool { @@ -1978,6 +2018,10 @@ struct FromRadio { guard case .channel(let l) = lhs, case .channel(let r) = rhs else { preconditionFailure() } return l == r }() + case (.queueStatus, .queueStatus): return { + guard case .queueStatus(let l) = lhs, case .queueStatus(let r) = rhs else { preconditionFailure() } + return l == r + }() default: return false } } @@ -2133,6 +2177,7 @@ extension NodeInfo: @unchecked Sendable {} extension MyNodeInfo: @unchecked Sendable {} extension LogRecord: @unchecked Sendable {} extension LogRecord.Level: @unchecked Sendable {} +extension QueueStatus: @unchecked Sendable {} extension FromRadio: @unchecked Sendable {} extension FromRadio.OneOf_PayloadVariant: @unchecked Sendable {} extension ToRadio: @unchecked Sendable {} @@ -2175,6 +2220,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding { 42: .same(proto: "M5STACK"), 43: .same(proto: "HELTEC_V3"), 44: .same(proto: "HELTEC_WSL_V3"), + 45: .same(proto: "BETAFPV_2400_TX"), 255: .same(proto: "PRIVATE_HW"), ] } @@ -3245,6 +3291,56 @@ extension LogRecord.Level: SwiftProtobuf._ProtoNameProviding { ] } +extension QueueStatus: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = "QueueStatus" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "res"), + 2: .same(proto: "free"), + 3: .same(proto: "maxlen"), + 4: .standard(proto: "mesh_packet_id"), + ] + + 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.decodeSingularInt32Field(value: &self.res) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.free) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.maxlen) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.meshPacketID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.res != 0 { + try visitor.visitSingularInt32Field(value: self.res, fieldNumber: 1) + } + if self.free != 0 { + try visitor.visitSingularUInt32Field(value: self.free, fieldNumber: 2) + } + if self.maxlen != 0 { + try visitor.visitSingularUInt32Field(value: self.maxlen, fieldNumber: 3) + } + if self.meshPacketID != 0 { + try visitor.visitSingularUInt32Field(value: self.meshPacketID, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: QueueStatus, rhs: QueueStatus) -> Bool { + if lhs.res != rhs.res {return false} + if lhs.free != rhs.free {return false} + if lhs.maxlen != rhs.maxlen {return false} + if lhs.meshPacketID != rhs.meshPacketID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + extension FromRadio: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "FromRadio" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ @@ -3258,6 +3354,7 @@ extension FromRadio: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementation 8: .same(proto: "rebooted"), 9: .same(proto: "moduleConfig"), 10: .same(proto: "channel"), + 11: .same(proto: "queueStatus"), ] fileprivate class _StorageClass { @@ -3397,6 +3494,19 @@ extension FromRadio: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementation _storage._payloadVariant = .channel(v) } }() + case 11: try { + var v: QueueStatus? + var hadOneofValue = false + if let current = _storage._payloadVariant { + hadOneofValue = true + if case .queueStatus(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v { + if hadOneofValue {try decoder.handleConflictingOneOf()} + _storage._payloadVariant = .queueStatus(v) + } + }() default: break } } @@ -3449,6 +3559,10 @@ extension FromRadio: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementation guard case .channel(let v)? = _storage._payloadVariant else { preconditionFailure() } try visitor.visitSingularMessageField(value: v, fieldNumber: 10) }() + case .queueStatus?: try { + guard case .queueStatus(let v)? = _storage._payloadVariant else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 11) + }() case nil: break } } diff --git a/Meshtastic/Protobufs/module_config.pb.swift b/Meshtastic/Protobufs/module_config.pb.swift index 19fa66f7..74a8e7a1 100644 --- a/Meshtastic/Protobufs/module_config.pb.swift +++ b/Meshtastic/Protobufs/module_config.pb.swift @@ -111,6 +111,16 @@ struct ModuleConfig { set {payloadVariant = .audio(newValue)} } + /// + /// TODO: REPLACE + var remoteHardware: ModuleConfig.RemoteHardwareConfig { + get { + if case .remoteHardware(let v)? = payloadVariant {return v} + return ModuleConfig.RemoteHardwareConfig() + } + set {payloadVariant = .remoteHardware(newValue)} + } + var unknownFields = SwiftProtobuf.UnknownStorage() /// @@ -140,6 +150,9 @@ struct ModuleConfig { /// /// TODO: REPLACE case audio(ModuleConfig.AudioConfig) + /// + /// TODO: REPLACE + case remoteHardware(ModuleConfig.RemoteHardwareConfig) #if !swift(>=4.1) static func ==(lhs: ModuleConfig.OneOf_PayloadVariant, rhs: ModuleConfig.OneOf_PayloadVariant) -> Bool { @@ -179,6 +192,10 @@ struct ModuleConfig { guard case .audio(let l) = lhs, case .audio(let r) = rhs else { preconditionFailure() } return l == r }() + case (.remoteHardware, .remoteHardware): return { + guard case .remoteHardware(let l) = lhs, case .remoteHardware(let r) = rhs else { preconditionFailure() } + return l == r + }() default: return false } } @@ -230,6 +247,22 @@ struct ModuleConfig { init() {} } + /// + /// RemoteHardwareModule Config + struct RemoteHardwareConfig { + // 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 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + } + /// /// Audio Config for codec2 voice struct AudioConfig { @@ -844,6 +877,7 @@ extension ModuleConfig.CannedMessageConfig.InputEventChar: CaseIterable { extension ModuleConfig: @unchecked Sendable {} extension ModuleConfig.OneOf_PayloadVariant: @unchecked Sendable {} extension ModuleConfig.MQTTConfig: @unchecked Sendable {} +extension ModuleConfig.RemoteHardwareConfig: @unchecked Sendable {} extension ModuleConfig.AudioConfig: @unchecked Sendable {} extension ModuleConfig.AudioConfig.Audio_Baud: @unchecked Sendable {} extension ModuleConfig.SerialConfig: @unchecked Sendable {} @@ -870,6 +904,7 @@ extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat 6: .same(proto: "telemetry"), 7: .standard(proto: "canned_message"), 8: .same(proto: "audio"), + 9: .standard(proto: "remote_hardware"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -982,6 +1017,19 @@ extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat self.payloadVariant = .audio(v) } }() + case 9: try { + var v: ModuleConfig.RemoteHardwareConfig? + var hadOneofValue = false + if let current = self.payloadVariant { + hadOneofValue = true + if case .remoteHardware(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v { + if hadOneofValue {try decoder.handleConflictingOneOf()} + self.payloadVariant = .remoteHardware(v) + } + }() default: break } } @@ -1025,6 +1073,10 @@ extension ModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat guard case .audio(let v)? = self.payloadVariant else { preconditionFailure() } try visitor.visitSingularMessageField(value: v, fieldNumber: 8) }() + case .remoteHardware?: try { + guard case .remoteHardware(let v)? = self.payloadVariant else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 9) + }() case nil: break } try unknownFields.traverse(visitor: &visitor) @@ -1099,6 +1151,38 @@ extension ModuleConfig.MQTTConfig: SwiftProtobuf.Message, SwiftProtobuf._Message } } +extension ModuleConfig.RemoteHardwareConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = ModuleConfig.protoMessageName + ".RemoteHardwareConfig" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "enabled"), + ] + + 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) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.enabled != false { + try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: ModuleConfig.RemoteHardwareConfig, rhs: ModuleConfig.RemoteHardwareConfig) -> Bool { + if lhs.enabled != rhs.enabled {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 = [ diff --git a/Meshtastic/Views/Settings/Config/BluetoothConfig.swift b/Meshtastic/Views/Settings/Config/BluetoothConfig.swift index 16afc341..ead9c3a6 100644 --- a/Meshtastic/Views/Settings/Config/BluetoothConfig.swift +++ b/Meshtastic/Views/Settings/Config/BluetoothConfig.swift @@ -54,6 +54,10 @@ struct BluetoothConfig: View { TextField("bluetooth.mode.fixedpin", text: $fixedPin) .foregroundColor(.gray) .onChange(of: fixedPin, perform: { value in + // Don't let the first character be 0 because it will get stripped when saving a UInt32 + if fixedPin.first == "0" { + fixedPin = fixedPin.replacing("0", with: "") + } //Require that pin is no more than 6 numbers and no less than 6 numbers if fixedPin.utf8.count == pinLength { shortPin = false diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index 58c022f0..8f57c6b3 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -114,7 +114,7 @@ struct NetworkConfig: View { network.wifiSsid = self.wifiSsid network.wifiPsk = self.wifiPsk network.ethEnabled = self.ethEnabled - network.ethMode = Config.NetworkConfig.EthMode.dhcp + //network.addressMode = Config.NetworkConfig.AddressMode.dhcp let adminMessageId = bleManager.saveWiFiConfig(config: network, fromUser: node!.user!, toUser: node!.user!) if adminMessageId > 0 {