diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 81b65bf1..7b7074f6 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -348,7 +348,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { invalidVersion = true return } else { - MeshLogger.log("â„šī¸ Issuing Want Config to \(connectedPeripheral!.peripheral.name ?? NSLocalizedString("unknown", comment: "Unknown"))") + MeshLogger.log("đŸ›Žī¸ Issuing Want Config to \(connectedPeripheral!.peripheral.name ?? NSLocalizedString("unknown", comment: "Unknown"))") //BLE Characteristics discovered, issue wantConfig var toRadio: ToRadio = ToRadio() configNonce += 1 @@ -484,16 +484,16 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { } } // Log any other unknownApp calls - if !nowKnown { MeshLogger.log("â„šī¸ MESH PACKET received for Unknown App UNHANDLED \(try! decodedInfo.packet.jsonString())") } + if !nowKnown { MeshLogger.log("🌐 MESH PACKET received for Unknown App UNHANDLED \(try! decodedInfo.packet.jsonString())") } case .textMessageApp: textMessageAppPacket(packet: decodedInfo.packet, connectedNode: (self.connectedPeripheral != nil ? connectedPeripheral.num : 0), context: context!) case .remoteHardwareApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Remote Hardware App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Remote Hardware App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .positionApp: positionPacket(packet: decodedInfo.packet, context: context!) case .waypointApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Waypoint App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Waypoint App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .nodeinfoApp: if !invalidVersion { nodeInfoAppPacket(packet: decodedInfo.packet, context: context!) } case .routingApp: @@ -501,29 +501,29 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { case .adminApp: adminAppPacket(packet: decodedInfo.packet, context: context!) case .replyApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Reply App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Reply App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .ipTunnelApp: - MeshLogger.log("â„šī¸ MESH PACKET received for IP Tunnel App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for IP Tunnel App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .serialApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Serial App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Serial App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .storeForwardApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Store Forward App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Store Forward App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .rangeTestApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Range Test App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Range Test App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .telemetryApp: if !invalidVersion { telemetryPacket(packet: decodedInfo.packet, connectedNode: (self.connectedPeripheral != nil ? connectedPeripheral.num : 0), context: context!) } case .textMessageCompressedApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Text Message Compressed App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Text Message Compressed App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .zpsApp: - MeshLogger.log("â„šī¸ MESH PACKET received for ZPS App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for ZPS App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .privateApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Private App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Private App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .atakForwarder: - MeshLogger.log("â„šī¸ MESH PACKET received for ATAK Forwarder App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for ATAK Forwarder App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .simulatorApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Simulator App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Simulator App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .audioApp: - MeshLogger.log("â„šī¸ MESH PACKET received for Audio App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Audio App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .tracerouteApp: if let routingMessage = try? RouteDiscovery(serializedData: decodedInfo.packet.decoded.payload) { @@ -540,7 +540,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { } } case .UNRECOGNIZED(_): - MeshLogger.log("â„šī¸ MESH PACKET received for Other App UNHANDLED \(try! decodedInfo.packet.jsonString())") + MeshLogger.log("🌐 MESH PACKET received for Other App UNHANDLED \(try! decodedInfo.packet.jsonString())") case .max: print("MAX PORT NUM OF 511") } @@ -809,43 +809,26 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { } } - public func sendShutdown(destNum: Int64) -> Bool { + public func sendShutdown(fromUser: UserEntity, toUser: UserEntity) -> Bool { var adminPacket = AdminMessage() adminPacket.shutdownSeconds = 10 - var meshPacket: MeshPacket = MeshPacket() - meshPacket.to = UInt32(connectedPeripheral.num) - meshPacket.from = 0 //UInt32(connectedPeripheral.num) + meshPacket.to = UInt32(toUser.num) + meshPacket.from = UInt32(fromUser.num) meshPacket.id = UInt32.random(in: UInt32(UInt8.max).. MyInfoEntity? { + MeshLogger.log("â„šī¸ MyInfo received: \(String(myInfo.myNodeNum))") let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(myInfo.myNodeNum)) @@ -732,18 +685,15 @@ func myInfoPacket (myInfo: MyNodeInfo, peripheralId: String, context: NSManagedO myInfoEntity.messageTimeoutMsec = Int32(bitPattern: myInfo.messageTimeoutMsec) myInfoEntity.minAppVersion = Int32(bitPattern: myInfo.minAppVersion) myInfoEntity.maxChannels = Int32(bitPattern: myInfo.maxChannels) - do { try context.save() - MeshLogger.log("💾 Saved a new myInfo for node number: \(String(myInfo.myNodeNum))") + print("💾 Saved a new myInfo for node number: \(String(myInfo.myNodeNum))") return myInfoEntity - } catch { context.rollback() let nsError = error as NSError print("đŸ’Ĩ Error Inserting New Core Data MyInfoEntity: \(nsError)") } - } else { fetchedMyInfo[0].peripheralId = peripheralId @@ -760,9 +710,8 @@ func myInfoPacket (myInfo: MyNodeInfo, peripheralId: String, context: NSManagedO do { try context.save() - MeshLogger.log("💾 Updated myInfo for node number: \(String(myInfo.myNodeNum))") + print("💾 Updated myInfo for node number: \(String(myInfo.myNodeNum))") return fetchedMyInfo[0] - } catch { context.rollback() let nsError = error as NSError @@ -770,7 +719,6 @@ func myInfoPacket (myInfo: MyNodeInfo, peripheralId: String, context: NSManagedO } } } catch { - print("đŸ’Ĩ Fetch MyInfo Error") } return nil @@ -780,15 +728,14 @@ func channelPacket (channel: Channel, fromNum: Int64, context: NSManagedObjectCo if channel.isInitialized && channel.hasSettings && channel.role != Channel.Role.disabled { + MeshLogger.log("đŸŽ›ī¸ Channel received: \(channel.settings.name)") let fetchedMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") fetchedMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", fromNum) do { let fetchedMyInfo = try context.fetch(fetchedMyInfoRequest) as! [MyInfoEntity] - if fetchedMyInfo.count == 1 { - let newChannel = ChannelEntity(context: context) newChannel.id = Int32(channel.index) newChannel.index = Int32(channel.index) @@ -809,15 +756,12 @@ func channelPacket (channel: Channel, fromNum: Int64, context: NSManagedObjectCo } catch { print("Failed to save channel") } - MeshLogger.log("💾 Updated MyInfo channel \(channel.index) from Channel App Packet For: \(fetchedMyInfo[0].myNodeNum)") + print("💾 Updated MyInfo channel \(channel.index) from Channel App Packet For: \(fetchedMyInfo[0].myNodeNum)") } else if channel.role.rawValue > 0 { print("đŸ’Ĩ Trying to save a channel to a MyInfo that does not exist: \(fromNum)") } - } catch { - context.rollback() - let nsError = error as NSError print("đŸ’Ĩ Error Saving MyInfo Channel from ADMIN_APP \(nsError)") } @@ -841,14 +785,11 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje newNode.channel = Int32(channel) if nodeInfo.hasDeviceMetrics { - let telemetry = TelemetryEntity(context: context) - telemetry.batteryLevel = Int32(nodeInfo.deviceMetrics.batteryLevel) telemetry.voltage = nodeInfo.deviceMetrics.voltage telemetry.channelUtilization = nodeInfo.deviceMetrics.channelUtilization telemetry.airUtilTx = nodeInfo.deviceMetrics.airUtilTx - var newTelemetries = [TelemetryEntity]() newTelemetries.append(telemetry) newNode.telemetries? = NSOrderedSet(array: newTelemetries) @@ -856,9 +797,7 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje newNode.lastHeard = Date(timeIntervalSince1970: TimeInterval(Int64(nodeInfo.lastHeard))) newNode.snr = nodeInfo.snr - if nodeInfo.hasUser { - let newUser = UserEntity(context: context) newUser.userId = nodeInfo.user.id newUser.num = Int64(nodeInfo.num) @@ -870,7 +809,6 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje } if nodeInfo.position.latitudeI > 0 || nodeInfo.position.longitudeI > 0 { - let position = PositionEntity(context: context) position.seqNo = Int32(nodeInfo.position.seqNumber) position.latitudeI = nodeInfo.position.latitudeI @@ -880,7 +818,6 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje position.speed = Int32(nodeInfo.position.groundSpeed) position.heading = Int32(nodeInfo.position.groundTrack) position.time = Date(timeIntervalSince1970: TimeInterval(Int64(nodeInfo.position.time))) - var newPostions = [PositionEntity]() newPostions.append(position) newNode.positions? = NSOrderedSet(array: newPostions) @@ -896,30 +833,22 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje if fetchedMyInfo.count > 0 { newNode.myInfo = fetchedMyInfo[0] } - do { - try context.save() - if nodeInfo.hasUser { - MeshLogger.log("💾 BLE FROMRADIO received and nodeInfo inserted for \(nodeInfo.user.longName)") + MeshLogger.log("📟 Node info received for: \(nodeInfo.user.longName)") } else { - MeshLogger.log("💾 BLE FROMRADIO received and nodeInfo inserted for \(nodeInfo.num)") + MeshLogger.log("📟 Node info received for: \(nodeInfo.num)") } return newNode - } catch { - context.rollback() - let nsError = error as NSError print("đŸ’Ĩ Error Saving Core Data NodeInfoEntity: \(nsError)") } - } catch { print("đŸ’Ĩ Fetch MyInfo Error") } - } else if nodeInfo.hasUser && nodeInfo.num > 0 { fetchedNode[0].id = Int64(nodeInfo.num) @@ -960,11 +889,8 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje position.altitude = nodeInfo.position.altitude position.satsInView = Int32(nodeInfo.position.satsInView) position.time = Date(timeIntervalSince1970: TimeInterval(Int64(nodeInfo.position.time))) - let mutablePositions = fetchedNode[0].positions!.mutableCopy() as! NSMutableOrderedSet - fetchedNode[0].positions = mutablePositions.copy() as? NSOrderedSet - } // Look for a MyInfo @@ -972,44 +898,31 @@ func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObje fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(nodeInfo.num)) do { - let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as! [MyInfoEntity] if fetchedMyInfo.count > 0 { - fetchedNode[0].myInfo = fetchedMyInfo[0] } - do { - try context.save() if nodeInfo.hasUser { - MeshLogger.log("💾 BLE FROMRADIO received and nodeInfo inserted for \(nodeInfo.user.longName)") - + MeshLogger.log("📟 Node info received for: \(nodeInfo.user.longName)") } else { - MeshLogger.log("💾 BLE FROMRADIO received and nodeInfo inserted for \(nodeInfo.num)") + MeshLogger.log("📟 Node info received for: \(nodeInfo.num)") } - return fetchedNode[0] - } catch { - context.rollback() - let nsError = error as NSError print("đŸ’Ĩ Error Saving Core Data NodeInfoEntity: \(nsError)") } - } catch { print("đŸ’Ĩ Fetch MyInfo Error") } } - } catch { - print("đŸ’Ĩ Fetch NodeInfoEntity Error") } - return nil } diff --git a/Meshtastic/Views/Nodes/NodeDetail.swift b/Meshtastic/Views/Nodes/NodeDetail.swift index ddeb9161..20bf8532 100644 --- a/Meshtastic/Views/Nodes/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/NodeDetail.swift @@ -362,9 +362,7 @@ struct NodeDetail: View { isPresented: $showingShutdownConfirm ) { Button("Shutdown Node?", role: .destructive) { - - if !bleManager.sendShutdown(destNum: node.num) { - + if !bleManager.sendShutdown(fromUser: node.user!, toUser: node.user!) { print("Shutdown Failed") } } diff --git a/Meshtastic/Views/Settings/AdminMessageList.swift b/Meshtastic/Views/Settings/AdminMessageList.swift index 28a1d719..ac98d635 100644 --- a/Meshtastic/Views/Settings/AdminMessageList.swift +++ b/Meshtastic/Views/Settings/AdminMessageList.swift @@ -37,7 +37,7 @@ struct AdminMessageList: View { Image(systemName: "checkmark.square") .foregroundColor(.gray) .font(.caption) - Text("acknowledged: \(Date(timeIntervalSince1970: TimeInterval(am.ackTimestamp)).formattedDate(format: "h:mm:ss a"))") + Text("routing.acknowledged").foregroundColor(.gray).font(.caption) + Text(": \(Date(timeIntervalSince1970: TimeInterval(am.ackTimestamp)).formattedDate(format: "h:mm:ss a"))") .foregroundColor(.gray) .font(.caption) @@ -56,13 +56,10 @@ struct AdminMessageList: View { } .navigationTitle("admin.log") .navigationBarItems(trailing: - ZStack { - ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "????") }) .onAppear { - self.bleManager.context = context } } diff --git a/Meshtastic/Views/Settings/MeshLog.swift b/Meshtastic/Views/Settings/MeshLog.swift index 1463883f..da9eba50 100644 --- a/Meshtastic/Views/Settings/MeshLog.swift +++ b/Meshtastic/Views/Settings/MeshLog.swift @@ -14,36 +14,28 @@ struct MeshLog: View { List(logs, id: \.self, rowContent: Text.init) .task { do { - let url = logFile! logs.removeAll() - var lineCount = 0 let lineLimit = 500 - // Get the number of lines for try await _ in url.lines { lineCount += 1 } - // Set the record to start with if we have more lines than the limit var startingLog = 0 if lineCount > lineLimit { startingLog = lineCount - lineLimit } - var lineNumber = 0 - for try await log in url.lines { if lineNumber >= startingLog { - logs.append(log) document.logFile.append("\(log) \n") } lineNumber += 1 } logs.reverse() - } catch { // Stop adding logs when an error is thrown }