Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
027ac5eb04
|
||
|
|
b7d9b37bb0
|
No files matched your search
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.1.0] - 2026-04-22
|
||||||
|
|
||||||
|
Small but high-value behavior change: `SET_CONFIG` issued while the
|
||||||
|
radio is in continuous RX no longer drops the radio (and the OLED)
|
||||||
|
back to idle. The radio now auto-re-arms RX with the new modulation
|
||||||
|
once reconfiguration completes, matching DongLoRa Protocol 1.1's
|
||||||
|
§3.5 / §6.3 amendments.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- `src/radio.rs`: inside `state Receiving`, add `on(ConfigApplied)
|
||||||
|
=> ResumingRx` to shadow the parent `Configured` state's
|
||||||
|
`on(ConfigApplied) => Idle` handler. The reconfigure path now
|
||||||
|
runs `apply_set_config` → `ConfigApplied` → `ResumingRx.entry:
|
||||||
|
try_start_rx_hw` → `StartRxOk` → `Receiving` without ever
|
||||||
|
entering `Idle`.
|
||||||
|
- The OLED's `Dashboard → Splash` transition was previously driven
|
||||||
|
by `RadioEvent::Idle` firing on `Configured.Idle.entry`. That
|
||||||
|
event no longer fires during a SET_CONFIG-from-Receiving
|
||||||
|
sequence, so the display stays on Dashboard.
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
- `donglora-protocol` bumped to `1.1.0` (spec-only change; matches
|
||||||
|
the new normative text the firmware now implements).
|
||||||
|
|
||||||
|
### Use-case unlock
|
||||||
|
|
||||||
|
- Scanner / time-division / dynamic-modulation workflows that
|
||||||
|
rotate LoRa parameters mid-RX no longer need to re-issue
|
||||||
|
`RX_START` after every `SET_CONFIG`. One call, radio continues
|
||||||
|
to receive.
|
||||||
|
|
||||||
## [1.0.0] - 2026-04-22
|
## [1.0.0] - 2026-04-22
|
||||||
|
|
||||||
The 1.0 release. Firmware now speaks DongLoRa Protocol v2 end to end,
|
The 1.0 release. Firmware now speaks DongLoRa Protocol v2 end to end,
|
||||||
|
|||||||
Generated
+3
-3
@@ -486,7 +486,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "donglora"
|
name = "donglora"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
@@ -527,9 +527,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "donglora-protocol"
|
name = "donglora-protocol"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8f2743ac7668845500e3686890917cdf5b0a09d17ec099bde2db4d3fae2a4a4"
|
checksum = "6bae9e9e5a8cebc6b4167f9ef696b61ce25b94c6d8283dbe1b2e97075a481b9d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"defmt 1.0.1",
|
"defmt 1.0.1",
|
||||||
"heapless 0.9.2",
|
"heapless 0.9.2",
|
||||||
|
|||||||
+2
-2
@@ -3,7 +3,7 @@ members = ["."]
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "donglora"
|
name = "donglora"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
authors = ["Stephen Waits <steve@waits.net>"]
|
authors = ["Stephen Waits <steve@waits.net>"]
|
||||||
@@ -30,7 +30,7 @@ embassy-usb = { version = "0.6", features = ["defmt"] }
|
|||||||
embassy-usb-driver = "0.2"
|
embassy-usb-driver = "0.2"
|
||||||
ucobs = { version = "0.3", features = ["legacy-msrv"] }
|
ucobs = { version = "0.3", features = ["legacy-msrv"] }
|
||||||
heapless = "0.9"
|
heapless = "0.9"
|
||||||
donglora-protocol = "1.0.0"
|
donglora-protocol = "1.1.0"
|
||||||
hsmc = { version = "0.1.0", default-features = false, features = ["embassy"] }
|
hsmc = { version = "0.1.0", default-features = false, features = ["embassy"] }
|
||||||
lora-phy = "3.0"
|
lora-phy = "3.0"
|
||||||
portable-atomic = { version = "1", optional = true, default-features = false, features = ["critical-section"] }
|
portable-atomic = { version = "1", optional = true, default-features = false, features = ["critical-section"] }
|
||||||
|
|||||||
+12
-4
@@ -170,10 +170,11 @@ statechart! {
|
|||||||
state Configured {
|
state Configured {
|
||||||
on(CmdSetConfig(m: Modulation)) => apply_set_config;
|
on(CmdSetConfig(m: Modulation)) => apply_set_config;
|
||||||
on(ConfigFailedRadio) => Unconfigured;
|
on(ConfigFailedRadio) => Unconfigured;
|
||||||
// Re-configure from any substate (Receiving, Transmitting, …)
|
// Default post-reconfigure landing is Idle. The RX ring is
|
||||||
// drops back to Idle. Spec §3.5: "Any continuous RX is
|
// always cleared as part of apply_set_config. Receiving
|
||||||
// stopped. RX ring is cleared." Only successful applies
|
// overrides this handler to auto-resume RX with the new
|
||||||
// emit ConfigApplied, so validation failures keep state.
|
// parameters (spec §3.5) so callers do not need to re-issue
|
||||||
|
// RX_START after SET_CONFIG.
|
||||||
on(ConfigApplied) => Idle;
|
on(ConfigApplied) => Idle;
|
||||||
default(Idle);
|
default(Idle);
|
||||||
|
|
||||||
@@ -202,6 +203,13 @@ statechart! {
|
|||||||
on(CmdRxStop) => stop_rx_hw, respond_ok;
|
on(CmdRxStop) => stop_rx_hw, respond_ok;
|
||||||
on(CmdRxStop) => Idle;
|
on(CmdRxStop) => Idle;
|
||||||
on(CmdTx) => TransmittingFromRx;
|
on(CmdTx) => TransmittingFromRx;
|
||||||
|
// Spec §3.5: a SET_CONFIG issued while receiving clears
|
||||||
|
// the RX ring (already handled by apply_set_config) but
|
||||||
|
// auto-rearms RX with the new parameters — the caller
|
||||||
|
// does not need to send a fresh RX_START. Override the
|
||||||
|
// parent's `on(ConfigApplied) => Idle` by landing in
|
||||||
|
// ResumingRx, whose entry kicks the chip back into RX.
|
||||||
|
on(ConfigApplied) => ResumingRx;
|
||||||
}
|
}
|
||||||
|
|
||||||
state ResumingRx {
|
state ResumingRx {
|
||||||
|
|||||||
Reference in new issue
Block a user