Commit Graph

160 Commits

Author SHA1 Message Date
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
Smittix
06f82bb88f Merge pull request #29 from kittyhutchinson/main
Macos compatibility fix
2026-01-05 08:06:26 +00:00
Kitty Hutchinson
d658b98a25 fix 2026-01-04 15:23:32 +00:00
Kitty Hutchinson
85e0f228ed fix macOS compatibility 2026-01-04 15:19:58 +00:00
Smittix
3098a61487 Fix WiFi monitor parsing, improve setup, reorganize docs
- Fix monitor interface regex parsing (Issues #27, #28)
- Add Python 3.9+ version check at startup
- Fix setup.sh to handle PEP 668 and auto-create venv
- Reorganize README: move detailed content to docs/ folder
- Add docs/FEATURES.md, USAGE.md, TROUBLESHOOTING.md, HARDWARE.md
2026-01-04 14:06:55 +00:00
Smittix
4f393c85ac Update README.md 2026-01-04 13:21:38 +00:00
Smittix
9e7ef3a1c7 Update README.md
Added discord
2026-01-04 13:15:54 +00:00
Smittix
3633c5f13c Merge pull request #18 from JonanOribe/main
CSS and images were moved to the "Static" folder to improve HTML maintainability.
2026-01-03 17:53:01 +00:00
Jon Ander Oribe
409656b35a Update README.md 2026-01-03 14:19:58 +01:00
Jon Ander Oribe
482560dbed Update README.md 2026-01-03 14:16:55 +01: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
2905f3a3cd Use print statements for GPS debugging (visible in console)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 17:39:11 +00:00
James Smith
bd48a8c4e7 Add more GPS debug logging
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 17:36:44 +00: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
a83e0f5c9a Add GPS debug endpoint for troubleshooting
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 17:25:27 +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
Smittix
3a0a697bac Update README.md 2026-01-02 17:18:06 +00:00
Smittix
7d8fa288fc AI Statement 2026-01-02 17:17:40 +00:00
Smittix
c9b76ee8c1 Update README.md 2026-01-02 14:26:27 +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
Smittix
3437a2fc0a Update README.md 2026-01-02 13:33:24 +00:00
Smittix
cf48020b58 Merge pull request #8 from JonanOribe/main
Added deployment instructions with UV
2026-01-02 13:20:16 +00:00
Jon Ander Oribe
e7ca13a49e Update README.md
Added deployment instructions with UV
2026-01-02 12:06:53 +01:00
Smittix
0c678867e9 Merge pull request #2 from unipheas/main 2026-01-01 19:16:24 +00:00
Brian Phillips
646a9220c9 Fix for UnicodeDecodeError on Macbook
added `load_dotenv=False` to app.run to resolve UnicodeDecodeError
2026-01-01 12:01:23 -07:00
James Smith
03f639b79f Update README with new features and UI improvements
- ADS-B: full-screen dashboard, trails, range rings, filtering,
  clustering, reception stats, observer location, audio alerts
- Satellite: full-screen dashboard, polar plot, ground track map,
  telemetry panel, improved pass prediction workflow
- UI: mode-specific header stats, UTC clock, active mode indicator,
  panel styling with indicator dots, consistent design

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 23:16:53 +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
ddbed245e1 Fix Ctrl+C not stopping application gracefully
The signal handler was intercepting SIGINT but not exiting, causing
the application to continue running. Now re-raises KeyboardInterrupt
so Flask can handle shutdown properly.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 22:55:04 +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
11c65448f5 Add aircraft trails, radar scope, and UI overhaul to ADS-B dashboard
- Aircraft Trails: altitude-based color gradient with fading opacity
- Virtual Radar Scope (PPI): canvas-based with sweep animation, range rings, compass rose
- UI Overhaul: controls bar at bottom, compact stats in header, MAP/RADAR view toggle
- Range selector syncs with both map rings and radar scope
- Click-to-select aircraft works in both map and radar views

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 21:14:40 +00:00
James Smith
5c895144bc Fix ADS-B start error: convert gain to string for subprocess
The validation now returns an integer, but subprocess command
arguments must be strings.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 19:31:30 +00:00
James Smith
1398a5dedd Major security and code quality improvements
Security:
- Add input validation for all API endpoints (frequency, lat/lon, device, gain, ppm)
- Add HTML escaping utility to prevent XSS attacks
- Add path traversal protection for log file configuration
- Add proper HTTP status codes for error responses (400, 409, 503)

Performance:
- Reduce SSE keepalive overhead (30s interval instead of 1s)
- Add centralized SSE stream utility with optimized keepalive
- Add DataStore class for thread-safe data with automatic cleanup

New Features:
- Add data export endpoints (/export/aircraft, /export/wifi, /export/bluetooth)
- Support for both JSON and CSV export formats
- Add process cleanup on application exit (atexit handlers)
- Label Iridium module as demo mode with clear warnings

Code Quality:
- Create utils/validation.py for centralized input validation
- Create utils/sse.py for SSE stream utilities
- Create utils/cleanup.py for memory management
- Add safe_terminate() and register_process() for process management
- Improve error handling with proper logging throughout routes

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 19:24:40 +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
fb7a3860ea Fix ADS-B tracking state not reset on kill all processes
The /killall endpoint was not resetting the ADS-B tracking state:
- Added dump1090 to the list of processes to kill
- Reset adsb_process to None
- Reset adsb_using_service flag to False

This fixes the "ADS-B tracking already active" error after using
kill all processes and trying to start tracking again.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 17:09:31 +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
0966b6aeca Fix satellite dashboard: preserve visible pass line and improve styling
- Keep trackLine (visible pass trajectory) when drawing orbit track
- Make visible pass line solid (weight 4, full opacity) vs orbit track
  (dashed, weight 2, 60% opacity) for clear visual distinction
- Only fit bounds on initial pass selection, not periodic updates
- Prevents map from re-zooming every 5 seconds

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:55:33 +00:00
James Smith
58f3acb484 Fix satellite dashboard orbit track visibility
The orbit track was being added correctly but wasn't visible because
the map was zoomed to the pass ground track (a small arc). Now the map
fits bounds to include the full orbit track plus observer location
after adding the orbit layer.

Also removed debug console.log statements.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:50:43 +00:00
James Smith
5990119db3 Add more debug logging to track orbit rendering
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:45:07 +00:00
James Smith
ac7e3e15f3 Add debug logging to satellite dashboard
Temporary logging to diagnose why dashboard isn't showing satellite
position and orbit track like the tab does.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:40:44 +00:00
James Smith
1e58812f50 Fix dashboard satellite change timing issue
- Remove duplicate updateRealTimePositions() call from onSatelliteChange()
  since calculatePasses() already calls selectPass() which triggers it
- Clear passes and selectedPass when changing satellites to prevent
  using stale data
- Clear map layers when changing satellites

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:37:04 +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
0f6f642fd9 Fix satellite dashboard to fetch full orbit immediately on pass select
Added updateRealTimePositions() call to selectPass() so the full orbit
track is fetched immediately when a pass is selected, not just on the
5-second interval.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 15:22:22 +00:00
James Smith
f1e55fc44c Fix trackLine.getBounds error in satellite dashboard
LayerGroup doesn't have getBounds() like polyline does. 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:18:10 +00:00