embassy-rs/embassy · error

not implemented

Error message

not implemented

What it means

event_type decodes the Tx event FIFO element's EFC field, handling only 0b01 (TxEvent) and 0b10 (TxDespiteAbort); the reserved 0b00/0b11 encodings hit unimplemented!. Reading an uninitialized or corrupt tx event element panics.

Solutions

  1. Check the Tx event FIFO fill level (TXEFS) before reading elements; only read valid entries
  2. Initialize event FIFO elements to 0b01/0b10 on setup if firmware requires
  3. Change event_type to return Option<EventType> and treat reserved values as no-event
  4. Avoid reading event elements for messages that were sent without event storage enabled

Example fix

// before
let ev = tx_event_fifo.read_element(i);
if ev.efc().is_tx_event() { ... } // panics on empty slot
// after
if tx_event_fifo.fill_level() > 0 {
    let ev = tx_event_fifo.read_element(i);
    ...
}
Defensive patterns

Strategy: type-guard

Validate before calling

fn event_bits_valid(bits: u8) -> bool { bits == 0b01 || bits == 0b10 }

Type guard

fn decode_event(bits: u8) -> Option<EventType> { match bits { 0b01 => Some(EventType::TxEvent), 0b10 => Some(EventType::TxDespiteAbort), _ => None } }

Try / catch

// check Tx event FIFO fill level before reading elements

Prevention

When it happens

Trigger: Calling is_tx_event or is_despite_abort on a TxEventFifoElement whose EFC bits are 0b00 or 0b11 — typically an empty/never-written event FIFO slot.

Common situations: Draining the Tx event FIFO without checking the fill level (rx FIFO status), so stale/uninitialized elements are read.

Related errors


AI-assisted analysis of embassy-rs/embassy@463a07b963 (2026-09-10). Data as JSON: /api/errors/0f133486a3b34ec7. Report an issue: GitHub.

Appendix: source

Thrown at embassy-stm32/src/can/fd/message_ram/txevent_element.rs:73

    }
}

#[derive(Clone, Copy, Debug, PartialEq)]
pub(crate) enum EventType {
    //_Reserved = 0b00,
    TxEvent = 0b01,
    TxDespiteAbort = 0b10,
    //_Reserved = 0b10,
}

#[doc = "Reader of field `EFC`"]
pub(crate) type EFC_R = generic::R<u8, EventType>;
impl EFC_R {
    pub fn event_type(&self) -> EventType {
        match self.bits() {
            0b01 => EventType::TxEvent,
            0b10 => EventType::TxDespiteAbort,
            _ => unimplemented!(),
        }
    }
    pub fn is_tx_event(&self) -> bool {
        self.event_type() == EventType::TxEvent
    }
    pub fn is_despite_abort(&self) -> bool {
        self.event_type() == EventType::TxDespiteAbort
    }
}

#[doc = "Reader of field `MM`"]
pub(crate) type MM_R = generic::R<u8, u8>;

impl R {
    #[doc = "Byte 0 - Bits 0:28 - ID"]
    #[inline(always)]
    pub fn id(&self) -> ID_R {
        ID_R::new(((self.bits[0]) & 0x1FFFFFFF))

View on GitHub (pinned to 463a07b963)