working version

This commit is contained in:
Ayzen
2026-05-18 17:27:00 +03:00
parent 907dbf29ce
commit 0da8b1283c
23 changed files with 1479 additions and 133 deletions
@@ -176,6 +176,7 @@ class MultiRadarSequentialCaptureSession:
can_undo=bool(self._captured_batches),
is_complete=self.is_complete(),
variant_count=len(self._radar_variants),
supports_batch_capture=not self._manual_multi_device_capture,
)
def capture_current_combo(self) -> MultiRadarCaptureBatch:
@@ -186,9 +187,11 @@ class MultiRadarSequentialCaptureSession:
if combo is None:
raise RuntimeError("Capture session is already complete")
pending_traces_by_radar_key: dict[str, list[TraceData]] = {}
display_traces: list[TraceData] = []
variant_labels: list[str] = []
if self._is_multi_device:
traces: list[TraceData] = []
variant_labels: list[str] = []
for variant in self._radar_variants:
self._radar.configure(variant.config.radar.sweep)
if self._base_config.runtime.settling_ms > 0:
@@ -198,56 +201,47 @@ class MultiRadarSequentialCaptureSession:
raise RuntimeError(f"Multi-device variant {variant.display_name} returned no traces")
if self._manual_multi_device_capture:
trace = select_trace_for_combo(collection, combo)
self._traces_by_radar_key[variant.radar_key].append(trace)
traces.append(trace)
pending_traces_by_radar_key[variant.radar_key] = [trace]
display_traces.append(trace)
else:
self._traces_by_radar_key[variant.radar_key].extend(collection.traces)
traces.append(collection.traces[-1])
pending_traces_by_radar_key[variant.radar_key] = list(collection.traces)
display_traces.append(collection.traces[-1])
variant_labels.append(variant.display_name)
batch = MultiRadarCaptureBatch(
combo=combo,
traces=tuple(traces),
variant_labels=tuple(variant_labels),
)
self._captured_batches.append(batch)
if self._manual_multi_device_capture:
self._next_index += 1
else:
self._next_index = len(self._combos)
return batch
assert self._input_switch is not None
assert self._output_switch is not None
self._output_switch.switch_to(combo.output)
self._input_switch.switch_to(combo.input)
if self._base_config.runtime.settling_ms > 0:
time.sleep(self._base_config.runtime.settling_ms / 1000.0)
traces: list[TraceData] = []
variant_labels: list[str] = []
for variant in self._radar_variants:
self._radar.configure(variant.config.radar.sweep)
else:
assert self._input_switch is not None
assert self._output_switch is not None
self._output_switch.switch_to(combo.output)
self._input_switch.switch_to(combo.input)
if self._base_config.runtime.settling_ms > 0:
time.sleep(self._base_config.runtime.settling_ms / 1000.0)
sweep = self._radar.acquire()
trace = TraceData(
combo=ComboKey(input_pos=combo.input, output_pos=combo.output),
frequency_hz=np.asarray(sweep.x, dtype=np.float32),
s11=np.asarray(sweep.trace("s11"), dtype=np.complex64),
s21=np.asarray(sweep.trace("s21"), dtype=np.complex64),
)
traces.append(trace)
variant_labels.append(variant.display_name)
self._traces_by_radar_key[variant.radar_key].append(trace)
for variant in self._radar_variants:
self._radar.configure(variant.config.radar.sweep)
if self._base_config.runtime.settling_ms > 0:
time.sleep(self._base_config.runtime.settling_ms / 1000.0)
sweep = self._radar.acquire()
trace = TraceData(
combo=ComboKey(input_pos=combo.input, output_pos=combo.output),
frequency_hz=np.asarray(sweep.x, dtype=np.float32),
s11=np.asarray(sweep.trace("s11"), dtype=np.complex64),
s21=np.asarray(sweep.trace("s21"), dtype=np.complex64),
)
pending_traces_by_radar_key[variant.radar_key] = [trace]
display_traces.append(trace)
variant_labels.append(variant.display_name)
for radar_key, traces in pending_traces_by_radar_key.items():
self._traces_by_radar_key[radar_key].extend(traces)
batch = MultiRadarCaptureBatch(
combo=combo,
traces=tuple(traces),
traces=tuple(display_traces),
variant_labels=tuple(variant_labels),
)
self._captured_batches.append(batch)
self._next_index += 1
if self._is_multi_device and not self._manual_multi_device_capture:
self._next_index = len(self._combos)
else:
self._next_index += 1
return batch
def undo_last_capture(self) -> MultiRadarCaptureBatch:
@@ -30,6 +30,7 @@ class SequentialCaptureState:
can_undo: bool
is_complete: bool
variant_count: int = 1
supports_batch_capture: bool = True
class SequentialCaptureSession:
@@ -141,6 +142,7 @@ class SequentialCaptureSession:
current_combo=current_combo,
can_undo=bool(self._traces),
is_complete=self.is_complete(),
supports_batch_capture=not self._manual_multi_device_capture,
)
def capture_current_combo(self) -> TraceData:
@@ -153,6 +155,8 @@ class SequentialCaptureSession:
if self._is_multi_device:
collection = self._radar.acquire_collection(collection_id=1)
if not collection.traces:
raise RuntimeError("Multi-device capture returned no traces")
if self._manual_multi_device_capture:
trace = select_trace_for_combo(collection, combo)
self._traces.append(trace)
@@ -161,8 +165,6 @@ class SequentialCaptureSession:
self._traces.extend(collection.traces)
self._next_index = len(self._combos)
if not collection.traces:
raise RuntimeError("Multi-device capture returned no traces")
return collection.traces[-1]
assert self._input_switch is not None