[fix](trx-frontend-http): show peak level in tooltip

Include the snapped peak signal level in the spectrum\nhover tooltip alongside the peak frequency.\n\nCo-authored-by: Codex <codex@openai.com>

Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-02-28 09:11:09 +01:00
parent d5b1b6f020
commit 8b3951d99d
@@ -2964,7 +2964,7 @@ function canvasXToHz(cssX, cssW, range) {
return range.visLoHz + (cssX / cssW) * range.visSpanHz; return range.visLoHz + (cssX / cssW) * range.visSpanHz;
} }
function nearestSpectrumPeakHz(cssX, cssW, data) { function nearestSpectrumPeak(cssX, cssW, data) {
if (!data || !Array.isArray(data.bins) || data.bins.length === 0 || cssW <= 0) { if (!data || !Array.isArray(data.bins) || data.bins.length === 0 || cssW <= 0) {
return null; return null;
} }
@@ -3017,7 +3017,15 @@ function nearestSpectrumPeakHz(cssX, cssW, data) {
} }
} }
return Math.round(fullLoHz + (snappedIdx / maxIdx) * data.sample_rate); return {
index: snappedIdx,
hz: Math.round(fullLoHz + (snappedIdx / maxIdx) * data.sample_rate),
db: bins[snappedIdx],
};
}
function nearestSpectrumPeakHz(cssX, cssW, data) {
return nearestSpectrumPeak(cssX, cssW, data)?.hz ?? null;
} }
// Format a frequency according to the current jog-step unit. // Format a frequency according to the current jog-step unit.
@@ -3485,11 +3493,16 @@ if (spectrumCanvas) {
const edge = getBwEdgeHit(cssX, rect.width, range); const edge = getBwEdgeHit(cssX, rect.width, range);
spectrumCanvas.style.cursor = edge ? "ew-resize" : "crosshair"; spectrumCanvas.style.cursor = edge ? "ew-resize" : "crosshair";
const hz = canvasXToHz(cssX, rect.width, range); const hz = canvasXToHz(cssX, rect.width, range);
const peakHz = edge ? null : nearestSpectrumPeakHz(cssX, rect.width, lastSpectrumData); const peak = edge ? null : nearestSpectrumPeak(cssX, rect.width, lastSpectrumData);
const peakHz = peak?.hz ?? null;
const peakDb = peak && Number.isFinite(peak.db) ? `${peak.db.toFixed(1)} dB` : null;
if (peakHz != null && Math.abs(peakHz - hz) >= Math.max(minFreqStepHz, 10)) { if (peakHz != null && Math.abs(peakHz - hz) >= Math.max(minFreqStepHz, 10)) {
spectrumTooltip.textContent = `Peak ${formatSpectrumFreq(peakHz)}`; spectrumTooltip.textContent = peakDb
? `Peak ${formatSpectrumFreq(peakHz)} · ${peakDb}`
: `Peak ${formatSpectrumFreq(peakHz)}`;
} else { } else {
spectrumTooltip.textContent = formatSpectrumFreq(peakHz ?? hz); const baseText = formatSpectrumFreq(peakHz ?? hz);
spectrumTooltip.textContent = peakDb ? `${baseText} · ${peakDb}` : baseText;
} }
spectrumTooltip.style.display = "block"; spectrumTooltip.style.display = "block";
const tw = spectrumTooltip.offsetWidth; const tw = spectrumTooltip.offsetWidth;