mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
Merge pull request #777 from meshtastic/last-heard-node-detail
Add First Heard and Last Heard times to node details
This commit is contained in:
commit
179dec259b
4 changed files with 50 additions and 14 deletions
|
|
@ -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" : {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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..<later).formatted(.components(style: .narrow))
|
||||
Text(uptime)
|
||||
.textSelection(.enabled)
|
||||
.textSelection(.enabled)
|
||||
}
|
||||
}
|
||||
|
||||
if let metadata = node.metadata {
|
||||
if let firstHeard = node.firstHeard {
|
||||
HStack {
|
||||
Label {
|
||||
Text("firmware.version")
|
||||
Text("First heard")
|
||||
} icon: {
|
||||
Image(systemName: "memorychip")
|
||||
Image(systemName: "clock")
|
||||
.symbolRenderingMode(.multicolor)
|
||||
}
|
||||
Spacer()
|
||||
|
||||
Text(metadata.firmwareVersion ?? "unknown".localized)
|
||||
LastHeardText(lastHeard: firstHeard)
|
||||
.textSelection(.enabled)
|
||||
}
|
||||
}
|
||||
|
||||
if let lastHeard = node.lastHeard {
|
||||
HStack {
|
||||
Label {
|
||||
Text("Last heard")
|
||||
} icon: {
|
||||
Image(systemName: "clock.arrow.circlepath")
|
||||
.symbolRenderingMode(.multicolor)
|
||||
}
|
||||
Spacer()
|
||||
|
||||
LastHeardText(lastHeard: lastHeard)
|
||||
.textSelection(.enabled)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue