[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 <noreply@anthropic.com> Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
@@ -765,6 +765,7 @@ mod tests {
|
|||||||
server_latitude: None,
|
server_latitude: None,
|
||||||
server_longitude: None,
|
server_longitude: None,
|
||||||
pskreporter_status: Some("Disabled".to_string()),
|
pskreporter_status: Some("Disabled".to_string()),
|
||||||
|
aprs_is_status: Some("Disabled".to_string()),
|
||||||
aprs_decode_enabled: false,
|
aprs_decode_enabled: false,
|
||||||
hf_aprs_decode_enabled: false,
|
hf_aprs_decode_enabled: false,
|
||||||
cw_decode_enabled: false,
|
cw_decode_enabled: false,
|
||||||
|
|||||||
@@ -403,6 +403,7 @@ mod tests {
|
|||||||
server_latitude: None,
|
server_latitude: None,
|
||||||
server_longitude: None,
|
server_longitude: None,
|
||||||
pskreporter_status: Some("Disabled".to_string()),
|
pskreporter_status: Some("Disabled".to_string()),
|
||||||
|
aprs_is_status: Some("Disabled".to_string()),
|
||||||
aprs_decode_enabled: false,
|
aprs_decode_enabled: false,
|
||||||
hf_aprs_decode_enabled: false,
|
hf_aprs_decode_enabled: false,
|
||||||
cw_decode_enabled: false,
|
cw_decode_enabled: false,
|
||||||
|
|||||||
@@ -3021,6 +3021,9 @@ function render(update) {
|
|||||||
if (update.pskreporter_status) {
|
if (update.pskreporter_status) {
|
||||||
document.getElementById("about-pskreporter").textContent = 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) {
|
if (update.info) {
|
||||||
const parts = [update.info.manufacturer, update.info.model, update.info.revision].filter(Boolean).join(" ");
|
const parts = [update.info.manufacturer, update.info.model, update.info.revision].filter(Boolean).join(" ");
|
||||||
if (parts) document.getElementById("about-rig-info").textContent = parts;
|
if (parts) document.getElementById("about-rig-info").textContent = parts;
|
||||||
|
|||||||
@@ -981,6 +981,7 @@
|
|||||||
<tr><td>Rigctl endpoint</td><td id="about-rigctl-endpoint">--</td></tr>
|
<tr><td>Rigctl endpoint</td><td id="about-rigctl-endpoint">--</td></tr>
|
||||||
<tr><td>Rigctl clients</td><td id="about-rigctl-clients">--</td></tr>
|
<tr><td>Rigctl clients</td><td id="about-rigctl-clients">--</td></tr>
|
||||||
<tr><td>PSK Reporter</td><td id="about-pskreporter">--</td></tr>
|
<tr><td>PSK Reporter</td><td id="about-pskreporter">--</td></tr>
|
||||||
|
<tr><td>APRS-IS</td><td id="about-aprs-is">--</td></tr>
|
||||||
<tr><td>Client version</td><td>{pkg} v{ver}</td></tr>
|
<tr><td>Client version</td><td>{pkg} v{ver}</td></tr>
|
||||||
<tr><td>Connected clients</td><td id="about-clients">--</td></tr>
|
<tr><td>Connected clients</td><td id="about-clients">--</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -2104,6 +2104,7 @@ async fn wait_for_view(mut rx: watch::Receiver<RigState>) -> Result<RigSnapshot,
|
|||||||
server_latitude: state.server_latitude,
|
server_latitude: state.server_latitude,
|
||||||
server_longitude: state.server_longitude,
|
server_longitude: state.server_longitude,
|
||||||
pskreporter_status: state.pskreporter_status,
|
pskreporter_status: state.pskreporter_status,
|
||||||
|
aprs_is_status: state.aprs_is_status,
|
||||||
aprs_decode_enabled: state.aprs_decode_enabled,
|
aprs_decode_enabled: state.aprs_decode_enabled,
|
||||||
hf_aprs_decode_enabled: state.hf_aprs_decode_enabled,
|
hf_aprs_decode_enabled: state.hf_aprs_decode_enabled,
|
||||||
cw_decode_enabled: state.cw_decode_enabled,
|
cw_decode_enabled: state.cw_decode_enabled,
|
||||||
|
|||||||
@@ -655,6 +655,7 @@ mod tests {
|
|||||||
server_latitude: None,
|
server_latitude: None,
|
||||||
server_longitude: None,
|
server_longitude: None,
|
||||||
pskreporter_status: None,
|
pskreporter_status: None,
|
||||||
|
aprs_is_status: None,
|
||||||
aprs_decode_enabled: false,
|
aprs_decode_enabled: false,
|
||||||
hf_aprs_decode_enabled: false,
|
hf_aprs_decode_enabled: false,
|
||||||
cw_decode_enabled: false,
|
cw_decode_enabled: false,
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ pub struct RigState {
|
|||||||
pub server_longitude: Option<f64>,
|
pub server_longitude: Option<f64>,
|
||||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
pub pskreporter_status: Option<String>,
|
pub pskreporter_status: Option<String>,
|
||||||
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
|
pub aprs_is_status: Option<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub aprs_decode_enabled: bool,
|
pub aprs_decode_enabled: bool,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@@ -149,6 +151,7 @@ impl RigState {
|
|||||||
server_latitude: None,
|
server_latitude: None,
|
||||||
server_longitude: None,
|
server_longitude: None,
|
||||||
pskreporter_status: None,
|
pskreporter_status: None,
|
||||||
|
aprs_is_status: None,
|
||||||
aprs_decode_enabled: false,
|
aprs_decode_enabled: false,
|
||||||
hf_aprs_decode_enabled: false,
|
hf_aprs_decode_enabled: false,
|
||||||
cw_decode_enabled: true,
|
cw_decode_enabled: true,
|
||||||
@@ -217,6 +220,7 @@ impl RigState {
|
|||||||
server_latitude: snapshot.server_latitude,
|
server_latitude: snapshot.server_latitude,
|
||||||
server_longitude: snapshot.server_longitude,
|
server_longitude: snapshot.server_longitude,
|
||||||
pskreporter_status: snapshot.pskreporter_status,
|
pskreporter_status: snapshot.pskreporter_status,
|
||||||
|
aprs_is_status: snapshot.aprs_is_status,
|
||||||
aprs_decode_enabled: snapshot.aprs_decode_enabled,
|
aprs_decode_enabled: snapshot.aprs_decode_enabled,
|
||||||
hf_aprs_decode_enabled: snapshot.hf_aprs_decode_enabled,
|
hf_aprs_decode_enabled: snapshot.hf_aprs_decode_enabled,
|
||||||
cw_decode_enabled: snapshot.cw_decode_enabled,
|
cw_decode_enabled: snapshot.cw_decode_enabled,
|
||||||
@@ -263,6 +267,7 @@ impl RigState {
|
|||||||
server_latitude: self.server_latitude,
|
server_latitude: self.server_latitude,
|
||||||
server_longitude: self.server_longitude,
|
server_longitude: self.server_longitude,
|
||||||
pskreporter_status: self.pskreporter_status.clone(),
|
pskreporter_status: self.pskreporter_status.clone(),
|
||||||
|
aprs_is_status: self.aprs_is_status.clone(),
|
||||||
aprs_decode_enabled: self.aprs_decode_enabled,
|
aprs_decode_enabled: self.aprs_decode_enabled,
|
||||||
hf_aprs_decode_enabled: self.hf_aprs_decode_enabled,
|
hf_aprs_decode_enabled: self.hf_aprs_decode_enabled,
|
||||||
cw_decode_enabled: self.cw_decode_enabled,
|
cw_decode_enabled: self.cw_decode_enabled,
|
||||||
@@ -430,6 +435,8 @@ pub struct RigSnapshot {
|
|||||||
pub server_longitude: Option<f64>,
|
pub server_longitude: Option<f64>,
|
||||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
pub pskreporter_status: Option<String>,
|
pub pskreporter_status: Option<String>,
|
||||||
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||||
|
pub aprs_is_status: Option<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub aprs_decode_enabled: bool,
|
pub aprs_decode_enabled: bool,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
|||||||
@@ -427,6 +427,7 @@ mod tests {
|
|||||||
server_latitude: None,
|
server_latitude: None,
|
||||||
server_longitude: None,
|
server_longitude: None,
|
||||||
pskreporter_status: None,
|
pskreporter_status: None,
|
||||||
|
aprs_is_status: None,
|
||||||
aprs_decode_enabled: false,
|
aprs_decode_enabled: false,
|
||||||
hf_aprs_decode_enabled: false,
|
hf_aprs_decode_enabled: false,
|
||||||
cw_decode_enabled: false,
|
cw_decode_enabled: false,
|
||||||
|
|||||||
@@ -402,6 +402,25 @@ fn build_rig_task_config(
|
|||||||
Some("Disabled".to_string())
|
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 {
|
rig_task::RigTaskConfig {
|
||||||
registry,
|
registry,
|
||||||
rig_id: rig_cfg.id.clone(),
|
rig_id: rig_cfg.id.clone(),
|
||||||
@@ -424,6 +443,7 @@ fn build_rig_task_config(
|
|||||||
server_latitude: latitude,
|
server_latitude: latitude,
|
||||||
server_longitude: longitude,
|
server_longitude: longitude,
|
||||||
pskreporter_status,
|
pskreporter_status,
|
||||||
|
aprs_is_status,
|
||||||
histories,
|
histories,
|
||||||
prebuilt_rig: None,
|
prebuilt_rig: None,
|
||||||
}
|
}
|
||||||
@@ -1007,6 +1027,14 @@ async fn main() -> DynResult<()> {
|
|||||||
} else {
|
} else {
|
||||||
Some("Disabled".to_string())
|
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 (state_tx, state_rx) = watch::channel(initial_state);
|
||||||
|
|
||||||
let mut task_config = build_rig_task_config(
|
let mut task_config = build_rig_task_config(
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ pub struct RigTaskConfig {
|
|||||||
pub server_latitude: Option<f64>,
|
pub server_latitude: Option<f64>,
|
||||||
pub server_longitude: Option<f64>,
|
pub server_longitude: Option<f64>,
|
||||||
pub pskreporter_status: Option<String>,
|
pub pskreporter_status: Option<String>,
|
||||||
|
pub aprs_is_status: Option<String>,
|
||||||
/// Per-rig decoder history store. Used by Reset* commands to clear the
|
/// Per-rig decoder history store. Used by Reset* commands to clear the
|
||||||
/// history and by the audio listener to serve history on connection.
|
/// history and by the audio listener to serve history on connection.
|
||||||
pub histories: Arc<DecoderHistories>,
|
pub histories: Arc<DecoderHistories>,
|
||||||
@@ -78,6 +79,7 @@ impl Default for RigTaskConfig {
|
|||||||
server_latitude: None,
|
server_latitude: None,
|
||||||
server_longitude: None,
|
server_longitude: None,
|
||||||
pskreporter_status: None,
|
pskreporter_status: None,
|
||||||
|
aprs_is_status: None,
|
||||||
histories: DecoderHistories::new(),
|
histories: DecoderHistories::new(),
|
||||||
prebuilt_rig: None,
|
prebuilt_rig: None,
|
||||||
}
|
}
|
||||||
@@ -136,6 +138,7 @@ pub async fn run_rig_task(
|
|||||||
config.initial_mode.clone(),
|
config.initial_mode.clone(),
|
||||||
);
|
);
|
||||||
state.pskreporter_status = config.pskreporter_status.clone();
|
state.pskreporter_status = config.pskreporter_status.clone();
|
||||||
|
state.aprs_is_status = config.aprs_is_status.clone();
|
||||||
|
|
||||||
// Polling configuration
|
// Polling configuration
|
||||||
let polling = &config.polling;
|
let polling = &config.polling;
|
||||||
|
|||||||
Reference in New Issue
Block a user