diff --git a/Meshtastic Apple.xcodeproj/project.pbxproj b/Meshtastic Apple.xcodeproj/project.pbxproj index 9c21d671..13e26e66 100644 --- a/Meshtastic Apple.xcodeproj/project.pbxproj +++ b/Meshtastic Apple.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ DDC2E1A726CEB3400042C5E4 /* LocationHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC2E1A626CEB3400042C5E4 /* LocationHelper.swift */; }; DDC3B274283F411B00AC321C /* LastHeardText.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC3B273283F411B00AC321C /* LastHeardText.swift */; }; DDC4D568275499A500A4208E /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC4D567275499A500A4208E /* Persistence.swift */; }; + DDCFF601285453A7005FA625 /* localonly.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDCFF600285453A7005FA625 /* localonly.pb.swift */; }; DDD94A502845C8F5004A87A0 /* DateTimeText.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD94A4F2845C8F5004A87A0 /* DateTimeText.swift */; }; DDD9E4E4284B208E003777C5 /* UserEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD9E4E3284B208E003777C5 /* UserEntityExtension.swift */; }; DDE393BA284E535700473991 /* ChannelHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE393B9284E535700473991 /* ChannelHelper.swift */; }; @@ -146,6 +147,7 @@ DDC2E1A626CEB3400042C5E4 /* LocationHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationHelper.swift; sourceTree = ""; }; DDC3B273283F411B00AC321C /* LastHeardText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastHeardText.swift; sourceTree = ""; }; DDC4D567275499A500A4208E /* Persistence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; + DDCFF600285453A7005FA625 /* localonly.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = localonly.pb.swift; sourceTree = ""; }; DDD94A4F2845C8F5004A87A0 /* DateTimeText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimeText.swift; sourceTree = ""; }; DDD9E4E3284B208E003777C5 /* UserEntityExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserEntityExtension.swift; sourceTree = ""; }; DDE393B9284E535700473991 /* ChannelHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelHelper.swift; sourceTree = ""; }; @@ -240,6 +242,7 @@ DDAF8C5626ED07740058C060 /* Protobufs */ = { isa = PBXGroup; children = ( + DDCFF600285453A7005FA625 /* localonly.pb.swift */, DD4DED8F27AD2975004BA27E /* cannedmessages.pb.swift */, DDAF8C6126ED0A230058C060 /* admin.pb.swift */, C9A88B56278B559900BD810A /* apponly.pb.swift */, @@ -562,6 +565,7 @@ buildActionMask = 2147483647; files = ( DD4DED9027AD2975004BA27E /* cannedmessages.pb.swift in Sources */, + DDCFF601285453A7005FA625 /* localonly.pb.swift in Sources */, DD836AE726F6B38600ABCC23 /* Connect.swift in Sources */, DDAF8C6E26ED19040058C060 /* Extensions.swift in Sources */, DD3501892852FC3B000FC853 /* Settings.swift in Sources */, @@ -776,7 +780,7 @@ CODE_SIGN_ENTITLEMENTS = MeshtasticApple/MeshtasticApple.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_ASSET_PATHS = "\"MeshtasticApple/Preview Content\""; DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_PREVIEWS = YES; @@ -807,7 +811,7 @@ CODE_SIGN_ENTITLEMENTS = MeshtasticApple/MeshtasticApple.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_ASSET_PATHS = "\"MeshtasticApple/Preview Content\""; DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_PREVIEWS = YES; diff --git a/MeshtasticApple/Helpers/BLEManager.swift b/MeshtasticApple/Helpers/BLEManager.swift index ce78febd..a3be6103 100644 --- a/MeshtasticApple/Helpers/BLEManager.swift +++ b/MeshtasticApple/Helpers/BLEManager.swift @@ -34,6 +34,9 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph @Published var isSwitchedOn: Bool = false @Published var isScanning: Bool = false @Published var isConnected: Bool = false + + /// Used to make sure we never get foold by old BLE packets + private var configNonce: UInt32 = 1 var timeoutTimer: Timer? var timeoutTimerCount = 0 @@ -320,7 +323,9 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if meshLoggingEnabled { MeshLogger.log("✅ BLE did discover TORADIO characteristic for Meshtastic by \(peripheral.name ?? "Unknown")") } TORADIO_characteristic = characteristic var toRadio: ToRadio = ToRadio() - toRadio.wantConfigID = UInt32.random(in: UInt32(UInt8.max).. Bool { + + var newConfig = Config.LoRaConfig() + var channel = ChannelSettings() + // var newPrefs = (value.loraConfig).toBuilder() +// newConfig. + return false + } } diff --git a/MeshtasticApple/Helpers/MeshPackets.swift b/MeshtasticApple/Helpers/MeshPackets.swift index 483629b7..fa16ab40 100644 --- a/MeshtasticApple/Helpers/MeshPackets.swift +++ b/MeshtasticApple/Helpers/MeshPackets.swift @@ -556,7 +556,7 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, meshLogging: do { try context.save() - print("💾 Saved a new message for \(packet.id)") + if meshLogging { MeshLogger.log("💾 Saved a new message for \(newMessage.messageId)") } if newMessage.toUser != nil && newMessage.toUser!.num == broadcastNodeNum || connectedNode == newMessage.toUser!.num { diff --git a/MeshtasticApple/Protobufs/localonly.pb.swift b/MeshtasticApple/Protobufs/localonly.pb.swift new file mode 100644 index 00000000..0a5d854e --- /dev/null +++ b/MeshtasticApple/Protobufs/localonly.pb.swift @@ -0,0 +1,419 @@ +// DO NOT EDIT. +// swift-format-ignore-file +// +// Generated by the Swift generator plugin for the protocol buffer compiler. +// Source: localonly.proto +// +// For information on using the generated types, please see the documentation: +// https://github.com/apple/swift-protobuf/ + +import Foundation +import SwiftProtobuf + +// If the compiler emits an error on this type, it is because this file +// was generated by a version of the `protoc` Swift plug-in that is +// incompatible with the version of SwiftProtobuf to which you are linking. +// Please ensure that you are building against the same version of the API +// that was used to generate this file. +fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck { + struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {} + typealias Version = _2 +} + +struct LocalConfig { + // 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. + + /// + /// TODO: REPLACE + var device: Config.DeviceConfig { + get {return _storage._device ?? Config.DeviceConfig()} + set {_uniqueStorage()._device = newValue} + } + /// Returns true if `device` has been explicitly set. + var hasDevice: Bool {return _storage._device != nil} + /// Clears the value of `device`. Subsequent reads from it will return its default value. + mutating func clearDevice() {_uniqueStorage()._device = nil} + + /// + /// TODO: REPLACE + var position: Config.PositionConfig { + get {return _storage._position ?? Config.PositionConfig()} + set {_uniqueStorage()._position = newValue} + } + /// Returns true if `position` has been explicitly set. + var hasPosition: Bool {return _storage._position != nil} + /// Clears the value of `position`. Subsequent reads from it will return its default value. + mutating func clearPosition() {_uniqueStorage()._position = nil} + + /// + /// TODO: REPLACE + var power: Config.PowerConfig { + get {return _storage._power ?? Config.PowerConfig()} + set {_uniqueStorage()._power = newValue} + } + /// Returns true if `power` has been explicitly set. + var hasPower: Bool {return _storage._power != nil} + /// Clears the value of `power`. Subsequent reads from it will return its default value. + mutating func clearPower() {_uniqueStorage()._power = nil} + + /// + /// TODO: REPLACE + var wifi: Config.WiFiConfig { + get {return _storage._wifi ?? Config.WiFiConfig()} + set {_uniqueStorage()._wifi = newValue} + } + /// Returns true if `wifi` has been explicitly set. + var hasWifi: Bool {return _storage._wifi != nil} + /// Clears the value of `wifi`. Subsequent reads from it will return its default value. + mutating func clearWifi() {_uniqueStorage()._wifi = nil} + + /// + /// TODO: REPLACE + var display: Config.DisplayConfig { + get {return _storage._display ?? Config.DisplayConfig()} + set {_uniqueStorage()._display = newValue} + } + /// Returns true if `display` has been explicitly set. + var hasDisplay: Bool {return _storage._display != nil} + /// Clears the value of `display`. Subsequent reads from it will return its default value. + mutating func clearDisplay() {_uniqueStorage()._display = nil} + + /// + /// TODO: REPLACE + var lora: Config.LoRaConfig { + get {return _storage._lora ?? Config.LoRaConfig()} + set {_uniqueStorage()._lora = newValue} + } + /// Returns true if `lora` has been explicitly set. + var hasLora: Bool {return _storage._lora != nil} + /// Clears the value of `lora`. Subsequent reads from it will return its default value. + mutating func clearLora() {_uniqueStorage()._lora = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct LocalModuleConfig { + // 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. + + /// + /// TODO: REPLACE + var mqtt: ModuleConfig.MQTTConfig { + get {return _storage._mqtt ?? ModuleConfig.MQTTConfig()} + set {_uniqueStorage()._mqtt = newValue} + } + /// Returns true if `mqtt` has been explicitly set. + var hasMqtt: Bool {return _storage._mqtt != nil} + /// Clears the value of `mqtt`. Subsequent reads from it will return its default value. + mutating func clearMqtt() {_uniqueStorage()._mqtt = nil} + + /// + /// TODO: REPLACE + var serial: ModuleConfig.SerialConfig { + get {return _storage._serial ?? ModuleConfig.SerialConfig()} + set {_uniqueStorage()._serial = newValue} + } + /// Returns true if `serial` has been explicitly set. + var hasSerial: Bool {return _storage._serial != nil} + /// Clears the value of `serial`. Subsequent reads from it will return its default value. + mutating func clearSerial() {_uniqueStorage()._serial = nil} + + /// + /// TODO: REPLACE + var externalNotification: ModuleConfig.ExternalNotificationConfig { + get {return _storage._externalNotification ?? ModuleConfig.ExternalNotificationConfig()} + set {_uniqueStorage()._externalNotification = newValue} + } + /// Returns true if `externalNotification` has been explicitly set. + var hasExternalNotification: Bool {return _storage._externalNotification != nil} + /// Clears the value of `externalNotification`. Subsequent reads from it will return its default value. + mutating func clearExternalNotification() {_uniqueStorage()._externalNotification = nil} + + /// + /// TODO: REPLACE + var storeForward: ModuleConfig.StoreForwardConfig { + get {return _storage._storeForward ?? ModuleConfig.StoreForwardConfig()} + set {_uniqueStorage()._storeForward = newValue} + } + /// Returns true if `storeForward` has been explicitly set. + var hasStoreForward: Bool {return _storage._storeForward != nil} + /// Clears the value of `storeForward`. Subsequent reads from it will return its default value. + mutating func clearStoreForward() {_uniqueStorage()._storeForward = nil} + + /// + /// TODO: REPLACE + var rangeTest: ModuleConfig.RangeTestConfig { + get {return _storage._rangeTest ?? ModuleConfig.RangeTestConfig()} + set {_uniqueStorage()._rangeTest = newValue} + } + /// Returns true if `rangeTest` has been explicitly set. + var hasRangeTest: Bool {return _storage._rangeTest != nil} + /// Clears the value of `rangeTest`. Subsequent reads from it will return its default value. + mutating func clearRangeTest() {_uniqueStorage()._rangeTest = nil} + + /// + /// TODO: REPLACE + var telemetry: ModuleConfig.TelemetryConfig { + get {return _storage._telemetry ?? ModuleConfig.TelemetryConfig()} + set {_uniqueStorage()._telemetry = newValue} + } + /// Returns true if `telemetry` has been explicitly set. + var hasTelemetry: Bool {return _storage._telemetry != nil} + /// Clears the value of `telemetry`. Subsequent reads from it will return its default value. + mutating func clearTelemetry() {_uniqueStorage()._telemetry = nil} + + /// + /// TODO: REPLACE + var cannedMessage: ModuleConfig.CannedMessageConfig { + get {return _storage._cannedMessage ?? ModuleConfig.CannedMessageConfig()} + set {_uniqueStorage()._cannedMessage = newValue} + } + /// Returns true if `cannedMessage` has been explicitly set. + var hasCannedMessage: Bool {return _storage._cannedMessage != nil} + /// Clears the value of `cannedMessage`. Subsequent reads from it will return its default value. + mutating func clearCannedMessage() {_uniqueStorage()._cannedMessage = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +#if swift(>=5.5) && canImport(_Concurrency) +extension LocalConfig: @unchecked Sendable {} +extension LocalModuleConfig: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + +// MARK: - Code below here is support for the SwiftProtobuf runtime. + +extension LocalConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = "LocalConfig" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "device"), + 2: .same(proto: "position"), + 3: .same(proto: "power"), + 4: .same(proto: "wifi"), + 5: .same(proto: "display"), + 6: .same(proto: "lora"), + ] + + fileprivate class _StorageClass { + var _device: Config.DeviceConfig? = nil + var _position: Config.PositionConfig? = nil + var _power: Config.PowerConfig? = nil + var _wifi: Config.WiFiConfig? = nil + var _display: Config.DisplayConfig? = nil + var _lora: Config.LoRaConfig? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _device = source._device + _position = source._position + _power = source._power + _wifi = source._wifi + _display = source._display + _lora = source._lora + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + 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.decodeSingularMessageField(value: &_storage._device) }() + case 2: try { try decoder.decodeSingularMessageField(value: &_storage._position) }() + case 3: try { try decoder.decodeSingularMessageField(value: &_storage._power) }() + case 4: try { try decoder.decodeSingularMessageField(value: &_storage._wifi) }() + case 5: try { try decoder.decodeSingularMessageField(value: &_storage._display) }() + case 6: try { try decoder.decodeSingularMessageField(value: &_storage._lora) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + try { if let v = _storage._device { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } }() + try { if let v = _storage._position { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } }() + try { if let v = _storage._power { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } }() + try { if let v = _storage._wifi { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } }() + try { if let v = _storage._display { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } }() + try { if let v = _storage._lora { + try visitor.visitSingularMessageField(value: v, fieldNumber: 6) + } }() + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: LocalConfig, rhs: LocalConfig) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._device != rhs_storage._device {return false} + if _storage._position != rhs_storage._position {return false} + if _storage._power != rhs_storage._power {return false} + if _storage._wifi != rhs_storage._wifi {return false} + if _storage._display != rhs_storage._display {return false} + if _storage._lora != rhs_storage._lora {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension LocalModuleConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = "LocalModuleConfig" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "mqtt"), + 2: .same(proto: "serial"), + 3: .standard(proto: "external_notification"), + 4: .standard(proto: "store_forward"), + 5: .standard(proto: "range_test"), + 6: .same(proto: "telemetry"), + 7: .standard(proto: "canned_message"), + ] + + fileprivate class _StorageClass { + var _mqtt: ModuleConfig.MQTTConfig? = nil + var _serial: ModuleConfig.SerialConfig? = nil + var _externalNotification: ModuleConfig.ExternalNotificationConfig? = nil + var _storeForward: ModuleConfig.StoreForwardConfig? = nil + var _rangeTest: ModuleConfig.RangeTestConfig? = nil + var _telemetry: ModuleConfig.TelemetryConfig? = nil + var _cannedMessage: ModuleConfig.CannedMessageConfig? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _mqtt = source._mqtt + _serial = source._serial + _externalNotification = source._externalNotification + _storeForward = source._storeForward + _rangeTest = source._rangeTest + _telemetry = source._telemetry + _cannedMessage = source._cannedMessage + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + 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.decodeSingularMessageField(value: &_storage._mqtt) }() + case 2: try { try decoder.decodeSingularMessageField(value: &_storage._serial) }() + case 3: try { try decoder.decodeSingularMessageField(value: &_storage._externalNotification) }() + case 4: try { try decoder.decodeSingularMessageField(value: &_storage._storeForward) }() + case 5: try { try decoder.decodeSingularMessageField(value: &_storage._rangeTest) }() + case 6: try { try decoder.decodeSingularMessageField(value: &_storage._telemetry) }() + case 7: try { try decoder.decodeSingularMessageField(value: &_storage._cannedMessage) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every if/case branch local when no optimizations + // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and + // https://github.com/apple/swift-protobuf/issues/1182 + try { if let v = _storage._mqtt { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } }() + try { if let v = _storage._serial { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } }() + try { if let v = _storage._externalNotification { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } }() + try { if let v = _storage._storeForward { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } }() + try { if let v = _storage._rangeTest { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } }() + try { if let v = _storage._telemetry { + try visitor.visitSingularMessageField(value: v, fieldNumber: 6) + } }() + try { if let v = _storage._cannedMessage { + try visitor.visitSingularMessageField(value: v, fieldNumber: 7) + } }() + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: LocalModuleConfig, rhs: LocalModuleConfig) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._mqtt != rhs_storage._mqtt {return false} + if _storage._serial != rhs_storage._serial {return false} + if _storage._externalNotification != rhs_storage._externalNotification {return false} + if _storage._storeForward != rhs_storage._storeForward {return false} + if _storage._rangeTest != rhs_storage._rangeTest {return false} + if _storage._telemetry != rhs_storage._telemetry {return false} + if _storage._cannedMessage != rhs_storage._cannedMessage {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} diff --git a/MeshtasticApple/Views/Settings/ShareChannel.swift b/MeshtasticApple/Views/Settings/ShareChannel.swift index b66d3fec..4cacb29e 100644 --- a/MeshtasticApple/Views/Settings/ShareChannel.swift +++ b/MeshtasticApple/Views/Settings/ShareChannel.swift @@ -38,7 +38,7 @@ struct ShareChannel: View { let channelSet = ChannelSet() - @State private var text = "https://wwww.meshtastic.org/e/#" + @State private var text = "https://meshtastic.org/e/#" var qrCodeImage = QrCodeImage() var body: some View { diff --git a/gen_protos.sh b/gen_protos.sh index bf9b4e82..0dd3c382 100755 --- a/gen_protos.sh +++ b/gen_protos.sh @@ -13,9 +13,10 @@ if [ ! -x "`which protoc`" ]; then fi pdir=$(realpath "../Meshtastic-protobufs") -sdir=$(realpath "./MeshtasticClient/Protobufs") +sdir=$(realpath "./MeshtasticApple/Protobufs") echo "pdir:$pdir sdir:$sdir" -pfiles="admin.proto apponly.proto cannedmessages.proto channel.proto config.proto deviceonly.proto mesh.proto module_config.proto mqtt.proto portnums.proto remote_hardware.proto storeforward.proto telemetry.proto" +pfiles="admin.proto apponly.proto cannedmessages.proto channel.proto config.proto deviceonly.proto localonly.proto mesh.proto module_config.proto mqtt.proto portnums.proto remote_hardware.proto +storeforward.proto telemetry.proto" for pf in $pfiles do echo "Generating $pf..."