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