Commit Graph

1444 Commits

Author SHA1 Message Date
James Smith ba06784e0d Add AOS/TCA/LOS pass data strip below polar plot
Fills the empty space below the sky view circle with a compact
three-column AOS / TCA / LOS readout (time + azimuth/elevation)
and a duration + max elevation footer line.
Populated by drawPolarPlot() when a pass is selected; shows a
placeholder prompt otherwise.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:40:38 +00:00
James Smith e9959e3877 Fix oval polar plot — remove height:100% that overrode aspect-ratio
Setting both width:100% and height:100% made CSS ignore aspect-ratio,
stretching the drawing buffer non-uniformly into the tall container.
Fixed by keeping only width:100% + max-height:100% so aspect-ratio:1/1
clamps the height and the element stays square.
Draw functions now use canvas.offsetWidth for the square buffer size.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:35:34 +00:00
James Smith 3accb74ffa Stretch sky view to fill right column height
- command-rail last row changed from minmax(260px, 340px) to 1fr so the
  polar plot expands to fill whatever vertical space remains after the
  Next Pass and Live Telemetry panels
- polar-container made flex-column so panel-content can grow with flex: 1
- #polarPlot width/height 100% with aspect-ratio 1/1 — canvas fills the
  available square area and stays proportional
- Remove align-items: start from the 1320px breakpoint primary-layout so
  the command-rail stretches to match map height in the two-column layout
- Fix matching 2-column command-rail rows at 1320px breakpoint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:33:17 +00:00
James Smith 7365bf2e76 Fix squashed sky view polar plot and eliminate wasted space
- Remove align-self: start from .polar-container so the grid row's
  minmax(260px, 340px) height is actually respected
- Switch #polarPlot to aspect-ratio: 1/1 so the canvas is always square
- Fix both draw functions to size canvas from getBoundingClientRect on
  the canvas itself (not parent) using min(width, height) for a square plot
- Remove min-height from .dashboard to prevent empty space below content
  on narrow/mobile screens where stacked panels are shorter than 720px

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:17:35 +00:00
James Smith 0bf190c86b Fix pass calculation race condition and 1Hz distance updates
- Move _passAbortController = null to after response.json() so the retry
  scheduler cannot see a false idle state mid-parse, increment
  _passRequestId, and discard the in-flight response — this was causing
  non-ISS satellites to show no passes intermittently
- Add _computeSlantRange() helper using 3D ECEF geometry
- Update applyTelemetryPosition to compute slant range from SSE lat/lon/
  altitude, giving distance updates at 1Hz instead of 5s HTTP poll rate

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:55:56 +00:00
James Smith 2d4718c6fb Fix satellite tracker TLE key mismatch and empty pass caching
Two root-cause bugs causing the reported issues:

1. Tracker never sent ISS positions: _start_satellite_tracker fell back
   to sat_name.replace(' ', '-').upper() as the TLE cache key when the
   DB entry had null TLE lines. For 'ISS (ZARYA)' this produced
   'ISS-(ZARYA)' which has no matching entry in _tle_cache (keyed as
   'ISS'). ISS was silently skipped every loop tick, so no SSE positions
   were ever emitted and the map marker never moved.

   Fix: try _BUILTIN_NORAD_TO_KEY.get(norad_int) first before the
   name-derived fallback so the NORAD-to-key mapping is always used.

2. Stale TLE pass prediction results were cached: if startup TLEs were
   too old for Skyfield to find events in the 48h window, the empty
   passes list was cached for 300s. A page refresh within that window
   re-served the empty result, showing 'NO PASSES FOUND' persistently.

   Fix: only cache non-empty pass results so the next request
   recomputes once the TLE auto-refresh has populated fresh data.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:21:31 +00:00
James Smith 15632db5ad fix(satellite): show 'NO UPCOMING PASSES' when all passes are in the past
updateCountdown fell back to passes[0] even when it was in the past,
showing 00:00:00:00 with a stale satellite name indefinitely. Now
displays a clear 'NO UPCOMING PASSES' state with '--' for all fields
when no future pass exists in the current prediction window.
2026-03-19 21:55:25 +00:00
James Smith fb4c5238f3 perf(satellite): compute ground tracks in thread pool, not inline
Ground track computation (90 Skyfield points per satellite) was blocking
the 1Hz tracker loop on every cache miss. On cold start with multiple
tracked satellites this could stall the SSE stream for several seconds.

Tracks are now computed in a 2-worker ThreadPoolExecutor. The tracker
loop emits position without groundTrack on cache miss; clients retain
the previous track via SSE merge until the new one is ready.
2026-03-19 21:55:00 +00:00
James Smith c9a3bea40d refactor(satellite): simplify telemetry abort controller management
Consolidated to a single active-request guard with cleanup in finally.
The previous pattern had redundant null-checks across try and catch, and
an always-false check on a controller that was already null. Cancel-on-
new-request is now explicit before creating the new controller.
2026-03-19 21:49:45 +00:00
James Smith f5dbba7b69 fix(satellite): add METEOR-M2 to weather satellite handoff keys
METEOR-M2 (NORAD 40069) is a weather satellite with LRPT downlink but
was missing from WEATHER_SAT_KEYS, so no capture button appeared in
the pass list. Adds it alongside M2-3 and M2-4.
2026-03-19 21:49:09 +00:00
James Smith dd3f334f92 fix(satellite): use wgs84 subpoint elevation for altitude in /position
Replace geocentric.distance().km - 6371 (fixed spherical radius) with
wgs84.subpoint(geocentric).elevation.km in the /position endpoint.
The SSE tracker was already fixed in the Task 1 commit.
2026-03-19 21:48:55 +00:00
James Smith b530769016 fix(satellite): populate currentPos with full telemetry in pass predictions
Previously currentPos only had lat/lon, so the updateTelemetry fallback
(used before first live position arrives) always showed '---' for
altitude/elevation/azimuth/distance. currentPos now includes all fields
computed from the request observer location. updateTelemetry simplified
to delegate to applyTelemetryPosition.
2026-03-19 21:48:33 +00:00
James Smith fb4c2832df feat(satellite): add 24-hour periodic TLE auto-refresh
TLE data was only refreshed once at startup. After each refresh, a new
24-hour timer is now scheduled in a finally block so it fires even on
refresh failure. threading moved to module-level import.
2026-03-19 21:47:38 +00:00
James Smith a72da6d2e0 fix(satellite): SSE path only updates orbit position, not observer data
Adds a 'source' param to handleLivePositions. The SSE path ('sse') only
applies lat/lon/altitude/groundTrack since the server-side tracker has
no per-client location. The HTTP poll path ('poll') owns all observer-
relative data and the visible-count badge.
2026-03-19 21:46:36 +00:00
James Smith d4753ad0c8 fix(satellite): strip observer-relative fields from SSE tracker
SSE runs server-wide with DEFAULT_LAT/LON defaults of 0,0. Emitting
elevation/azimuth/distance/visible from the tracker produced wrong
values (always visible:False) that overwrote correct data from the
per-client HTTP poll every second.

The HTTP poll (/satellite/position) owns all observer-relative data.
SSE now only emits lat/lon/altitude/groundTrack. Also removes the
unused DEFAULT_LATITUDE/DEFAULT_LONGITUDE import.
2026-03-19 21:45:48 +00:00
James Smith 7395e4e083 Stabilize satellite live telemetry state 2026-03-19 21:09:03 +00:00
James Smith 6a72ba9d1b Tear down satellite dashboard cleanly 2026-03-19 20:34:32 +00:00
James Smith 124886e157 Preserve satellite panes during refresh 2026-03-19 20:30:52 +00:00
James Smith 97f97bc9e1 Guard satellite target refreshes 2026-03-19 19:12:51 +00:00
James Smith 181df8a7bf Stabilize satellite target switching 2026-03-19 17:44:02 +00:00
James Smith 2dcad79333 Speed up satellite live telemetry updates 2026-03-19 17:18:39 +00:00
James Smith 2afab565a1 Batch satellite pass predictions 2026-03-19 17:07:23 +00:00
James Smith b23f63cb89 Stabilize satellite pass target switching 2026-03-19 16:41:55 +00:00
James Smith afc8c2e84f Wire satellite capture handoff 2026-03-19 15:59:58 +00:00
James Smith 30960e6d6f Harden satellite target switching 2026-03-19 15:33:20 +00:00
James Smith 572d6e3215 Fix satellite target switching regression 2026-03-19 14:55:48 +00:00
James Smith 17e2ca0c6a Stabilize satellite dashboard refreshes 2026-03-19 14:26:08 +00:00
James Smith ebf916d186 Tighten satellite polar plot sizing 2026-03-19 14:16:44 +00:00
James Smith 8191966e8e Fix satellite dashboard startup helpers 2026-03-19 13:49:20 +00:00
James Smith 19c9b4eaf3 Stabilize satellite dashboard startup 2026-03-19 13:23:52 +00:00
James Smith 4268732d58 Restore satellite mission controls 2026-03-19 13:06:26 +00:00
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 cde5bed49b Fix satellite pass prediction route 2026-03-19 11:39:22 +00:00
James Smith 089687ca31 Cache satellite pass predictions 2026-03-19 11:27:38 +00:00
James Smith ced65042b1 Vendor flask-socketio fallback for radiosonde 2026-03-19 11:16:42 +00:00
James Smith f1345b91c4 Vendor semver fallback for radiosonde 2026-03-19 11:09:54 +00:00
James Smith 953a6be3f1 Probe more radiosonde Python environments 2026-03-19 11:02:42 +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 b78a261a0b Shorten agent health checks on load 2026-03-19 08:09:07 +00:00