From 283d190efe6bd72dfadff63414fd3e010dc427e8 Mon Sep 17 00:00:00 2001 From: Jeff McBride Date: Fri, 30 Jan 2026 12:35:23 -0800 Subject: [PATCH 1/2] Allow PDO config update in Bootup state Because this is when persisted values are loaded from flash --- zencan-node/src/pdo.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/zencan-node/src/pdo.rs b/zencan-node/src/pdo.rs index 54726b8..566754a 100644 --- a/zencan-node/src/pdo.rs +++ b/zencan-node/src/pdo.rs @@ -498,8 +498,10 @@ impl SubObjectAccess for PdoCobSubObject<'_> { } fn write(&self, data: &[u8]) -> Result<(), AbortCode> { - // Changing PDO config is only allowed during PreOperational state - if self.pdo.nmt_state() != NmtState::PreOperational { + // Changing PDO config is only allowed during PreOperational state, or Bootup when the + // defaults are loaded (Bootup is a always a short-lived state). + let nmt_state = self.pdo.nmt_state(); + if nmt_state != NmtState::PreOperational && nmt_state != NmtState::Bootup { return Err(AbortCode::GeneralError); } if data.len() < 4 { @@ -549,8 +551,10 @@ impl SubObjectAccess for PdoTransmissionTypeSubObject<'_> { } fn write(&self, data: &[u8]) -> Result<(), AbortCode> { - // Changing of PDO config only allowed during preoperational state - if self.pdo.nmt_state() != NmtState::PreOperational { + // Changing PDO config is only allowed during PreOperational state, or Bootup when the + // defaults are loaded (Bootup is a always a short-lived state). + let nmt_state = self.pdo.nmt_state(); + if nmt_state != NmtState::PreOperational && nmt_state != NmtState::Bootup { return Err(AbortCode::GeneralError); } if data.is_empty() { @@ -657,8 +661,10 @@ impl ObjectAccess for PdoMappingObject<'_> { } fn write(&self, sub: u8, data: &[u8]) -> Result<(), AbortCode> { - // Changing of PDO mapping is only allowed in PreOperational state - if self.pdo.nmt_state() != NmtState::PreOperational { + // Changing PDO config is only allowed during PreOperational state, or Bootup when the + // defaults are loaded (Bootup is a always a short-lived state). + let nmt_state = self.pdo.nmt_state(); + if nmt_state != NmtState::PreOperational && nmt_state != NmtState::Bootup { return Err(AbortCode::GeneralError); } if sub == 0 { From 0206acabc652cda99a3ccd920fd945151f810df7 Mon Sep 17 00:00:00 2001 From: Jeff McBride Date: Fri, 30 Jan 2026 12:37:17 -0800 Subject: [PATCH 2/2] Update node changelog --- zencan-node/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/zencan-node/CHANGELOG.md b/zencan-node/CHANGELOG.md index b7dd394..0c788a9 100644 --- a/zencan-node/CHANGELOG.md +++ b/zencan-node/CHANGELOG.md @@ -9,6 +9,7 @@ Human-friendly documentation of releases and what's changed in them for the zenc - Unused code warning when num_tdpos or num_rpdos is 0 - TPDO bug where event flags were never cleared causing all TPDOs to be transmitted when any event was set +- PDO objects were unwritable when reset_app/reset_comms callback is called ## v0.0.3 - 2026-01-20