diff --git a/config.py b/config.py index ce25fd4..1fa1ed0 100644 --- a/config.py +++ b/config.py @@ -7,7 +7,7 @@ import os import sys # Application version -VERSION = "1.0.0" +VERSION = "1.1.0" def _get_env(key: str, default: str) -> str: diff --git a/routes/adsb.py b/routes/adsb.py index 3da51a1..81cd1c6 100644 --- a/routes/adsb.py +++ b/routes/adsb.py @@ -16,7 +16,10 @@ from flask import Blueprint, jsonify, request, Response, render_template import app as app_module from utils.logging import adsb_logger as logger -from utils.validation import validate_device_index, validate_gain +from utils.validation import ( + validate_device_index, validate_gain, + validate_rtl_tcp_host, validate_rtl_tcp_port +) from utils.sse import format_sse from utils.sdr import SDRFactory, SDRType @@ -238,6 +241,25 @@ def start_adsb(): except ValueError as e: return jsonify({'status': 'error', 'message': str(e)}), 400 + # Check for remote SBS connection (e.g., remote dump1090) + remote_sbs_host = data.get('remote_sbs_host') + remote_sbs_port = data.get('remote_sbs_port', 30003) + + if remote_sbs_host: + # Validate and connect to remote dump1090 SBS output + try: + remote_sbs_host = validate_rtl_tcp_host(remote_sbs_host) + remote_sbs_port = validate_rtl_tcp_port(remote_sbs_port) + except ValueError as e: + return jsonify({'status': 'error', 'message': str(e)}), 400 + + remote_addr = f"{remote_sbs_host}:{remote_sbs_port}" + logger.info(f"Connecting to remote dump1090 SBS at {remote_addr}") + adsb_using_service = True + thread = threading.Thread(target=parse_sbs_stream, args=(remote_addr,), daemon=True) + thread.start() + return jsonify({'status': 'started', 'message': f'Connected to remote dump1090 at {remote_addr}'}) + # Check if dump1090 is already running externally (e.g., user started it manually) existing_service = check_dump1090_service() if existing_service: diff --git a/routes/pager.py b/routes/pager.py index 7d79703..d68acc1 100644 --- a/routes/pager.py +++ b/routes/pager.py @@ -18,7 +18,10 @@ from flask import Blueprint, jsonify, request, Response import app as app_module from utils.logging import pager_logger as logger -from utils.validation import validate_frequency, validate_device_index, validate_gain, validate_ppm +from utils.validation import ( + validate_frequency, validate_device_index, validate_gain, validate_ppm, + validate_rtl_tcp_host, validate_rtl_tcp_port +) from utils.sse import format_sse from utils.process import safe_terminate, register_process from utils.sdr import SDRFactory, SDRType, SDRValidationError @@ -209,9 +212,25 @@ def start_decoding() -> Response: except ValueError: sdr_type = SDRType.RTL_SDR - # Create device object and get command builder - sdr_device = SDRFactory.create_default_device(sdr_type, index=device) - builder = SDRFactory.get_builder(sdr_type) + # Check for rtl_tcp (remote SDR) connection + rtl_tcp_host = data.get('rtl_tcp_host') + rtl_tcp_port = data.get('rtl_tcp_port', 1234) + + if rtl_tcp_host: + # Validate and create network device + try: + rtl_tcp_host = validate_rtl_tcp_host(rtl_tcp_host) + rtl_tcp_port = validate_rtl_tcp_port(rtl_tcp_port) + except ValueError as e: + return jsonify({'status': 'error', 'message': str(e)}), 400 + + sdr_device = SDRFactory.create_network_device(rtl_tcp_host, rtl_tcp_port) + logger.info(f"Using remote SDR: rtl_tcp://{rtl_tcp_host}:{rtl_tcp_port}") + else: + # Create local device object + sdr_device = SDRFactory.create_default_device(sdr_type, index=device) + + builder = SDRFactory.get_builder(sdr_device.sdr_type) # Build FM demodulation command rtl_cmd = builder.build_fm_demod_command( diff --git a/routes/sensor.py b/routes/sensor.py index 3959168..aa21a53 100644 --- a/routes/sensor.py +++ b/routes/sensor.py @@ -14,7 +14,10 @@ from flask import Blueprint, jsonify, request, Response import app as app_module from utils.logging import sensor_logger as logger -from utils.validation import validate_frequency, validate_device_index, validate_gain, validate_ppm +from utils.validation import ( + validate_frequency, validate_device_index, validate_gain, validate_ppm, + validate_rtl_tcp_host, validate_rtl_tcp_port +) from utils.sse import format_sse from utils.process import safe_terminate, register_process from utils.sdr import SDRFactory, SDRType @@ -90,9 +93,25 @@ def start_sensor() -> Response: except ValueError: sdr_type = SDRType.RTL_SDR - # Create device object and get command builder - sdr_device = SDRFactory.create_default_device(sdr_type, index=device) - builder = SDRFactory.get_builder(sdr_type) + # Check for rtl_tcp (remote SDR) connection + rtl_tcp_host = data.get('rtl_tcp_host') + rtl_tcp_port = data.get('rtl_tcp_port', 1234) + + if rtl_tcp_host: + # Validate and create network device + try: + rtl_tcp_host = validate_rtl_tcp_host(rtl_tcp_host) + rtl_tcp_port = validate_rtl_tcp_port(rtl_tcp_port) + except ValueError as e: + return jsonify({'status': 'error', 'message': str(e)}), 400 + + sdr_device = SDRFactory.create_network_device(rtl_tcp_host, rtl_tcp_port) + logger.info(f"Using remote SDR: rtl_tcp://{rtl_tcp_host}:{rtl_tcp_port}") + else: + # Create local device object + sdr_device = SDRFactory.create_default_device(sdr_type, index=device) + + builder = SDRFactory.get_builder(sdr_device.sdr_type) # Build ISM band decoder command cmd = builder.build_ism_command( diff --git a/templates/adsb_dashboard.html b/templates/adsb_dashboard.html index 19aca15..ebd12f6 100644 --- a/templates/adsb_dashboard.html +++ b/templates/adsb_dashboard.html @@ -159,6 +159,17 @@ +