diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV11.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV11.xcdatamodel/contents index bd103e74..689184f3 100644 --- a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV11.xcdatamodel/contents +++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV11.xcdatamodel/contents @@ -43,6 +43,7 @@ + @@ -149,6 +150,7 @@ + @@ -253,6 +255,7 @@ + diff --git a/Meshtastic/Protobufs/meshtastic/channel.pb.swift b/Meshtastic/Protobufs/meshtastic/channel.pb.swift index f635dddd..a3a89d0d 100644 --- a/Meshtastic/Protobufs/meshtastic/channel.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/channel.pb.swift @@ -21,11 +21,9 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP } /// -/// Full settings (center freq, spread factor, pre-shared secret key etc...) -/// needed to configure a radio for speaking on a particular channel This -/// information can be encoded as a QRcode/url so that other users can configure +/// This information can be encoded as a QRcode/url so that other users can configure /// their radio to join the same channel. -/// A note about how channel names are shown to users: channelname-Xy +/// A note about how channel names are shown to users: channelname-X /// poundsymbol is a prefix used to indicate this is a channel name (idea from @professr). /// Where X is a letter from A-Z (base 26) representing a hash of the PSK for this /// channel - so that if the user changes anything about the channel (which does @@ -35,8 +33,6 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26" /// This also allows the option of someday if people have the PSK off (zero), the /// users COULD type in a channel name and be able to talk. -/// Y is a lower case letter from a-z that represents the channel 'speed' settings -/// (for some future definition of speed) /// FIXME: Add description of multi-channel support and how primary vs secondary channels are used. /// FIXME: explain how apps use channels for security. /// explain how remote settings and remote gpio are managed as an example @@ -57,7 +53,7 @@ struct ChannelSettings { /// because they are listed in this source code. /// Those bytes are mapped using the following scheme: /// `0` = No crypto - /// `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0xbf} + /// `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0x01} /// `2` through 10 = The default channel key, except with 1 through 9 added to the last byte. /// Shown to user as simple1 through 10 var psk: Data = Data() diff --git a/Meshtastic/Protobufs/meshtastic/config.pb.swift b/Meshtastic/Protobufs/meshtastic/config.pb.swift index 4f92bedd..8c502d60 100644 --- a/Meshtastic/Protobufs/meshtastic/config.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/config.pb.swift @@ -177,6 +177,10 @@ struct Config { /// Defaults to 900 Seconds (15 minutes) var nodeInfoBroadcastSecs: UInt32 = 0 + /// + /// Treat double tap interrupt on supported accelerometers as a button press if set to true + var doubleTapAsButtonPress: Bool = false + var unknownFields = SwiftProtobuf.UnknownStorage() /// @@ -1587,6 +1591,7 @@ extension Config.DeviceConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl 5: .standard(proto: "buzzer_gpio"), 6: .standard(proto: "rebroadcast_mode"), 7: .standard(proto: "node_info_broadcast_secs"), + 8: .standard(proto: "double_tap_as_button_press"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1602,6 +1607,7 @@ extension Config.DeviceConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl case 5: try { try decoder.decodeSingularUInt32Field(value: &self.buzzerGpio) }() case 6: try { try decoder.decodeSingularEnumField(value: &self.rebroadcastMode) }() case 7: try { try decoder.decodeSingularUInt32Field(value: &self.nodeInfoBroadcastSecs) }() + case 8: try { try decoder.decodeSingularBoolField(value: &self.doubleTapAsButtonPress) }() default: break } } @@ -1629,6 +1635,9 @@ extension Config.DeviceConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl if self.nodeInfoBroadcastSecs != 0 { try visitor.visitSingularUInt32Field(value: self.nodeInfoBroadcastSecs, fieldNumber: 7) } + if self.doubleTapAsButtonPress != false { + try visitor.visitSingularBoolField(value: self.doubleTapAsButtonPress, fieldNumber: 8) + } try unknownFields.traverse(visitor: &visitor) } @@ -1640,6 +1649,7 @@ extension Config.DeviceConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl if lhs.buzzerGpio != rhs.buzzerGpio {return false} if lhs.rebroadcastMode != rhs.rebroadcastMode {return false} if lhs.nodeInfoBroadcastSecs != rhs.nodeInfoBroadcastSecs {return false} + if lhs.doubleTapAsButtonPress != rhs.doubleTapAsButtonPress {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/Meshtastic/Protobufs/meshtastic/module_config.pb.swift b/Meshtastic/Protobufs/meshtastic/module_config.pb.swift index 914b5f9f..5c5f151c 100644 --- a/Meshtastic/Protobufs/meshtastic/module_config.pb.swift +++ b/Meshtastic/Protobufs/meshtastic/module_config.pb.swift @@ -242,6 +242,10 @@ struct ModuleConfig { /// Whether to send / consume json packets on MQTT var jsonEnabled: Bool = false + /// + /// If true, we attempt to establish a secure connection using TLS + var tlsEnabled: Bool = false + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} @@ -1109,6 +1113,7 @@ extension ModuleConfig.MQTTConfig: SwiftProtobuf.Message, SwiftProtobuf._Message 4: .same(proto: "password"), 5: .standard(proto: "encryption_enabled"), 6: .standard(proto: "json_enabled"), + 7: .standard(proto: "tls_enabled"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1123,6 +1128,7 @@ extension ModuleConfig.MQTTConfig: SwiftProtobuf.Message, SwiftProtobuf._Message case 4: try { try decoder.decodeSingularStringField(value: &self.password) }() case 5: try { try decoder.decodeSingularBoolField(value: &self.encryptionEnabled) }() case 6: try { try decoder.decodeSingularBoolField(value: &self.jsonEnabled) }() + case 7: try { try decoder.decodeSingularBoolField(value: &self.tlsEnabled) }() default: break } } @@ -1147,6 +1153,9 @@ extension ModuleConfig.MQTTConfig: SwiftProtobuf.Message, SwiftProtobuf._Message if self.jsonEnabled != false { try visitor.visitSingularBoolField(value: self.jsonEnabled, fieldNumber: 6) } + if self.tlsEnabled != false { + try visitor.visitSingularBoolField(value: self.tlsEnabled, fieldNumber: 7) + } try unknownFields.traverse(visitor: &visitor) } @@ -1157,6 +1166,7 @@ extension ModuleConfig.MQTTConfig: SwiftProtobuf.Message, SwiftProtobuf._Message if lhs.password != rhs.password {return false} if lhs.encryptionEnabled != rhs.encryptionEnabled {return false} if lhs.jsonEnabled != rhs.jsonEnabled {return false} + if lhs.tlsEnabled != rhs.tlsEnabled {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index 1de2541c..8451da12 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -47,6 +47,7 @@ struct DeviceMetricsLog: View { .accessibilityLabel("Line Series") .accessibilityValue("X: \(point.time!), Y: \(point.batteryLevel)") .foregroundStyle(batteryChartColor) + .interpolationMethod(.cardinal) Plot { PointMark(