diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 0bda8ad8..fd5400d2 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -7365,6 +7365,9 @@ } } } + }, + "First heard" : { + }, "Five Minutes" : { @@ -10797,6 +10800,9 @@ } } } + }, + "Last heard" : { + }, "Latitude" : { @@ -21713,7 +21719,6 @@ }, "unknown" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { 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 4d5deba4..f34a0ec1 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, let text = Self.formatter.string(for: lastHeard) { + Text(text) } else { - Text("unknown.age") + Text("unknown") } } } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 0f197e77..aaad49c6 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,37 @@ struct NodeDetail: View { let later = now + TimeInterval(dm.uptimeSeconds) let uptime = (now..