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;