Commit Graph
10 Commits
Author SHA1 Message Date
swaits e81cb9dc20 chore: release 1.0.0
CI / lint (push) Canceled after 0s
CI / test (3.10) (push) Canceled after 0s
CI / test (3.11) (push) Canceled after 0s
CI / test (3.12) (push) Canceled after 0s
CI / test (3.13) (push) Canceled after 0s
CI / publish (push) Canceled after 0s
v1.0.0
2026-04-22 09:56:05 -06:00
swaits b15b661c2d feat!: mux-py on DongLoRa Protocol v2 with tag-aware dispatch
The 1.0 Python mux, mirroring the Rust donglora-mux 1.0 one-for-one and implementing the full §13 multi-client semantics on the DongLoRa Protocol v2 wire format.

* Structural rewrite. donglora_mux/{daemon,intercept,session,tagmap}.py replace the 601-line __init__.py monolith.

* Tag-aware dispatch. TagMapper with skip-zero allocation and per-client bulk drop on disconnect. Multiple clients can have commands in flight concurrently; the single-oneshot response slot is gone.

* Full §13.2 multi-client SET_CONFIG semantics. Tracks (client_id, modulation) lock owner and synthesizes OK(APPLIED/MINE), OK(ALREADY_MATCHED/OTHER), or OK(LOCKED_MISMATCH/OTHER).

* TX loopback fan-out (§13.4). On TX_DONE(TRANSMITTED) the mux synthesizes an RX frame with origin = LOCAL_LOOPBACK for every connected client except the transmitter.

* Async ERR(EFRAME) fan-out: tag-0 framing errors are broadcast to all clients.

* Per-client TX cache on ClientSession so the loopback fan-out does not need the sender to re-buffer.

* Socket and serial fcntl.flock to prevent multiple mux instances from fighting over the same dongle or socket path.

* 500 ms keepalive matching PROTOCOL.md §3.4 (2x margin on the 1 s inactivity timer), replacing the 5 s cadence from 0.x.

* Clean SIGINT / SIGTERM shutdown: per-client handler tasks are tracked and cancelled, so blocked reader.read() calls no longer pin the event loop open.
2026-04-22 09:55:28 -06:00
swaits e64ce852ba feat: add keepalive ping, state restoration, and fix baud rate
Add keepalive ping (5s interval, 2s timeout) to detect unresponsive
dongles behind UART bridges where the serial port stays open across
ESP32 resets. On reconnect, saved radio config and RX state are
re-sent so connected clients continue working transparently.

Also fix serial port opened without baud rate (defaulted to 9600
instead of 115200), preventing connection to UART boards.
2026-04-11 02:46:05 -06:00
swaits 5c883dbcb1 ci: retrigger
CI / lint (push) Canceled after 0s
CI / test (3.10) (push) Canceled after 0s
CI / test (3.11) (push) Canceled after 0s
CI / test (3.12) (push) Canceled after 0s
CI / test (3.13) (push) Canceled after 0s
CI / publish (push) Canceled after 0s
v0.2.0
2026-04-08 19:32:48 -06:00
swaits 3512c7c4e1 fix: use --no-sources in CI to resolve donglora from PyPI 2026-04-08 19:16:19 -06:00
swaits 69a9f7136a fix: check out client-py in CI so uv can resolve local path source 2026-04-08 19:13:56 -06:00
swaitsandClaude Opus 4.6 af46b4b5c6 docs: fix dependency link (clients/python → client-py)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 13:46:11 -06:00
swaitsandClaude Opus 4.6 43f9115ca8 feat!: v0.2.0 — PyPI-ready, interception tests, strict linting
PyPI-ready metadata (donglora-mux), full classifiers, URLs.
Fixed dependency path to client-py. Added 11 interception tests
ported from the Rust mux (SetConfig locking, StartRx/StopRx
refcounting). GitHub Actions CI. Strict ruff linting.

Applied contextlib.suppress per SIM105, collapsed nested ifs per
SIM102.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 13:33:49 -06:00
swaits 334f88a45e chore: add consistent mise.toml, justfile, and tooling config 2026-04-07 14:41:27 -06:00
swaits a455f2afd7 chore: massive repo reorganization 2026-04-03 10:28:38 -06:00