[feat](trx-frontend-http): add decoder toggle/clear UI and endpoints
Add POST endpoints for toggle_aprs_decode, toggle_cw_decode, clear_aprs_decode, and clear_cw_decode. Add toggle buttons in APRS and CW tabs. Render decoder enabled state from SSE updates. Clear button now also resets server-side decoder state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
@@ -362,6 +362,24 @@ function render(update) {
|
|||||||
if (typeof update.clients === "number") {
|
if (typeof update.clients === "number") {
|
||||||
document.getElementById("about-clients").textContent = update.clients;
|
document.getElementById("about-clients").textContent = update.clients;
|
||||||
}
|
}
|
||||||
|
// Decoder toggle buttons
|
||||||
|
const aprsToggleBtn = document.getElementById("aprs-decode-toggle-btn");
|
||||||
|
const cwToggleBtn = document.getElementById("cw-decode-toggle-btn");
|
||||||
|
if (aprsToggleBtn) {
|
||||||
|
const aprsOn = !!update.aprs_decode_enabled;
|
||||||
|
aprsToggleBtn.textContent = aprsOn ? "Disable APRS" : "Enable APRS";
|
||||||
|
aprsToggleBtn.style.borderColor = aprsOn ? "#00d17f" : "";
|
||||||
|
aprsToggleBtn.style.color = aprsOn ? "#00d17f" : "";
|
||||||
|
window.aprsDecodeEnabled = aprsOn;
|
||||||
|
}
|
||||||
|
if (cwToggleBtn) {
|
||||||
|
const cwOn = !!update.cw_decode_enabled;
|
||||||
|
cwToggleBtn.textContent = cwOn ? "Disable CW" : "Enable CW";
|
||||||
|
cwToggleBtn.style.borderColor = cwOn ? "#00d17f" : "";
|
||||||
|
cwToggleBtn.style.color = cwOn ? "#00d17f" : "";
|
||||||
|
window.cwDecodeEnabled = cwOn;
|
||||||
|
}
|
||||||
|
|
||||||
powerHint.textContent = readyText();
|
powerHint.textContent = readyText();
|
||||||
lastLocked = update.status && update.status.lock === true;
|
lastLocked = update.status && update.status.lock === true;
|
||||||
lockBtn.textContent = lastLocked ? "Unlock" : "Lock";
|
lockBtn.textContent = lastLocked ? "Unlock" : "Lock";
|
||||||
|
|||||||
@@ -145,6 +145,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="subtab-aprs" class="sub-tab-panel" style="display:none;">
|
<div id="subtab-aprs" class="sub-tab-panel" style="display:none;">
|
||||||
<div class="aprs-controls">
|
<div class="aprs-controls">
|
||||||
|
<button id="aprs-decode-toggle-btn" type="button">Enable APRS</button>
|
||||||
<button id="aprs-clear-btn" type="button">Clear</button>
|
<button id="aprs-clear-btn" type="button">Clear</button>
|
||||||
<small id="aprs-status" style="color:var(--text-muted);">Waiting for server decode</small>
|
<small id="aprs-status" style="color:var(--text-muted);">Waiting for server decode</small>
|
||||||
</div>
|
</div>
|
||||||
@@ -152,6 +153,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="subtab-cw" class="sub-tab-panel" style="display:none;">
|
<div id="subtab-cw" class="sub-tab-panel" style="display:none;">
|
||||||
<div class="cw-controls">
|
<div class="cw-controls">
|
||||||
|
<button id="cw-decode-toggle-btn" type="button">Enable CW</button>
|
||||||
<button id="cw-clear-btn" type="button">Clear</button>
|
<button id="cw-clear-btn" type="button">Clear</button>
|
||||||
<small id="cw-status" style="color:var(--text-muted);">Waiting for server decode</small>
|
<small id="cw-status" style="color:var(--text-muted);">Waiting for server decode</small>
|
||||||
<div id="cw-signal-indicator" class="cw-signal-off"></div>
|
<div id="cw-signal-indicator" class="cw-signal-off"></div>
|
||||||
|
|||||||
@@ -72,10 +72,15 @@ function addAprsPacket(pkt) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementById("aprs-clear-btn").addEventListener("click", () => {
|
document.getElementById("aprs-decode-toggle-btn").addEventListener("click", async () => {
|
||||||
|
try { await postPath("/toggle_aprs_decode"); } catch (e) { console.error("APRS toggle failed", e); }
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("aprs-clear-btn").addEventListener("click", async () => {
|
||||||
aprsPacketsEl.innerHTML = "";
|
aprsPacketsEl.innerHTML = "";
|
||||||
aprsPacketHistory = [];
|
aprsPacketHistory = [];
|
||||||
saveSetting("aprsPackets", []);
|
saveSetting("aprsPackets", []);
|
||||||
|
try { await postPath("/clear_aprs_decode"); } catch (e) { console.error("APRS clear failed", e); }
|
||||||
});
|
});
|
||||||
|
|
||||||
// Restore saved packets and map markers on page load
|
// Restore saved packets and map markers on page load
|
||||||
|
|||||||
@@ -6,8 +6,13 @@ const cwToneInput = document.getElementById("cw-tone");
|
|||||||
const cwSignalIndicator = document.getElementById("cw-signal-indicator");
|
const cwSignalIndicator = document.getElementById("cw-signal-indicator");
|
||||||
const CW_MAX_LINES = 200;
|
const CW_MAX_LINES = 200;
|
||||||
|
|
||||||
document.getElementById("cw-clear-btn").addEventListener("click", () => {
|
document.getElementById("cw-decode-toggle-btn").addEventListener("click", async () => {
|
||||||
|
try { await postPath("/toggle_cw_decode"); } catch (e) { console.error("CW toggle failed", e); }
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("cw-clear-btn").addEventListener("click", async () => {
|
||||||
cwOutputEl.innerHTML = "";
|
cwOutputEl.innerHTML = "";
|
||||||
|
try { await postPath("/clear_cw_decode"); } catch (e) { console.error("CW clear failed", e); }
|
||||||
});
|
});
|
||||||
|
|
||||||
// --- Server-side CW decode handler ---
|
// --- Server-side CW decode handler ---
|
||||||
|
|||||||
@@ -264,6 +264,38 @@ pub async fn set_tx_limit(
|
|||||||
send_command(&rig_tx, RigCommand::SetTxLimit(query.limit)).await
|
send_command(&rig_tx, RigCommand::SetTxLimit(query.limit)).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[post("/toggle_aprs_decode")]
|
||||||
|
pub async fn toggle_aprs_decode(
|
||||||
|
state: web::Data<watch::Receiver<RigState>>,
|
||||||
|
rig_tx: web::Data<mpsc::Sender<RigRequest>>,
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
let enabled = state.get_ref().borrow().aprs_decode_enabled;
|
||||||
|
send_command(&rig_tx, RigCommand::SetAprsDecodeEnabled(!enabled)).await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/toggle_cw_decode")]
|
||||||
|
pub async fn toggle_cw_decode(
|
||||||
|
state: web::Data<watch::Receiver<RigState>>,
|
||||||
|
rig_tx: web::Data<mpsc::Sender<RigRequest>>,
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
let enabled = state.get_ref().borrow().cw_decode_enabled;
|
||||||
|
send_command(&rig_tx, RigCommand::SetCwDecodeEnabled(!enabled)).await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/clear_aprs_decode")]
|
||||||
|
pub async fn clear_aprs_decode(
|
||||||
|
rig_tx: web::Data<mpsc::Sender<RigRequest>>,
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
send_command(&rig_tx, RigCommand::ResetAprsDecoder).await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[post("/clear_cw_decode")]
|
||||||
|
pub async fn clear_cw_decode(
|
||||||
|
rig_tx: web::Data<mpsc::Sender<RigRequest>>,
|
||||||
|
) -> Result<HttpResponse, Error> {
|
||||||
|
send_command(&rig_tx, RigCommand::ResetCwDecoder).await
|
||||||
|
}
|
||||||
|
|
||||||
pub fn configure(cfg: &mut web::ServiceConfig) {
|
pub fn configure(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(index)
|
cfg.service(index)
|
||||||
.service(status_api)
|
.service(status_api)
|
||||||
@@ -277,6 +309,10 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
|
|||||||
.service(set_mode)
|
.service(set_mode)
|
||||||
.service(set_ptt)
|
.service(set_ptt)
|
||||||
.service(set_tx_limit)
|
.service(set_tx_limit)
|
||||||
|
.service(toggle_aprs_decode)
|
||||||
|
.service(toggle_cw_decode)
|
||||||
|
.service(clear_aprs_decode)
|
||||||
|
.service(clear_cw_decode)
|
||||||
.service(crate::server::audio::audio_ws)
|
.service(crate::server::audio::audio_ws)
|
||||||
.service(favicon)
|
.service(favicon)
|
||||||
.service(logo)
|
.service(logo)
|
||||||
@@ -405,6 +441,8 @@ async fn wait_for_view(mut rx: watch::Receiver<RigState>) -> Result<RigSnapshot,
|
|||||||
server_version: state.server_version,
|
server_version: state.server_version,
|
||||||
server_latitude: state.server_latitude,
|
server_latitude: state.server_latitude,
|
||||||
server_longitude: state.server_longitude,
|
server_longitude: state.server_longitude,
|
||||||
|
aprs_decode_enabled: state.aprs_decode_enabled,
|
||||||
|
cw_decode_enabled: state.cw_decode_enabled,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user