ross_protocol/interface/
usart.rs

1use alloc::vec;
2use embedded_hal::serial::{Read, Write};
3use nb::block;
4
5use crate::frame::*;
6use crate::interface::*;
7use crate::packet::*;
8
9#[derive(Debug, PartialEq)]
10pub enum UsartError {
11    ReadError,
12}
13
14pub struct Usart<S: Read<u8> + Write<u8>> {
15    serial: S,
16    packet_builder: Option<PacketBuilder>,
17}
18
19impl<S: Read<u8> + Write<u8>> Usart<S> {
20    pub fn new(serial: S) -> Self {
21        Usart {
22            serial,
23            packet_builder: None,
24        }
25    }
26}
27
28impl<S: Read<u8> + Write<u8>> Interface for Usart<S> {
29    fn try_get_packet(&mut self) -> Result<Packet, InterfaceError> {
30        loop {
31            match self.serial.read() {
32                Ok(frame_start) => {
33                    if frame_start == 0x00 {
34                        let mut frame = vec![];
35
36                        let expected_length = match block!(self.serial.read()) {
37                            Ok(length) => length,
38                            Err(_) => {
39                                return Err(InterfaceError::UsartError(UsartError::ReadError))
40                            }
41                        };
42
43                        loop {
44                            match block!(self.serial.read()) {
45                                Ok(byte) => frame.push(byte),
46                                Err(_) => {
47                                    return Err(InterfaceError::UsartError(UsartError::ReadError))
48                                }
49                            }
50
51                            if frame.len() == expected_length as usize {
52                                break;
53                            }
54                        }
55
56                        let ross_frame = match Frame::from_usart_frame(frame) {
57                            Ok(frame) => frame,
58                            Err(err) => return Err(InterfaceError::FrameError(err)),
59                        };
60
61                        if let Some(ref mut packet_builder) = self.packet_builder {
62                            if let Err(err) = packet_builder.add_frame(ross_frame) {
63                                self.packet_builder = None;
64
65                                return Err(InterfaceError::BuilderError(err));
66                            }
67                        } else {
68                            self.packet_builder = match PacketBuilder::new(ross_frame) {
69                                Ok(builder) => Some(builder),
70                                Err(err) => return Err(InterfaceError::BuilderError(err)),
71                            };
72                        }
73
74                        if let Some(ref mut packet_builder) = self.packet_builder {
75                            if packet_builder.frames_left() == 0 {
76                                let packet = match packet_builder.build() {
77                                    Ok(packet) => packet,
78                                    Err(err) => return Err(InterfaceError::BuilderError(err)),
79                                };
80
81                                self.packet_builder = None;
82
83                                return Ok(packet);
84                            }
85                        }
86                    }
87                }
88                Err(_) => break,
89            }
90        }
91
92        Err(InterfaceError::NoPacketReceived)
93    }
94
95    fn try_send_packet(&mut self, packet: &Packet) -> Result<(), InterfaceError> {
96        let frames = packet.to_frames();
97
98        for frame in frames {
99            let _ = block!(self.serial.write(0x00));
100
101            let usart_frame = frame.to_usart_frame();
102
103            let _ = block!(self.serial.write(usart_frame.len() as u8));
104
105            for byte in frame.to_usart_frame().iter() {
106                let _ = block!(self.serial.write(*byte));
107            }
108        }
109
110        Ok(())
111    }
112}