Files
protocol-rs/CHANGELOG.md
T
swaits dba6f264cd
CI / Test (all-features) (push) Canceled after 0s
CI / Test (default) (push) Canceled after 0s
CI / Test (no-default-features) (push) Canceled after 0s
CI / Clippy (all-features) (push) Canceled after 0s
CI / Clippy (default) (push) Canceled after 0s
CI / Clippy (no-default-features) (push) Canceled after 0s
CI / Format (push) Canceled after 0s
CI / Doc (push) Canceled after 0s
CI / Cargo Deny (push) Canceled after 0s
CI / Miri (push) Canceled after 0s
CI / Fuzz (60s per target) (push) Canceled after 0s
CI / Mutants (default) (push) Canceled after 0s
CI / Mutants (no-default-features) (push) Canceled after 0s
chore: release 1.1.0
2026-04-22 11:45:21 -06:00

5.0 KiB

Changelog

All notable changes to this crate are documented here. The format follows Keep a Changelog and this project adheres to Semantic Versioning.

1.1.0 — 2026-04-22

Spec-only release. No code change in the crate; PROTOCOL.md normative behavior is amended so SET_CONFIG no longer disrupts continuous RX.

Changed

  • PROTOCOL.md §3.5 ("Operations Spanning Reconfiguration") and §6.3 ("Side effects on APPLIED"): a SET_CONFIG issued while the radio is in continuous RX now auto-re-arms RX with the new parameters once reconfiguration completes. The RX ring is still cleared. The host does not need to re-issue RX_START after SET_CONFIG.

    Rationale: the previous "RX is stopped, re-issue RX_START yourself" rule was hostile to scanner / time-division / dynamic-modulation workflows and violated the principle of least surprise. Scope of the change is strictly additive: hosts that still issue a redundant RX_START after SET_CONFIG continue to work (firmware replies OK with the radio already in Receiving).

  • No wire-format, field-layout, or type_id changes. The CRC, COBS framing, tag semantics, and every message shape are byte-for-byte identical to 1.0.0.

Compatibility

  • Wire-compatible with 1.0.0 firmware and hosts.
  • Behavior-compatible with 1.0.0 hosts (old-style "always re-issue RX_START" code paths are now no-ops but still correct).
  • New-style hosts that rely on auto-resume require firmware donglora 1.1.0 or later, which implements the new semantics.

1.0.0 — 2026-04-22

The 1.0 wire-format rewrite. Every message shape, tag-correlation rule, and field layout is re-specified in the new normative PROTOCOL.md and is incompatible with the 0.1.x line.

Breaking

  • DongLoRa Protocol v2 wire format. Every type_id, tag-correlation rule, and field layout is redefined in PROTOCOL.md §2 through §16. No byte compatibility with 0.1.x.
  • Module split. The single-file lib.rs is replaced with dedicated modules: frame, commands, events, errors, modulation, info, crc, chip_id. Re-exports at the crate root preserve the short-form imports (Command, ErrorCode, etc.), but full paths to the old framing module and Response / RadioConfig / Bandwidth types no longer resolve.
  • Framing replaced. src/framing.rs is gone. The new frame::FrameDecoder streams inbound bytes and yields FrameResult::Ok { type_id, tag, payload } on each COBS-delimited, CRC-verified frame. Encoding moves to encode_frame(type_id, tag, payload, out).
  • Modulation replaces RadioConfig + Bandwidth. New enum covering LoRa, FSK/GFSK, LR-FHSS, and FLRC, each with its own typed parameter struct.
  • New response shapes. OkPayload, SetConfigResult, TxDonePayload, RxPayload, RxOrigin, and TxFlags model the richer response surface required by v2.

Added

  • PROTOCOL.md: the normative specification of DongLoRa Protocol v2, including wire examples, error taxonomy, state machine, and multi-client semantics (§13).
  • RadioChipId enum for GET_INFO chip identification.
  • CRC-16/CCITT-FALSE helper (crc) exposed for integrity checks on arbitrary payload slices.
  • cap bitflag helpers on the Info struct for decoding capability bitmaps.

Changed

  • Fuzz corpus rewritten: decoder_feed, frame_roundtrip, lora_config_roundtrip, parse_command, parse_device_message replace the 0.1 cobs_* and command_roundtrip targets.
  • Proptest suite and mutation-killer set expanded to cover the new wire shape.
  • Canonical-byte vectors rewritten against PROTOCOL.md §C.

CI

  • Workflow now runs on pushes to dev in addition to main.
  • Fuzz jobs pinned to x86_64-unknown-linux-gnu for reproducibility.

0.1.0 — 2026-04-13

Initial release. The DongLoRa wire-protocol types and COBS framing, extracted from the firmware so the firmware, client-rs, mux-rs, and bridge can share one definition.

Added

  • Wire types: Command, Response, RadioConfig, Bandwidth, ErrorCode, plus the MAX_PAYLOAD, RADIO_CONFIG_SIZE, TX_POWER_MAX, and PREAMBLE_DEFAULT constants. Fixed-width little-endian on the wire — see the firmware repo's PROTOCOL.md.
  • framing module: streaming CobsDecoder plus cobs_encode_response, with a MAX_FRAME constant sized to fit any valid Response after COBS overhead.
  • Cargo features: defmt (default, derives defmt::Format on public enums) and std (off, opt-in for host-side Debug niceties).
  • Test surface: 23 proptest properties (~1.13M cases per run), 4 cargo-fuzz targets, 16 canonical wire-byte vectors anchored to the spec, 6 mutation-killers. Mutation testing reaches 89/89 viable mutants under both feature configurations (3 provably-equivalent mutants documented and excluded). Miri runs clean on the library and the canonical-vector tests.
  • forbid(unsafe_code) at the crate root.
  • GitHub Actions CI (test/clippy/fmt/doc/deny/miri/fuzz/mutants).