From b7a4b8a1df18683deee82b22cc8d27248476db6d Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Sun, 15 Mar 2026 19:25:15 +0100 Subject: [PATCH] [feat](trx-frontend-http): add LNA gain control UI and API Add POST /set_sdr_lna_gain endpoint. Add an LNA Gain input+Set button to the SDR settings row, styled identically to RF Gain. The control is hidden until the server reports a sdr_lna_gain_db value (i.e. devices that expose an LNA gain element). AGC disables it alongside RF Gain. Co-authored-by: Claude Sonnet 4.6 Signed-off-by: Stanislaw Grams --- .../trx-frontend-http/assets/web/app.js | 33 +++++++++++++++++-- .../trx-frontend-http/assets/web/index.html | 7 ++++ .../trx-frontend/trx-frontend-http/src/api.rs | 14 ++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) 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 b4ee328..00c8eb4 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 @@ -2719,6 +2719,11 @@ function render(update) { ) { sdrGainEl.value = String(Math.round(update.filter.sdr_gain_db)); } + if (sdrLnaGainEl && typeof update.filter.sdr_lna_gain_db === "number" + && document.activeElement !== sdrLnaGainEl) { + sdrLnaGainEl.value = String(Math.round(update.filter.sdr_lna_gain_db)); + if (sdrLnaGainControlsEl) sdrLnaGainControlsEl.style.display = ""; + } if (wfmDeemphasisEl && typeof update.filter.wfm_deemphasis_us === "number") { wfmDeemphasisEl.value = String(update.filter.wfm_deemphasis_us); } @@ -6720,6 +6725,9 @@ const sdrSettingsRowEl = document.getElementById("sdr-settings-row"); const sdrGainControlsEl = document.getElementById("sdr-gain-controls"); const sdrGainEl = document.getElementById("sdr-gain-db"); const sdrGainSetBtn = document.getElementById("sdr-gain-set"); +const sdrLnaGainControlsEl = document.getElementById("sdr-lna-gain-controls"); +const sdrLnaGainEl = document.getElementById("sdr-lna-gain-db"); +const sdrLnaGainSetBtn = document.getElementById("sdr-lna-gain-set"); const sdrAgcEl = document.getElementById("sdr-agc-enabled"); const wfmStFlagEl = document.getElementById("wfm-st-flag"); const sdrSquelchWrapEl = document.getElementById("sdr-squelch-wrap"); @@ -6896,10 +6904,12 @@ function submitSdrGain() { postPath(`/set_sdr_gain?db=${encodeURIComponent(parsed)}`).catch(() => {}); } function updateSdrGainInputState() { - if (!sdrAgcEl || !sdrGainEl || !sdrGainSetBtn) return; + if (!sdrAgcEl) return; const agcOn = sdrAgcEl.checked; - sdrGainEl.disabled = agcOn; - sdrGainSetBtn.disabled = agcOn; + if (sdrGainEl) sdrGainEl.disabled = agcOn; + if (sdrGainSetBtn) sdrGainSetBtn.disabled = agcOn; + if (sdrLnaGainEl) sdrLnaGainEl.disabled = agcOn; + if (sdrLnaGainSetBtn) sdrLnaGainSetBtn.disabled = agcOn; } if (sdrAgcEl) { sdrAgcEl.addEventListener("change", () => { @@ -6918,6 +6928,23 @@ if (sdrGainEl) { } }); } +function submitSdrLnaGain() { + if (!sdrLnaGainEl) return; + const parsed = Number.parseFloat(sdrLnaGainEl.value); + if (!Number.isFinite(parsed) || parsed < 0) return; + postPath(`/set_sdr_lna_gain?db=${encodeURIComponent(parsed)}`).catch(() => {}); +} +if (sdrLnaGainSetBtn) { + sdrLnaGainSetBtn.addEventListener("click", submitSdrLnaGain); +} +if (sdrLnaGainEl) { + sdrLnaGainEl.addEventListener("keydown", (ev) => { + if (ev.key === "Enter") { + ev.preventDefault(); + submitSdrLnaGain(); + } + }); +} function updateWfmControls() { if (!wfmControlsCol) return; const mode = (modeEl && modeEl.value ? modeEl.value : "").toUpperCase(); 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 7d9f601..dc5c774 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 @@ -268,6 +268,13 @@ +
+ + +
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 064fb8b..551dce9 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 @@ -873,6 +873,19 @@ pub async fn set_sdr_gain( send_command(&rig_tx, RigCommand::SetSdrGain(query.db)).await } +#[derive(serde::Deserialize)] +pub struct SdrLnaGainQuery { + pub db: f64, +} + +#[post("/set_sdr_lna_gain")] +pub async fn set_sdr_lna_gain( + query: web::Query, + rig_tx: web::Data>, +) -> Result { + send_command(&rig_tx, RigCommand::SetSdrLnaGain(query.db)).await +} + #[derive(serde::Deserialize)] pub struct SdrAgcQuery { pub enabled: bool, @@ -1546,6 +1559,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) { .service(set_bandwidth) .service(set_fir_taps) .service(set_sdr_gain) + .service(set_sdr_lna_gain) .service(set_sdr_agc) .service(set_sdr_squelch) .service(set_wfm_deemphasis)