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(