Commit Graph

13 Commits

Author SHA1 Message Date
Matt Edholm 48a3a1c7dd review(2-5): code-review pass for per-aircraft drawing — add heading guard, close story
- Add `or 0.0` defensive guard on `aircraft.heading` in `draw_aircraft` per spec (task 1.6)
- Story 2-5 status: review → done
- Sprint status updated: 2-5-per-aircraft-drawing done
- Deferred work: add [2-5] default font 8px readability risk and [2-5] inline arrow geometry constants

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:29:22 -04:00
Matt Edholm f530185e31 feat(renderer): implement per-aircraft drawing — story 2-5
Implements draw_aircraft() with heading arrow (filled/outlined for MLAT),
callsign+altitude label, and a 5-dot fade trail. Adds 5 tests covering
all ACs; all 94 tests pass, ruff lint and format clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:27:36 -04:00
Matt Edholm 2c86ffd422 feat(2-4): implement altitude colour bands and aircraft type icons
Implements altitude_to_colour() mapping altitude bands to the 6 e-ink
palette colours, and classify_aircraft_type() resolving ADS-B category,
callsign prefix, and altitude fallback to AircraftType enum. Adds 21
new tests (13 parametrised boundary cases + 8 icon classification);
89 tests total, all quality gates green.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:21:50 -04:00
Matt Edholm e8ce0602a4 feat(story-2.3): implement home marker and airspace outline rendering
Adds draw_home_marker() in overlay.py (red cross at projected home
position) and draw_airspace() in airspace.py (GeoJSON Polygon
boundaries in blue, graceful FileNotFoundError handling). Includes
airspace fixture and three tests covering all acceptance criteria.
All 70 tests pass; ruff check and format clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:16:03 -04:00
Matt Edholm 037ce3e193 Implement story 2.2: coordinate projection and base map loading
Add MapBounds dataclass and equirectangular project() function in
projection.py, basemap.load() forcing pixels into memory via .copy(),
and full test coverage for both modules (4 new tests). All quality
gates pass: 67 tests, ruff clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:10:38 -04:00
Matt Edholm 6208134a1c Implement story 2.1: aircraft data model and fetcher
Add HttpFetcher and FileFixtureFetcher with shared _parse_aircraft helper,
DUMP1090_URL constant, realistic fixture data, and full test coverage for
all acceptance criteria (AC1–AC5).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:03:20 -04:00
Matt Edholm 9c53ccb524 Review story 1.5: provisioning execution passes all ACs — Epic 1 complete
Fix portal.py error handling so validate_cache failures return retry HTML while
kill_wifi ProvisioningError propagates (re-raise) per AC4. All 56 tests pass.
Update sprint-status.yaml: 1-5 → done, epic-1 → done. Append story 1.5 deferred
items to deferred-work.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:57:55 -04:00
Matt Edholm 4aeeefb488 Implement story 1.5: provisioning execution tile download cache validation wifi kill
Add tiles.py, airspace.py, wifi.join_home_wifi, portal /submit route, and rewire
provision.py main loop; all tasks and quality gates pass (56 tests, ruff clean).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:54:34 -04:00
Matt Edholm 6231e3157e Implement story 1.4: location resolution ICAO and address
Adds location.resolve() with ICAO CSV lookup and Nominatim geocoding,
POST /find-location portal route with inline confirmation/error display,
and full test coverage with mocked network calls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:46:31 -04:00
Matt Edholm 563b0d4665 Implement story 1.3: WiFi hotspot and captive portal form
Implement wifi.py (start_ap/stop_ap/kill_wifi with subprocess and ProvisioningError),
portal.py (Flask captive portal with Android/iOS/Windows probe redirects and 404 catch-all),
updated provision.py provisioning loop, and full test suite (38 passing).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:41:05 -04:00
Matt Edholm 826f1d98fa Implement story 1.2: config read/write/wipe
Add provisioning/config.py with read/write/wipe functions, update
conftest.py with autouse CONFIG_PATH patch fixture, write 7 tests
covering all acceptance criteria, and extend pyproject.toml
per-file-ignores so conftest.py may import from provisioning.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:35:11 -04:00
Matt Edholm 3afb7f5f1e Add .gitignore to exclude __pycache__ and egg-info artifacts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:27:02 -04:00
Matt Edholm 85c8acf767 Implement story 1.1: project scaffold and verified entry points
Creates the complete src/planemapper/ layout with all module stubs,
provisioning and renderer subpackages, airports.csv data bundle,
systemd unit files, and full test scaffold. All three quality gates
pass: pytest 12/12, ruff check zero violations, ruff format clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:26:53 -04:00