Rename kamil_adc to rph_radar and fix its data path

This commit is contained in:
Ayzen
2026-10-06 18:15:18 +03:00
parent aef549ea76
commit a185e61495
94 changed files with 2851 additions and 9485 deletions
+25 -3
View File
@@ -20,6 +20,7 @@ from python_app.models.run_config_schema import (
GprModel,
GprRxGeometryModel,
GprTxGeometryModel,
RphRadarModel,
RadarSweepModel,
RingEndpointModel,
RunConfigModel,
@@ -129,12 +130,15 @@ def validate_acquisition_config(config: RunConfigModel) -> None:
if mode not in ("mock", "native"):
raise ValueError("radar.driver_mode must be mock or native")
if config.radar.model not in (
config.LIBREVNA_MODEL, config.LIBREVNA_MULTI_MODEL, config.KAMIL_ADC_MODEL,
config.LIBREVNA_MODEL, config.LIBREVNA_MULTI_MODEL, config.RPH_RADAR_MODEL,
):
raise ValueError(f"Unsupported radar model: {config.radar.model}")
if mode != "native" and config.is_kamil_adc:
if mode != "native" and config.is_rph_radar:
raise ValueError(f"{config.radar.model} requires native driver mode")
if config.is_rph_radar:
validate_rph_radar_model(config.radar.rph_radar)
for switch, physical_positions in (
(config.input_switch, config.matrix_input_switch_positions),
(config.output_switch, config.matrix_output_switch_positions),
@@ -155,7 +159,7 @@ def validate_acquisition_config(config: RunConfigModel) -> None:
if not switch.gpio_chip or switch.pin_a < 0 or switch.pin_b < 0 or switch.pin_b == switch.pin_a:
raise ValueError(f"{context}: GPIO chip and distinct nonnegative control pins are required")
points = config.radar.kamil_adc.band.points if config.is_kamil_adc else config.radar.sweep.points
points = config.radar.rph_radar.band.points if config.is_rph_radar else config.radar.sweep.points
# RAW3/PRP3 header, frequency/S21 arrays and capture windows.
minimum = 44 + len(config.combos) * (28 + 12 * points)
for name in ("raw", "raw_tap", "preprocessed", "preprocessed_tap"):
@@ -166,6 +170,24 @@ def validate_acquisition_config(config: RunConfigModel) -> None:
raise ValueError(f"rings.{name}.slot_size_bytes must be at least {minimum} for this sweep")
def validate_rph_radar_model(adc: RphRadarModel) -> None:
"""Reject phase/grid errors before stopping a running pipeline."""
phase, band = adc.phase_calibration, adc.band
for name, value in {**asdict(phase), **asdict(band)}.items():
if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value):
raise ValueError(f"radar.rph_radar.{name} must be finite")
if phase.phase0_rad == phase.phase1_rad or phase.freq0_hz == phase.freq1_hz:
raise ValueError("radar.rph_radar.phase_calibration requires distinct phases and frequencies")
if not 0 <= band.start_hz < band.stop_hz <= 3.4e38:
raise ValueError("radar.rph_radar.band requires 0 <= start_hz < stop_hz within float32")
if not isinstance(band.points, int) or not 2 <= band.points <= _UINT32_MAX:
raise ValueError("radar.rph_radar.band.points must be an integer in [2, uint32 max]")
for name in ("startup_timeout_s", "sweep_timeout_s", "stop_timeout_s"):
value = getattr(adc, name)
if not math.isfinite(value) or value <= 0:
raise ValueError(f"radar.rph_radar.{name} must be finite and positive")
def validate_sweep_model(sweep: RadarSweepModel) -> None:
"""Validate radar sweep bounds (point count and frequency span).