From 239f1ac5cccf8612ac03982f19bc8683fdbaa86b Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:08:31 -0800 Subject: [PATCH] telemetry support --- Meshtastic/Helpers/TAK/CoTMessage.swift | 6 ++- .../Helpers/TAK/TAKMeshtasticBridge.swift | 37 ++++++++++++++++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Meshtastic/Helpers/TAK/CoTMessage.swift b/Meshtastic/Helpers/TAK/CoTMessage.swift index 12aff014..68a6b063 100644 --- a/Meshtastic/Helpers/TAK/CoTMessage.swift +++ b/Meshtastic/Helpers/TAK/CoTMessage.swift @@ -131,7 +131,8 @@ struct CoTMessage: Identifiable, Sendable { team: String = "Cyan", role: String = "Team Member", battery: Int = 100, - staleMinutes: Int = 10 + staleMinutes: Int = 10, + remarks: String? = nil ) -> CoTMessage { let now = Date() return CoTMessage( @@ -149,7 +150,8 @@ struct CoTMessage: Identifiable, Sendable { contact: CoTContact(callsign: callsign, endpoint: "0.0.0.0:4242:tcp"), group: CoTGroup(name: team, role: role), status: CoTStatus(battery: battery), - track: CoTTrack(speed: speed, course: course) + track: CoTTrack(speed: speed, course: course), + remarks: remarks ) } diff --git a/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift b/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift index e455f1cf..ec15f2fc 100644 --- a/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift +++ b/Meshtastic/Helpers/TAK/TAKMeshtasticBridge.swift @@ -460,11 +460,37 @@ final class TAKMeshtasticBridge { } let uid = "MESHTASTIC-\(String(format: "%08X", node.num))" - let callsign = node.user?.shortName ?? node.user?.longName ?? "MESH-\(node.num)" - - // Get battery level from device metrics - let battery = Int(node.latestDeviceMetrics?.batteryLevel ?? 100) + // Format: "SHORT - Long Name" or just "ShortName" if no long name + let callsign: String + if let shortName = node.user?.shortName, let longName = node.user?.longName, !longName.isEmpty { + callsign = "\(shortName) - \(longName)" + } else { + callsign = node.user?.shortName ?? node.user?.longName ?? "MESH-\(node.num)" + } + // Get telemetry from device metrics + let deviceMetrics = node.latestDeviceMetrics + let battery = Int(deviceMetrics?.batteryLevel ?? 100) + let voltage = deviceMetrics?.voltage ?? 0 + let channelUtil = deviceMetrics?.channelUtilization ?? 0 + let rssi = deviceMetrics?.rssi ?? 0 + let snr = deviceMetrics?.snr ?? 0 + + // Build remarks with telemetry info + var remarks = "Battery: \(battery)%" + if voltage > 0 { + remarks += " | Voltage: \(String(format: "%.2f", voltage))V" + } + if channelUtil > 0 { + remarks += " | Chan Util: \(String(format: "%.1f", channelUtil))%" + } + if rssi != 0 { + remarks += " | RSSI: \(rssi) dBm" + } + if snr != 0 { + remarks += " | SNR: \(String(format: "%.1f", snr)) dB" + } + return CoTMessage.pli( uid: uid, callsign: callsign, @@ -476,7 +502,8 @@ final class TAKMeshtasticBridge { team: "Green", // Meshtastic nodes shown as green by default role: "Team Member", battery: battery, - staleMinutes: 15 // Meshtastic positions can be older + staleMinutes: 15, // Meshtastic positions can be older + remarks: remarks ) }