Skip to main content

rsiot/components/cmp_esp_can/
can_frame.rs

1use embedded_can::Frame;
2use enumset::EnumSet;
3use esp_idf_svc::hal::can::Flags;
4// use esp_idf_svc::hal::can::Frame;
5
6use crate::components_config::can_general::{CanFrame, CanId};
7
8use super::Error;
9
10impl TryFrom<esp_idf_svc::hal::can::Frame> for CanFrame {
11    type Error = Error;
12
13    fn try_from(value: esp_idf_svc::hal::can::Frame) -> Result<Self, Self::Error> {
14        let id: CanId = value.id().into();
15        let frame = if value.is_data_frame() {
16            let mut data = [0_u8; 8];
17            for (i, b) in value.data().iter().enumerate() {
18                data[i] = *b;
19            }
20            Self::Normal { id, data }
21        } else {
22            todo!()
23        };
24
25        Ok(frame)
26    }
27}
28
29impl TryFrom<CanFrame> for esp_idf_svc::hal::can::Frame {
30    type Error = Error;
31
32    fn try_from(value: CanFrame) -> Result<Self, Self::Error> {
33        let frame = match value {
34            CanFrame::Normal { id, data } => {
35                let mut flags = EnumSet::new();
36                if matches!(id, CanId::Extended(_)) {
37                    flags.insert(Flags::Extended);
38                }
39
40                let id = id.as_raw();
41
42                let frame = esp_idf_svc::hal::can::Frame::new(id, flags, &data);
43                let Some(frame) = frame else {
44                    return Err(Error::FrameConversionIntoField(value));
45                };
46                frame
47            }
48        };
49        Ok(frame)
50    }
51}