Skip to content

20261019 - Show where the node is proven to see on a Tracker map - #121

Merged
Purple10101 merged 3 commits into
mainfrom
20261017-coverage-wedge
Oct 19, 2026
Merged

Purple10101 merged 3 commits into
mainfrom
20261017-coverage-wedge

Conversation

@Purple10101

Copy link
Copy Markdown
Collaborator

What

The Tracker page gains a second display. A Display control in the page header switches the panel between Delay / Doppler and a wedge view: a map of where the node is proven to see, built only from ADS-B-verified detections, with its tracks drawn on it. Labelled tracks are trails of their verified positions; unlabelled tracks are their delay arcs, solid inside the wedge and faint outside. Clicking a track in the rail replays its travel through the wedge over ten seconds.

Why

Delay and Doppler say nothing about which way the antenna looks or how far it reaches, and a declared beam is configuration, not measurement. The wedge is evidence: a slice appears only once two different aircraft have been detected in it, and it holds for a sliding 24 hours.

The wedge view

  • Layers: the proven lobes; close-in slices drawn lighter with a dashed edge (mostly aircraft overhead, not the antenna's pattern); the processed range limit as a grey dashed ellipse, since a slice reaching it is capped by the node's delay setting; receiver, transmitter and baseline; trails and arcs.
  • Footer: the legend and the evidence, for example "Last 24 h · 273 aircraft · 54 of 72 slices proven · 36 close-in · 7 at the processed range limit".
  • Notices over the map explain an empty or missing wedge: not proven yet, just reset, receiver or transmitter moved, no location set, a tracker without the wedge (404/503), or unreachable (502).
  • Replay: clicking a row also replays it in the wedge view; clicking again stops or replays. A labelled aircraft moves along its trail with its measured arc; an unlabelled arc sweeps with a fading afterglow. Other tracks dim.
  • Reset wedge clears the wedge on the node behind a confirm dialog, separate from Clear buffer because it must not touch tracking.
  • The map reuses the setup wizard's Leaflet and CARTO basemap and key handling, fits the lobes, then keeps the viewer's pan and zoom.
  • The scope is not redrawn while hidden. Delay / Doppler gets no replay cursor, since Plotly would redraw the whole scene every frame.

How it is built

retina-tracker owns every shape (lobes, arcs, the range limit); the page only draws. Four routes proxy the sidecar's coverage endpoints and relay its status. Track ids are checked before they reach the upstream path. Track columns on the stream gain lat/lon, which only the wedge view reads; the scope ignores them. The new script is static/tracker-wedge.js.

Testing

  • Full suite: 1059 passed; ruff clean; the dead-code gate is clean.
  • Headless Chromium against a local tracker fed synthetic traffic: wedge, both replays, reset, reload into the wedge view, and phone width.
  • Live on a test node for two days with real map tiles.
  • Not verified: browsers other than Chromium, or a real phone.

Docs

docs/features/tracker.md gains a Wedge view section (with Replaying a track and Resetting the wedge) and the stream's lat/lon columns; docs/README.md maps static/tracker-wedge.js.

After this

🤖 Generated with Claude Code

Purple10101 and others added 3 commits October 17, 2026 13:59
The Tracker page could only show detections in delay and Doppler, which
says nothing about which way the antenna looks or how far it reaches. A
Display control in the page header now switches the panel to a wedge
view: a map of the node's coverage as proven by ADS-B-verified detections,
with labelled tracks drawn as trails of their verified positions and
unlabelled tracks as their delay arcs, solid inside the wedge and faint
outside it. Clicking a track in the rail replays its travel through the
wedge over ten seconds; clicking again stops or replays it.

retina-tracker owns every shape, so the page only draws what it is sent.
Four routes proxy the sidecar's new coverage endpoints and relay its
status, so the page can tell a tracker without the wedge (404, 503) from
an unreachable one (502) and say so over the map. Reset wedge clears the
wedge on the node behind a confirm dialog, separate from Clear buffer
because it must not touch tracking. The map reuses the setup wizard's
Leaflet and CARTO basemap. The scope is not redrawn while hidden, and the
Delay / Doppler view gets no replay cursor, since Plotly would redraw the
whole scene every frame.

Track ids are checked before they reach the upstream path. Tests cover
the proxies, the id check and the page carrying the view; the full suite
passes (1059). Checked in headless Chromium against a local tracker fed
synthetic traffic, including phone width, and on a test node, but not
against real map tiles. Needs retina-tracker with the coverage wedge.
docs/features/tracker.md gains a Wedge view section and the message
format's lat/lon columns; docs/README.md maps the new script.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…on the wedge

A wedge slice that reaches the furthest bistatic range the node
processes is limited by that setting, not by the antenna, and the map
gave no way to tell the two apart. It now draws that limit as a grey
dashed ellipse with its own legend entry, from retina-tracker's
span_ring, and the footer counts the slices that reach it ("3 at the
processed range limit").

The map also opened on a 120 km box around the receiver, which left a
short-range wedge small in the middle of the screen. It now fits the
proven lobes once there are any, refitting once when the first appear,
and keeps the viewer's own pan and zoom after that.

Checked in headless Chromium against a local tracker with synthetic
traffic and a stated delay limit; 1059 tests pass. Needs the matching
retina-tracker change for the ellipse and the count; without it the map
draws as before. docs/features/tracker.md covers the new layer, the
footer count and how the map fits.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The wedge view ringed the receiver with small proven slices in almost
every direction. On a test node those came from aircraft at a median 45
degrees elevation, nearly overhead, so they made the map read as if the
antenna saw all round and hid which way it points.

Slices retina-tracker serves as close-in (held under 10 km) are now
drawn much lighter with a dashed edge, under a "Close-in, overhead"
legend entry, and the footer counts them ("36 close-in"). They stay
proven and counted; only the drawing changes. The map also fits the
close-in slices as well as the main lobe, so the receiver is not pressed
against the edge.

Checked in headless Chromium against a local tracker loaded with a test
node's real wedge; 1059 tests pass. Needs the matching retina-tracker
change; without it the map draws as before. docs/features/tracker.md
covers the new layer, the legend entry and the footer count.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Purple10101
Purple10101 merged commit 1461101 into main Oct 19, 2026
3 checks passed
@Purple10101
Purple10101 deleted the 20261017-coverage-wedge branch October 19, 2026 11:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant