[fix](trx-frontend): let decoder disable take scheduler control
When a scheduler-managed decoder is manually disabled from the frontend, take scheduler control first so the manual change overrides the current scheduler cycle like a direct frequency change does. Track decoder enabled state on the toggle buttons and only take over when the click is actually disabling FT8, FT4, FT2, WSPR, or HF APRS. Co-Authored-By: OpenAI Codex <noreply@openai.com> Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
@@ -2875,6 +2875,7 @@ function render(update) {
|
|||||||
const ft8ToggleBtn = document.getElementById("ft8-decode-toggle-btn");
|
const ft8ToggleBtn = document.getElementById("ft8-decode-toggle-btn");
|
||||||
if (ft8ToggleBtn) {
|
if (ft8ToggleBtn) {
|
||||||
const ft8On = !!update.ft8_decode_enabled;
|
const ft8On = !!update.ft8_decode_enabled;
|
||||||
|
ft8ToggleBtn.dataset.enabled = ft8On ? "true" : "false";
|
||||||
ft8ToggleBtn.textContent = ft8On ? "Disable FT8" : "Enable FT8";
|
ft8ToggleBtn.textContent = ft8On ? "Disable FT8" : "Enable FT8";
|
||||||
ft8ToggleBtn.style.borderColor = ft8On ? "#00d17f" : "";
|
ft8ToggleBtn.style.borderColor = ft8On ? "#00d17f" : "";
|
||||||
ft8ToggleBtn.style.color = ft8On ? "#00d17f" : "";
|
ft8ToggleBtn.style.color = ft8On ? "#00d17f" : "";
|
||||||
@@ -2882,6 +2883,7 @@ function render(update) {
|
|||||||
const ft4ToggleBtn = document.getElementById("ft4-decode-toggle-btn");
|
const ft4ToggleBtn = document.getElementById("ft4-decode-toggle-btn");
|
||||||
if (ft4ToggleBtn) {
|
if (ft4ToggleBtn) {
|
||||||
const ft4On = !!update.ft4_decode_enabled;
|
const ft4On = !!update.ft4_decode_enabled;
|
||||||
|
ft4ToggleBtn.dataset.enabled = ft4On ? "true" : "false";
|
||||||
ft4ToggleBtn.textContent = ft4On ? "Disable FT4" : "Enable FT4";
|
ft4ToggleBtn.textContent = ft4On ? "Disable FT4" : "Enable FT4";
|
||||||
ft4ToggleBtn.style.borderColor = ft4On ? "#00d17f" : "";
|
ft4ToggleBtn.style.borderColor = ft4On ? "#00d17f" : "";
|
||||||
ft4ToggleBtn.style.color = ft4On ? "#00d17f" : "";
|
ft4ToggleBtn.style.color = ft4On ? "#00d17f" : "";
|
||||||
@@ -2889,6 +2891,7 @@ function render(update) {
|
|||||||
const ft2ToggleBtn = document.getElementById("ft2-decode-toggle-btn");
|
const ft2ToggleBtn = document.getElementById("ft2-decode-toggle-btn");
|
||||||
if (ft2ToggleBtn) {
|
if (ft2ToggleBtn) {
|
||||||
const ft2On = !!update.ft2_decode_enabled;
|
const ft2On = !!update.ft2_decode_enabled;
|
||||||
|
ft2ToggleBtn.dataset.enabled = ft2On ? "true" : "false";
|
||||||
ft2ToggleBtn.textContent = ft2On ? "Disable FT2" : "Enable FT2";
|
ft2ToggleBtn.textContent = ft2On ? "Disable FT2" : "Enable FT2";
|
||||||
ft2ToggleBtn.style.borderColor = ft2On ? "#00d17f" : "";
|
ft2ToggleBtn.style.borderColor = ft2On ? "#00d17f" : "";
|
||||||
ft2ToggleBtn.style.color = ft2On ? "#00d17f" : "";
|
ft2ToggleBtn.style.color = ft2On ? "#00d17f" : "";
|
||||||
@@ -2896,6 +2899,7 @@ function render(update) {
|
|||||||
const wsprToggleBtn = document.getElementById("wspr-decode-toggle-btn");
|
const wsprToggleBtn = document.getElementById("wspr-decode-toggle-btn");
|
||||||
if (wsprToggleBtn) {
|
if (wsprToggleBtn) {
|
||||||
const wsprOn = !!update.wspr_decode_enabled;
|
const wsprOn = !!update.wspr_decode_enabled;
|
||||||
|
wsprToggleBtn.dataset.enabled = wsprOn ? "true" : "false";
|
||||||
wsprToggleBtn.textContent = wsprOn ? "Disable WSPR" : "Enable WSPR";
|
wsprToggleBtn.textContent = wsprOn ? "Disable WSPR" : "Enable WSPR";
|
||||||
wsprToggleBtn.style.borderColor = wsprOn ? "#00d17f" : "";
|
wsprToggleBtn.style.borderColor = wsprOn ? "#00d17f" : "";
|
||||||
wsprToggleBtn.style.color = wsprOn ? "#00d17f" : "";
|
wsprToggleBtn.style.color = wsprOn ? "#00d17f" : "";
|
||||||
@@ -2903,6 +2907,7 @@ function render(update) {
|
|||||||
const hfAprsToggleBtn = document.getElementById("hf-aprs-decode-toggle-btn");
|
const hfAprsToggleBtn = document.getElementById("hf-aprs-decode-toggle-btn");
|
||||||
if (hfAprsToggleBtn) {
|
if (hfAprsToggleBtn) {
|
||||||
const hfAprsOn = !!update.hf_aprs_decode_enabled;
|
const hfAprsOn = !!update.hf_aprs_decode_enabled;
|
||||||
|
hfAprsToggleBtn.dataset.enabled = hfAprsOn ? "true" : "false";
|
||||||
hfAprsToggleBtn.textContent = hfAprsOn ? "Disable HF APRS" : "Enable HF APRS";
|
hfAprsToggleBtn.textContent = hfAprsOn ? "Disable HF APRS" : "Enable HF APRS";
|
||||||
hfAprsToggleBtn.style.borderColor = hfAprsOn ? "#00d17f" : "";
|
hfAprsToggleBtn.style.borderColor = hfAprsOn ? "#00d17f" : "";
|
||||||
hfAprsToggleBtn.style.color = hfAprsOn ? "#00d17f" : "";
|
hfAprsToggleBtn.style.color = hfAprsOn ? "#00d17f" : "";
|
||||||
@@ -3247,6 +3252,16 @@ async function postPath(path) {
|
|||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function takeSchedulerControlForDecoderDisable(buttonEl) {
|
||||||
|
const enabled = buttonEl?.dataset?.enabled === "true"
|
||||||
|
|| /^\s*Disable\b/i.test(buttonEl?.textContent || "");
|
||||||
|
if (!enabled) return;
|
||||||
|
if (typeof window.vchanTakeSchedulerControl === "function") {
|
||||||
|
await window.vchanTakeSchedulerControl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.takeSchedulerControlForDecoderDisable = takeSchedulerControlForDecoderDisable;
|
||||||
|
|
||||||
async function switchRigFromSelect(selectEl) {
|
async function switchRigFromSelect(selectEl) {
|
||||||
if (!selectEl || !selectEl.value) {
|
if (!selectEl || !selectEl.value) {
|
||||||
showHint("No rig selected", 1500);
|
showHint("No rig selected", 1500);
|
||||||
|
|||||||
@@ -179,8 +179,14 @@ if (ft2FilterInput) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementById("ft2-decode-toggle-btn")?.addEventListener("click", async () => {
|
const ft2DecodeToggleBtn = document.getElementById("ft2-decode-toggle-btn");
|
||||||
try { await postPath("/toggle_ft2_decode"); } catch (e) { console.error("FT2 toggle failed", e); }
|
ft2DecodeToggleBtn?.addEventListener("click", async () => {
|
||||||
|
try {
|
||||||
|
await window.takeSchedulerControlForDecoderDisable?.(ft2DecodeToggleBtn);
|
||||||
|
await postPath("/toggle_ft2_decode");
|
||||||
|
} catch (e) {
|
||||||
|
console.error("FT2 toggle failed", e);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("settings-clear-ft2-history")?.addEventListener("click", async () => {
|
document.getElementById("settings-clear-ft2-history")?.addEventListener("click", async () => {
|
||||||
|
|||||||
@@ -179,8 +179,14 @@ if (ft4FilterInput) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementById("ft4-decode-toggle-btn")?.addEventListener("click", async () => {
|
const ft4DecodeToggleBtn = document.getElementById("ft4-decode-toggle-btn");
|
||||||
try { await postPath("/toggle_ft4_decode"); } catch (e) { console.error("FT4 toggle failed", e); }
|
ft4DecodeToggleBtn?.addEventListener("click", async () => {
|
||||||
|
try {
|
||||||
|
await window.takeSchedulerControlForDecoderDisable?.(ft4DecodeToggleBtn);
|
||||||
|
await postPath("/toggle_ft4_decode");
|
||||||
|
} catch (e) {
|
||||||
|
console.error("FT4 toggle failed", e);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("settings-clear-ft4-history")?.addEventListener("click", async () => {
|
document.getElementById("settings-clear-ft4-history")?.addEventListener("click", async () => {
|
||||||
|
|||||||
@@ -447,8 +447,14 @@ if (ft8MessagesEl) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementById("ft8-decode-toggle-btn").addEventListener("click", async () => {
|
const ft8DecodeToggleBtn = document.getElementById("ft8-decode-toggle-btn");
|
||||||
try { await postPath("/toggle_ft8_decode"); } catch (e) { console.error("FT8 toggle failed", e); }
|
ft8DecodeToggleBtn?.addEventListener("click", async () => {
|
||||||
|
try {
|
||||||
|
await window.takeSchedulerControlForDecoderDisable?.(ft8DecodeToggleBtn);
|
||||||
|
await postPath("/toggle_ft8_decode");
|
||||||
|
} catch (e) {
|
||||||
|
console.error("FT8 toggle failed", e);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("settings-clear-ft8-history")?.addEventListener("click", async () => {
|
document.getElementById("settings-clear-ft8-history")?.addEventListener("click", async () => {
|
||||||
|
|||||||
@@ -372,8 +372,14 @@ window.restoreHfAprsHistory = function(packets) {
|
|||||||
window.onServerHfAprsBatch(packets);
|
window.onServerHfAprsBatch(packets);
|
||||||
};
|
};
|
||||||
|
|
||||||
document.getElementById("hf-aprs-decode-toggle-btn")?.addEventListener("click", async () => {
|
const hfAprsDecodeToggleBtn = document.getElementById("hf-aprs-decode-toggle-btn");
|
||||||
try { await postPath("/toggle_hf_aprs_decode"); } catch (e) { console.error("HF APRS toggle failed", e); }
|
hfAprsDecodeToggleBtn?.addEventListener("click", async () => {
|
||||||
|
try {
|
||||||
|
await window.takeSchedulerControlForDecoderDisable?.(hfAprsDecodeToggleBtn);
|
||||||
|
await postPath("/toggle_hf_aprs_decode");
|
||||||
|
} catch (e) {
|
||||||
|
console.error("HF APRS toggle failed", e);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("settings-clear-hf-aprs-history")?.addEventListener("click", async () => {
|
document.getElementById("settings-clear-hf-aprs-history")?.addEventListener("click", async () => {
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ async function vchanTakeSchedulerControl() {
|
|||||||
console.error("scheduler control takeover failed", e);
|
console.error("scheduler control takeover failed", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
window.vchanTakeSchedulerControl = vchanTakeSchedulerControl;
|
||||||
|
|
||||||
// Called by app.js when the SSE `session` event arrives.
|
// Called by app.js when the SSE `session` event arrives.
|
||||||
function vchanHandleSession(data) {
|
function vchanHandleSession(data) {
|
||||||
|
|||||||
@@ -255,8 +255,14 @@ if (wsprMessagesEl) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementById("wspr-decode-toggle-btn").addEventListener("click", async () => {
|
const wsprDecodeToggleBtn = document.getElementById("wspr-decode-toggle-btn");
|
||||||
try { await postPath("/toggle_wspr_decode"); } catch (e) { console.error("WSPR toggle failed", e); }
|
wsprDecodeToggleBtn?.addEventListener("click", async () => {
|
||||||
|
try {
|
||||||
|
await window.takeSchedulerControlForDecoderDisable?.(wsprDecodeToggleBtn);
|
||||||
|
await postPath("/toggle_wspr_decode");
|
||||||
|
} catch (e) {
|
||||||
|
console.error("WSPR toggle failed", e);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("settings-clear-wspr-history")?.addEventListener("click", async () => {
|
document.getElementById("settings-clear-wspr-history")?.addEventListener("click", async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user