diff --git a/src/trx-server/src/rig_task.rs b/src/trx-server/src/rig_task.rs index b7c63cb..d565688 100644 --- a/src/trx-server/src/rig_task.rs +++ b/src/trx-server/src/rig_task.rs @@ -254,17 +254,18 @@ pub async fn run_rig_task( ); let _ = state_tx.send(state.clone()); - // SDR backends can refresh signal strength cheaply (cached DSP value), - // so we run a fast meter tick between full polls to keep the S-meter - // responsive — matching the spectrum redraw rate (~100 ms). + // Run a fast meter tick between full polls to keep the S-meter + // responsive. SDR backends expose a cached DSP reading and can + // refresh every 100 ms; CAT rigs poll the serial link, which is + // slower but still fine at ~150 ms. let is_sdr = rig.as_sdr_ref().is_some(); - let meter_tick_duration = Duration::from_millis(100); - let mut meter_tick: std::pin::Pin> = if is_sdr { - Box::pin(tokio::time::sleep(meter_tick_duration)) + let meter_tick_duration = if is_sdr { + Duration::from_millis(100) } else { - // Park indefinitely for non-SDR backends; the branch will never fire. - Box::pin(tokio::time::sleep(Duration::from_secs(86400))) + Duration::from_millis(150) }; + let mut meter_tick: std::pin::Pin> = + Box::pin(tokio::time::sleep(meter_tick_duration)); // Main task loop let mut current_poll_duration = polling.interval(state.status.tx_en); @@ -289,11 +290,24 @@ pub async fn run_rig_task( Err(_) => break, } } - // Fast meter-only refresh for SDR backends (cheap cached read). - _ = &mut meter_tick, if is_sdr => { + // Fast meter-only refresh between full polls. + _ = &mut meter_tick => { meter_tick = Box::pin(tokio::time::sleep(meter_tick_duration)); - if !matches!(state.control.enabled, Some(false)) { - if let Some(db) = rig.get_signal_strength_db().await { + // Skip while powered off, transmitting, or while a + // full poll is paused (typically just after a CAT write). + let powered_off = matches!(state.control.enabled, Some(false)); + let paused = poll_pause_until + .map(|u| Instant::now() < u) + .unwrap_or(false); + if !powered_off && !state.status.tx_en && !paused { + let new_sig = if let Some(db) = rig.get_signal_strength_db().await { + Some(db) + } else if let Ok(meter) = rig.get_signal_strength().await { + Some(map_signal_strength(&state.status.mode, meter)) + } else { + None + }; + if let Some(db) = new_sig { let prev = state.status.rx.as_ref().and_then(|r| r.sig); if prev != Some(db) { state.status.rx.get_or_insert(RigRxStatus { sig: None }).sig = Some(db);