1pub use embedded_can::{ExtendedId, Id, StandardId};
2
3#[derive(Debug, thiserror::Error)]
4#[error("invalid data size error {0}")]
5pub struct InvalidDataSizeError(usize);
6
7#[derive(Debug, Copy, Clone, PartialEq, Eq)]
8pub struct CanFrameNormal {
9 id: embedded_can::Id,
10 size: usize,
11 data: [u8; 8],
12}
13
14impl CanFrameNormal {
15 pub fn new(id: embedded_can::Id, data: &[u8]) -> Result<Self, InvalidDataSizeError> {
16 if data.len() > 8 {
17 return Err(InvalidDataSizeError(data.len()));
18 }
19 let size = data.len();
20 let mut data_array = [0; 8];
21 data_array[0..size].copy_from_slice(data);
22 Ok(Self {
23 id,
24 size,
25 data: data_array,
26 })
27 }
28
29 #[inline]
30 pub fn id(&self) -> embedded_can::Id {
31 self.id
32 }
33
34 #[inline]
35 pub fn data(&self) -> &[u8] {
36 &self.data[0..self.dlc()]
37 }
38
39 #[inline]
40 pub fn dlc(&self) -> usize {
41 self.size
42 }
43}
44
45#[derive(Debug, Copy, Clone, PartialEq, Eq)]
46pub struct CanFrameRtr {
47 id: embedded_can::Id,
48 dlc: usize,
49}
50
51impl CanFrameRtr {
52 pub fn new(id: embedded_can::Id, dlc: usize) -> Self {
53 Self { id, dlc }
54 }
55
56 pub fn id(&self) -> embedded_can::Id {
57 self.id
58 }
59
60 pub fn dlc(&self) -> usize {
61 self.dlc
62 }
63}
64
65#[derive(Debug, Clone, Copy, PartialEq, Eq)]
66pub enum CanFrame {
67 Normal(CanFrameNormal),
68 Rtr(CanFrameRtr),
69}
70
71impl From<CanFrameNormal> for CanFrame {
72 fn from(value: CanFrameNormal) -> Self {
73 Self::Normal(value)
74 }
75}
76
77impl From<CanFrameRtr> for CanFrame {
78 fn from(value: CanFrameRtr) -> Self {
79 Self::Rtr(value)
80 }
81}
82
83impl embedded_can::Frame for CanFrame {
84 fn new(id: impl Into<embedded_can::Id>, data: &[u8]) -> Option<Self> {
85 if data.len() > 8 {
86 return None;
87 }
88 let id: embedded_can::Id = id.into();
89 Some(Self::Normal(CanFrameNormal::new(id, data).unwrap()))
90 }
91
92 fn new_remote(id: impl Into<embedded_can::Id>, dlc: usize) -> Option<Self> {
93 let id: embedded_can::Id = id.into();
94 Some(Self::Rtr(CanFrameRtr::new(id, dlc)))
95 }
96
97 fn is_extended(&self) -> bool {
98 match self.id() {
99 embedded_can::Id::Extended(_) => true,
100 embedded_can::Id::Standard(_) => false,
101 }
102 }
103
104 fn is_remote_frame(&self) -> bool {
105 match self {
106 CanFrame::Normal(_) => false,
107 CanFrame::Rtr(_) => true,
108 }
109 }
110
111 fn id(&self) -> embedded_can::Id {
112 match self {
113 CanFrame::Normal(can_frame_normal) => can_frame_normal.id(),
114 CanFrame::Rtr(can_frame_rtr) => can_frame_rtr.id(),
115 }
116 }
117
118 fn dlc(&self) -> usize {
119 match self {
120 CanFrame::Normal(can_frame_normal) => can_frame_normal.dlc(),
121 CanFrame::Rtr(can_frame_rtr) => can_frame_rtr.dlc(),
122 }
123 }
124
125 fn data(&self) -> &[u8] {
126 match self {
127 CanFrame::Normal(can_frame_normal) => can_frame_normal.data(),
128 CanFrame::Rtr(_) => &[],
129 }
130 }
131}