mirror of
https://github.com/smittix/intercept.git
synced 2026-04-24 06:40:00 -07:00
Phase 1 - Automated observation engine: - utils/ground_station/scheduler.py: GroundStationScheduler fires at AOS/LOS, claims SDR, manages IQBus lifecycle, emits SSE events - utils/ground_station/observation_profile.py: ObservationProfile dataclass + DB CRUD - routes/ground_station.py: REST API for profiles, scheduler, observations, recordings, rotator; SSE stream; /ws/satellite_waterfall WebSocket - DB tables: observation_profiles, ground_station_observations, ground_station_events, sigmf_recordings (added to utils/database.py init_db) - app.py: ground_station_queue, WebSocket init, scheduler startup in _deferred_init - routes/__init__.py: register ground_station_bp Phase 2 - Doppler correction: - utils/doppler.py: generalized DopplerTracker extracted from sstv_decoder.py; accepts satellite name or raw TLE tuple; thread-safe; update_tle() method - utils/sstv/sstv_decoder.py: replace inline DopplerTracker with import from utils.doppler - Scheduler runs 5s retune loop; calls rotator.point_to() if enabled Phase 3 - IQ recording (SigMF): - utils/sigmf.py: SigMFWriter writes .sigmf-data + .sigmf-meta; disk-free guard (500MB) - utils/ground_station/consumers/sigmf_writer.py: SigMFConsumer wraps SigMFWriter Phase 4 - Multi-decoder IQ broadcast pipeline: - utils/ground_station/iq_bus.py: IQBus single-producer fan-out; IQConsumer Protocol - utils/ground_station/consumers/waterfall.py: CU8→FFT→binary frames - utils/ground_station/consumers/fm_demod.py: CU8→FM demod (numpy)→decoder subprocess - utils/ground_station/consumers/gr_satellites.py: CU8→cf32→gr_satellites (optional) Phase 5 - Live spectrum waterfall: - static/js/modes/ground_station_waterfall.js: /ws/satellite_waterfall canvas renderer - Waterfall panel in satellite dashboard sidebar, auto-shown on iq_bus_started SSE event Phase 6 - Antenna rotator control (optional): - utils/rotator.py: RotatorController TCP client for rotctld (Hamlib line protocol) - Rotator panel in satellite dashboard; silently disabled if rotctld unreachable Also fixes pre-existing test_weather_sat_predict.py breakage: - utils/weather_sat_predict.py: rewritten with self-contained skyfield implementation using find_discrete (matching what committed tests expected); adds _format_utc_iso - tests/test_weather_sat_predict.py: add _MOCK_WEATHER_SATS and @patch decorators for tests that assumed NOAA-18 active (decommissioned Jun 2025, now active=False) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
104 lines
4.5 KiB
Python
104 lines
4.5 KiB
Python
# Routes package - registers all blueprints with the Flask app
|
|
|
|
|
|
def register_blueprints(app):
|
|
"""Register all route blueprints with the Flask app."""
|
|
# Import CSRF to exempt API blueprints (they use JSON, not form tokens)
|
|
try:
|
|
from app import csrf as _csrf
|
|
except ImportError:
|
|
_csrf = None
|
|
from .acars import acars_bp
|
|
from .adsb import adsb_bp
|
|
from .ais import ais_bp
|
|
from .alerts import alerts_bp
|
|
from .aprs import aprs_bp
|
|
from .bluetooth import bluetooth_bp
|
|
from .bluetooth_v2 import bluetooth_v2_bp
|
|
from .bt_locate import bt_locate_bp
|
|
from .controller import controller_bp
|
|
from .correlation import correlation_bp
|
|
from .dsc import dsc_bp
|
|
from .gps import gps_bp
|
|
from .listening_post import receiver_bp
|
|
from .meshtastic import meshtastic_bp
|
|
from .meteor_websocket import meteor_bp
|
|
from .morse import morse_bp
|
|
from .offline import offline_bp
|
|
from .ground_station import ground_station_bp
|
|
from .ook import ook_bp
|
|
from .pager import pager_bp
|
|
from .radiosonde import radiosonde_bp
|
|
from .recordings import recordings_bp
|
|
from .rtlamr import rtlamr_bp
|
|
from .satellite import satellite_bp
|
|
from .sensor import sensor_bp
|
|
from .settings import settings_bp
|
|
from .signalid import signalid_bp
|
|
from .space_weather import space_weather_bp
|
|
from .spy_stations import spy_stations_bp
|
|
from .sstv import sstv_bp
|
|
from .sstv_general import sstv_general_bp
|
|
from .subghz import subghz_bp
|
|
from .system import system_bp
|
|
from .tscm import init_tscm_state, tscm_bp
|
|
from .updater import updater_bp
|
|
from .vdl2 import vdl2_bp
|
|
from .weather_sat import weather_sat_bp
|
|
from .websdr import websdr_bp
|
|
from .wefax import wefax_bp
|
|
from .wifi import wifi_bp
|
|
from .wifi_v2 import wifi_v2_bp
|
|
|
|
app.register_blueprint(pager_bp)
|
|
app.register_blueprint(sensor_bp)
|
|
app.register_blueprint(rtlamr_bp)
|
|
app.register_blueprint(wifi_bp)
|
|
app.register_blueprint(wifi_v2_bp) # New unified WiFi API
|
|
app.register_blueprint(bluetooth_bp)
|
|
app.register_blueprint(bluetooth_v2_bp) # New unified Bluetooth API
|
|
app.register_blueprint(adsb_bp)
|
|
app.register_blueprint(ais_bp)
|
|
app.register_blueprint(dsc_bp) # VHF DSC maritime distress
|
|
app.register_blueprint(acars_bp)
|
|
app.register_blueprint(vdl2_bp)
|
|
app.register_blueprint(aprs_bp)
|
|
app.register_blueprint(satellite_bp)
|
|
app.register_blueprint(gps_bp)
|
|
app.register_blueprint(settings_bp)
|
|
app.register_blueprint(correlation_bp)
|
|
app.register_blueprint(receiver_bp)
|
|
app.register_blueprint(meshtastic_bp)
|
|
app.register_blueprint(tscm_bp)
|
|
app.register_blueprint(spy_stations_bp)
|
|
app.register_blueprint(controller_bp) # Remote agent controller
|
|
app.register_blueprint(offline_bp) # Offline mode settings
|
|
app.register_blueprint(updater_bp) # GitHub update checking
|
|
app.register_blueprint(sstv_bp) # ISS SSTV decoder
|
|
app.register_blueprint(weather_sat_bp) # NOAA/Meteor weather satellite decoder
|
|
app.register_blueprint(sstv_general_bp) # General terrestrial SSTV
|
|
app.register_blueprint(websdr_bp) # HF/Shortwave WebSDR
|
|
app.register_blueprint(alerts_bp) # Cross-mode alerts
|
|
app.register_blueprint(recordings_bp) # Session recordings
|
|
app.register_blueprint(subghz_bp) # SubGHz transceiver (HackRF)
|
|
app.register_blueprint(bt_locate_bp) # BT Locate SAR device tracking
|
|
app.register_blueprint(space_weather_bp) # Space weather monitoring
|
|
app.register_blueprint(signalid_bp) # External signal ID enrichment
|
|
app.register_blueprint(wefax_bp) # WeFax HF weather fax decoder
|
|
app.register_blueprint(meteor_bp) # Meteor scatter detection
|
|
app.register_blueprint(morse_bp) # CW/Morse code decoder
|
|
app.register_blueprint(radiosonde_bp) # Radiosonde weather balloon tracking
|
|
app.register_blueprint(system_bp) # System health monitoring
|
|
app.register_blueprint(ook_bp) # Generic OOK signal decoder
|
|
app.register_blueprint(ground_station_bp) # Ground station automation
|
|
|
|
# Exempt all API blueprints from CSRF (they use JSON, not form tokens)
|
|
if _csrf:
|
|
for bp in app.blueprints.values():
|
|
_csrf.exempt(bp)
|
|
|
|
# Initialize TSCM state with queue and lock from app
|
|
import app as app_module
|
|
if hasattr(app_module, 'tscm_queue') and hasattr(app_module, 'tscm_lock'):
|
|
init_tscm_state(app_module.tscm_queue, app_module.tscm_lock)
|