From d52fc20d2a6dfab3350c9c308503144a54c57fcc Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 11 Jan 2022 06:43:41 -0800 Subject: [PATCH] Tapback working branch --- MeshtasticClient/Helpers/BLEManager.swift | 20 +++---- MeshtasticClient/Protobufs/mesh.pb.swift | 59 +++++++++---------- .../Views/Bluetooth/Connect.swift | 2 +- .../Views/Messages/UserMessageList.swift | 2 +- 4 files changed, 40 insertions(+), 43 deletions(-) diff --git a/MeshtasticClient/Helpers/BLEManager.swift b/MeshtasticClient/Helpers/BLEManager.swift index 0c8ec67a..2148ae2a 100644 --- a/MeshtasticClient/Helpers/BLEManager.swift +++ b/MeshtasticClient/Helpers/BLEManager.swift @@ -55,7 +55,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph // MARK: init BLEManager override init() { - self.meshLoggingEnabled = true // UserDefaults.standard.object(forKey: "meshActivityLog") as? Bool ?? true + self.meshLoggingEnabled = true // UserDefaults.standard.object(forKey: "meshActivityLog") as? Bool ?? false self.lastConnectionError = "" self.lastConnnectionVersion = "0.0.0" super.init() @@ -128,8 +128,8 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph self.timeoutTimer?.invalidate() } else { - print("🚫 BLE Connecting 2 Second Timeout Timer Fired \(timeoutTimerCount) Time(s): \(name)") - if meshLoggingEnabled { MeshLogger.log("🚫 BLE Connecting 2 Second Timeout Timer Fired \(timeoutTimerCount) Time(s): \(name)") } + print("🚨 BLE Connecting 2 Second Timeout Timer Fired \(timeoutTimerCount) Time(s): \(name)") + if meshLoggingEnabled { MeshLogger.log("🚨 BLE Connecting 2 Second Timeout Timer Fired \(timeoutTimerCount) Time(s): \(name)") } } } @@ -142,6 +142,8 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph stopScanning() if self.connectedPeripheral != nil { + if meshLoggingEnabled { MeshLogger.log("ℹ️ BLE Disconnecting from: \(self.connectedPeripheral.name) to connect to \(peripheral.name ?? "Unknown")") } + print("ℹ️ BLE Disconnecting from: \(self.connectedPeripheral.name) to connect to \(peripheral.name ?? "Unknown")") self.disconnectPeripheral() } @@ -364,8 +366,6 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } // MARK: Data Read / Update Characteristic Event - // TODO: Convert to CoreData - // FIXME: Remove broken JSON file data layer implementation func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { @@ -682,11 +682,11 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } newMessage.receivedACK = false newMessage.direction = "IN" - newMessage.isTapback = decodedInfo.packet.isTapback + newMessage.isTapback = decodedInfo.packet.decoded.isTapback - if decodedInfo.packet.replyID > 0 { + if decodedInfo.packet.decoded.replyID > 0 { - newMessage.replyID = Int64(decodedInfo.packet.replyID) + newMessage.replyID = Int64(decodedInfo.packet.decoded.replyID) } if decodedInfo.packet.to == broadcastNodeNum && fetchedUsers.count == 1 { @@ -962,9 +962,9 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph var meshPacket = MeshPacket() meshPacket.to = UInt32(toUserNum) meshPacket.from = UInt32(fromUserNum) - meshPacket.isTapback = isTapback + meshPacket.decoded.isTapback = isTapback if replyID > 0 { - meshPacket.replyID = UInt32(replyID) + meshPacket.decoded.replyID = UInt32(replyID) } meshPacket.decoded = dataMessage meshPacket.wantAck = true diff --git a/MeshtasticClient/Protobufs/mesh.pb.swift b/MeshtasticClient/Protobufs/mesh.pb.swift index 512ab45a..e7b1fc87 100644 --- a/MeshtasticClient/Protobufs/mesh.pb.swift +++ b/MeshtasticClient/Protobufs/mesh.pb.swift @@ -62,6 +62,9 @@ enum HardwareModel: SwiftProtobuf.Enum { /// The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37. Sadly they did not update anything on the silkscreen to identify this board case heltecV21 // = 10 + /// Ancient heltec WiFi_Lora_32 board + case heltecV1 // = 11 + /// /// Less common/prototype boards listed here (needs one more byte over the air) case loraRelayV1 // = 32 @@ -97,6 +100,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case 8: self = .tloraV11P3 case 9: self = .rak4631 case 10: self = .heltecV21 + case 11: self = .heltecV1 case 32: self = .loraRelayV1 case 33: self = .nrf52840Dk case 34: self = .ppr @@ -122,6 +126,7 @@ enum HardwareModel: SwiftProtobuf.Enum { case .tloraV11P3: return 8 case .rak4631: return 9 case .heltecV21: return 10 + case .heltecV1: return 11 case .loraRelayV1: return 32 case .nrf52840Dk: return 33 case .ppr: return 34 @@ -152,6 +157,7 @@ extension HardwareModel: CaseIterable { .tloraV11P3, .rak4631, .heltecV21, + .heltecV1, .loraRelayV1, .nrf52840Dk, .ppr, @@ -1064,6 +1070,15 @@ struct DataMessage { /// Indicates the original message ID that this message is reporting failure on. (formerly called original_id) var requestID: UInt32 = 0 + /// + /// If set, this message is intened to be a reply to a previously sent message with the defined id. + var replyID: UInt32 = 0 + + /// + /// Defaults to false. If true, then what is in the payload should be treated as an emoji like giving + /// a message a heart or poop emoji. + var isTapback: Bool = false + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} @@ -1212,21 +1227,6 @@ struct MeshPacket { set {_uniqueStorage()._delayed = newValue} } - /// - /// If set, this message is intened to be a reply to a previously sent message with the defined id. - var replyID: UInt32 { - get {return _storage._replyID} - set {_uniqueStorage()._replyID = newValue} - } - - /// - /// Defaults to false. If true, then what is in the payload should be treated as an emoji like giving - /// a message a heart or poop emoji. - var isTapback: Bool { - get {return _storage._isTapback} - set {_uniqueStorage()._isTapback = newValue} - } - var unknownFields = SwiftProtobuf.UnknownStorage() enum OneOf_PayloadVariant: Equatable { @@ -2046,6 +2046,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding { 8: .same(proto: "TLORA_V1_1p3"), 9: .same(proto: "RAK4631"), 10: .same(proto: "HELTEC_V2_1"), + 11: .same(proto: "HELTEC_V1"), 32: .same(proto: "LORA_RELAY_V1"), 33: .same(proto: "NRF52840DK"), 34: .same(proto: "PPR"), @@ -2585,6 +2586,8 @@ extension DataMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati 4: .same(proto: "dest"), 5: .same(proto: "source"), 6: .standard(proto: "request_id"), + 7: .standard(proto: "reply_id"), + 8: .standard(proto: "is_tapback"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -2599,6 +2602,8 @@ extension DataMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati case 4: try { try decoder.decodeSingularFixed32Field(value: &self.dest) }() case 5: try { try decoder.decodeSingularFixed32Field(value: &self.source) }() case 6: try { try decoder.decodeSingularFixed32Field(value: &self.requestID) }() + case 7: try { try decoder.decodeSingularFixed32Field(value: &self.replyID) }() + case 8: try { try decoder.decodeSingularBoolField(value: &self.isTapback) }() default: break } } @@ -2623,6 +2628,12 @@ extension DataMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati if self.requestID != 0 { try visitor.visitSingularFixed32Field(value: self.requestID, fieldNumber: 6) } + if self.replyID != 0 { + try visitor.visitSingularFixed32Field(value: self.replyID, fieldNumber: 7) + } + if self.isTapback != false { + try visitor.visitSingularBoolField(value: self.isTapback, fieldNumber: 8) + } try unknownFields.traverse(visitor: &visitor) } @@ -2633,6 +2644,8 @@ extension DataMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati if lhs.dest != rhs.dest {return false} if lhs.source != rhs.source {return false} if lhs.requestID != rhs.requestID {return false} + if lhs.replyID != rhs.replyID {return false} + if lhs.isTapback != rhs.isTapback {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } @@ -2654,8 +2667,6 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio 12: .same(proto: "priority"), 13: .standard(proto: "rx_rssi"), 15: .same(proto: "delayed"), - 16: .standard(proto: "reply_id"), - 17: .standard(proto: "is_tapback"), ] fileprivate class _StorageClass { @@ -2671,8 +2682,6 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio var _priority: MeshPacket.Priority = .unset var _rxRssi: Int32 = 0 var _delayed: MeshPacket.Delayed = .noDelay - var _replyID: UInt32 = 0 - var _isTapback: Bool = false static let defaultInstance = _StorageClass() @@ -2691,8 +2700,6 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio _priority = source._priority _rxRssi = source._rxRssi _delayed = source._delayed - _replyID = source._replyID - _isTapback = source._isTapback } } @@ -2743,8 +2750,6 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio case 12: try { try decoder.decodeSingularEnumField(value: &_storage._priority) }() case 13: try { try decoder.decodeSingularInt32Field(value: &_storage._rxRssi) }() case 15: try { try decoder.decodeSingularEnumField(value: &_storage._delayed) }() - case 16: try { try decoder.decodeSingularFixed32Field(value: &_storage._replyID) }() - case 17: try { try decoder.decodeSingularBoolField(value: &_storage._isTapback) }() default: break } } @@ -2800,12 +2805,6 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio if _storage._delayed != .noDelay { try visitor.visitSingularEnumField(value: _storage._delayed, fieldNumber: 15) } - if _storage._replyID != 0 { - try visitor.visitSingularFixed32Field(value: _storage._replyID, fieldNumber: 16) - } - if _storage._isTapback != false { - try visitor.visitSingularBoolField(value: _storage._isTapback, fieldNumber: 17) - } } try unknownFields.traverse(visitor: &visitor) } @@ -2827,8 +2826,6 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio if _storage._priority != rhs_storage._priority {return false} if _storage._rxRssi != rhs_storage._rxRssi {return false} if _storage._delayed != rhs_storage._delayed {return false} - if _storage._replyID != rhs_storage._replyID {return false} - if _storage._isTapback != rhs_storage._isTapback {return false} return true } if !storagesAreEqual {return false} diff --git a/MeshtasticClient/Views/Bluetooth/Connect.swift b/MeshtasticClient/Views/Bluetooth/Connect.swift index 6a5d7470..8fdcad18 100644 --- a/MeshtasticClient/Views/Bluetooth/Connect.swift +++ b/MeshtasticClient/Views/Bluetooth/Connect.swift @@ -73,7 +73,7 @@ struct Connect: View { Text(String(bleManager.connectedPeripheral.peripheral.name ?? "Unknown")).font(.title2) } - Text("BLE Name: ").font(.caption)+Text(bleManager.connectedPeripheral.name) + Text("BLE Name: ").font(.caption)+Text(bleManager.connectedPeripheral.peripheral.name ?? "Unknown") .font(.caption).foregroundColor(Color.gray) if bleManager.connectedPeripheral != nil { Text("FW Version: ").font(.caption)+Text(bleManager.connectedPeripheral.firmwareVersion) diff --git a/MeshtasticClient/Views/Messages/UserMessageList.swift b/MeshtasticClient/Views/Messages/UserMessageList.swift index a9b61c88..d6a14e69 100644 --- a/MeshtasticClient/Views/Messages/UserMessageList.swift +++ b/MeshtasticClient/Views/Messages/UserMessageList.swift @@ -317,7 +317,7 @@ struct UserMessageList: View { }) .onChange(of: allMessages.count, perform: { count in - self.context.refresh(user, mergeChanges: true) + //self.context.refresh(user, mergeChanges: true) let index = count - 1