Add live waterfall during pager and sensor decoding via IQ pipeline

Replace rtl_fm/rtl_433 with rtl_sdr for raw IQ capture when available,
enabling a Python IQ processor to compute FFT for the waterfall while
simultaneously feeding decoded data to multimon-ng (pager) or rtl_433
(sensor). Falls back to the legacy pipeline when rtl_sdr is unavailable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Smittix
2026-02-07 23:18:43 +00:00
parent 51550d3dfc
commit bc7be06afa
9 changed files with 1053 additions and 434 deletions
+11 -3
View File
@@ -232,6 +232,13 @@ cleanup_manager.register(ais_vessels)
cleanup_manager.register(dsc_messages)
cleanup_manager.register(deauth_alerts)
# ============================================
# WATERFALL SOURCE TRACKING
# ============================================
# Tracks whether waterfall data is being produced by a decoder's IQ pipeline
# None = no active source, 'rtl_power' = standalone, 'pager'/'sensor' = decoder-driven
waterfall_source: str | None = None
# ============================================
# SDR DEVICE REGISTRY
# ============================================
@@ -659,7 +666,7 @@ def kill_all() -> Response:
"""Kill all decoder, WiFi, and Bluetooth processes."""
global current_process, sensor_process, wifi_process, adsb_process, ais_process, acars_process
global aprs_process, aprs_rtl_process, dsc_process, dsc_rtl_process, bt_process
global dmr_process, dmr_rtl_process
global dmr_process, dmr_rtl_process, waterfall_source
# Import adsb and ais modules to reset their state
from routes import adsb as adsb_module
@@ -668,7 +675,7 @@ def kill_all() -> Response:
killed = []
processes_to_kill = [
'rtl_fm', 'multimon-ng', 'rtl_433',
'rtl_fm', 'multimon-ng', 'rtl_433', 'rtl_sdr',
'airodump-ng', 'aireplay-ng', 'airmon-ng',
'dump1090', 'acarsdec', 'direwolf', 'AIS-catcher',
'hcitool', 'bluetoothctl', 'dsd',
@@ -741,9 +748,10 @@ def kill_all() -> Response:
except Exception:
pass
# Clear SDR device registry
# Clear SDR device registry and waterfall source
with sdr_device_registry_lock:
sdr_device_registry.clear()
waterfall_source = None
return jsonify({'status': 'killed', 'processes': killed})