rsiot/components/cmp_linux_can/
can_frame.rs1use 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}