rsiot/components/cmp_esp_can/
can_frame.rs1use embedded_can::Frame;
2use enumset::EnumSet;
3use esp_idf_svc::hal::can::Flags;
4use 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}