ross_protocol/interface/
can.rs

1use bxcan::{Can as BxCan, Instance};
2use nb::block;
3
4use crate::frame::*;
5use crate::interface::*;
6use crate::packet::*;
7
8#[derive(Debug, PartialEq)]
9pub enum CanError {
10    BufferOverrun,
11    MailboxFull,
12}
13
14pub struct Can<I: Instance> {
15    can: BxCan<I>,
16    packet_builder: Option<PacketBuilder>,
17}
18
19impl<I: Instance> Can<I> {
20    pub fn new(can: BxCan<I>) -> Self {
21        Can {
22            can,
23            packet_builder: None,
24        }
25    }
26}
27
28impl<I: Instance> Interface for Can<I> {
29    fn try_get_packet(&mut self) -> Result<Packet, InterfaceError> {
30        loop {
31            match self.can.receive() {
32                Ok(frame) => {
33                    let ross_frame = match Frame::from_bxcan_frame(frame) {
34                        Ok(frame) => frame,
35                        Err(err) => return Err(InterfaceError::FrameError(err)),
36                    };
37
38                    if let Some(ref mut packet_builder) = self.packet_builder {
39                        if let Err(err) = packet_builder.add_frame(ross_frame) {
40                            self.packet_builder = None;
41
42                            return Err(InterfaceError::BuilderError(err));
43                        }
44                    } else {
45                        self.packet_builder = match PacketBuilder::new(ross_frame) {
46                            Ok(builder) => Some(builder),
47                            Err(err) => return Err(InterfaceError::BuilderError(err)),
48                        };
49                    }
50
51                    if let Some(ref mut packet_builder) = self.packet_builder {
52                        if packet_builder.frames_left() == 0 {
53                            let packet = match packet_builder.build() {
54                                Ok(packet) => packet,
55                                Err(err) => return Err(InterfaceError::BuilderError(err)),
56                            };
57
58                            self.packet_builder = None;
59
60                            return Ok(packet);
61                        }
62                    }
63                }
64                Err(_) => break,
65            }
66        }
67
68        Err(InterfaceError::NoPacketReceived)
69    }
70
71    fn try_send_packet(&mut self, packet: &Packet) -> Result<(), InterfaceError> {
72        let frames = packet.to_frames();
73
74        for frame in frames {
75            if let Ok(transmit_status) = block!(self.can.transmit(&frame.to_bxcan_frame())) {
76                if let Some(_) = transmit_status.dequeued_frame() {
77                    return Err(InterfaceError::CanError(CanError::MailboxFull));
78                }
79            }
80        }
81
82        Ok(())
83    }
84}