From 449663ddd7992d642ed28391bff9b843c72cb514 Mon Sep 17 00:00:00 2001 From: Stan Grams Date: Sat, 28 Feb 2026 01:22:30 +0100 Subject: [PATCH] [feat](trx-frontend-http): refine decoder and SDR displays Co-authored-by: OpenAI Codex Signed-off-by: Stan Grams --- .../trx-frontend-http/assets/web/app.js | 25 ++++++++++++++++--- .../trx-frontend-http/assets/web/index.html | 2 +- .../assets/web/plugins/aprs.js | 7 +++++- .../assets/web/plugins/ft8.js | 6 ++++- .../assets/web/plugins/wspr.js | 6 ++++- 5 files changed, 39 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 b9764ec..19b583e 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 @@ -275,12 +275,10 @@ function applyCapabilities(caps) { if (vfoRow) vfoRow.style.display = caps.vfo_switch ? "" : "none"; // Signal meter row - const sigRow = document.querySelector(".full-row.label-below-row"); - // Find signal row by content check rather than class (it may share classes) document.querySelectorAll(".full-row.label-below-row").forEach(row => { const label = row.querySelector(".label span"); if (label && label.textContent === "Signal") { - row.style.display = caps.signal_meter ? "" : "none"; + row.style.display = (caps.signal_meter && !caps.filter_controls) ? "" : "none"; } }); @@ -361,6 +359,7 @@ let lastClientCount = null; let lastLocked = false; let lastRigIds = []; let lastRigDisplayNames = {}; +let lastActiveRigId = null; const originalTitle = document.title; const savedTheme = loadSetting("theme", null); @@ -409,6 +408,25 @@ function readyText() { return lastClientCount !== null ? `Ready \u00b7 ${lastClientCount} user${lastClientCount !== 1 ? "s" : ""}` : "Ready"; } +function rigBadgeColor(rigId) { + const text = (rigId || "rx").toString(); + let hash = 0; + for (let i = 0; i < text.length; i++) { + hash = ((hash * 33) + text.charCodeAt(i)) >>> 0; + } + const hue = hash % 360; + return `hsl(${hue}, 62%, 52%)`; +} + +window.getDecodeRigMeta = function() { + const rigId = lastActiveRigId || "local"; + return { + rigId, + label: lastRigDisplayNames[rigId] || rigId, + color: rigBadgeColor(rigId), + }; +}; + function populateRigPicker(selectEl, rigIds, activeRigId, disabled) { if (!selectEl) return; const selectedBefore = selectEl.value; @@ -445,6 +463,7 @@ function applyRigList(activeRigId, rigIds, displayNames) { aboutList.textContent = lastRigIds.length ? lastRigIds.join(", ") : "--"; } if (typeof activeRigId === "string" && activeRigId.length > 0) { + lastActiveRigId = activeRigId; const aboutActive = document.getElementById("about-active-rig"); if (aboutActive) aboutActive.textContent = activeRigId; } 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 ef2f696..b287f07 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 @@ -99,7 +99,7 @@
diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/aprs.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/aprs.js index d7c692e..f555024 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/aprs.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/aprs.js @@ -68,7 +68,11 @@ function renderAprsRow(pkt) { const osmUrl = `https://www.openstreetmap.org/?mlat=${pkt.lat}&mlon=${pkt.lon}#map=15/${pkt.lat}/${pkt.lon}`; posHtml = ` ${pkt.lat.toFixed(4)}, ${pkt.lon.toFixed(4)}`; } + const receiverHtml = pkt.receiver + ? `${pkt.receiver.label} ` + : ""; row.dataset.filterText = [ + pkt.receiver ? pkt.receiver.label : "", pkt.srcCall, pkt.destCall, pkt.path, @@ -80,7 +84,7 @@ function renderAprsRow(pkt) { .filter(Boolean) .join(" ") .toUpperCase(); - row.innerHTML = `${ts}${symbolHtml}${pkt.srcCall}>${pkt.destCall}${pkt.path ? "," + pkt.path : ""}: ${renderAprsInfo(pkt)}${posHtml}${crcTag}`; + row.innerHTML = `${ts}${receiverHtml}${symbolHtml}${pkt.srcCall}>${pkt.destCall}${pkt.path ? "," + pkt.path : ""}: ${renderAprsInfo(pkt)}${posHtml}${crcTag}`; applyAprsFilterToRow(row); return row; } @@ -148,6 +152,7 @@ if (aprsFilterInput) { window.onServerAprs = function(pkt) { aprsStatus.textContent = "Receiving"; addAprsPacket({ + receiver: window.getDecodeRigMeta ? window.getDecodeRigMeta() : null, srcCall: pkt.src_call, destCall: pkt.dest_call, path: pkt.path, diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js index f8a19fb..8d439e2 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/ft8.js @@ -34,7 +34,10 @@ function renderFt8Row(msg) { const rfHz = Number.isFinite(msg.freq_hz) && Number.isFinite(baseHz) ? (baseHz + msg.freq_hz) : null; const freq = Number.isFinite(rfHz) ? rfHz.toFixed(0) : "--"; const renderedMessage = renderFt8Message(rawMessage); - row.innerHTML = `${fmtTime(msg.ts_ms)}${snr}${dt}${freq}${renderedMessage}`; + const receiverHtml = msg.receiver + ? `${msg.receiver.label}` + : ""; + row.innerHTML = `${fmtTime(msg.ts_ms)}${receiverHtml}${snr}${dt}${freq}${renderedMessage}`; applyFt8FilterToRow(row); return row; } @@ -173,6 +176,7 @@ window.onServerFt8 = function(msg) { window.ft8MapAddLocator(raw, grids, "ft8", station); } addFt8Message({ + receiver: window.getDecodeRigMeta ? window.getDecodeRigMeta() : null, ts_ms: msg.ts_ms, snr_db: msg.snr_db, dt_s: msg.dt_s, diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wspr.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wspr.js index 5aad2b4..549275d 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wspr.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/plugins/wspr.js @@ -34,7 +34,10 @@ function renderWsprRow(msg) { const freq = Number.isFinite(rfHz) ? rfHz.toFixed(0) : "--"; const message = (msg.message || "").toString(); row.dataset.message = message.toUpperCase(); - row.innerHTML = `${fmtWsprTime(msg.ts_ms)}${snr}${dt}${freq}${escapeWsprHtml(message)}`; + const receiverHtml = msg.receiver + ? `${msg.receiver.label}` + : ""; + row.innerHTML = `${fmtWsprTime(msg.ts_ms)}${receiverHtml}${snr}${dt}${freq}${escapeWsprHtml(message)}`; applyWsprFilterToRow(row); return row; } @@ -119,6 +122,7 @@ window.onServerWspr = function(msg) { window.ft8MapAddLocator(raw, grids, "wspr", station); } addWsprMessage({ + receiver: window.getDecodeRigMeta ? window.getDecodeRigMeta() : null, ts_ms: msg.ts_ms, snr_db: msg.snr_db, dt_s: msg.dt_s,