embassy_stm32/can/
common.rs

1use embassy_sync::channel::{DynamicReceiver, DynamicSender};
2
3use super::enums::*;
4use super::frame::*;
5
6pub(crate) struct ClassicBufferedRxInner {
7    pub rx_sender: DynamicSender<'static, Result<Envelope, BusError>>,
8}
9pub(crate) struct ClassicBufferedTxInner {
10    pub tx_receiver: DynamicReceiver<'static, Frame>,
11}
12
13#[cfg(any(can_fdcan_v1, can_fdcan_h7))]
14
15pub(crate) struct FdBufferedRxInner {
16    pub rx_sender: DynamicSender<'static, Result<FdEnvelope, BusError>>,
17}
18
19#[cfg(any(can_fdcan_v1, can_fdcan_h7))]
20pub(crate) struct FdBufferedTxInner {
21    pub tx_receiver: DynamicReceiver<'static, FdFrame>,
22}
23
24/// Sender that can be used for sending CAN frames.
25#[derive(Copy, Clone)]
26pub struct BufferedCanSender {
27    pub(crate) tx_buf: embassy_sync::channel::DynamicSender<'static, Frame>,
28    pub(crate) waker: fn(),
29}
30
31impl BufferedCanSender {
32    /// Async write frame to TX buffer.
33    pub fn try_write(&mut self, frame: Frame) -> Result<(), embassy_sync::channel::TrySendError<Frame>> {
34        self.tx_buf.try_send(frame)?;
35        (self.waker)();
36        Ok(())
37    }
38
39    /// Async write frame to TX buffer.
40    pub async fn write(&mut self, frame: Frame) {
41        self.tx_buf.send(frame).await;
42        (self.waker)();
43    }
44
45    /// Allows a poll_fn to poll until the channel is ready to write
46    pub fn poll_ready_to_send(&self, cx: &mut core::task::Context<'_>) -> core::task::Poll<()> {
47        self.tx_buf.poll_ready_to_send(cx)
48    }
49}
50
51/// Receiver that can be used for receiving CAN frames. Note, each CAN frame will only be received by one receiver.
52pub type BufferedCanReceiver = embassy_sync::channel::DynamicReceiver<'static, Result<Envelope, BusError>>;