Skip to main content

psdk_fruit_emapi/
frame_parser.rs

1use 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}