diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 868efeb6..8ab8179a 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -295,10 +295,6 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { guard (connectedPeripheral!.peripheral.state == CBPeripheralState.connected) else { return 0 } - let nodeName = connectedPeripheral!.peripheral.name ?? NSLocalizedString("unknown", comment: NSLocalizedString("unknown", comment: "Unknown")) - let logString = String.localizedStringWithFormat(NSLocalizedString("mesh.log.devicemetadata %@", - comment: "Requesting Device Metadata for %@"), nodeName) - MeshLogger.log("🛎️ \(logString)") var adminPacket = AdminMessage() adminPacket.getDeviceMetadataRequest = true var meshPacket: MeshPacket = MeshPacket() @@ -834,7 +830,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { public func sendShutdown(fromUser: UserEntity, toUser: UserEntity) -> Bool { var adminPacket = AdminMessage() - adminPacket.shutdownSeconds = 5 + adminPacket.shutdownSeconds = 10 var meshPacket: MeshPacket = MeshPacket() meshPacket.to = UInt32(toUser.num) meshPacket.from = UInt32(fromUser.num) @@ -857,7 +853,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { public func sendReboot(fromUser: UserEntity, toUser: UserEntity) -> Bool { var adminPacket = AdminMessage() - adminPacket.rebootSeconds = 5 + adminPacket.rebootSeconds = 10 var meshPacket: MeshPacket = MeshPacket() meshPacket.to = UInt32(toUser.num) @@ -905,7 +901,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject { public func sendNodeDBReset(fromUser: UserEntity, toUser: UserEntity) -> Bool { var adminPacket = AdminMessage() - adminPacket.nodedbReset = 5 + adminPacket.nodedbReset = 10 var meshPacket: MeshPacket = MeshPacket() meshPacket.to = UInt32(toUser.num) diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 9498af21..be1653a1 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -209,7 +209,7 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, context: NS newMetadata.role = Int32(metadata.role.rawValue) newMetadata.positionFlags = Int32(metadata.positionFlags) fetchedNode[0].metadata = newMetadata - + do { try context.save() } catch { @@ -525,6 +525,35 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { } else { MeshLogger.log("🕸️ MESH PACKET received for Admin App \(try! packet.decoded.jsonString())") } + + // Save an ack for the admin message log for each admin message response received as we stopped sending acks if there is also a response to reduce airtime. + adminResponseAck(packet: packet, context: context) + } +} + +func adminResponseAck (packet: MeshPacket, context: NSManagedObjectContext) { + + let fetchedAdminMessageRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MessageEntity") + fetchedAdminMessageRequest.predicate = NSPredicate(format: "messageId == %lld", packet.decoded.requestID) + do { + let fetchedMessage = try context.fetch(fetchedAdminMessageRequest) as! [MessageEntity] + if fetchedMessage.count > 0 { + fetchedMessage[0].ackTimestamp = Int32(Date().timeIntervalSince1970) + fetchedMessage[0].ackError = Int32(RoutingError.none.rawValue) + fetchedMessage[0].receivedACK = true + fetchedMessage[0].realACK = true + fetchedMessage[0].ackSNR = packet.rxSnr + if fetchedMessage[0].fromUser != nil { + fetchedMessage[0].fromUser?.objectWillChange.send() + } + do { + try context.save() + } catch { + print("Failed to save admin message response as an ack") + } + } + } catch { + print("Failed to fetch admin message by requestID") } } diff --git a/Meshtastic/Views/Settings/AdminMessageList.swift b/Meshtastic/Views/Settings/AdminMessageList.swift index b2c40f8a..9e597164 100644 --- a/Meshtastic/Views/Settings/AdminMessageList.swift +++ b/Meshtastic/Views/Settings/AdminMessageList.swift @@ -5,9 +5,9 @@ // Created by Garth Vander Houwen on 7/2/22. // /* -Abstract: -A view showing the details for a node. -*/ + Abstract: + A view showing the details for a node. + */ import SwiftUI import MapKit @@ -17,39 +17,41 @@ struct AdminMessageList: View { @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager - + var user: UserEntity? - + var body: some View { let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmmssa", options: 0, locale: Locale.current) let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mm:ss a") List { if user != nil { - - ForEach ( user!.adminMessageList ) { am in - HStack { + ForEach ( user!.adminMessageList.reversed() ) { am in + + VStack (alignment: .leading) { Text("\(am.adminDescription ?? NSLocalizedString("unknown", comment: "Unknown")) - \(Date(timeIntervalSince1970: TimeInterval(am.messageTimestamp)).formattedDate(format: dateFormatString))") - .font(.caption) + .font(.caption2) - if am.receivedACK { - - Image(systemName: "checkmark.square") - .foregroundColor(.gray) - .font(.caption) - Text("routing.acknowledged").foregroundColor(.gray).font(.caption) + Text(": \(Date(timeIntervalSince1970: TimeInterval(am.ackTimestamp)).formattedDate(format: "h:mm:ss a"))") - .foregroundColor(.gray) - .font(.caption) - - } else { - let ackErrorVal = RoutingError(rawValue: Int(am.ackError)) - Image(systemName: "square") - .foregroundColor(.gray) - .font(.caption) - Text(ackErrorVal?.display ?? "Empty Ack Error") - .foregroundColor(.gray) - .font(.caption) + HStack{ + if am.receivedACK { + + Image(systemName: "checkmark.square") + .foregroundColor(.gray) + .font(.caption) + Text("routing.acknowledged").foregroundColor(.gray).font(.caption) + Text(": \(Date(timeIntervalSince1970: TimeInterval(am.ackTimestamp)).formattedDate(format: "h:mm:ss a"))") + .foregroundColor(.gray) + .font(.caption) + + } else { + let ackErrorVal = RoutingError(rawValue: Int(am.ackError)) + Image(systemName: "square") + .foregroundColor(.gray) + .font(.caption) + Text(ackErrorVal?.display ?? "Empty Ack Error") + .foregroundColor(.gray) + .font(.caption) + } } } } @@ -57,7 +59,7 @@ struct AdminMessageList: View { } .navigationTitle("admin.log") .navigationBarItems(trailing: - ZStack { + ZStack { ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "????") }) .onAppear { diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 93bb597e..9d11d10f 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -85,7 +85,7 @@ struct Settings: View { let adminMessageId = bleManager.requestDeviceMetadata(fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode!.myInfo!.adminIndex, context: context) if adminMessageId > 0 { - print("Saved node metadata") + print("Sent node metadata request from node details") } } }