async_hal/can/
mod.rs

1use futures::{Sink, Stream};
2
3#[cfg(feature = "nb")]
4pub mod transmit;
5#[cfg(feature = "mock")]
6pub use transmit::MockTransmit;
7#[cfg(feature = "nb")]
8pub use transmit::Transmitter;
9
10#[cfg(feature = "nb")]
11pub mod receive;
12#[cfg(feature = "nb")]
13pub use receive::{DualReceiver, Receiver};
14
15pub use embedded_hal::can::Frame;
16
17pub trait Can: CanReceive + CanTransmit<Self::Frame> {}
18
19impl<T> Can for T where T: ?Sized + CanReceive + CanTransmit<Self::Frame> {}
20
21pub trait CanReceive:
22    Stream<Item = Result<Self::Frame, Self::Error>> + can_receive::Sealed
23{
24    type Frame: Frame;
25
26    type Error;
27}
28
29impl<T, F, E> CanReceive for T
30where
31    T: ?Sized + Stream<Item = Result<F, E>>,
32    F: ?Sized + Frame,
33{
34    type Frame = F;
35
36    type Error = E;
37}
38
39pub trait CanTransmit<F>: Sink<F> + can_transmit::Sealed {}
40
41impl<T, F> CanTransmit<F> for T where T: ?Sized + Sink<F> {}
42
43mod can_receive {
44    use super::Stream;
45
46    pub trait Sealed {}
47
48    impl<T, F, E> Sealed for T where T: ?Sized + Stream<Item = Result<F, E>> {}
49}
50
51mod can_transmit {
52
53    pub trait Sealed {}
54
55    impl<T> Sealed for T where T: ?Sized {}
56}
57
58#[cfg(feature = "mock")]
59mod mock {
60    use embedded_hal::can::{Frame, Id};
61
62    #[derive(Clone, Debug, PartialEq, Eq)]
63    pub struct MockFrame {
64        pub id: Id,
65        pub data: Vec<u8>,
66    }
67
68    impl Frame for MockFrame {
69        fn new(id: impl Into<Id>, data: &[u8]) -> Option<Self> {
70            Some(Self {
71                id: id.into(),
72                data: data.to_owned(),
73            })
74        }
75
76        fn new_remote(_id: impl Into<Id>, _dlc: usize) -> Option<Self> {
77            todo!()
78        }
79
80        fn is_extended(&self) -> bool {
81            todo!()
82        }
83
84        fn is_remote_frame(&self) -> bool {
85            todo!()
86        }
87
88        fn id(&self) -> Id {
89            todo!()
90        }
91
92        fn dlc(&self) -> usize {
93            todo!()
94        }
95
96        fn data(&self) -> &[u8] {
97            todo!()
98        }
99    }
100}
101
102#[cfg(feature = "mock")]
103pub use mock::MockFrame;