From 28bdd7a39acf5273cd441fedcfb2bcb1ef507ed1 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 28 Sep 2021 00:00:09 -0700 Subject: [PATCH] Receive messages code --- MeshtasticClient/Helpers/BLEManager.swift | 51 +++++++++++++++++-- MeshtasticClient/MeshtasticClientApp.swift | 3 ++ MeshtasticClient/Model/MessageData.swift | 4 +- MeshtasticClient/Model/NodeInfoModel.swift | 2 +- .../Views/Helpers/MessageBubble.swift | 1 + .../Views/Messages/Messages.swift | 2 +- 6 files changed, 56 insertions(+), 7 deletions(-) diff --git a/MeshtasticClient/Helpers/BLEManager.swift b/MeshtasticClient/Helpers/BLEManager.swift index 63d883e8..98b5ebec 100644 --- a/MeshtasticClient/Helpers/BLEManager.swift +++ b/MeshtasticClient/Helpers/BLEManager.swift @@ -10,6 +10,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph // Data @ObservedObject private var meshData : MeshData + @ObservedObject private var messageData : MessageData private var centralManager: CBCentralManager! @Published var connectedPeripheral: CBPeripheral! @Published var peripheralArray = [CBPeripheral]() @@ -31,6 +32,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph override init() { self.meshData = MeshData() + self.messageData = MessageData() super.init() centralManager = CBCentralManager(delegate: self, queue: nil) centralManager.delegate = self @@ -91,7 +93,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph //--------------------------------------------------------------------------------------- - // Disconnect Device function + // Set Owner function //--------------------------------------------------------------------------------------- public func setOwner(myUser: User) { @@ -156,6 +158,14 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph //--------------------------------------------------------------------------------------- func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { + if let e = error { + + print("Central disconnected because \(e)") + // connectToDevice(id: peripheral.identifier.uuidString) + } else { + print("Central disconnected! (no error)") + } + if(peripheral.identifier == connectedPeripheral.identifier){ connectedPeripheral = nil connectedNodeInfo = nil @@ -165,6 +175,8 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph self.startScanning() } + + //--------------------------------------------------------------------------------------- // Discover Services Event //--------------------------------------------------------------------------------------- @@ -320,10 +332,42 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if decodedInfo.packet.id != 0 { - print("Save a packet") + do { - print(try decodedInfo.packet.jsonString()) + if decodedInfo.packet.decoded.portnum == PortNum.textMessageApp { + if let messageText = String(bytes: decodedInfo.packet.decoded.payload, encoding: .utf8) { + print(messageText) + print(try decodedInfo.packet.jsonString()) + + messageData.messages.append( + MessageModel(messageId: decodedInfo.packet.id, messageTimeStamp: Int64(decodedInfo.packet.rxTime), fromUserId: decodedInfo.packet.from, toUserId: decodedInfo.packet.to, fromUserLongName: "From Long Name ", toUserLongName: "To Long Name", fromUserShortName: "FLN", toUserShortName: "TLN", receivedACK: decodedInfo.packet.decoded.wantResponse, messagePayload: messageText, direction: "IN")) + messageData.save() + } else { + print("not a valid UTF-8 sequence") + } + + } + else if decodedInfo.packet.decoded.portnum == PortNum.nodeinfoApp { + if let nodeInfoPayload = String(bytes: decodedInfo.packet.decoded.payload, encoding: .utf8) { + print(nodeInfoPayload) + } else { + print("not a valid UTF-8 sequence") + print(try decodedInfo.packet.jsonString()) + } + + } + else if decodedInfo.packet.decoded.portnum == PortNum.positionApp { + if let nodeInfoPayload = String(bytes: decodedInfo.packet.decoded.payload, encoding: .utf8) { + print(nodeInfoPayload) + } else { + print("not a valid UTF-8 sequence") + print(try decodedInfo.packet.jsonString()) + } + } + else + { + print("Save a packet") print(try decodedInfo.packet.jsonString()) } @@ -335,6 +379,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if decodedInfo.configCompleteID != 0 { print(decodedInfo) meshData.load() + messageData.load() } default: diff --git a/MeshtasticClient/MeshtasticClientApp.swift b/MeshtasticClient/MeshtasticClientApp.swift index d39d19af..3c8d2753 100644 --- a/MeshtasticClient/MeshtasticClientApp.swift +++ b/MeshtasticClient/MeshtasticClientApp.swift @@ -11,15 +11,18 @@ import SwiftUI struct MeshtasticClientApp: App { @ObservedObject private var meshData: MeshData = MeshData() + @ObservedObject private var messageData: MessageData = MessageData() @ObservedObject private var bleManager: BLEManager = BLEManager() var body: some Scene { WindowGroup { ContentView() .environmentObject(meshData) + .environmentObject(messageData) .environmentObject(bleManager) .onAppear{ meshData.load() + messageData.load() } } diff --git a/MeshtasticClient/Model/MessageData.swift b/MeshtasticClient/Model/MessageData.swift index c0edf8db..a6356bfa 100644 --- a/MeshtasticClient/Model/MessageData.swift +++ b/MeshtasticClient/Model/MessageData.swift @@ -22,11 +22,11 @@ class MessageData: ObservableObject { func load() { DispatchQueue.global(qos: .background).async { [weak self] in guard let data = try? Data(contentsOf: Self.fileURL) else { - //#if DEBUG + #if DEBUG DispatchQueue.main.async { self?.messages = MessageModel.data } - //#endif + #endif return } guard let messageList = try? JSONDecoder().decode([MessageModel].self, from: data) else { diff --git a/MeshtasticClient/Model/NodeInfoModel.swift b/MeshtasticClient/Model/NodeInfoModel.swift index 2acfb0fe..e804d415 100644 --- a/MeshtasticClient/Model/NodeInfoModel.swift +++ b/MeshtasticClient/Model/NodeInfoModel.swift @@ -52,7 +52,7 @@ struct NodeInfoModel: Identifiable, Codable { } } var coordinate: CLLocationCoordinate2D? { - if latitude != nil || longitude != nil { + if latitude != nil && longitude != nil { let coord = CLLocationCoordinate2D(latitude: latitude!, longitude: longitude!) return coord diff --git a/MeshtasticClient/Views/Helpers/MessageBubble.swift b/MeshtasticClient/Views/Helpers/MessageBubble.swift index f77d7bce..4e75aab4 100644 --- a/MeshtasticClient/Views/Helpers/MessageBubble.swift +++ b/MeshtasticClient/Views/Helpers/MessageBubble.swift @@ -7,6 +7,7 @@ struct MessageBubble: View { var shortName: String var body: some View { + HStack (alignment: .top) { CircleText(text: shortName, color: isCurrentUser ? Color.blue : Color(.darkGray)).padding(.all, 5) diff --git a/MeshtasticClient/Views/Messages/Messages.swift b/MeshtasticClient/Views/Messages/Messages.swift index 9574a96b..4c2e7d12 100644 --- a/MeshtasticClient/Views/Messages/Messages.swift +++ b/MeshtasticClient/Views/Messages/Messages.swift @@ -17,7 +17,7 @@ struct Messages: View { @Namespace var bottomId // Message Data and Bluetooth - @ObservedObject var messageData: MessageData = MessageData() + @EnvironmentObject var messageData: MessageData @EnvironmentObject var bleManager: BLEManager var body: some View {