[fix](trx-frontend-http): replay what arrived before a lazy view loaded
Opening the Map or Statistics page showed only what had been decoded since the moment it was opened, and a reload — landing straight on the tab, so its module loads at startup ahead of the history — was the only way to see the rest. Two things were being thrown away. The decode log the Statistics page counts lives in the map module, which is lazy. Recording into a module that is not loaded yet is a no-op, and unlike the map markers nothing replayed the log when it finally arrived, so every decode heard before the first visit was simply never counted. Hold those records in the client and hand them over when the module attaches. The map's own replay covered APRS, AIS and VDES, whose plugins implement syncMap, but not the grid squares: the FTx family and WSPR plotted locators as decodes arrived and had no replay at all, so everything they heard before the map loaded was lost, and the unique-grid counter with it. Both plot through a helper now, which their syncMap replays oldest first. A replayed WSPR spot carries the frequency it was heard on rather than one worked out against wherever the dial has moved to since. Pinned in decode-flow, whose history fixture gains FT8 and WSPR spots: after a first visit the statistics count every stored decode and every grid square, which before this change were 0 and 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SyX26FCpMQxiBoC7r5K1A7 Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -17,6 +17,9 @@ interface WsprMessage {
|
||||
dt_s?: number | undefined;
|
||||
freq_hz?: number | undefined;
|
||||
rig_id?: string | null | undefined;
|
||||
/** RF frequency the spot was heard on, kept so a map replay does not
|
||||
* recompute it against wherever the dial has moved to since. */
|
||||
_rfHz?: number | null | undefined;
|
||||
receiver?: unknown;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
@@ -135,6 +138,7 @@ function normalizeServerWsprMessage(msg: WsprMessage): { raw: string; grids: str
|
||||
rfHz,
|
||||
history: {
|
||||
rig_id: msg.rig_id ?? null,
|
||||
_rfHz: rfHz,
|
||||
receiver: wsprWindow.getDecodeRigMeta ? wsprWindow.getDecodeRigMeta() : null,
|
||||
ts_ms: msg.ts_ms,
|
||||
snr_db: msg.snr_db,
|
||||
@@ -152,12 +156,7 @@ function onServerWsprBatch(messages: WsprMessage[]): void {
|
||||
const next = normalizeServerWsprMessage(msg);
|
||||
// "Receiving" is the panel's own status, and the panel is the rig's.
|
||||
if (wsprStatus && isActiveRigDecode(msg.rig_id)) wsprStatus.textContent = "Receiving";
|
||||
if (next.grids.length > 0 && wsprWindow.mapAddLocator) {
|
||||
wsprWindow.mapAddLocator(next.raw, next.grids, "wspr", next.station, {
|
||||
...msg,
|
||||
...(next.rfHz === null ? {} : { freq_hz: next.rfHz }),
|
||||
});
|
||||
}
|
||||
plotWsprLocator(msg);
|
||||
next.history._tsMs = Number.isFinite(next.history.ts_ms) ? Number(next.history.ts_ms) : Date.now();
|
||||
normalized.push(next.history);
|
||||
}
|
||||
@@ -317,15 +316,24 @@ document.getElementById("settings-clear-wspr-history")?.addEventListener("click"
|
||||
})();
|
||||
});
|
||||
|
||||
/** Hands a spot's grid squares to the map, if the map module is loaded yet.
|
||||
* The module is lazy, so a spot heard before it arrived has to be replayable. */
|
||||
function plotWsprLocator(msg: WsprMessage): void {
|
||||
const next = normalizeServerWsprMessage(msg);
|
||||
if (next.grids.length === 0 || !wsprWindow.mapAddLocator) return;
|
||||
// A replayed spot carries the frequency it was heard on; a fresh one has it
|
||||
// worked out from the dial it just arrived against.
|
||||
const rfHz = finiteNumber(msg._rfHz) ?? next.rfHz;
|
||||
wsprWindow.mapAddLocator(next.raw, next.grids, "wspr", next.station, {
|
||||
...msg,
|
||||
...(rfHz === null ? {} : { freq_hz: rfHz }),
|
||||
});
|
||||
}
|
||||
|
||||
function onServerWspr(msg: WsprMessage): void {
|
||||
if (wsprStatus && isActiveRigDecode(msg.rig_id)) wsprStatus.textContent = "Receiving";
|
||||
const next = normalizeServerWsprMessage(msg);
|
||||
if (next.grids.length > 0 && wsprWindow.mapAddLocator) {
|
||||
wsprWindow.mapAddLocator(next.raw, next.grids, "wspr", next.station, {
|
||||
...msg,
|
||||
...(next.rfHz === null ? {} : { freq_hz: next.rfHz }),
|
||||
});
|
||||
}
|
||||
plotWsprLocator(msg);
|
||||
addWsprMessage(next.history);
|
||||
}
|
||||
|
||||
@@ -337,4 +345,6 @@ wsprWindow.trxPluginRuntime.registerDecoder({
|
||||
prune: pruneWsprHistoryView,
|
||||
reset: resetWsprHistoryView,
|
||||
rerender: renderWsprHistory,
|
||||
// Oldest first, so the map builds the grids up in the order they were heard.
|
||||
syncMap: () => { for (const message of [...wsprMessageHistory].reverse()) plotWsprLocator(message); },
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user