From f7367e6270a93e7128b155c698a04fe1ba252fce Mon Sep 17 00:00:00 2001 From: Stan Grams Date: Sat, 28 Feb 2026 09:16:15 +0100 Subject: [PATCH] [feat](trx-frontend-http): add RDS debug panel in Plugins tab Add an RDS sub-tab to the Plugins panel showing PI code, PS name, PTY number and name, decoder status, and a raw JSON dump of the latest RDS data received via SSE. Also list the RDS decoder in the Overview tab. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: Stan Grams --- .../trx-frontend-http/assets/web/app.js | 44 ++++++++++++++++--- .../trx-frontend-http/assets/web/index.html | 18 ++++++++ .../trx-frontend-http/assets/web/style.css | 10 +++++ 3 files changed, 65 insertions(+), 7 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 8458e78..357fe3d 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 @@ -3103,14 +3103,44 @@ function clearSpectrumCanvas() { } function updateRdsPsOverlay(rds) { - if (!rdsPsOverlay) return; - const ps = rds?.program_service?.trim(); - if (ps) { - rdsPsOverlay.textContent = ps; - rdsPsOverlay.style.display = ""; - } else { - rdsPsOverlay.style.display = "none"; + // Overview strip overlay + if (rdsPsOverlay) { + const ps = rds?.program_service?.trim(); + if (ps) { + rdsPsOverlay.textContent = ps; + rdsPsOverlay.style.display = ""; + } else { + rdsPsOverlay.style.display = "none"; + } } + + // RDS debug panel + const statusEl = document.getElementById("rds-status"); + const piEl = document.getElementById("rds-pi"); + const psEl = document.getElementById("rds-ps"); + const ptyEl = document.getElementById("rds-pty"); + const ptyNameEl = document.getElementById("rds-pty-name"); + const rawEl = document.getElementById("rds-raw"); + if (!statusEl) return; + + if (!rds) { + statusEl.textContent = "No signal"; + statusEl.className = "rds-value rds-no-signal"; + piEl.textContent = "--"; + psEl.textContent = "--"; + ptyEl.textContent = "--"; + ptyNameEl.textContent = "--"; + rawEl.textContent = "--"; + return; + } + + statusEl.textContent = "Decoding"; + statusEl.className = "rds-value rds-decoding"; + piEl.textContent = rds.pi != null ? `0x${rds.pi.toString(16).toUpperCase().padStart(4, "0")}` : "--"; + psEl.textContent = rds.program_service ?? "--"; + ptyEl.textContent = rds.pty != null ? String(rds.pty) : "--"; + ptyNameEl.textContent = rds.pty_name ?? "--"; + rawEl.textContent = JSON.stringify(rds, null, 2); } function scheduleSpectrumDraw() { 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 61e338f..f080cc2 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 @@ -236,6 +236,7 @@ +
@@ -263,6 +264,23 @@ Decodes WSPR messages from RX audio (DIG/USB only, toggle required).
+
+ RDS Decoder +
+ Decodes Radio Data System (RDS) metadata from WFM broadcasts (57 kHz subcarrier). +
+
+ +