feat: first try at building waveform binary files.
This commit is contained in:
+40
-6
@@ -608,6 +608,7 @@ class MiniMateClient:
|
||||
)
|
||||
if a5_frames:
|
||||
a5_ok = True
|
||||
ev._a5_frames = a5_frames # store for write_n00
|
||||
_decode_a5_metadata_into(a5_frames, ev)
|
||||
_decode_a5_waveform(a5_frames, ev)
|
||||
log.info(
|
||||
@@ -776,6 +777,39 @@ class MiniMateClient:
|
||||
else:
|
||||
log.warning("download_waveform: waveform decode produced no samples")
|
||||
|
||||
return a5_frames
|
||||
|
||||
def save_blastware_file(self, event: "Event", path: "Union[str, Path]", serial: str) -> None:
|
||||
"""
|
||||
Download the full waveform for *event* and save it as a Blastware-
|
||||
compatible .N00 / .9T0 file at *path*.
|
||||
|
||||
This is a convenience wrapper that calls download_waveform() (which
|
||||
performs the complete SUB 5A BULK_WAVEFORM_STREAM download) and then
|
||||
calls write_n00() from blastware_file.py to encode the result.
|
||||
|
||||
Args:
|
||||
event: Event object with waveform key populated (from get_events()).
|
||||
path: Destination file path. Caller should use blastware_filename()
|
||||
to pick the correct .N00 / .9T0 extension.
|
||||
serial: Device serial number (e.g. "BE11529") — passed to
|
||||
blastware_filename() for reference, but the caller supplies
|
||||
the final path.
|
||||
"""
|
||||
from pathlib import Path as _Path
|
||||
from .blastware_file import write_n00 as _write_n00
|
||||
|
||||
a5_frames = self.download_waveform(event)
|
||||
if not a5_frames:
|
||||
raise RuntimeError(
|
||||
f"save_blastware_file: no A5 frames received for event#{event.index}"
|
||||
)
|
||||
_write_n00(event, a5_frames, path)
|
||||
log.info(
|
||||
"save_blastware_file: wrote %s (%d A5 frames)",
|
||||
path, len(a5_frames),
|
||||
)
|
||||
|
||||
# ── Write commands ────────────────────────────────────────────────────────
|
||||
|
||||
def push_config_raw(
|
||||
@@ -1324,7 +1358,7 @@ def _decode_waveform_record_into(data: bytes, event: Event) -> None:
|
||||
log.warning("waveform record project strings decode failed: %s", exc)
|
||||
|
||||
|
||||
def _decode_a5_metadata_into(frames_data: list[bytes], event: Event) -> None:
|
||||
def _decode_a5_metadata_into(frames_data: list[S3Frame], event: Event) -> None:
|
||||
"""
|
||||
Search A5 (BULK_WAVEFORM_STREAM) frame data for event-time metadata strings
|
||||
and populate event.project_info.
|
||||
@@ -1352,7 +1386,7 @@ def _decode_a5_metadata_into(frames_data: list[bytes], event: Event) -> None:
|
||||
|
||||
Modifies event in-place.
|
||||
"""
|
||||
combined = b"".join(frames_data)
|
||||
combined = b"".join(f.data for f in frames_data)
|
||||
|
||||
def _find_string_after(needle: bytes, max_len: int = 64) -> Optional[str]:
|
||||
pos = combined.find(needle)
|
||||
@@ -1376,7 +1410,7 @@ def _decode_a5_metadata_into(frames_data: list[bytes], event: Event) -> None:
|
||||
notes = _find_string_after(b"Extended Notes")
|
||||
|
||||
if not any([project, client, operator, location, notes]):
|
||||
log.debug("a5 metadata: no project strings found in %d frames", len(frames_data))
|
||||
log.debug("a5 metadata: no project strings found in %d frames (%d bytes)", len(frames_data), len(combined))
|
||||
return
|
||||
|
||||
if event.project_info is None:
|
||||
@@ -1402,7 +1436,7 @@ def _decode_a5_metadata_into(frames_data: list[bytes], event: Event) -> None:
|
||||
|
||||
|
||||
def _decode_a5_waveform(
|
||||
frames_data: list[bytes],
|
||||
frames_data: list[S3Frame],
|
||||
event: Event,
|
||||
) -> None:
|
||||
"""
|
||||
@@ -1463,7 +1497,7 @@ def _decode_a5_waveform(
|
||||
return
|
||||
|
||||
# ── Parse STRT record from A5[0] ────────────────────────────────────────
|
||||
w0 = frames_data[0][7:] # db[7:] for A5[0]
|
||||
w0 = frames_data[0].data[7:] # frame.data[7:] for A5[0]
|
||||
strt_pos = w0.find(b"STRT")
|
||||
if strt_pos < 0:
|
||||
log.warning("_decode_a5_waveform: STRT record not found in A5[0]")
|
||||
@@ -1499,7 +1533,7 @@ def _decode_a5_waveform(
|
||||
global_offset = 0
|
||||
|
||||
for fi, db in enumerate(frames_data):
|
||||
w = db[7:]
|
||||
w = db.data[7:] # frame.data[7:]
|
||||
|
||||
# A5[0]: waveform begins after the 21-byte STRT record and 6-byte preamble.
|
||||
# Layout: STRT(21B) + null-pad(2B) + 0xFF sentinel(4B) = 27 bytes total.
|
||||
|
||||
Reference in New Issue
Block a user