fdCanTransceiver
Overview
Implements the OpenBSW AbstractCANTransceiver interface for the STM32
FDCAN peripheral. Wraps the register-level FdCanDevice (bspCan module)
and adds lifecycle management, async task integration, ISR dispatch and
bus-off recovery. The peripheral runs in classic CAN mode at 500 kbps.
Lifecycle
The transceiver follows the AbstractCANTransceiver state model
(CLOSED -> INITIALIZED -> OPEN <-> MUTED). init() and
open() delegate to FdCanDevice::init() and FdCanDevice::start();
close() stops the device from any state. mute() and unmute()
suppress and resume transmission while reception stays active.
TX Path
write(frame) transmits fire-and-forget and notifies sent-listeners
synchronously. write(frame, listener) queues the job, transmits with the
TX-complete interrupt enabled, and invokes listener.canFrameSent() from
task context (deferred via async::execute) after the TX ISR; further
queued frames are sent one after another from that callback chain.
RX Path
receiveInterrupt() runs in the RX ISR and delegates to
FdCanDevice::receiveISR(nullptr), accepting all frames into the software
queue; per-listener filtering happens later in notifyListeners().
receiveTask() runs in task context, notifies listeners for each queued
frame, clears the queue and re-enables the RX interrupt.
Bus-Off Recovery
cyclicTask() polls FdCanDevice::isBusOff() periodically. On bus-off
the transceiver transitions from OPEN to MUTED; once the peripheral
recovers it returns to OPEN, unless the user explicitly called mute().