psdk_fruit_emapi/
frame_parser.rs1use crate::{
2 command::EmapiCommand,
3 constants::{COMMAND_HEADER_LENGTH, FRAME_HEAD, FRAME_OVERHEAD_LENGTH},
4 endian::read_uint16,
5 error::{EmapiError, Result},
6 frame_codec::FrameCodec,
7};
8
9#[derive(Debug, Default, Clone)]
10pub struct FrameParser {
11 buffer: Vec<u8>,
12}
13
14impl FrameParser {
15 pub fn new() -> Self {
16 Self::default()
17 }
18
19 pub fn add(&mut self, data: &[u8]) -> Result<Vec<EmapiCommand>> {
20 self.buffer.extend_from_slice(data);
21 let mut commands = Vec::new();
22
23 loop {
24 let Some(head_index) = self.buffer.iter().position(|byte| *byte == FRAME_HEAD) else {
25 self.buffer.clear();
26 return Ok(commands);
27 };
28 if head_index > 0 {
29 self.buffer.drain(..head_index);
30 }
31 if self.buffer.len() < 4 {
32 return Ok(commands);
33 }
34
35 let data_length = usize::from(read_uint16(&self.buffer, 2)?);
36 let frame_length = data_length + FRAME_OVERHEAD_LENGTH;
37 if data_length < COMMAND_HEADER_LENGTH {
38 self.buffer.remove(0);
39 return Err(EmapiError::InvalidFrameDataLength);
40 }
41 if self.buffer.len() < frame_length {
42 return Ok(commands);
43 }
44
45 let frame: Vec<u8> = self.buffer.drain(..frame_length).collect();
46 commands.push(FrameCodec::decode(&frame)?);
47 }
48 }
49}