Skip to content

Commit

Permalink
UPD: Store Bytes After Sentinel on Error
Browse files Browse the repository at this point in the history
* Pass clone of buffer to take_from_bytes_cobs to avoid
  buffer being modified on error
* Get position of 0x00 sentinel byte in buffer on error,
  and handle unused bytes as no error
  • Loading branch information
Stuart Andrews committed Jan 15, 2025
1 parent 478d2fe commit a3a5489
Showing 1 changed file with 15 additions and 15 deletions.
30 changes: 15 additions & 15 deletions rmk/src/split/serial/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,25 +78,25 @@ impl<S: Read + Write> SplitReader for SerialSplitDriver<S> {
}
}

let (message, n_bytes_unused) = {
let (message, unused_bytes): (SplitMessage, &mut [u8]) =
postcard::take_from_bytes_cobs(&mut self.buffer[..self.n_bytes_part]).map_err(
|e| {
error!("Postcard deserialize split message error: {}", e);
self.n_bytes_part = 0;
SplitDriverError::SerializeError
},
)?;
(message, unused_bytes.len())
let (result, n_bytes_unused) = match postcard::take_from_bytes_cobs::<SplitMessage>(
&mut self.buffer.clone()[..self.n_bytes_part],
) {
Ok((message, unused_bytes)) => (Ok(message), unused_bytes.len()),
Err(e) => {
error!("Postcard deserialize split message error: {}", e);
let n_bytes_unused = self.buffer[..self.n_bytes_part]
.iter()
.position(|&x| x == SENTINEL)
.map_or(0, |index| self.n_bytes_part - index - 1);
(Err(SplitDriverError::SerializeError), n_bytes_unused)
}
};

self.buffer.copy_within(
self.n_bytes_part-n_bytes_unused..self.n_bytes_part,
0,
);
self.buffer
.copy_within(self.n_bytes_part - n_bytes_unused..self.n_bytes_part, 0);
self.n_bytes_part = n_bytes_unused;

Ok(message)
result
}
}

Expand Down

0 comments on commit a3a5489

Please sign in to comment.