2.0 KiB
id5100 — Decisions
Format: YYYY-MM-DD: <decision> — <why>
-
2026-06-14: Pure-stdlib
termiosinstead of pyserial — system Python is PEP-668 externally-managed; per the escalation-brake rule,--break-system-packagesfor one dependency is the wrong trade.termiosis zero-install and reusable. -
2026-06-14: Layered as codec (
civ.py) / transport (radio.py) / CLI (cli.py) — the codec is pure and unit-testable; web UI / HA-MQTT front ends bolt onto the transport without touching byte plumbing. -
2026-06-14: TDD the codec against the real probe capture (
00 00 30 47 01↔ 147.300000 MHz) — gives a hardware-true vector, not a made-up one. -
2026-06-14: Cable lands on [SP2] (= CI-V), 9600 baud, addr 0x8C — verified live, not assumed.
-
2026-06-14: Web panel = stdlib
http.server+ singlepanel.html, no framework — keeps the no-deps promise; the UI is one self-contained file. One sharedRadioguarded by a lock (CI-V is half-duplex; concurrent transactions would interleave). -
2026-06-14:
transact()returns as soon as the radio's reply frame parses instead of always burning the full timeout — dropped a full status poll from ~3.6s to ~0.2s, making a ~1 Hz live S-meter poll viable. -
2026-06-14: Aesthetic = industrial instrument faceplate (amber VFD via DSEG7 font, LED S-meter, illuminated mode buttons) — matches the radio-gear domain and the Sethian dark/orange brand. Verified by headless screenshot.
Deferred / Rejected
- Full software control-head replica — rejected: the detachable head talks a proprietary, undocumented bus to the main unit; CI-V exposes operating functions only (no menu/LCD mirror). Not worth reverse-engineering.
- pyserial — rejected (see above).
- DV mode set — deferred: 0x17 unverified on this radio; don't ship set_mode('dv') as trusted until confirmed against the manual's CI-V table or the live rig.
- RS-MS1A data-jack protocol (D-STAR DR/callsign/messaging) — out of scope for this CI-V layer; separate effort if wanted.