Skip to main content

rsiot/components/cmp_linux_can/
can_frame.rs

1use socketcan::EmbeddedFrame;
2
3use super::{CanFrame, CanId, Error};
4
5impl TryFrom<CanFrame> for socketcan::CanAnyFrame {
6    type Error = Error;
7
8    fn try_from(value: CanFrame) -> Result<Self, Error> {
9        match &value {
10            CanFrame::Normal { id, data } => {
11                let id: socketcan::CanId = id.clone().try_into()?;
12
13                let frame = socketcan::CanDataFrame::new(id, data)
14                    .ok_or_else(|| Error::FrameConversion(value.clone()))?;
15
16                Ok(socketcan::CanAnyFrame::Normal(frame))
17            }
18        }
19    }
20}
21
22impl TryFrom<CanFrame> for socketcan::CanFrame {
23    type Error = Error;
24
25    fn try_from(value: CanFrame) -> Result<Self, Error> {
26        match &value {
27            CanFrame::Normal { id, data } => {
28                let id: socketcan::CanId = id.clone().try_into()?;
29
30                let frame = socketcan::CanDataFrame::new(id, data)
31                    .ok_or_else(|| Error::FrameConversion(value.clone()))?;
32
33                Ok(socketcan::CanFrame::Data(frame))
34            }
35        }
36    }
37}
38
39impl TryFrom<socketcan::CanFrame> for CanFrame {
40    type Error = Error;
41
42    fn try_from(value: socketcan::CanFrame) -> Result<Self, Self::Error> {
43        match value {
44            socketcan::CanFrame::Data(frame) => {
45                let id: socketcan::CanId = frame.id().into();
46                let id: CanId = id.try_into()?;
47
48                let mut data = [0_u8; 8];
49                for (i, b) in frame.data().iter().enumerate() {
50                    data[i] = *b;
51                }
52
53                let frame = CanFrame::Normal { id, data };
54                Ok(frame)
55            }
56            socketcan::CanFrame::Remote(_frame) => todo!(),
57            socketcan::CanFrame::Error(frame) => todo!(),
58        }
59    }
60}