embassy_stm32/can/
common.rs1use 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#[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 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 pub async fn write(&mut self, frame: Frame) {
41 self.tx_buf.send(frame).await;
42 (self.waker)();
43 }
44
45 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
51pub type BufferedCanReceiver = embassy_sync::channel::DynamicReceiver<'static, Result<Envelope, BusError>>;