Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
922c304734 | ||
|
|
5f81fb0217 |
+68
-3
@@ -46,6 +46,50 @@ All notable changes to seismo-relay are documented here.
|
|||||||
500s. Reproduced on BE12599. Production is unaffected: it ingests complete
|
500s. Reproduced on BE12599. Production is unaffected: it ingests complete
|
||||||
files via the watcher path and never runs this walk.
|
files via the watcher path and never runs this walk.
|
||||||
|
|
||||||
|
- **The Micromate (Series IV) live wire protocol, reverse-engineered end to
|
||||||
|
end** — `docs/micromate_protocol_reference.md`. Worked out against a bench
|
||||||
|
UM12947 over USB and a recording relay, with THOR driving every write so that
|
||||||
|
no command has ever been originated against a unit by this project. **A
|
||||||
|
Micromate answers Series III command frames**, with three framing differences:
|
||||||
|
responses carry no leading `DLE`, `payload[1]` is `0xC5` (Blastware firmware)
|
||||||
|
or `0x03` (Thor firmware) rather than `0x10`, and the data length is a
|
||||||
|
**uint16 BE at `payload[8:10]`** — read as a single byte it under-reads
|
||||||
|
`SUB 0x1A` by 47x. Read path, event chain, and `SUB 0x5A` streaming the
|
||||||
|
`.IDFW` file verbatim are all confirmed.
|
||||||
|
- **Series IV setup management, fully mapped.** `0x41` reads the active setup
|
||||||
|
name, `0x1A` its config block, `0xDA` names the target `.MMB`, `0x71`/`0x72`
|
||||||
|
write it back. **Setups are read-modify-write** — the written block is the
|
||||||
|
read block, 91% byte-identical at a fixed 11-byte shift. `0xDA` **creates**
|
||||||
|
files rather than only overwriting, confirmed on the unit's own screen, and an
|
||||||
|
overwrite is protocol-identical to a create: no handshake, no warning, and no
|
||||||
|
protection even over the *active* setup of a monitoring unit.
|
||||||
|
- **The scheduler file decoded** — `\system\schedule\schedule.dat`, 260-byte
|
||||||
|
records carrying an action bitmask (2 start, 4 stop, 8 self-check, 16 ACH), a
|
||||||
|
half-hour slot (48/day), day-of-week (0 = Sunday) and a length-prefixed setup
|
||||||
|
name. Verified entry-for-entry against the operator's own THOR screen.
|
||||||
|
- **A generic file transfer addressed by full path** — `0x94`/`0x48` read,
|
||||||
|
`0x8D`/`0x8E` write. This **retracts** an earlier conclusion in the same
|
||||||
|
document that no such command existed; that was inferred from absent firmware
|
||||||
|
strings and was wrong.
|
||||||
|
- **Monitoring control and per-event delete.** `0x96`/`0x97` start and stop as
|
||||||
|
on Series III, but the monitoring flag at `SUB 0x1C` `data[12]` must be tested
|
||||||
|
for **non-zero** (observed as both `0x0E` and `0x0C`) rather than compared to a
|
||||||
|
constant. Deletion is **per-event** — `0xA8` with the event key, then `0xAA` —
|
||||||
|
which is safer than Series III's erase-everything. `SUB 0x1C` also carries the
|
||||||
|
device clock.
|
||||||
|
- **`bridges/mm_probe.py`** — distinguishes the four faults THOR reports
|
||||||
|
identically as "disconnected": refused, connect timeout (the silent-drop
|
||||||
|
signature of a trusted-IP whitelist), **connected but no reply** (the modem
|
||||||
|
answered and the unit did not), and replied. Each verdict names what to try
|
||||||
|
next. `--slots N` tests single-session modem behaviour.
|
||||||
|
- **`bridges/mm_link.py`** — a bench stand-in for a cellular modem, with a
|
||||||
|
decoded timestamped log and fault injection (`blackhole`, `drop`, `delay`,
|
||||||
|
`onewaydev`) driven by a control file. No pyserial; stdlib `termios` only.
|
||||||
|
- **`scratch/mm_frame_parse.py`**, **`socat_log_split.py`** and **`fake_unit.py`**
|
||||||
|
— a Micromate-aware frame parser (`S3FrameParser` cannot see these responses at
|
||||||
|
all, since it scans for `DLE+STX`), byte-exact capture recovery from a
|
||||||
|
`socat -x` relay log, and a serial-port stand-in that answers as a unit.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- **Connecting to a unit no longer walks its event chain.** `/device/events`
|
- **Connecting to a unit no longer walks its event chain.** `/device/events`
|
||||||
@@ -58,11 +102,32 @@ All notable changes to seismo-relay are documented here.
|
|||||||
toolbar. Knowing whether a unit's ACH is on no longer requires reading every
|
toolbar. Knowing whether a unit's ACH is on no longer requires reading every
|
||||||
event it has stored.
|
event it has stored.
|
||||||
|
|
||||||
|
- **Recorded what THOR actually does on the wire**, measured rather than assumed.
|
||||||
|
A "status check" is **eleven commands, ~2.2 KB including TCP setup** — 18.8
|
||||||
|
MB/day per unit at a 10 s cadence, against ~0.2 MB/day for a `POLL` +
|
||||||
|
`MONITOR_STATUS` check at 60 s. The **status interval is honoured; the
|
||||||
|
connection interval is not** — it sets `(status / connection) - 1` checks per
|
||||||
|
cycle, so equal values yield *zero* cheap checks and every connection becomes
|
||||||
|
the expensive one.
|
||||||
|
- **Two THOR defects reproduced with timestamps.** After a connection drops
|
||||||
|
mid-download it retries **once**, stops polling entirely and **never resumes**,
|
||||||
|
while displaying `Connected` for as long as it is left alone — and `Idle` for a
|
||||||
|
unit that is actively recording. Separately, THOR's own log shows a
|
||||||
|
**subscription leak**: one logical event dispatched to a growing number of
|
||||||
|
handlers, **1 to 12 over ten hours** of uptime, consistent with the field
|
||||||
|
report that only a restart recovers it.
|
||||||
|
- **The Micromate's USB host supports FTDI and CDC-ACM only** — no Prolific, in
|
||||||
|
either firmware line. A PL2303 cable (Benfei) leaves a unit with no working
|
||||||
|
modem port; an FTDI cable (Sabrent) works. Both are in circulation and
|
||||||
|
indistinguishable by eye — identify by `lsusb` VID, `0403` against `067b`.
|
||||||
|
|
||||||
### Migration
|
### Migration
|
||||||
|
|
||||||
**None.** Frontend and documentation only — no codec, waveform-store or DB
|
**None.** Frontend, documentation and bench tooling only — no codec,
|
||||||
change, no schema change, and no `TOOL_VERSION` bump. The webapp is served
|
waveform-store or DB change, no schema change, and no `TOOL_VERSION` bump. The
|
||||||
from the image, so the change appears after the next `sfm` rebuild.
|
webapp is served from the image, so its changes appear after the next `sfm`
|
||||||
|
rebuild. The Series-4 work adds `docs/`, `bridges/` and `scratch/` files only;
|
||||||
|
nothing under `sfm/`, `minimateplus/` or `micromate/` was touched.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user