Skip to content

Commit b816ac1

Browse files
committed
Update framing
1 parent ac4ac05 commit b816ac1

File tree

1 file changed

+11
-7
lines changed
  • espflash/src/cli/monitor

1 file changed

+11
-7
lines changed

espflash/src/cli/monitor/mod.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,15 @@ struct FrameDelimiter<'a> {
8585
}
8686

8787
const FRAME_START: &[u8] = &[0xFF, 0x00];
88-
const FRAME_END: &[u8] = &[0xFC, 0x00];
88+
const FRAME_END: &[u8] = &[0x00];
8989

90-
fn search(haystack: &[u8], look_for_end: bool) -> Option<(&[u8], usize)> {
90+
fn search(haystack: &[u8], look_for_end: bool) -> Option<(&[u8], &[u8])> {
9191
let needle = if look_for_end { FRAME_END } else { FRAME_START };
92+
9293
haystack
9394
.windows(needle.len())
94-
.position(|window| window == FRAME_START || window == FRAME_END)
95-
.map(|pos| (&haystack[pos..][..2], pos))
95+
.position(|byte| byte == needle)
96+
.map(|pos| (needle, &haystack[..pos]))
9697
}
9798

9899
impl FrameDelimiter<'_> {
@@ -104,19 +105,22 @@ impl FrameDelimiter<'_> {
104105

105106
self.buffer.extend_from_slice(buffer);
106107

107-
while let Some((delimiter, pos)) = search(&self.buffer, self.in_frame) {
108-
let frame = &self.buffer[..pos];
108+
while let Some((delimiter, frame)) = search(&self.buffer, self.in_frame) {
109109
if delimiter == FRAME_START {
110110
process(FrameKind::Raw(frame));
111+
self.in_frame = true;
111112
} else {
112113
table.received(frame);
114+
// small reliance on rzcobs internals: we need to feed the terminating zero
115+
table.received(delimiter);
113116
if let Ok(frame) = table.decode() {
114117
process(FrameKind::Defmt(frame));
115118
} else {
116119
log::warn!("Failed to decode defmt frame");
117120
}
121+
self.in_frame = false;
118122
}
119-
self.buffer.drain(..pos + delimiter.len());
123+
self.buffer.drain(..frame.len() + delimiter.len());
120124
}
121125
}
122126
}

0 commit comments

Comments
 (0)