mirror of
https://github.com/smittix/intercept.git
synced 2026-07-22 16:18:11 -07:00
feat(tscm): add custom frequency range option to RF sweep
Adds a "Custom Range" sweep type that lets users specify start/end MHz instead of using a fixed preset. Useful in dense RF environments where a full or standard sweep returns too many signals and causes slowdown. UI shows start/end MHz inputs when "Custom Range" is selected. Range is validated (0 < start < end ≤ 6000 MHz) before the sweep starts. Backend threads the ranges through to _scan_rf_signals(), which already supports arbitrary frequency bands. Closes #172
This commit is contained in:
@@ -490,6 +490,7 @@ def _start_sweep_internal(
|
||||
bt_interface: str = '',
|
||||
sdr_device: int | None = None,
|
||||
verbose_results: bool = False,
|
||||
custom_ranges: list[dict] | None = None,
|
||||
) -> dict:
|
||||
"""Start a TSCM sweep without request context."""
|
||||
global _sweep_running, _sweep_thread, _current_sweep_id
|
||||
@@ -532,7 +533,7 @@ def _start_sweep_internal(
|
||||
_sweep_thread = threading.Thread(
|
||||
target=_run_sweep,
|
||||
args=(sweep_type, baseline_id, wifi_enabled, bt_enabled, rf_enabled,
|
||||
wifi_interface, bt_interface, sdr_device, verbose_results),
|
||||
wifi_interface, bt_interface, sdr_device, verbose_results, custom_ranges),
|
||||
daemon=True
|
||||
)
|
||||
_sweep_thread.start()
|
||||
@@ -1127,7 +1128,8 @@ def _run_sweep(
|
||||
wifi_interface: str = '',
|
||||
bt_interface: str = '',
|
||||
sdr_device: int | None = None,
|
||||
verbose_results: bool = False
|
||||
verbose_results: bool = False,
|
||||
custom_ranges: list[dict] | None = None,
|
||||
) -> None:
|
||||
"""
|
||||
Run the TSCM sweep in a background thread.
|
||||
@@ -1504,7 +1506,7 @@ def _run_sweep(
|
||||
'rf_count': len(all_rf),
|
||||
})
|
||||
# Try RF scan even if sdr_device is None (will use device 0)
|
||||
rf_signals = _scan_rf_signals(sdr_device, sweep_ranges=preset.get('ranges'))
|
||||
rf_signals = _scan_rf_signals(sdr_device, sweep_ranges=custom_ranges or preset.get('ranges'))
|
||||
|
||||
# If no signals and this is first RF scan, send info event
|
||||
if not rf_signals and last_rf_scan == 0:
|
||||
|
||||
@@ -58,6 +58,25 @@ def start_sweep():
|
||||
bt_interface = data.get('bt_interface', '')
|
||||
sdr_device = data.get('sdr_device')
|
||||
|
||||
# Validate custom frequency ranges if provided
|
||||
custom_ranges = None
|
||||
if sweep_type == 'custom':
|
||||
raw_ranges = data.get('custom_ranges') or []
|
||||
validated = []
|
||||
for rng in raw_ranges:
|
||||
try:
|
||||
start = float(rng.get('start', 0))
|
||||
end = float(rng.get('end', 0))
|
||||
step = float(rng.get('step', 0.1))
|
||||
if 0 < start < end <= 6000:
|
||||
validated.append({'start': start, 'end': end, 'step': step,
|
||||
'name': rng.get('name') or f'{start:.0f}–{end:.0f} MHz'})
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
if not validated:
|
||||
return jsonify({'status': 'error', 'message': 'custom sweep requires valid start/end MHz'}), 400
|
||||
custom_ranges = validated
|
||||
|
||||
result = _start_sweep_internal(
|
||||
sweep_type=sweep_type,
|
||||
baseline_id=baseline_id,
|
||||
@@ -68,6 +87,7 @@ def start_sweep():
|
||||
bt_interface=bt_interface,
|
||||
sdr_device=sdr_device,
|
||||
verbose_results=verbose_results,
|
||||
custom_ranges=custom_ranges,
|
||||
)
|
||||
http_status = result.pop('http_status', 200)
|
||||
return jsonify(result), http_status
|
||||
|
||||
Reference in New Issue
Block a user