From 7cf829ef5210daeb49e56e92d730611a70f5a497 Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Tue, 17 Mar 2026 23:20:43 +0100 Subject: [PATCH] [feat](trx-rs): display APRS-IS connection status on About page Thread aprs_is_status through RigState, RigSnapshot, and the protocol layer following the same pattern as pskreporter_status. Show the connection target and callsign when enabled, or "Disabled" otherwise. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Stanislaw Grams --- src/trx-client/src/remote_client.rs | 1 + .../trx-frontend-http-json/src/server.rs | 1 + .../trx-frontend-http/assets/web/app.js | 3 ++ .../trx-frontend-http/assets/web/index.html | 1 + .../trx-frontend/trx-frontend-http/src/api.rs | 1 + .../trx-frontend-rigctl/src/server.rs | 1 + src/trx-core/src/rig/state.rs | 7 +++++ src/trx-protocol/src/codec.rs | 1 + src/trx-server/src/main.rs | 28 +++++++++++++++++++ src/trx-server/src/rig_task.rs | 3 ++ 10 files changed, 47 insertions(+) diff --git a/src/trx-client/src/remote_client.rs b/src/trx-client/src/remote_client.rs index 9419ce8..19a59f4 100644 --- a/src/trx-client/src/remote_client.rs +++ b/src/trx-client/src/remote_client.rs @@ -765,6 +765,7 @@ mod tests { server_latitude: None, server_longitude: None, pskreporter_status: Some("Disabled".to_string()), + aprs_is_status: Some("Disabled".to_string()), aprs_decode_enabled: false, hf_aprs_decode_enabled: false, cw_decode_enabled: false, diff --git a/src/trx-client/trx-frontend/trx-frontend-http-json/src/server.rs b/src/trx-client/trx-frontend/trx-frontend-http-json/src/server.rs index d8d10bf..67144cf 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http-json/src/server.rs +++ b/src/trx-client/trx-frontend/trx-frontend-http-json/src/server.rs @@ -403,6 +403,7 @@ mod tests { server_latitude: None, server_longitude: None, pskreporter_status: Some("Disabled".to_string()), + aprs_is_status: Some("Disabled".to_string()), aprs_decode_enabled: false, hf_aprs_decode_enabled: false, cw_decode_enabled: false, diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js index 09afd9e..9b5274e 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/app.js @@ -3021,6 +3021,9 @@ function render(update) { if (update.pskreporter_status) { document.getElementById("about-pskreporter").textContent = update.pskreporter_status; } + if (update.aprs_is_status) { + document.getElementById("about-aprs-is").textContent = update.aprs_is_status; + } if (update.info) { const parts = [update.info.manufacturer, update.info.model, update.info.revision].filter(Boolean).join(" "); if (parts) document.getElementById("about-rig-info").textContent = parts; diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html index e04024a..8955188 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html @@ -981,6 +981,7 @@ Rigctl endpoint-- Rigctl clients-- PSK Reporter-- + APRS-IS-- Client version{pkg} v{ver} Connected clients-- diff --git a/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs b/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs index 6767462..dee0a79 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs +++ b/src/trx-client/trx-frontend/trx-frontend-http/src/api.rs @@ -2104,6 +2104,7 @@ async fn wait_for_view(mut rx: watch::Receiver) -> Result, #[serde(default, skip_serializing_if = "Option::is_none")] pub pskreporter_status: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub aprs_is_status: Option, #[serde(default)] pub aprs_decode_enabled: bool, #[serde(default)] @@ -149,6 +151,7 @@ impl RigState { server_latitude: None, server_longitude: None, pskreporter_status: None, + aprs_is_status: None, aprs_decode_enabled: false, hf_aprs_decode_enabled: false, cw_decode_enabled: true, @@ -217,6 +220,7 @@ impl RigState { server_latitude: snapshot.server_latitude, server_longitude: snapshot.server_longitude, pskreporter_status: snapshot.pskreporter_status, + aprs_is_status: snapshot.aprs_is_status, aprs_decode_enabled: snapshot.aprs_decode_enabled, hf_aprs_decode_enabled: snapshot.hf_aprs_decode_enabled, cw_decode_enabled: snapshot.cw_decode_enabled, @@ -263,6 +267,7 @@ impl RigState { server_latitude: self.server_latitude, server_longitude: self.server_longitude, pskreporter_status: self.pskreporter_status.clone(), + aprs_is_status: self.aprs_is_status.clone(), aprs_decode_enabled: self.aprs_decode_enabled, hf_aprs_decode_enabled: self.hf_aprs_decode_enabled, cw_decode_enabled: self.cw_decode_enabled, @@ -430,6 +435,8 @@ pub struct RigSnapshot { pub server_longitude: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub pskreporter_status: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub aprs_is_status: Option, #[serde(default)] pub aprs_decode_enabled: bool, #[serde(default)] diff --git a/src/trx-protocol/src/codec.rs b/src/trx-protocol/src/codec.rs index 55e9bbe..b16dd09 100644 --- a/src/trx-protocol/src/codec.rs +++ b/src/trx-protocol/src/codec.rs @@ -427,6 +427,7 @@ mod tests { server_latitude: None, server_longitude: None, pskreporter_status: None, + aprs_is_status: None, aprs_decode_enabled: false, hf_aprs_decode_enabled: false, cw_decode_enabled: false, diff --git a/src/trx-server/src/main.rs b/src/trx-server/src/main.rs index 93669b1..0c36f0e 100644 --- a/src/trx-server/src/main.rs +++ b/src/trx-server/src/main.rs @@ -402,6 +402,25 @@ fn build_rig_task_config( Some("Disabled".to_string()) }; + let aprs_is_status = if rig_cfg.aprsfi.enabled { + let cs = rig_cfg + .aprsfi + .callsign + .as_deref() + .or(callsign.as_deref()) + .unwrap_or(""); + if cs.trim().is_empty() { + Some("Enabled but inactive (missing callsign)".to_string()) + } else { + Some(format!( + "Enabled ({}:{}, {})", + rig_cfg.aprsfi.host, rig_cfg.aprsfi.port, cs + )) + } + } else { + Some("Disabled".to_string()) + }; + rig_task::RigTaskConfig { registry, rig_id: rig_cfg.id.clone(), @@ -424,6 +443,7 @@ fn build_rig_task_config( server_latitude: latitude, server_longitude: longitude, pskreporter_status, + aprs_is_status, histories, prebuilt_rig: None, } @@ -1007,6 +1027,14 @@ async fn main() -> DynResult<()> { } else { Some("Disabled".to_string()) }; + initial_state.aprs_is_status = if rig_cfg.aprsfi.enabled { + Some(format!( + "Enabled ({}:{})", + rig_cfg.aprsfi.host, rig_cfg.aprsfi.port + )) + } else { + Some("Disabled".to_string()) + }; let (state_tx, state_rx) = watch::channel(initial_state); let mut task_config = build_rig_task_config( diff --git a/src/trx-server/src/rig_task.rs b/src/trx-server/src/rig_task.rs index 1d16d10..ab4b9bb 100644 --- a/src/trx-server/src/rig_task.rs +++ b/src/trx-server/src/rig_task.rs @@ -46,6 +46,7 @@ pub struct RigTaskConfig { pub server_latitude: Option, pub server_longitude: Option, pub pskreporter_status: Option, + pub aprs_is_status: Option, /// Per-rig decoder history store. Used by Reset* commands to clear the /// history and by the audio listener to serve history on connection. pub histories: Arc, @@ -78,6 +79,7 @@ impl Default for RigTaskConfig { server_latitude: None, server_longitude: None, pskreporter_status: None, + aprs_is_status: None, histories: DecoderHistories::new(), prebuilt_rig: None, } @@ -136,6 +138,7 @@ pub async fn run_rig_task( config.initial_mode.clone(), ); state.pskreporter_status = config.pskreporter_status.clone(); + state.aprs_is_status = config.aprs_is_status.clone(); // Polling configuration let polling = &config.polling;