async_hal/can/transmit/
mod.rs

1use embedded_hal::can::Frame;
2mod transmitter;
3pub use transmitter::Transmitter;
4
5pub trait Transmit {
6    type Frame: Frame;
7    type Error;
8
9    fn is_ready(&mut self) -> bool;
10
11    fn transmit(&mut self, frame: &Self::Frame) -> nb::Result<(), Self::Error>;
12}
13
14#[cfg(feature = "mock")]
15use super::MockFrame;
16
17#[cfg(feature = "mock")]
18#[derive(Default)]
19pub struct MockTransmit {
20    pub frames: Vec<MockFrame>,
21}
22
23#[cfg(feature = "mock")]
24impl Transmit for MockTransmit {
25    type Frame = MockFrame;
26
27    type Error = ();
28
29    fn is_ready(&mut self) -> bool {
30        true
31    }
32
33    fn transmit(&mut self, frame: &Self::Frame) -> nb::Result<(), Self::Error> {
34        self.frames.push(frame.clone());
35        Ok(())
36    }
37}
38
39#[cfg(feature = "bxcan")]
40impl<I: bxcan::Instance> Transmit for bxcan::Tx<I> {
41    type Frame = bxcan::Frame;
42    type Error = core::convert::Infallible;
43
44    fn is_ready(&mut self) -> bool {
45        !self.is_idle()
46    }
47
48    fn transmit(&mut self, frame: &Self::Frame) -> nb::Result<(), Self::Error> {
49        self.transmit(frame).map(|_| ())
50    }
51}