Version numbers are bumped and reconciled across pyproject.toml, Cargo.toml, and
CMakeLists.txt; tag v0.3.0 to publish to PyPI.
Added
- Per-node clock reconstruction (ADR 0002). The ground station fits a per-node
ClockModel(online least squares) against its reference clock, recovering each node's
drift and mapping node timestamps onto one timeline. Recovered drift matches the injected
drift_ppmwithin < 0.5 ppm; jitter widens the confidence interval without biasing it. wiredaq-clocksyncCLI — demos drift recovery and cross-node timeline alignment.CsvLoggerwrites a reconstructedt_ref_uscolumn so drifted nodes align in the export.- Rust/Lua backend now runs a seeded link simulation — per-packet loss / duplication /
jitter / reorder with a decode-side receiver, plus executedfaultsandassertions
tables; unknown fault kinds are rejected. Its golden vectors are read from the shared
vectors.json(decode + re-encode) andcargo testruns in CI. - Hardware-in-the-loop seam.
SerialPortTransport(a receive-sideByteStreamTransport
backed by a real serial device) lets a real board drop in behind the same port the
simulated serial link used; the existing StreamReceiver → Collector run unchanged.
Verified without hardware by a loopback test;docs/bring-up-log-template.mdcaptures the
predicted-vs-observed comparison once a board is attached.pyserialis an optional
hardwareextra — the core stays standard-library-only.
Fixed
RawFrameLoggerandStreamReceiverhandle HEARTBEAT frames correctly (were re-encoded
as / rejected as data, causing byte-mismatched archives and phantom loss).- Clock drift is no longer quantized to zero at the CLI-default ppm (float accumulation).
- C++ wrapper rejects sample counts that overflow the
uint8wire field instead of
silently truncating. - Impairment corruption is always classified as CRC, not framing.
- Decoders (Python / C / Rust) fail closed on control-plane shape: a HEARTBEAT with nonzero
channel/sample counts is rejected. - C++
encode()dispatches onmsg_type, soencode(decode(heartbeat))round-trips. - Collector distinguishes a stale duplicate from a genuine reorder (bounded seen-set), so a
late duplicate no longer decrements real loss; reorder is counted only on an actual overtake.
Docs
- Fixed stale test counts, softened overclaims ("avionics-grade", "HIL is a drop-in",
"wired to the schema"), named ADR deciders, and repaired the two broken demo-site links.