Commit Graph

107 Commits

Author SHA1 Message Date
James Smith 7e138622fa fix: resolve two-window hang and sweep UI/theming updates
Fix app becoming unresponsive when two browser windows are open: the
root cause was HTTP/1.1 connection pool exhaustion (6-connection limit
per origin). VoiceAlerts was opening 3 SSE streams per window by
default, so two windows produced 8 connections and permanently starved
all regular HTTP requests.

- voice-alerts.js: default all streams to false (opt-in) to stay within
  the browser connection limit; existing user preferences in localStorage
  are preserved
- routes/alerts.py: replace direct AlertManager.stream_events() with
  sse_stream_fanout so both windows receive every alert instead of
  competing for the same queue
- routes/bluetooth_v2.py: same fanout fix via subscribe_fanout_queue,
  preserving named SSE events (device_update, scan_started, etc.)

Also includes accumulated UI/theming changes: accent-cyan CSS variable
sweep across mode CSS/JS files, standalone dashboard pages, template
updates, satellite TLE data refresh, and tile provider default rename.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 22:01:10 +01:00
James Smith 4ac996a538 fix: apply UI tier to standalone dashboard pages (ADS-B, AIS, Satellite)
Each dashboard is a separate HTML page that doesn't inherit the main SPA's
localStorage restore. Add a synchronous tier-restore script before CSS loads
so html[data-ui-tier] selectors fire on first paint.

Also add enhanced/lean tier override blocks to each dashboard CSS to remap
the dashboard-local variables (--bg-dark, --bg-panel, --radar-cyan, etc.)
that variables.css doesn't cover, and add lean-mode scanline/bg hide rules
since components.css is not loaded on these pages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 08:44:29 +01:00
James Smith f6adc0e063 fix(satellite): use MapUtils._buildReticle consistently in updateObserverMarker 2026-04-13 23:03:46 +01:00
James Smith 239369ab9f refactor(satellite): use MapUtils.init + HUD on ground track map
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 22:56:20 +01:00
James Smith 99416ed268 Fix weather sat handoff: remove defunct METEOR-M2, fire change event
- Remove 'METEOR-M2' (NORAD 40069) from WEATHER_SAT_KEYS — it has no
  entry in WEATHER_SATELLITES and no dropdown option, so the Capture
  button was silently scheduling against the wrong satellite
- Dispatch a 'change' event after setting satSelect.value in preSelect()
  and startPass() so any UI listeners (frequency display, mode info)
  update correctly when the satellite is set programmatically

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 23:52:14 +00:00
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 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 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 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 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 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 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 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 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 09e0ddef79 Ignore aborted satellite pass requests 2026-03-19 08:04:36 +00:00
James Smith b00638f794 Stop clearing browser caches on load 2026-03-19 07:43:32 +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 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 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