Commit Graph

30 Commits

Author SHA1 Message Date
Smittix
b2c32173e1 Add Airspy SDR support and persist GPS coordinates
Airspy support:
- Add AIRSPY to SDRType enum and driver mappings
- Create AirspyCommandBuilder using SoapySDR tools (rx_fm, readsb, rtl_433)
- Register in SDRFactory and add to hardware type dropdown
- Supports Airspy R2/Mini (24MHz-1.8GHz) and HF+ devices

GPS coordinate persistence:
- Save observer location to localStorage when manually entered or via geolocation
- Restore saved coordinates on page load in both index.html and adsb_dashboard.html
- Coordinates are shared between both pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 21:04:43 +00:00
Smittix
ba4c6999a6 Add rtl_tcp (remote SDR) support v1.1.0
Features:
- Add rtl_tcp support for pager and sensor decoding
  - Connect to remote RTL-SDR via rtl_tcp server
  - New UI toggle and host:port inputs in sidebar
  - Supports rtl_fm and rtl_433 with remote devices

- Add remote dump1090 support for ADS-B tracking
  - Connect to dump1090 SBS output on remote machine
  - New "Remote" checkbox with host:port in ADS-B dashboard

Backend changes:
- Add rtl_tcp_host/port fields to SDRDevice dataclass
- Add is_network property for detecting remote devices
- Update RTLSDRCommandBuilder to use rtl_tcp:host:port format
- Add create_network_device() to SDRFactory
- Add validate_rtl_tcp_host/port validation functions
- Update pager, sensor, and adsb routes to accept remote params

Note: dump1090 doesn't support rtl_tcp directly - use remote
dump1090's SBS output (port 30003) for remote ADS-B tracking.
2026-01-05 08:44:58 +00:00
Smittix
27cbd47a80 Fix CSV export bug (fixes #30)
- Fix escaped newline in CSV export causing literal \n in output
- Clear allMessages array when clearing messages so CSV/JSON exports
  reflect current data after clearing
2026-01-05 08:19:31 +00:00
Smittix
351e478dd8 Remove Iridium (demo-only) and add version display
- Remove Iridium satellite decoding feature (was placeholder/demo only)
  - Delete routes/iridium.py
  - Remove Iridium UI elements from index.html
  - Remove Iridium CSS styles
  - Remove Iridium dependencies and logger
  - Clean up SDR docstrings mentioning Iridium

- Add version number display (fixes #31)
  - Add VERSION constant to config.py
  - Add --version / -V CLI flag to intercept.py
  - Display version badge in web UI header
2026-01-05 08:17:08 +00:00
Jon Ander Oribe
ac0235312c Add dashboard CSS and update screenshot paths
Moved CSS files for ADS-B and satellite dashboards, as well as the main index page. Updated screenshot image paths in the README and moved screenshot files to a dedicated images/screenshots directory. Adjusted HTML templates to use the new path for the CSS files.
2026-01-03 14:15:43 +01:00
James Smith
7b877727e1 Add baud rate selector for GPS dongle (fixes 4800 baud devices)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 17:33:57 +00:00
James Smith
e01c651bb4 Add GPS dongle support and fix Python 3.7/3.8 compatibility
- Add GPS dongle support with NMEA parsing (utils/gps.py, routes/gps.py)
- Add GPS device selector to ADS-B and Satellite observer location sections
- Add GPS dongle option to ADS-B dashboard
- Fix Python 3.7/3.8 compatibility by adding 'from __future__ import annotations'
  to all SDR module files (fixes TypeError: 'type' object is not subscriptable)
- Add pyserial to requirements.txt
- Update README with GPS dongle documentation and troubleshooting

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 17:19:59 +00:00
James Smith
5ed9674e1f Add multi-SDR hardware support (LimeSDR, HackRF) and setup script
- Add SDR hardware abstraction layer (utils/sdr/) with support for:
  - RTL-SDR (existing, using native rtl_* tools)
  - LimeSDR (via SoapySDR)
  - HackRF (via SoapySDR)
- Add hardware type selector to UI with capabilities display
- Add automatic device detection across all supported hardware
- Add hardware-specific parameter validation (frequency/gain ranges)
- Add setup.sh script for automated dependency installation
- Update README with multi-SDR docs, installation guide, troubleshooting
- Add SoapySDR/LimeSDR/HackRF to dependency definitions
- Fix dump1090 detection for Homebrew on Apple Silicon Macs
- Remove defunct NOAA-15/18/19 satellites, add NOAA-21

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 14:24:57 +00:00
James Smith
9742c269cb Fix Show Radar Display checkbox not working in Aircraft tab
Added toggleAircraftRadar() function and onchange handler to the
checkbox. Also updated switchMode() to respect the checkbox state
when switching to aircraft mode.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 23:14:33 +00:00
James Smith
0547086e4c Apply consistent UI patterns across all dashboards
- Satellite dashboard: Add header stat badges, bottom controls bar,
  streamlined sidebar with countdown/telemetry/pass list panels
- Main dashboard: Add UTC clock, mode-specific header stats with
  real-time syncing, active mode indicator with pulse animation
- Controls bar: Reorganize into logical groups (Mode, Export),
  gradient background, styled status indicator
- Panel styling: Gradient backgrounds, indicator dots on headers,
  Orbitron font for titles, rounded corners throughout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 22:53:34 +00:00
James Smith
b44546af53 Add manual location input for non-HTTPS environments
GPS geolocation only works on HTTPS or localhost. Added manual lat/lon
input fields so users can enter their coordinates directly when
accessing the app over HTTP on a local network.

- Added latitude/longitude input fields to both ADS-B tab and dashboard
- GPS button now checks for secure context before attempting geolocation
- Shows helpful error message directing users to use manual input
- Input fields update observer location and redraw range rings on change

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 19:01:37 +00:00
James Smith
2736c0c107 Add ADS-B range rings, statistics, geolocation, and reception stats
New features for both ADS-B tab and dashboard:

1. Range Rings - Concentric circles at 25, 50, 100, 150, 200nm showing
   distance from observer location with dashed styling and labels

2. Statistics Panel - Tracks:
   - Max range achieved (with aircraft that achieved it)
   - Total unique aircraft seen this session
   - Messages per second rate
   - Busiest hour of tracking

3. Geolocation Button - Gets user's actual GPS location to:
   - Center the map on their position
   - Calculate accurate distances for range statistics
   - Position range rings correctly

4. Reception Statistics - Real-time msg/sec counter to monitor
   receiver performance

All features work on both the ADS-B tab and full-screen dashboard.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:58:10 +00:00
James Smith
bde977c73d Fix overly broad military ICAO ranges causing false positives
The UK range 0x400000-0x43FFFF was the entire UK allocation, not just
military - this incorrectly flagged civilian airlines like EasyJet
(EZY callsign) as military aircraft.

Fixed ranges:
- Removed broad UK range, kept only RAF sub-range 0x43C000-0x43CFFF
- Narrowed France range to actual military 0x3F4000-0x3F7FFF
- Fixed Germany to correct Luftwaffe range 0x3D0000-0x3DFFFF
- Fixed typo in US range (0xADFFFFF -> 0xADFFFF)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:34:30 +00:00
James Smith
4cf2fa9fe5 Fix duplicate audioContext declaration breaking disclaimer popup
Renamed ADS-B audio context to avoid conflict with existing audio
system. The duplicate 'let audioContext' declaration was causing
a JavaScript syntax error that prevented the rest of the script
from loading, including the acceptDisclaimer function.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 18:19:40 +00:00
James Smith
d1b10d55bd Add audio alerts for military aircraft and emergency squawk codes
Features:
- Audio alert plays when military aircraft or emergency squawk code
  (7500/7600/7700) is first detected
- Different tones: two-tone urgent alert for emergencies, single tone
  for military aircraft
- Visual banner notification appears at top of screen for 5 seconds
- Toggle checkbox to enable/disable audio alerts
- Alerts only trigger once per aircraft to avoid spam
- Implemented on both ADS-B tab and full-screen dashboard

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:31:15 +00:00
James Smith
b1ced5daf7 Fix orbit track splitting to only occur at true antimeridian crossings
The previous logic split the track whenever longitude jumped by more
than 180°, which could happen in cases other than actual antimeridian
crossings, causing gaps in the middle of the orbit track.

New logic only splits when one longitude is > 90° and the other is
< -90°, which specifically identifies crossings of the ±180° line.

Also changed segment minimum from 2 to 1 point to preserve all data.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:59:48 +00:00
James Smith
43ff1a8b74 Fix satellite marker disappearing when changing passes
When removing map layers, set references to null so new markers get
created properly on position updates. Also clear orbit track lines
when changing passes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:35:49 +00:00
James Smith
fc5a4b1b6b Fix groundTrackLine.getBounds error in satellite tab
Same fix as dashboard: LayerGroup doesn't have getBounds(), so collect
all coordinates and create bounds manually using L.latLngBounds().

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:31:41 +00:00
James Smith
13be9c189e Fix satellite tab to redraw polar plot with trajectory on position update
The polar plot now redraws the pass trajectory before overlaying the
current position indicator, matching the dashboard behavior.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:28:37 +00:00
James Smith
ebe0bf9431 Fix orbit track to use selected pass's satellite, not dropdown
Bug: Both files were fetching orbit data for the dropdown-selected
satellite instead of the satellite from the selected pass.

Fixes:
- satellite_dashboard.html: updateRealTimePositions() now uses
  passes[selectedPass].satellite instead of selectedSatellite
- index.html: updateRealTimePosition() now ensures the selected
  pass's satellite is included in the position request, and added
  includeTrack: true to get orbit data

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:26:23 +00:00
James Smith
22791b6c3b Fix satellite ground track to show full orbit
- Fix property name mismatch: backend returns 'track' but index.html
  expected 'orbitTrack'
- Start position updates when a pass is selected (was never called)
- Fetch position immediately on pass selection for instant orbit display
- Dashboard: always show full orbit track, not just when no pass selected

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:16:36 +00:00
James Smith
0cf9360fce Fix satellite tracker polar plot and ground track issues
- Fix polar plot trajectory not displaying: backend returns 'el'/'az'
  properties but code expected 'elevation'/'azimuth'. Updated both
  drawPolarPlot() and drawPolarPlotPopout() to handle both formats.
- Fix ground track lines crossing entire map: added antimeridian
  crossing detection to split orbit tracks into segments, preventing
  lines from drawing across the map when crossing 180° longitude.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:10:13 +00:00
James Smith
7c215cf08c Add aircraft filtering and fix icon rotation
- Add aircraft filter dropdown (All/Military/Civil/Emergency) to both
  main dashboard and full-screen ADS-B dashboard
- Military detection uses ICAO hex ranges and callsign prefixes
- Military aircraft display olive drab markers and MIL badges
- Fix aircraft icon rotation in adsb_dashboard.html by replacing
  emoji (✈) with SVG icon - emoji had inconsistent orientation
  across platforms causing incorrect heading display

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 14:55:16 +00:00
James Smith
31b70140d6 Fix ground track map to fill its container
Use flexbox to make map expand to fill available space in container
2025-12-29 22:21:57 +00:00
James Smith
7309cf0565 Revert "Improve satellite tab layout for better screen space usage"
This reverts commit 170f5dac36.
2025-12-29 22:21:04 +00:00
James Smith
170f5dac36 Improve satellite tab layout for better screen space usage
- Make polar plot and ground track map taller (350px min)
- Combine countdown and pass list into full-width bottom section
- Side-by-side layout: compact countdown left, scrollable pass list right
- Responsive: stacks vertically on narrow screens
- Increase ground track map height to 280px
2025-12-29 22:18:57 +00:00
James Smith
61543b8b34 Fix JavaScript errors: variable hoisting and renamed function
- Move isWifiRunning and isBtRunning declarations to top of script
  to fix 'Cannot access before initialization' errors
- Update handleWifiNetwork hook to use renamed handleWifiNetworkImmediate
- Remove duplicate variable declarations
2025-12-29 22:13:43 +00:00
James Smith
f7a08f890d Fix browser freeze in WiFi/Bluetooth modes and add dashboard links
- Add requestAnimationFrame batching to WiFi SSE handler to prevent
  freeze with many access points
- Add requestAnimationFrame batching to Bluetooth SSE handler to
  prevent freeze with many devices
- Move channel graph updates to batched frame instead of per-network
- Throttle probe analysis updates to every 2 seconds
- Optimize aircraft tracking in main page with marker state caching,
  150 marker limit, and throttled auto-fit bounds
- Add "Full Screen Dashboard" links to aircraft and satellite modes
- Add "Main Dashboard" links to ADSB and satellite dashboards

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 21:55:48 +00:00
James Smith
3ee9f5e749 Fix duplicate aircraft cards in console output
Now updates existing cards instead of creating duplicates when
receiving updates for the same ICAO.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 12:52:23 +00:00
James Smith
ddeff002c9 Refactor into modular structure with improvements
- Split monolithic intercept.py (15k lines) into modular structure:
  - routes/ - Flask blueprints for each feature
  - templates/ - Jinja2 HTML templates
  - data/ - OUI database, satellite TLEs, detection patterns
  - utils/ - dependencies, process management, logging
  - config.py - centralized configuration with env var support

- Add type hints to function signatures
- Replace bare except clauses with specific exceptions
- Add proper logging module (replaces print statements)
- Add environment variable support (INTERCEPT_* prefix)
- Add test suite with pytest
- Add Dockerfile for containerized deployment
- Add pyproject.toml with ruff/black/mypy config
- Add requirements-dev.txt for development dependencies

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 16:28:48 +00:00