docs: update CHANGELOG and CLAUDE.md for v0.9.0
CHANGELOG.md: - New v0.9.0 section covering erase-all protocol, browse helpers, delete_all_events(), ach_mitm.py, and ACH server overhaul - Back-filled v0.8.0 section (write pipeline, monitoring, ACH server) that was missing from the previous release notes CLAUDE.md: - Bump version to v0.9.0 - Add erase-all protocol section with full wire sequence, SUB 0x06 storage range response layout, and post-erase key counter reset notes - Document ACH server state format (ach_state.json v0.9.0 schema with downloaded_keys + max_downloaded_key) - Add RV55 DCD/DTR issue to What's next Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
Ground-up Python replacement for **Blastware**, Instantel's Windows-only software for
|
||||
managing MiniMate Plus seismographs. Connects over direct RS-232 or cellular modem
|
||||
(Sierra Wireless RV50 / RV55). Current version: **v0.8.0**.
|
||||
(Sierra Wireless RV50 / RV55). Current version: **v0.9.0**.
|
||||
|
||||
---
|
||||
|
||||
@@ -25,9 +25,9 @@ CHANGELOG.md ← version history
|
||||
|
||||
---
|
||||
|
||||
## Current implementation state (v0.8.0)
|
||||
## Current implementation state (v0.9.0)
|
||||
|
||||
Full read pipeline + write pipeline working end-to-end over TCP/cellular:
|
||||
Full read pipeline + write pipeline + erase pipeline working end-to-end over TCP/cellular:
|
||||
|
||||
| Step | SUB | Status |
|
||||
|---|---|---|
|
||||
@@ -41,12 +41,15 @@ Full read pipeline + write pipeline working end-to-end over TCP/cellular:
|
||||
| Waveform record (peaks, timestamp, project) | 0C | ✅ |
|
||||
| **Bulk waveform stream (event-time metadata)** | **5A** | ✅ new v0.6.0 |
|
||||
| Event advance / next key | 1F | ✅ |
|
||||
| **Write commands (push config to device)** | **68–83** | ✅ **new v0.8.0** |
|
||||
| **Write commands (push config to device)** | **68–83** | ✅ new v0.8.0 |
|
||||
| **Erase all events** | **0xA3 → 0x1C → 0x06 → 0xA2** | ✅ **new v0.9.0** |
|
||||
|
||||
`get_events()` sequence per event: `1E → 0A → 0C → 5A → 1F`
|
||||
|
||||
`push_config_raw()` write sequence: `68→73 | 71×3→72 | 82→83 | 69→74→72`
|
||||
|
||||
`delete_all_events()` erase sequence: `0xA3 → 0x1C → 0x06 → 0xA2`
|
||||
|
||||
---
|
||||
|
||||
## Protocol fundamentals
|
||||
@@ -720,9 +723,82 @@ Full compliance config encoder is a future task.
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Erase-all protocol (SUBs 0xA3/0xA2/0x06) — confirmed 2026-04-11
|
||||
|
||||
Full sequence confirmed from 4-11-26 MITM capture of a live Blastware ACH session
|
||||
(`bridges/captures/mitm/ach_mitm_20260411_001912/`).
|
||||
|
||||
### Wire sequence
|
||||
|
||||
```
|
||||
BW → device: SUB 0xA3 params=00 00 00 00 00 00 00 FE 00 00 (begin erase)
|
||||
device → BW: SUB 0x5C (ack)
|
||||
BW → device: SUB 0x1C probe (offset=0x00)
|
||||
device → BW: SUB 0xE3 (probe ack)
|
||||
BW → device: SUB 0x1C data (offset=0x2C)
|
||||
device → BW: SUB 0xE3 (monitor status response)
|
||||
BW → device: SUB 0x06 probe (offset=0x00, params same)
|
||||
device → BW: SUB 0xF9 (probe ack)
|
||||
BW → device: SUB 0x06 data (offset=0x24)
|
||||
device → BW: SUB 0xF9 (36-byte storage range response)
|
||||
BW → device: SUB 0xA2 params=00 00 00 00 00 00 00 FE 00 00 (confirm erase)
|
||||
device → BW: SUB 0x5D (ack — device memory is now cleared)
|
||||
```
|
||||
|
||||
All frames use standard `build_bw_frame` (not write-format). Response SUBs follow the
|
||||
standard `0xFF - SUB` formula; no exceptions.
|
||||
|
||||
### SUB 0x06 — event storage range response (36 bytes)
|
||||
|
||||
The 36-byte response body ends with two 4-byte event keys:
|
||||
|
||||
| Offset (from end) | Field | Notes |
|
||||
|---|---|---|
|
||||
| `[-8:-4]` | first stored event key | `01110000` when empty |
|
||||
| `[-4:]` | last stored event key | `01110000` when empty |
|
||||
|
||||
Before erase: ends with `<first_key> <last_key>` (e.g. `0111ea60 0111eaa6`).
|
||||
After erase: both bytes read `01110000` — device's empty/reset sentinel.
|
||||
|
||||
### Post-erase key counter reset
|
||||
|
||||
After a successful erase, the device resets its event counter. New events start from
|
||||
key `0x01110000` again — the same key as the very first event ever recorded. This means
|
||||
key-based deduplication in the ACH server must account for key reuse:
|
||||
|
||||
- After our own erase: `ach_state.json` `downloaded_keys` and `max_downloaded_key` are
|
||||
cleared so the next session starts fresh.
|
||||
- After an external erase: the ACH server detects it by comparing `max(device_keys)` to
|
||||
`max_downloaded_key` from state. If the device max has rolled back below the historical
|
||||
max, all current device keys are treated as new regardless of `seen_keys`.
|
||||
|
||||
### ACH server state format (v0.9.0)
|
||||
|
||||
`bridges/captures/ach_state.json`:
|
||||
```json
|
||||
{
|
||||
"BE11529": {
|
||||
"downloaded_keys": ["01110000", "0111245a"],
|
||||
"max_downloaded_key": "0111245a",
|
||||
"last_seen": "2026-04-11T01:04:36",
|
||||
"serial": "BE11529",
|
||||
"peer": "63.43.212.232:51920"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`max_downloaded_key` is the high-water mark — the largest key ever downloaded from the
|
||||
unit. It is NOT reset when events are erased from the device (only when our server does
|
||||
the erase). Used for post-erase detection.
|
||||
|
||||
---
|
||||
|
||||
## What's next
|
||||
|
||||
- Compliance config encoder — build raw write payloads from a `ComplianceConfig` object
|
||||
- Locate "Sensor Check" byte in compliance config (need capture with Disabled vs Before-monitoring)
|
||||
- ACH inbound server — accept call-home connections from field units
|
||||
- Modem manager — push RV50/RV55 configs via Sierra Wireless API
|
||||
- RV55 DCD/DTR issue — newer RV55 firmware doesn't assert DCD by default; units don't
|
||||
resume monitoring after call-home disconnect (`--restart-monitoring` flag deferred)
|
||||
|
||||
Reference in New Issue
Block a user