From 3bf443884ca0297fc85632181081e84164c09741 Mon Sep 17 00:00:00 2001 From: Blake McAnally Date: Tue, 9 Jul 2024 20:34:25 -0500 Subject: [PATCH 1/2] Add Last Heard time to node details --- Localizable.xcstrings | 4 ++- Meshtastic/Views/Helpers/LastHeardText.swift | 7 ++--- .../Views/Nodes/Helpers/NodeDetail.swift | 29 ++++++++++++++----- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 0bda8ad8..3bc72cef 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -10797,6 +10797,9 @@ } } } + }, + "Last heard" : { + }, "Latitude" : { @@ -21713,7 +21716,6 @@ }, "unknown" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { diff --git a/Meshtastic/Views/Helpers/LastHeardText.swift b/Meshtastic/Views/Helpers/LastHeardText.swift index 4d5deba4..8766f800 100644 --- a/Meshtastic/Views/Helpers/LastHeardText.swift +++ b/Meshtastic/Views/Helpers/LastHeardText.swift @@ -7,7 +7,6 @@ import SwiftUI // struct LastHeardText: View { var lastHeard: Date? - let sixMonthsAgo = Calendar.current.date(byAdding: .month, value: -6, to: Date()) static let formatter: RelativeDateTimeFormatter = { let formatter = RelativeDateTimeFormatter() @@ -16,10 +15,10 @@ struct LastHeardText: View { }() var body: some View { - if lastHeard != nil && lastHeard! >= sixMonthsAgo! { - Text(lastHeard?.formatted() ?? "unknown.age".localized) + if let lastHeard, lastHeard.timeIntervalSince1970 > 0 { + Text(lastHeard.formatted()) } else { - Text("unknown.age") + Text("unknown") } } } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 0f197e77..8779695c 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -18,11 +18,11 @@ struct NodeDetail: View { // The node the device is currently connected to var connectedNode: NodeInfoEntity? - + // The node information being displayed on the detail screen @ObservedObject var node: NodeInfoEntity - + var columnVisibility = NavigationSplitViewVisibility.all var favoriteNodeAction: some View { @@ -96,6 +96,20 @@ struct NodeDetail: View { .textSelection(.enabled) } + if let metadata = node.metadata { + HStack { + Label { + Text("firmware.version") + } icon: { + Image(systemName: "memorychip") + .symbolRenderingMode(.multicolor) + } + Spacer() + + Text(metadata.firmwareVersion ?? "unknown".localized) + } + } + if let dm = node.telemetries?.filtered(using: NSPredicate(format: "metricsType == 0")).lastObject as? TelemetryEntity, dm.uptimeSeconds > 0 { HStack { Label { @@ -111,21 +125,22 @@ struct NodeDetail: View { let later = now + TimeInterval(dm.uptimeSeconds) let uptime = (now.. Date: Tue, 9 Jul 2024 20:47:26 -0500 Subject: [PATCH 2/2] adding first heard date too --- Localizable.xcstrings | 3 +++ Meshtastic/Persistence/UpdateCoreData.swift | 6 ++++-- Meshtastic/Views/Helpers/LastHeardText.swift | 4 ++-- Meshtastic/Views/Nodes/Helpers/NodeDetail.swift | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 3bc72cef..fd5400d2 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -7365,6 +7365,9 @@ } } } + }, + "First heard" : { + }, "Five Minutes" : { diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 381db194..06d08a9b 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -145,8 +145,10 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) let newNode = NodeInfoEntity(context: context) newNode.id = Int64(packet.from) newNode.num = Int64(packet.from) - newNode.firstHeard = Date(timeIntervalSince1970: TimeInterval(Int64(packet.rxTime))) - newNode.lastHeard = Date(timeIntervalSince1970: TimeInterval(Int64(packet.rxTime))) + if packet.rxTime != 0 { + newNode.firstHeard = Date(timeIntervalSince1970: TimeInterval(Int64(packet.rxTime))) + newNode.lastHeard = Date(timeIntervalSince1970: TimeInterval(Int64(packet.rxTime))) + } newNode.snr = packet.rxSnr newNode.rssi = packet.rxRssi newNode.viaMqtt = packet.viaMqtt diff --git a/Meshtastic/Views/Helpers/LastHeardText.swift b/Meshtastic/Views/Helpers/LastHeardText.swift index 8766f800..f34a0ec1 100644 --- a/Meshtastic/Views/Helpers/LastHeardText.swift +++ b/Meshtastic/Views/Helpers/LastHeardText.swift @@ -15,8 +15,8 @@ struct LastHeardText: View { }() var body: some View { - if let lastHeard, lastHeard.timeIntervalSince1970 > 0 { - Text(lastHeard.formatted()) + if let lastHeard, lastHeard.timeIntervalSince1970 > 0, let text = Self.formatter.string(for: lastHeard) { + Text(text) } else { Text("unknown") } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 8779695c..aaad49c6 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -129,6 +129,21 @@ struct NodeDetail: View { } } + if let firstHeard = node.firstHeard { + HStack { + Label { + Text("First heard") + } icon: { + Image(systemName: "clock") + .symbolRenderingMode(.multicolor) + } + Spacer() + + LastHeardText(lastHeard: firstHeard) + .textSelection(.enabled) + } + } + if let lastHeard = node.lastHeard { HStack { Label {