embedded_hal/can/mod.rs
1//! Controller Area Network
2
3pub mod nb;
4
5mod id;
6
7pub use self::id::*;
8pub use self::nb::*;
9
10/// A CAN2.0 Frame
11pub trait Frame: Sized {
12 /// Creates a new frame.
13 ///
14 /// This will return `None` if the data slice is too long.
15 fn new(id: impl Into<Id>, data: &[u8]) -> Option<Self>;
16
17 /// Creates a new remote frame (RTR bit set).
18 ///
19 /// This will return `None` if the data length code (DLC) is not valid.
20 fn new_remote(id: impl Into<Id>, dlc: usize) -> Option<Self>;
21
22 /// Returns true if this frame is a extended frame.
23 fn is_extended(&self) -> bool;
24
25 /// Returns true if this frame is a standard frame.
26 fn is_standard(&self) -> bool {
27 !self.is_extended()
28 }
29
30 /// Returns true if this frame is a remote frame.
31 fn is_remote_frame(&self) -> bool;
32
33 /// Returns true if this frame is a data frame.
34 fn is_data_frame(&self) -> bool {
35 !self.is_remote_frame()
36 }
37
38 /// Returns the frame identifier.
39 fn id(&self) -> Id;
40
41 /// Returns the data length code (DLC) which is in the range 0..8.
42 ///
43 /// For data frames the DLC value always matches the length of the data.
44 /// Remote frames do not carry any data, yet the DLC can be greater than 0.
45 fn dlc(&self) -> usize;
46
47 /// Returns the frame data (0..8 bytes in length).
48 fn data(&self) -> &[u8];
49}
50
51/// CAN error
52pub trait Error: core::fmt::Debug {
53 /// Convert error to a generic CAN error kind
54 ///
55 /// By using this method, CAN errors freely defined by HAL implementations
56 /// can be converted to a set of generic serial errors upon which generic
57 /// code can act.
58 fn kind(&self) -> ErrorKind;
59}
60
61/// CAN error kind
62///
63/// This represents a common set of CAN operation errors. HAL implementations are
64/// free to define more specific or additional error types. However, by providing
65/// a mapping to these common CAN errors, generic code can still react to them.
66#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
67pub enum ErrorKind {
68 /// The peripheral receive buffer was overrun.
69 Overrun,
70
71 // MAC sublayer errors
72 /// A bit error is detected at that bit time when the bit value that is
73 /// monitored differs from the bit value sent.
74 Bit,
75
76 /// A stuff error is detected at the bit time of the sixth consecutive
77 /// equal bit level in a frame field that shall be coded by the method
78 /// of bit stuffing.
79 Stuff,
80
81 /// Calculated CRC sequence does not equal the received one.
82 Crc,
83
84 /// A form error shall be detected when a fixed-form bit field contains
85 /// one or more illegal bits.
86 Form,
87
88 /// An ACK error shall be detected by a transmitter whenever it does not
89 /// monitor a dominant bit during the ACK slot.
90 Acknowledge,
91
92 /// A different error occurred. The original error may contain more information.
93 Other,
94}
95
96impl Error for ErrorKind {
97 fn kind(&self) -> ErrorKind {
98 *self
99 }
100}
101
102impl core::fmt::Display for ErrorKind {
103 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
104 match self {
105 ErrorKind::Overrun => write!(f, "The peripheral receive buffer was overrun"),
106 ErrorKind::Bit => write!(
107 f,
108 "Bit value that is monitored differs from the bit value sent"
109 ),
110 ErrorKind::Stuff => write!(f, "Sixth consecutive equal bits detected"),
111 ErrorKind::Crc => write!(f, "Calculated CRC sequence does not equal the received one"),
112 ErrorKind::Form => write!(
113 f,
114 "A fixed-form bit field contains one or more illegal bits"
115 ),
116 ErrorKind::Acknowledge => write!(f, "Transmitted frame was not acknowledged"),
117 ErrorKind::Other => write!(
118 f,
119 "A different error occurred. The original error may contain more information"
120 ),
121 }
122 }
123}