Commit Graph

607 Commits

Author SHA1 Message Date
James Smith b746f9689c Move satellite packets into map console 2026-03-19 12:17:28 +00:00
James Smith 0f56fa1a13 Rework satellite dashboard mission layout 2026-03-19 12:01:59 +00:00
James Smith 089687ca31 Cache satellite pass predictions 2026-03-19 11:27:38 +00:00
James Smith c789646f24 Fix dashboard startup regressions and mode utilities 2026-03-19 10:37:21 +00:00
James Smith 4fc35c094c Delay welcome page GPS and voice streams 2026-03-19 09:34:33 +00:00
James Smith 94e9d65fad Defer hidden dashboard startup work 2026-03-19 09:19:36 +00:00
James Smith 7587c1d009 Lazy-load satellite iframe on main dashboard 2026-03-19 09:05:48 +00:00
James Smith b8b661b3be Revert "Retry ADS-B map bootstrap safely"
This reverts commit 2c66a2fe4a.
2026-03-19 08:54:59 +00:00
James Smith 2c66a2fe4a Retry ADS-B map bootstrap safely 2026-03-19 08:52:08 +00:00
James Smith 665067e399 Retry slow SDR detection in ADS-B 2026-03-19 08:43:20 +00:00
James Smith 0ea03c8f93 Harden ADS-B dashboard bootstrap 2026-03-19 08:35:43 +00:00
James Smith 0f161f96d3 Revert "Keep ADS-B on local startup tiles"
This reverts commit 2ceeb520e9.
2026-03-19 08:32:10 +00:00
James Smith 2ceeb520e9 Keep ADS-B on local startup tiles 2026-03-19 08:28:13 +00:00
James Smith 274824fe68 Keep ADS-B fallback grid until tiles load 2026-03-19 08:18:00 +00:00
James Smith 09e0ddef79 Ignore aborted satellite pass requests 2026-03-19 08:04:36 +00:00
James Smith 5486656782 Defer noncritical ADS-B startup work 2026-03-19 08:01:33 +00:00
James Smith be4c9a87ad Reduce repeated ADS-B device probes 2026-03-19 07:55:19 +00:00
James Smith 1be531a263 Skip pre-stop on dashboard navigation 2026-03-19 07:47:46 +00:00
James Smith b00638f794 Stop clearing browser caches on load 2026-03-19 07:43:32 +00:00
James Smith 7c9df8beb3 Revert "Reduce ADS-B map layout shift"
This reverts commit af475ad6ea.
2026-03-19 00:17:22 +00:00
James Smith af475ad6ea Reduce ADS-B map layout shift 2026-03-19 00:11:29 +00:00
James Smith 853f1da581 Harden APRS mode teardown and map fallback 2026-03-19 00:06:47 +00:00
James Smith 412bdde2d9 Disable stale dashboard service worker cache 2026-03-19 00:01:47 +00:00
James Smith 42d2371ba6 Revert "Stage dashboard startup requests"
This reverts commit ab3c581ab0.
2026-03-18 23:57:37 +00:00
James Smith ab3c581ab0 Stage dashboard startup requests 2026-03-18 23:53:54 +00:00
James Smith 03a0f13772 Open satellite dashboard in new tab 2026-03-18 23:41:29 +00:00
James Smith 8927f50696 Use direct satellite dashboard links 2026-03-18 23:35:24 +00:00
James Smith a8001604d7 Unify satellite navigation to dashboard 2026-03-18 23:29:09 +00:00
James Smith 4dc1cd43e4 Stabilize satellite dashboard sidebar panels 2026-03-18 23:17:02 +00:00
James Smith 01ed00805e Refresh embedded satellite dashboard state 2026-03-18 23:09:07 +00:00
James Smith a9eef9f949 Harden embedded satellite dashboard loading 2026-03-18 23:00:21 +00:00
James Smith 77cfed11d5 Fix satellite dashboard refresh flows 2026-03-18 22:53:36 +00:00
James Smith 694e16da59 Clear stale telemetry and add transmitter fallbacks 2026-03-18 22:43:40 +00:00
James Smith 75137646fc Harden satellite dashboard telemetry loading 2026-03-18 22:35:31 +00:00
James Smith c1f4c2310e Align Meteor tracking defaults 2026-03-18 22:28:04 +00:00
James Smith 4deb9603db Improve persisted Meteor status in dashboard 2026-03-18 22:25:20 +00:00
James Smith 4df59d0fad Persist Meteor decode job state 2026-03-18 22:20:24 +00:00
James Smith f5a2383c04 Add Meteor LRPT ground station pipeline 2026-03-18 22:01:52 +00:00
James Smith bf2f0b4a7f Harden dashboard loading against network stalls 2026-03-18 21:33:32 +00:00
James Smith 963fdaf013 Fix mode switch re-entry regressions 2026-03-18 21:26:01 +00:00
James Smith c4b3fcbd51 Add observation profile management UI to Ground Station panel
- OBSERVATION PROFILES section with list of configured satellites
- + ADD button opens inline form pre-filled from currently selected satellite
  and SatNOGS transmitter data (frequency, decoder type auto-detected)
- EDIT / ✕ buttons per profile row
- Form fields: frequency, decoder (FM/AFSK/GMSK/BPSK/IQ-only), min elevation,
  gain, record IQ checkbox
- UPCOMING PASSES section below profiles with friendlier empty-state message
- gsOnSatelliteChange hook updates form when satellite dropdown changes
- CSS for .gs-form-row, .gs-profile-item, .gs-form-label

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:52:25 +00:00
James Smith a45a4d8ad5 Add ground station automation with 6-phase implementation
Phase 1 - Automated observation engine:
- utils/ground_station/scheduler.py: GroundStationScheduler fires at AOS/LOS,
  claims SDR, manages IQBus lifecycle, emits SSE events
- utils/ground_station/observation_profile.py: ObservationProfile dataclass + DB CRUD
- routes/ground_station.py: REST API for profiles, scheduler, observations, recordings,
  rotator; SSE stream; /ws/satellite_waterfall WebSocket
- DB tables: observation_profiles, ground_station_observations, ground_station_events,
  sigmf_recordings (added to utils/database.py init_db)
- app.py: ground_station_queue, WebSocket init, scheduler startup in _deferred_init
- routes/__init__.py: register ground_station_bp

Phase 2 - Doppler correction:
- utils/doppler.py: generalized DopplerTracker extracted from sstv_decoder.py;
  accepts satellite name or raw TLE tuple; thread-safe; update_tle() method
- utils/sstv/sstv_decoder.py: replace inline DopplerTracker with import from utils.doppler
- Scheduler runs 5s retune loop; calls rotator.point_to() if enabled

Phase 3 - IQ recording (SigMF):
- utils/sigmf.py: SigMFWriter writes .sigmf-data + .sigmf-meta; disk-free guard (500MB)
- utils/ground_station/consumers/sigmf_writer.py: SigMFConsumer wraps SigMFWriter

Phase 4 - Multi-decoder IQ broadcast pipeline:
- utils/ground_station/iq_bus.py: IQBus single-producer fan-out; IQConsumer Protocol
- utils/ground_station/consumers/waterfall.py: CU8→FFT→binary frames
- utils/ground_station/consumers/fm_demod.py: CU8→FM demod (numpy)→decoder subprocess
- utils/ground_station/consumers/gr_satellites.py: CU8→cf32→gr_satellites (optional)

Phase 5 - Live spectrum waterfall:
- static/js/modes/ground_station_waterfall.js: /ws/satellite_waterfall canvas renderer
- Waterfall panel in satellite dashboard sidebar, auto-shown on iq_bus_started SSE event

Phase 6 - Antenna rotator control (optional):
- utils/rotator.py: RotatorController TCP client for rotctld (Hamlib line protocol)
- Rotator panel in satellite dashboard; silently disabled if rotctld unreachable

Also fixes pre-existing test_weather_sat_predict.py breakage:
- utils/weather_sat_predict.py: rewritten with self-contained skyfield implementation
  using find_discrete (matching what committed tests expected); adds _format_utc_iso
- tests/test_weather_sat_predict.py: add _MOCK_WEATHER_SATS and @patch decorators
  for tests that assumed NOAA-18 active (decommissioned Jun 2025, now active=False)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:36:55 +00:00
James Smith db349c8d6e Fix satellite dashboard TARGET dropdown not reflecting enabled satellites
Add auto-refresh on window focus so the dropdown updates automatically when
switching back from the sidebar, plus a manual ↺ refresh button next to the
dropdown. Also preserves the current selection across refreshes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 14:05:22 +00:00
James Smith 90ff5c8e17 Fix setup.sh hanging on Python 3.14/macOS and add satellite enhancements
- Add --no-cache-dir and --timeout 120 to all pip calls to prevent hanging
  on corrupt/stale pip HTTP cache (cachecontrol .pyc issue)
- Replace silent python -c import verification with pip show to avoid
  import-time side effects hanging the installer
- Switch optional packages to --only-binary :all: to skip source compilation
  on Python versions without pre-built wheels (prevents gevent/numpy hangs)
- Warn early when Python 3.13+ is detected that some packages may be skipped
- Add ground track caching with 30-minute TTL to satellite route
- Add live satellite position tracker background thread via SSE fanout
- Add satellite_predict, satellite_telemetry, and satnogs utilities

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 11:09:00 +00:00
Smittix 32d598335a Fix APRS observer location not updating after settings change
Dispatch observer-location-changed event from settings manager and
listen for it in APRS mode so manual location saves propagate to
the map and distance calculations. Also refresh ObserverLocation in
initAprsMap() to catch changes between page load and first map use.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:00:35 +00:00
Smittix 7c6ca91666 Change default ADS-B range rings from 200nm to 50nm
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:06:29 +00:00
Smittix cb4f18123b Fix observer location persistence and APRS defaults 2026-03-15 17:49:46 +00:00
Smittix 26ef519fad v2.26.12: fix AIS/ADS-B dashboards ignoring configured observer position
Pass DEFAULT_LATITUDE/DEFAULT_LONGITUDE from config to both standalone
dashboard templates so observer-location.js uses .env values instead of
falling back to hardcoded London coordinates on first visit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 21:11:46 +00:00
Smittix 78713879b2 v2.26.11: fix APRS map ignoring configured observer position (#193)
The APRS map initialisation only checked for a live GPS fix, falling
back to the centre of the US (39.8N, 98.6W) when none was available.
It never read the observer position configured in .env via
INTERCEPT_DEFAULT_LAT / INTERCEPT_DEFAULT_LON.

Seed aprsUserLocation from ObserverLocation.getShared() (or the
Jinja-injected defaults) on page load so the map centres on the
user's configured position and distance calculations work without GPS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 18:17:50 +00:00
Smittix 5165cef7f9 v2.26.0: fix SSE fanout crash and branded logo FOUC
- Fix SSE fanout thread AttributeError when source queue is None during
  interpreter shutdown by snapshotting to local variable with null guard
- Fix branded "i" logo rendering oversized on first page load (FOUC) by
  adding inline width/height to SVG elements across 10 templates
- Bump version to 2.26.0 in config.py, pyproject.toml, and CHANGELOG.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:51:27 +00:00