[fix](trx-backend-soapysdr,trx-frontend-http): keep rds state on bw changes

Co-authored-by: Codex <codex@openai.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-02-28 12:13:06 +01:00
parent 976f66d383
commit 8f7afed132
3 changed files with 48 additions and 31 deletions
@@ -366,9 +366,10 @@ let sigMeasurePeak = null;
let lastFreqHz = null;
let centerFreqDirty = false;
let jogUnit = loadSetting("jogUnit", 1000); // base unit: 1, 1000, 1000000
let jogMult = loadSetting("jogMult", 1); // multiplier: 1, 10, 100
let jogStep = Math.max(jogUnit * jogMult, 1);
let jogMult = loadSetting("jogMult", 1); // divisor: 1, 10, 100
let jogStep = Math.max(Math.round(jogUnit / jogMult), 1);
let minFreqStepHz = 1;
let lastModeName = "";
const VFO_COLORS = ["var(--accent-green)", "var(--accent-yellow)"];
function vfoColor(idx) {
if (idx < VFO_COLORS.length) return VFO_COLORS[idx];
@@ -1053,7 +1054,7 @@ function updateJogStepSupport(cap) {
Number.isFinite(current) && current >= minFreqStepHz ? current : Math.max(steps[0], minFreqStepHz);
jogUnit = steps.reduce((best, s) => (Math.abs(s - desired) < Math.abs(best - desired) ? s : best), steps[0]);
jogStep = Math.max(jogUnit * jogMult, minFreqStepHz);
jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz);
saveSetting("jogUnit", jogUnit);
saveSetting("jogStep", jogStep);
@@ -1240,7 +1241,12 @@ function render(update) {
}
if (update.status && update.status.mode) {
const mode = normalizeMode(update.status.mode);
modeEl.value = mode ? mode.toUpperCase() : "";
const modeUpper = mode ? mode.toUpperCase() : "";
modeEl.value = modeUpper;
if (modeUpper === "WFM" && lastModeName !== "WFM") {
setJogDivisor(10);
}
lastModeName = modeUpper;
updateWfmControls();
// When filter panel is active (SDR backend), update the BW slider range
// to match the new mode — but only if the server hasn't already sent a
@@ -1716,7 +1722,7 @@ const jogStepEl = document.getElementById("jog-step");
const jogMultEl = document.getElementById("jog-mult");
function applyJogStep() {
jogStep = Math.max(jogUnit * jogMult, minFreqStepHz);
jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz);
saveSetting("jogUnit", jogUnit);
saveSetting("jogMult", jogMult);
saveSetting("jogStep", jogStep);
@@ -1724,6 +1730,17 @@ function applyJogStep() {
refreshCenterFreqDisplay();
}
function setJogDivisor(divisor) {
const next = divisor === 10 || divisor === 100 ? divisor : 1;
jogMult = next;
if (jogMultEl) {
jogMultEl.querySelectorAll("button[data-mult]").forEach((b) => {
b.classList.toggle("active", parseInt(b.dataset.mult, 10) === jogMult);
});
}
applyJogStep();
}
async function jogFreq(direction) {
if (lastLocked) { showHint("Locked", 1500); return; }
if (lastFreqHz === null) return;
@@ -1835,7 +1852,7 @@ if (jogMultEl) {
multBtns.forEach((b) => b.classList.toggle("active", b === activeMult));
}
}
jogStep = Math.max(jogUnit * jogMult, minFreqStepHz);
jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz);
}
async function applyModeFromPicker() {
@@ -1850,6 +1867,9 @@ async function applyModeFromPicker() {
try {
await postPath(`/set_mode?mode=${encodeURIComponent(mode)}`);
showHint("Mode set", 1500);
if (mode.toUpperCase() === "WFM") {
setJogDivisor(10);
}
// Apply sensible default bandwidth for the new mode and push to server.
await applyBwDefaultForMode(mode, true);
} catch (err) {
@@ -124,11 +124,11 @@
</div>
<div class="freq-field mult-col">
<div class="jog-mult" id="jog-mult">
<button type="button" data-mult="1" class="active">1×</button>
<button type="button" data-mult="10">10×</button>
<button type="button" data-mult="100">100×</button>
<button type="button" data-mult="1" class="active">1</button>
<button type="button" data-mult="10">1/10</button>
<button type="button" data-mult="100">1/100</button>
</div>
<div class="label"><span>Unit Multiplier</span></div>
<div class="label"><span>Unit Divisor</span></div>
</div>
</div>
</div>