Rework radar system

This commit is contained in:
Ayzen
2026-10-06 12:32:26 +03:00
parent 552cdc688a
commit 5bb86b7165
299 changed files with 13537 additions and 27763 deletions
+23 -30
View File
@@ -14,9 +14,9 @@ from python_app.models.dataset_model import (
)
from python_app.orchestration.shm.binary_cursor import ByteCursor
RAW_MAGIC = 0x32574152
PREPROC_MAGIC = 0x32525050
RESULT_MAGIC = 0x324C5352 # RSL2: adds processing_duration_ns after monotonic_ns
RAW_MAGIC = 0x33574152 # RAW3
PREPROC_MAGIC = 0x33505250 # PRP3
RESULT_MAGIC = 0x334C5352 # RSL3: typed acquisition and processing metadata
def decode_trace_collection(payload: bytes, expected_magic: int) -> SweepCollection:
@@ -39,40 +39,23 @@ def decode_trace_collection(payload: bytes, expected_magic: int) -> SweepCollect
freq_bytes = point_count * 4
freq = np.frombuffer(cursor.read_bytes(freq_bytes), dtype="<f4").astype(np.float32, copy=False)
interleaved_bytes = point_count * 8
s11_interleaved = np.frombuffer(cursor.read_bytes(interleaved_bytes), dtype="<f4")
s21_interleaved = np.frombuffer(cursor.read_bytes(interleaved_bytes), dtype="<f4")
s11 = (s11_interleaved[0::2] + 1j * s11_interleaved[1::2]).astype(np.complex64, copy=False)
s21 = (s21_interleaved[0::2] + 1j * s21_interleaved[1::2]).astype(np.complex64, copy=False)
s21 = np.frombuffer(cursor.read_bytes(point_count * 8), dtype="<c8")
traces.append(
TraceData(
combo=ComboKey(input=input_pos, output=output_pos),
frequency_hz=freq,
s11=s11,
s21=s21,
)
)
# Optional trailer, written after the trace blocks by newer producers: the
# collection capture window, then a per-trace window table. Both stages are
# optional so payloads from an older producer still decode (the timestamps
# simply stay zero).
capture_start_ns = 0
capture_end_ns = 0
if cursor.remaining_bytes() != 0:
if cursor.remaining_bytes() < 16:
raise ValueError("Truncated capture window in trace collection")
capture_start_ns = cursor.read_u64()
capture_end_ns = cursor.read_u64()
if cursor.remaining_bytes() != 0:
trace_time_count = cursor.read_u32()
if trace_time_count != len(traces):
raise ValueError("Per-trace capture window count does not match trace count")
for trace in traces:
trace.capture_start_ns = cursor.read_u64()
trace.capture_end_ns = cursor.read_u64()
capture_start_ns = cursor.read_u64()
capture_end_ns = cursor.read_u64()
if cursor.read_u32() != len(traces):
raise ValueError("Per-trace capture window count does not match trace count")
for trace in traces:
trace.capture_start_ns = cursor.read_u64()
trace.capture_end_ns = cursor.read_u64()
if cursor.remaining_bytes() != 0:
raise ValueError("Unexpected trailing bytes in trace collection")
@@ -98,8 +81,7 @@ def decode_result_collection(payload: bytes) -> ResultCollection:
if kind == 1:
point_count = cursor.read_u32()
freq = np.frombuffer(cursor.read_bytes(point_count * 4), dtype="<f4").astype(np.float32, copy=False)
interleaved = np.frombuffer(cursor.read_bytes(point_count * 8), dtype="<f4")
trace = (interleaved[0::2] + 1j * interleaved[1::2]).astype(np.complex64, copy=False)
trace = np.frombuffer(cursor.read_bytes(point_count * 8), dtype="<c8")
return ResultPayload(
processing_name=name,
kind=kind,
@@ -150,6 +132,10 @@ def decode_result_collection(payload: bytes) -> ResultCollection:
collection_id = cursor.read_u64()
monotonic_ns = cursor.read_u64()
processing_duration_ns = cursor.read_u64()
settings_revision = cursor.read_u64()
capture_start_ns = cursor.read_u64()
capture_end_ns = cursor.read_u64()
speed_m_s = cursor.read_f32()
collection_payload_count = cursor.read_u32()
block_count = cursor.read_u32()
@@ -174,10 +160,17 @@ def decode_result_collection(payload: bytes) -> ResultCollection:
)
)
if cursor.remaining_bytes() != 0:
raise ValueError("Unexpected trailing bytes in result collection")
return ResultCollection(
collection_id=collection_id,
monotonic_ns=monotonic_ns,
processing_duration_ns=processing_duration_ns,
settings_revision=settings_revision,
capture_start_ns=capture_start_ns,
capture_end_ns=capture_end_ns,
speed_m_s=speed_m_s,
collection_payloads=collection_payloads,
blocks=blocks,
)