[fix](trx-frontend-http): put HF APRS on the map, under its own source
The HF APRS list never plotted anything. Its plugin ships in the map plugin group and its packets carry positions, but nothing ever handed one to the map, so a station heard on 30 m appeared in the panel and nowhere else — and unlike the replay gaps around it, no reload brought it back. Plot it, and not as more VHF APRS. HF is a different band and a different path, and lumping the two together would leave no way to tell them apart or to look at one without the other, so it goes on as a source of its own: its own colour, its own chip in the map's Show filter, its own entry in the source legend, and its own clear. Station entries are keyed by source and callsign rather than callsign alone, so a station worked on both bands keeps a marker for each while the popups, the search text and the tracks still show the callsign as heard. decode-flow feeds an HF beacon alongside the VHF one and checks all of it: both reach the map under their own sources, the Show row offers HF APRS next to APRS, and turning that chip off takes the HF station off the map while the VHF one stays. 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:
@@ -25,6 +25,13 @@ const BEACON = {
|
||||
// A second rig listening in the background, on its own band. Both pages
|
||||
// describe the rig on screen, so its traffic belongs in neither the panel nor
|
||||
// the mini view — only on the map, which shows the whole station.
|
||||
// HF APRS travels a different band and a different path from the VHF list, so
|
||||
// it goes on the map under a source of its own that the filter can hide.
|
||||
const HF_BEACON = {
|
||||
type: "hf_aprs", src_call: "SP5HF-7", dest_call: "APRS", path: "WIDE2-2", info: "HF beacon",
|
||||
packet_type: "position", crc_ok: true, lat: 50.06, lon: 19.94,
|
||||
symbol_table: "/", symbol_code: ">", rig_id: "rig-a",
|
||||
};
|
||||
const OTHER_RIG_VESSEL = {
|
||||
...VESSEL, mmsi: 244660001, vessel_name: "ELDERBERRY", callsign: "PBTY",
|
||||
lat: 51.92, lon: 4.48, rig_id: "rig-b",
|
||||
@@ -32,7 +39,7 @@ const OTHER_RIG_VESSEL = {
|
||||
|
||||
// AIS is what the mini view for vessels is gated on; the rig has to be on it.
|
||||
const fixture = await startWebFixture({
|
||||
spectrum: true, decodes: [VESSEL, BEACON, OTHER_RIG_VESSEL], mode: "AIS",
|
||||
spectrum: true, decodes: [VESSEL, BEACON, HF_BEACON, OTHER_RIG_VESSEL], mode: "AIS",
|
||||
});
|
||||
const { browser, page, runtimeErrors } = await startBrowser(chromium);
|
||||
|
||||
@@ -104,6 +111,36 @@ try {
|
||||
return { ais: size(map?.aisMarkers), stations: size(map?.stationMarkers) };
|
||||
});
|
||||
assert.ok(markers.stations > 0, "the APRS station never reached the map");
|
||||
// Both APRS stations are on it, each under its own source: the HF one used
|
||||
// to be dropped entirely, since the HF list never plotted anything.
|
||||
const aprsSources = await page.evaluate(() => {
|
||||
const entries = [...(window.trx.modules.map?.stationMarkers ?? new Map()).entries()];
|
||||
return entries.map(([key, entry]) => `${entry?.type ?? "?"}:${entry?.call ?? key}`).sort();
|
||||
});
|
||||
assert.deepEqual(aprsSources, ["aprs:SP2SJG-9", "hf_aprs:SP5HF-7"],
|
||||
`the map holds ${JSON.stringify(aprsSources)}`);
|
||||
// And the filter offers HF APRS on a chip of its own, next to the VHF one.
|
||||
await page.locator('#map-locator-phase .map-locator-phase-btn[data-phase="type"]').click();
|
||||
await page.waitForTimeout(400);
|
||||
const chips = await page.evaluate(() => [...document.querySelectorAll("#map-locator-choice-filter .map-locator-chip")]
|
||||
.map((chip) => chip.dataset.filterKey));
|
||||
assert.ok(chips.includes("aprs") && chips.includes("hf_aprs"),
|
||||
`the Show chips are ${JSON.stringify(chips)}`);
|
||||
|
||||
// Turning that chip off takes the HF station off the map and leaves the VHF
|
||||
// one on: the two are filtered apart, which is the whole point of the split.
|
||||
await page.locator('#map-locator-choice-filter .map-locator-chip[data-filter-key="hf_aprs"]').click();
|
||||
await page.waitForTimeout(500);
|
||||
const shownAfterFilter = await page.evaluate(() => {
|
||||
const map = window.trx.modules.map;
|
||||
const onMap = [];
|
||||
(map?.stationMarkers ?? new Map()).forEach((entry, key) => {
|
||||
if (entry?.marker && map.aprsMap?.hasLayer(entry.marker)) onMap.push(entry?.call ?? key);
|
||||
});
|
||||
return onMap.sort();
|
||||
});
|
||||
assert.deepEqual(shownAfterFilter, ["SP2SJG-9"],
|
||||
`hiding HF APRS left ${JSON.stringify(shownAfterFilter)} on the map`);
|
||||
// The map is the whole station's view — the one place a background rig's
|
||||
// traffic belongs — so both vessels are on it even though the panel and the
|
||||
// mini view show only the selected rig's.
|
||||
|
||||
Reference in New Issue
Block a user