Skip to content

Fix Meteor LRPT, global timezone, VDL2 correlation, and weather sat UX#202

Open
mitchross wants to merge 8 commits intosmittix:mainfrom
mitchross:misc-fixes
Open

Fix Meteor LRPT, global timezone, VDL2 correlation, and weather sat UX#202
mitchross wants to merge 8 commits intosmittix:mainfrom
mitchross:misc-fixes

Conversation

@mitchross
Copy link
Copy Markdown
Contributor

Summary

  • Fix Meteor LRPT decoding in Docker — missing pipeline data, FFTW3 libs, and arm64 path handling
  • Global timezone/12h-24h setting — site-wide time preference in Settings > Display, applied across all modes
  • Fix VDL2 messages not appearing in aircraft datalink panel — nested field flattening and ICAO case mismatch
  • Fix ACARS message display — add weather, CPDLC, squawk rendering; use global timezone
  • Enhanced weather satellite UX — getting started guide, pass geometry panel, wider predictions, demo data mode
  • Fix clock flickering — duplicate setInterval timers on index.html and nav.html

Changes

Docker (Dockerfile)

  • Add libfftw3-double3 and libfftw3-single3 runtime dependencies for SatDump
  • Add missing COPY --from=builder /staging/usr/local/share/ (pipeline definitions were never reaching runtime)
  • Handle arm64 vs x86 install path differences (/usr vs /usr/local)
  • Split SatDump compile and staging into separate layers for faster rebuilds
  • Build-time assertions to catch missing pipelines early

Weather Satellite UI

  • Getting Started guide (what are Meteor satellites, step-by-step, when to look, what you need)
  • AOS/TCA/LOS pass geometry detail panel with times, bearings, cardinal directions
  • Pass analysis bar (24h quality breakdown, best upcoming pass)
  • Enhanced pass cards with AOS/LOS times, bearings, BEST badge, direction arrows
  • Console timestamps, log level filters (ALL/SIGNAL/PROG/ERR), copy/clear buttons
  • Countdown pulse animation when pass is imminent
  • "All Meteor Satellites" default dropdown (was single-satellite only)
  • Demo data mode for UI testing without SDR hardware
  • Meteor M2-4 80k baud fallback pipeline option
  • Widened prediction window to 48h at 5° min elevation
  • Fix duration display (was showing seconds labeled as minutes)

Global Time Preferences

  • InterceptTime utility in core/utils.js (timezone + 12h/24h format)
  • Settings > Display > Time & Timezone (UTC, Local, Eastern, Central, Mountain, Pacific)
  • Header nav clock uses selected timezone and format across all pages
  • Weather satellite, ACARS, VDL2 sidebar all respect global setting

ADS-B / ACARS / VDL2

  • Fix VDL2 messages not appearing in aircraft detail panel (nested field flattening, ICAO uppercase)
  • Add weather, CPDLC, squawk parsed data rendering to ACARS cards
  • Show tail/registration alongside flight number
  • Fix engine_data crash when parsed value isn't an object
  • INTERCEPT_DISABLE_AUTH env var for local/dev use

Clock Fix

  • Fix flickering between UTC and ET caused by duplicate setInterval timers
  • Inline updateHeaderClock in index.html was still using raw UTC

Test plan

  • Docker build succeeds on arm64 (RPi5) and x86
  • docker exec intercept satdump --help runs without missing library errors
  • ls /usr/local/share/satdump/pipelines/ shows 71 pipeline JSON files
  • Weather Sat mode shows pass predictions when location is set
  • Pass geometry panel appears when a pass is selected
  • Settings > Display > Timezone changes update clock and all time displays instantly
  • No clock flickering on any page
  • VDL2 messages appear in aircraft datalink panel when clicking a VDL2 message
  • ACARS messages show weather/CPDLC/squawk parsed data

🤖 Generated with Claude Code

mitchross and others added 8 commits March 25, 2026 00:05
Docker fixes:
- Add missing COPY for /usr/local/share/ (pipeline definitions were never
  reaching the runtime image — root cause of silent SatDump failures)
- Add libfftw3-double3 and libfftw3-single3 runtime dependencies
- Handle arm64 vs x86 install path differences (/usr vs /usr/local)
- Split SatDump compile and staging into separate layers for better caching
- Add build-time assertions to catch missing pipelines early

UI enhancements:
- Timezone selector (UTC, Local, Eastern, Central, Mountain, Pacific)
  with localStorage persistence — all time displays update instantly
- Pass analysis bar showing 24h quality breakdown and best upcoming pass
- Enhanced pass cards with cardinal direction (NW→SE), BEST badge
- Console timestamps, log level filters (ALL/SIGNAL/PROG/ERR), COPY/CLR
- Pass count in stats strip
- Demo data mode for UI testing without SDR or live satellite pass
- Meteor M2-4 80k baud fallback pipeline option

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…edictions

Pass prediction improvements:
- Widen prediction window to 48h at 5° min elevation (was 24h/15°)
- Add AOS/TCA/LOS pass geometry detail panel with times and bearings
- Fix duration display (was showing seconds labeled as minutes)
- Enhanced pass cards with AOS/LOS times, bearings, and directions
- Add REFRESH button in passes panel header
- Better empty state with clear "set your location" prompt and icon

Countdown and visual:
- Pulse animation on countdown when pass is imminent or active
- Countdown numbers scale up and change color for urgency

Sidebar getting started guide:
- New "Getting Started" section explaining what Meteor satellites are,
  polar orbits, 4-8 passes/day, step-by-step workflow
- "When to look" tips (elevation, day vs night, pass direction)
- "What you need" equipment table with costs
- Collapsed antenna guide by default to reduce initial overwhelm
- Improved offline decode section with clear instructions on where
  to get IQ recordings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Global time preferences (Settings > Display > Time & Timezone):
- InterceptTime utility in core/utils.js with timezone + 12h/24h support
- Timezone options: UTC, Local, Eastern, Central, Mountain, Pacific
- Time format: 12-hour (AM/PM) or 24-hour toggle
- Defaults to US/Eastern + 12-hour
- Header nav clock updates to use selected timezone and format
- Weather satellite mode delegates to global InterceptTime
- Settings persist via localStorage, change listeners notify all modes

Weather satellite improvements:
- Satellite dropdown defaults to "All Meteor Satellites" showing all passes
- Can still filter to specific satellite (M2-3, M2-4, M2-4-80K)
- Capture button on pass cards auto-selects the correct satellite

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use global InterceptTime for all ACARS timestamps (respects Eastern/12h)
- Add weather message rendering (wind, temperature, turbulence)
- Add CPDLC controller-pilot message rendering (purple highlight)
- Add squawk code change rendering (red highlight)
- Fix engine_data crash when parsed value isn't an object
- Show tail/registration alongside flight number on all cards
- Increase message text truncation to 200 chars
- Add FL prefix to flight level in position reports
- Applied consistently across ADS-B dashboard, sidebar feed, and standalone ACARS mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause: dumpvdl2 outputs nested JSON (vdl2.avlc.acars.flight) but
FlightCorrelator only checks top-level fields. VDL2 messages were stored
in the correlator but never matched to any aircraft.

Fix: Promote identifying fields (flight, reg, tail, icao, addr, label,
text) from the nested VDL2 structure to top-level before storing in the
correlator. Also promote AVLC source address as ICAO when src.type is
"Aircraft".

Also fix VDL2 sidebar timestamps to use global InterceptTime setting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Timezone fixes:
- Add utils.js (InterceptTime) to adsb_dashboard.html — was completely
  missing, causing all times to fall back to UTC regardless of setting
- Register onChange listener in nav.html so clock updates instantly
  when timezone/format is changed in Settings
- Initialize timezone/format dropdowns on ADS-B dashboard page load
- Browser-verified: ET/12h ↔ UTC/24h switches instantly on ADS-B page

VDL2 correlation fix:
- Force ICAO hex to uppercase when promoting from VDL2 src.addr (dumpvdl2
  may output lowercase, ADS-B stores uppercase — case mismatch prevented
  correlator from matching)
- Move ICAO/addr promotion before ACARS field extraction so even
  non-ACARS VDL2 frames (XID, connection mgmt) get correlated

Auth:
- Add INTERCEPT_DISABLE_AUTH env var to skip login for local/dev use
- Configurable via docker-compose.yml environment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
app.js and nav.html both started 1-second intervals updating the same
#headerUtcTime element. Even though both used InterceptTime, their
slightly different timing caused visible text flicker.

Fix: app.js now sets window._navClockStarted before starting its
interval, so nav.html's guard condition skips its duplicate. Also
register InterceptTime.onChange listener in app.js for instant updates.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…g UTC

The updateHeaderClock function in index.html was inlined and still using
raw UTC (toISOString), while nav.html's version used InterceptTime.
Both ran on 1-second intervals updating the same element, causing the
clock to rapidly alternate between ET and UTC.

Fix: Updated the inline version in index.html to use InterceptTime,
matching nav.html. Added _navClockStarted guard and onChange listener
so only one interval runs and timezone changes apply instantly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Owner

@smittix smittix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR — there's a lot of good work here. The Dockerfile split into compile/staging layers is a genuine fix for the missing pipeline issue, and the InterceptTime module is well-structured. Before we can merge, there are two issues that need addressing:

Required fixes

1. updateTimelineLabels() — ReferenceError at runtime

In static/js/modes/weather-satellite.js, the new updateTimelineLabels() function references selectedTimezone and TZ_MAP directly, but those variables no longer exist after the InterceptTime refactor. This will throw a ReferenceError whenever a timezone is selected or passes are loaded.

Fix: replace the raw variable references with the InterceptTime API already used correctly elsewhere in this PR:

const tz = typeof InterceptTime !== 'undefined' ? InterceptTime.getTimezone() : 'UTC';
const ianaName = typeof InterceptTime !== 'undefined' ? InterceptTime.getIANA() : undefined;

2. docker-compose.ymlprofiles: [basic] on the intercept service breaks existing deployments

Adding profiles: [basic] to the intercept service means plain docker compose up -d starts nothing. Anyone using the documented docker compose --profile basic up -d workflow will be fine, but users who run the bare docker compose up -d will get a silently empty deployment.

The intercept service should remain unconditional (no profiles: block), consistent with how the service worked before this PR.


Other notes (not blocking)

  • Clock flicker fixapp.js doesn't check _navClockStarted before starting its own interval, so the duplicate-timer scenario may still partially occur on the main SPA page.
  • INTERCEPT_DISABLE_AUTH — works correctly, but a startup app.logger.warning() when the flag is active would help prevent accidental use in a deployed environment.
  • INTERCEPT_IMAGE removal — silently breaks users pulling a pre-built registry image (e.g. via build-multiarch.sh). Worth documenting if intentional.
  • Min elevation — 5° is at the horizon with maximum atmospheric attenuation; most users won't get a usable decode at that angle. 10° would be a better default.
  • "24h passes" label — the analysis bar header still says "24h passes" but the fetch window is now 48h.
  • VDL2data['addr'] is set redundantly alongside data['icao']; can be removed if not consumed downstream.
  • Default timezone — defaulting to US/Eastern will surprise non-US users; UTC would be a more neutral default.

Fix the two required items and this is ready to go.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants