From a00aa40e36ce062ed0aa34d5a20daab6a8f20a41 Mon Sep 17 00:00:00 2001 From: Brent Petit Date: Wed, 8 Jan 2025 08:58:21 -0600 Subject: [PATCH] Update traceroute back route display to handle case where route back is not valid --- Meshtastic/Helpers/BLEManager.swift | 29 +++++++++++----------- Meshtastic/Views/Nodes/TraceRouteLog.swift | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 2bba29c7..b542ca0e 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -903,10 +903,11 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate /// Add the destination node to the end of the route towards string and the beginning of the route back string routeString += "\(traceRoute?.node?.user?.longName ?? "unknown".localized) \((traceRoute?.node?.num ?? 0).toHex()) (\(destinationHop.snr != -32 ? String(destinationHop.snr) : "unknown ".localized)dB)" traceRoute?.routeText = routeString - - traceRoute?.hopsBack = Int32(routingMessage.routeBack.count) + // Default to -1 only fill in if routeBack is valid below + traceRoute?.hopsBack = -1 // Only if hopStart is set and there is an SNR entry if decodedInfo.packet.hopStart > 0 && routingMessage.snrBack.count > 0 { + traceRoute?.hopsBack = Int32(routingMessage.routeBack.count) var routeBackString = "\(traceRoute?.node?.user?.longName ?? "unknown".localized) \((traceRoute?.node?.num ?? 0).toHex()) --> " for (index, node) in routingMessage.routeBack.enumerated() { var hopNode = getNodeInfo(id: Int64(node), context: context) @@ -947,19 +948,19 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate let snrBackLast = Float(routingMessage.snrBack.last ?? -128) / 4 routeBackString += "\(connectedNode.user?.longName ?? String(connectedNode.num.toHex())) (\(snrBackLast != -32 ? String(snrBackLast) : "unknown ".localized)dB)" traceRoute?.routeBackText = routeBackString - traceRoute?.hops = NSOrderedSet(array: hopNodes) - traceRoute?.time = Date() - do { - try context.save() - Logger.data.info("💾 Saved Trace Route") - } catch { - context.rollback() - let nsError = error as NSError - Logger.data.error("Error Updating Core Data TraceRouteHop: \(nsError, privacy: .public)") - } - let logString = String.localizedStringWithFormat("mesh.log.traceroute.received.route %@".localized, routeString) - MeshLogger.log("🪧 \(logString)") } + traceRoute?.hops = NSOrderedSet(array: hopNodes) + traceRoute?.time = Date() + do { + try context.save() + Logger.data.info("💾 Saved Trace Route") + } catch { + context.rollback() + let nsError = error as NSError + Logger.data.error("Error Updating Core Data TraceRouteHop: \(nsError, privacy: .public)") + } + let logString = String.localizedStringWithFormat("mesh.log.traceroute.received.route %@".localized, routeString) + MeshLogger.log("🪧 \(logString)") } case .neighborinfoApp: if let neighborInfo = try? NeighborInfo(serializedBytes: decodedInfo.packet.decoded.payload) { diff --git a/Meshtastic/Views/Nodes/TraceRouteLog.swift b/Meshtastic/Views/Nodes/TraceRouteLog.swift index 1bdccf46..f10dad58 100644 --- a/Meshtastic/Views/Nodes/TraceRouteLog.swift +++ b/Meshtastic/Views/Nodes/TraceRouteLog.swift @@ -44,7 +44,7 @@ struct TraceRouteLog: View { .font(.caption) } else if route.response { let hopTowardsString = String(localized: "\(route.hopsTowards) Hops") - let hopBackString = String(localized: "\(route.hopsBack) Hops") + let hopBackString = route.hopsBack >= 0 ? String(localized: "\(route.hopsBack) Hops") : String(localized: "unknown") Text("\(routeTime) - \(hopTowardsString) Towards \(hopBackString) Back") .font(.caption) } else if route.sent {