ross_protocol/interface/
can.rs1use 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}