Repository navigation
Releases: TimNe0/skyscope
Release list
v0.3.0
The fetch no longer freezes the app
Reported from a badge: too slow to even open the menu, though data was still arriving. The redraw work in v0.2.1 was not the cause.
The network fetch was. A TLS request plus parse takes seconds on an ESP32, and it ran on the main task — so for that whole time nothing else happened: no button handling, no redraw. Measured in the simulator as the worst gap between input polls, which is exactly how long a press can go unnoticed:
| worst stall | 2nd worst | |
|---|---|---|
| Fetching inline | 5.36 s | 2.78 s |
| On a worker thread | 0.28 s | 0.25 s |
A desktop understates it, too — mbedTLS on the badge is far slower.
The fetch now runs on a worker thread, the same pattern the published Overhead app uses on this hardware. The worker touches only a result slot and a busy flag; the main task folds the result in. Where threads are unavailable it falls back to fetching inline, and a watchdog recovers if a worker ever dies without unwinding.
Two supporting cuts
- Parser: it re-found all four of its scan markers on every step, and
str.findcosts the distance it travels — so an 80 KB payload was scanned about 87 times over. Carrying the markers between steps makes each cross the text once: 87× → 3.8×. - Drawing: the aircraft outline is 10 points rather than 18, and glyphs are batched by colour into one path per colour instead of one draw call per aircraft. A busy frame went from 737 ctx primitives to 351. Swept edges still read as a plane at 14 px.
No change to what the app shows or how it is used.
v0.2.1
Much lighter on the badge
The app was redrawing the whole screen ~15 times a second for a display whose data changes once every 15 seconds. It now redraws only when what would appear on screen actually differs from what is already there, with a slow one-per-second tick to keep the "updated N seconds ago" counter honest, and full-rate drawing only while something genuinely animates — a menu, a notification, the sweep, armed-alert pulsing, or a finger on the touch ring.
Measured in the simulator:
| draws/sec | ctx calls/sec | |
|---|---|---|
| Before | 15.3 | 4,660 |
| After | 1.0 | 271 |
The saving grows with traffic: 30 contacts on an 80 km scope over Heathrow is about 1,300 ctx calls a second, against roughly 11,000 before.
Also:
- The LED ring is only written when the frame actually changes, and the OS pattern generator is told to stay off once a second rather than five times.
- New "Max contacts" setting (10 / 20 / 30 / 50). Each contact costs an aircraft outline and a label-placement attempt on every redraw, so it is the biggest lever you have. It was in the config file but not the menu.
- The README now documents the measurements and which settings cost the most, in order of effect.
- No log spam on a 2024 badge, which has no touch ring.
No change to what the app shows or how it is used.
v0.2.0
Fixed: LEDs sticking on
The ring could stay lit after the app left the screen. Three ways in, all fixed:
- it was only driven from the radar screen, so opening the settings menu froze it on the last radar frame;
- losing focus to anything other than the app's own CANCEL handler left it frozen, because the main loop blocks while backgrounded and cannot notice;
- the white "under your finger" LED followed the sticky touch selection rather than the finger, so it stayed lit after you lifted off.
The ring is now driven on every screen, and the app hands the LEDs back and re-enables the OS pattern the moment it is no longer on screen. White now means "pad currently touched".
New: where the flight came from and where it is going
ADS-B carries no route information, so origin and destination come from a separate lookup against adsbdb.com — free and keyless like the position feeds. The detail page now shows the airline, LHR → JFK, and the city names.
Lookups happen only when you open an aircraft's detail page, one flight at a time, never during the normal poll loop, and results — including "no route known" — are cached so a flight is never asked for twice.
New: aircraft look like aircraft
Contacts are drawn as a top-down airliner silhouette — fuselage, wings, tailplane — turned to each aircraft's track, instead of an arrow with a line coming out of it. The shape shows heading by itself, so the separate heading vector is gone. Rotations are cached in 5° steps, so redrawing thirty of them costs nothing on the badge.
v0.1.2
Fixes the app store rejecting the app with "Failed to parse contents of tildagon.toml".
The cause was a UTF-8 byte order mark written to the front of the file by a Windows editor; a strict TOML parser treats it as a syntax error. tildagon.toml, app.py and adsb.py all carried one, and all three are now written as UTF-8 without a BOM.
Nothing in the app itself had noticed — Python skips a BOM in source and every editor renders the file identically — so there is now a packaging test asserting that no repo file starts with a BOM, that tildagon.toml parses, and that its category, string version, description length and author length all match the store's schema.
No functional changes to the app.
v0.1.1
Location list reordered so the customisable entry comes first.
- Home - your own saved spot, shown even before it is set. Selecting it when unset goes straight to entering coordinates, which are saved as Home and become the observer, so the top slot is never a dead end.
- East Essex Hackspace - the default observer.
- EMF (Eastnor Deer Park) - the camp site, now using the Eastnor Deer Park centroid (52.038012, -2.377969).
- London, Manchester, Edinburgh, Amsterdam, Berlin, New York.
The actions - Set Home to here, Manual entry, Auto (IP) - sit below the places.
v0.1.0
The 2026 touch ring, as a bearing input.
A radar is a polar display and the badge's twelve capacitive pads are a polar input, so they map onto each other exactly: twelve pads, twelve 30 degree compass sectors, matching the ticks already drawn on the scope.
Touch a pad to highlight that wedge and select the nearest aircraft in it; CONFIRM opens its detail page. Slide round the bezel to sweep the horizon. Hold for the mode-specific action, chosen in Settings > Touch:
- Arm alert - watch a bearing. The arc pulses amber, the LED breathes, and a notification fires when traffic enters. Armed sectors persist across reboots.
- Filter - show only that sector, with labels expanded to cover all of it.
- Course-up - turn the scope so that bearing is at the top; ticks, cardinal letters, glyphs and the LED ring all rotate with it.
Also in this release: the aircraft detail page is now reachable directly from the radar instead of only through Settings > Contacts, and CANCEL unwinds any touch state before minimising, so a filtered or rotated scope is never a trap.
The 2024 Tildagon frontboard has no touch hardware; there the setting is visible but inert and says so when selected. Touch cannot be exercised in the badge simulator, so the pad-to-bearing orientation is the one thing to confirm on real 2026 hardware.
v0.0.2
v0.0.1
First release of SkyScope: a live ADS-B flight radar for the EMF Tildagon / Spaceagon badge.
- North-up radar scope with range rings, cardinal marks, aircraft glyphs with heading vectors and decluttered callsign/altitude/speed labels.
- Configurable observer location (presets including East Essex Hackspace and EMF at Eastnor, saved Home, manual lat/lon, approximate IP lookup) and range 5-200 km.
- Live keyless data from adsb.lol, with adsb.fi and airplanes.live selectable as alternatives.
- Aviation, metric and mixed units; sweep, trails and an LED ring that points at the nearest aircraft.
- Aircraft detail page, settings that persist across reboots, and exponential backoff on errors.
- Optional GC9A01 round LCD on a hexpansion (see README for wiring).
Runs on stock Tildagon OS. Data (c) the contributors to adsb.lol, adsb.fi and airplanes.live.