bandsaunter/tests
The Dust Council 2e20c48971 Mark the aerodromes in the window, and draw the lot on a vector display
The aerodromes were never on the window at all: only the animation drew
them, and the window's map had whatever airport glyphs the tiles happened to
carry.  They are drawn there now, in the same colour and the same square.

The first attempt at that had a bug worth naming, because it would have
looked like the feature simply not working.  They were fetched inside the
same pass of the fetching loop as a piece of map, so they queued behind a
hundred and twenty tiles coming off a network -- and once the map was in
hand there were no more passes, so they were never fetched again.  They are
their own question now, asked on the same thread but not behind the tiles,
and they arrive whether the tiles do or not.  An area that has been asked
about and has none in it is remembered as none, rather than asked about
again five times a second for the rest of the night.  And the thread now
starts if either the map or the aerodromes are wanted, so --no-basemap no
longer quietly takes the airports with it.

Then the themes, which change the window and the animated pictures together
because both read their colours out of the same palette.  night is what this
program has always drawn and is untouched.  digital, phosphor, amber and red
are the screens the phrase "air defence display" actually calls to mind: a
black tube, one phosphor, and thin bright vector lines with a halo round
them.

Three things follow from having one colour to spend, and they are
constraints rather than decoration.  Height becomes brightness, since hue is
no longer free -- low is dim and high burns, which is the trade those
displays made.  The map underneath drops to about a quarter of the
brightness asked for, because a tinted photograph of a county behind the
vectors is the one thing that stops a vector display looking like one.  And
a country is named in two letters rather than drawn as a flag, a flag being
half a dozen colours.

The glow is done twice, differently, because the two are different kinds of
picture.  The window lays each line down two or three times, wider and
fainter each pass, with the core last: trails, symbols, leader lines, box
borders and the aerodrome squares.  The animation cannot blend at all, a GIF
being indexed colour, so it dilates what it has drawn and fills the halo
with the dimmed copy of the colour underneath -- and the aircraft colours
already had dimmed copies, since those are the trail shades, so an aeroplane
glows into the colour its own trail is drawn in, which is the colour a
phosphor would have spread into.  The fixed colours get two rings each in
the palette for the purpose.  The halo goes over the map, the grid and the
background and over nothing else that was drawn, since a halo is what light
does to the dark around a line; where two rings meet the nearer wins.  It
costs about 55 ms a frame at 1400 by 1258 and the default theme skips the
pass entirely.

The palette is written over in place rather than replaced, because both
drawings and every one of their helpers hold a reference to that array and a
new one would leave half the program painting in the colours of the theme
before.  There is a test that every theme keeps the aerodrome colour more
than forty units of CIELAB from every altitude colour, stated as the
distance rather than as the colour, so that a new theme cannot quietly walk
an aircraft back into the airports.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PsWPTweCT6pwxKngvVxcg
2026-09-05 00:39:20 -07:00
..
adsb_gen.py Read the pictures, the aircraft, the meters and the sensors 2026-08-29 19:38:37 -07:00
conftest.py Aircraft, from the menus, on a live board, over a real map 2026-09-04 00:05:32 -07:00
image_gen.py Read the pictures, the aircraft, the meters and the sensors 2026-08-29 19:38:37 -07:00
morse_gen.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
signals.py Decode data signals, starting with on-off keying 2026-08-28 12:55:37 -07:00
speech.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
terminal.py Deal with the recordings, not just read them 2026-08-29 13:21:32 -07:00
test_aircraft_display.py Give the aerodromes a colour of their own, and say what each aircraft is 2026-09-04 22:45:41 -07:00
test_aircraft_menu.py A sharper map, and aircraft that fade rather than blink out 2026-09-04 19:04:09 -07:00
test_announce.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_bands.py Name the band beside every frequency, and map who was heard 2026-08-28 11:02:56 -07:00
test_basemap.py A sharper map, and aircraft that fade rather than blink out 2026-09-04 19:04:09 -07:00
test_browse.py Draw the waterfall for everything that never spoke 2026-09-03 18:36:00 -07:00
test_callsign.py Hear the short replies, and read the other kind of callsign 2026-09-02 00:30:02 -07:00
test_classify.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_decode.py Decode data signals, starting with on-off keying 2026-08-28 12:55:37 -07:00
test_dsp.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_flags.py A window on the sky, and flags on the routes 2026-09-04 13:38:47 -07:00
test_flightmap.py Give the aerodromes a colour of their own, and say what each aircraft is 2026-09-04 22:45:41 -07:00
test_flights.py Give the aerodromes a colour of their own, and say what each aircraft is 2026-09-04 22:45:41 -07:00
test_ident.py Hear the short replies, and read the other kind of callsign 2026-09-02 00:30:02 -07:00
test_images.py Ask a service that knows which leg it is, and fetch a map worth the screen 2026-09-04 20:19:53 -07:00
test_kml.py Hear the short replies, and read the other kind of callsign 2026-09-02 00:30:02 -07:00
test_licence.py A window on the sky, and flags on the routes 2026-09-04 13:38:47 -07:00
test_livemap.py Mark the aerodromes in the window, and draw the lot on a vector display 2026-09-05 00:39:20 -07:00
test_manage.py Deal with the recordings, not just read them 2026-08-29 13:21:32 -07:00
test_manpage.py Deal with the recordings, not just read them 2026-08-29 13:21:32 -07:00
test_morse.py Read the Morse a station sends over its own carrier 2026-09-02 07:57:18 -07:00
test_quality.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_ranges.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_resize.py Redraw cleanly when the window is resized 2026-08-28 15:47:36 -07:00
test_scanner.py Remember runtime lock-outs, and let a lock-out be a span 2026-08-21 23:44:24 -07:00
test_schedules.py Ask a service that knows which leg it is, and fetch a map worth the screen 2026-09-04 20:19:53 -07:00
test_settings.py Remember runtime lock-outs, and let a lock-out be a span 2026-08-21 23:44:24 -07:00
test_signals_named.py Frame the map on the receiver, and throw out what never happened 2026-09-04 12:25:39 -07:00
test_ssb.py Tune SSB to the carrier, and read the sideband from the signal 2026-08-21 23:09:44 -07:00
test_themes.py Mark the aerodromes in the window, and draw the lot on a vector display 2026-09-05 00:39:20 -07:00
test_transcribe.py Hear the short replies, and read the other kind of callsign 2026-09-02 00:30:02 -07:00
test_trunk.py Recognise trunking control channels, and refuse to sit on them 2026-08-22 14:22:49 -07:00
test_tui.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_ui.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_version.py Add packaging, date-based versioning, and full install docs 2026-08-21 21:05:51 -07:00
test_waterfall.py Never call a string of Morse tones "words" 2026-09-03 21:44:14 -07:00