va416xx_hal/can/
frame.rs

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}