# Changelog All notable changes to seismo-relay are documented here. --- ## v0.5.0 — 2026-03-31 ### Added - **Console tab in `seismo_lab.py`** — direct device connection without the bridge subprocess. - Serial and TCP transport selectable via radio buttons. - Four one-click commands: POLL, Serial #, Full Config, Event Index. - Colour-coded scrolling output: TX (blue), RX raw hex (teal), parsed/decoded (green), errors (red). - Save Log and Send to Analyzer buttons; logs auto-saved to `bridges/captures/console_.log`. - Queue/`after(100)` pattern — no UI blocking or performance impact. - **`minimateplus` package** — clean Python client library for the MiniMate Plus S3 protocol. - `SerialTransport` and `TcpTransport` (for Sierra Wireless RV50/RV55 cellular modems). - `MiniMateProtocol` — DLE frame parser/builder, two-step paged reads, checksum validation. - `MiniMateClient` — high-level client: `connect()`, `get_serial()`, `get_config()`, `get_events()`. - **TCP/cellular transport** (`TcpTransport`) — connect to field units via Sierra Wireless RV50/RV55 modems over cellular. - `read_until_idle(idle_gap=1.5s)` to handle modem data-forwarding buffer delay. - Confirmed working end-to-end: TCP → RV50/RV55 → RS-232 → MiniMate Plus. - **`bridges/tcp_serial_bridge.py`** — local TCP-to-serial bridge for bench testing `TcpTransport` without a cellular modem. - **SFM REST server** (`sfm/server.py`) — FastAPI server with device info, event list, and event record endpoints over both serial and TCP. ### Fixed - `protocol.py` `startup()` was using a hardcoded `POLL_RECV_TIMEOUT = 10.0` constant, ignoring the configurable `self._recv_timeout`. Fixed to use `self._recv_timeout` throughout. - `sfm/server.py` now retries once on `ProtocolError` for TCP connections to handle cold-boot timing on first connect. ### Protocol / Documentation - **Sierra Wireless RV50/RV55 modem config** — confirmed required ACEmanager settings: Quiet Mode = Enable, Data Forwarding Timeout = 1, TCP Connect Response Delay = 0. Quiet Mode disabled causes modem to inject `RING\r\nCONNECT\r\n` onto the serial line, breaking the S3 handshake. - **Calibration year** confirmed at SUB FE (Full Config) destuffed payload offset 0x56–0x57 (uint16 BE). `0x07E7` = 2023, `0x07E9` = 2025. - **`"Operating System"` boot string** — 16-byte UART boot message captured on cold-start before unit enters DLE-framed mode. Parser handles correctly by scanning for DLE+STX. - RV50/RV55 sends `RING`/`CONNECT` over TCP to the calling client even with Quiet Mode enabled — this is normal behaviour, parser discards it. --- ## v0.4.0 — 2026-03-12 ### Added - **`seismo_lab.py`** — combined Bridge + Analyzer GUI. Single window with two tabs; bridge start auto-wires live mode in the Analyzer. - **`frame_db.py`** — SQLite frame database. Captures accumulate over time; Query DB tab searches across all sessions. - **`bridges/s3-bridge/proxy.py`** — bridge proxy module. - Large BW→S3 write frame checksum algorithm confirmed and implemented (`SUM8` of payload `[2:-1]` skipping `0x10` bytes, plus constant `0x10`, mod 256). - SUB `A4` identified as composite container frame with embedded inner frames; `_extract_a4_inner_frames()` and `_diff_a4_payloads()` reduce diff noise from 2300 → 17 meaningful entries. ### Fixed - BAD CHK false positives on BW POLL frames — BW frame terminator `03 41` was being included in the de-stuffed payload. Fixed to strip correctly. - Aux Trigger read location confirmed at SUB FE offset `0x0109`. --- ## v0.3.0 — 2026-03-09 ### Added - Record time confirmed at SUB E5 page2 offset `+0x28` as float32 BE. - Trigger Sample Width confirmed at BW→S3 write frame SUB `0x82`, destuffed payload offset `[22]`. - Mode-gating documented: several settings only appear on the wire when the appropriate mode is active. ### Fixed - `0x082A` mystery resolved — fixed-size E5 payload length (2090 bytes), not a record-time field. --- ## v0.2.0 — 2026-03-01 ### Added - Channel config float layout fully confirmed: trigger level, alarm level, and unit string per channel (IEEE 754 BE floats). - Blastware `.set` file format decoded — little-endian binary struct mirroring the wire payload. - Operator manual (716U0101 Rev 15) added as cross-reference source. --- ## v0.1.0 — 2026-02-26 ### Added - Initial `s3_bridge.py` serial bridge — transparent RS-232 tap between Blastware and MiniMate Plus. - `s3_parser.py` — deterministic DLE state machine frame extractor. - `s3_analyzer.py` — session parser, frame differ, Claude export. - `gui_bridge.py` and `gui_analyzer.py` — Tkinter GUIs. - DLE framing confirmed: `DLE+STX` / `DLE+ETX`, `0x41` = ACK (not STX), DLE stuffing rule. - Response SUB rule confirmed: `response_SUB = 0xFF - request_SUB`. - Year `0x07CB` = 1995 confirmed as MiniMate factory RTC default. - Full write command family documented (SUBs `68`–`83`).