@@ -85,14 +85,15 @@ struct FrameDelimiter<'a> {
85
85
}
86
86
87
87
const FRAME_START : & [ u8 ] = & [ 0xFF , 0x00 ] ;
88
- const FRAME_END : & [ u8 ] = & [ 0xFC , 0x00 ] ;
88
+ const FRAME_END : & [ u8 ] = & [ 0x00 ] ;
89
89
90
- fn search ( haystack : & [ u8 ] , look_for_end : bool ) -> Option < ( & [ u8 ] , usize ) > {
90
+ fn search ( haystack : & [ u8 ] , look_for_end : bool ) -> Option < ( & [ u8 ] , & [ u8 ] ) > {
91
91
let needle = if look_for_end { FRAME_END } else { FRAME_START } ;
92
+
92
93
haystack
93
94
. 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] ) )
96
97
}
97
98
98
99
impl FrameDelimiter < ' _ > {
@@ -104,19 +105,22 @@ impl FrameDelimiter<'_> {
104
105
105
106
self . buffer . extend_from_slice ( buffer) ;
106
107
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 ) {
109
109
if delimiter == FRAME_START {
110
110
process ( FrameKind :: Raw ( frame) ) ;
111
+ self . in_frame = true ;
111
112
} else {
112
113
table. received ( frame) ;
114
+ // small reliance on rzcobs internals: we need to feed the terminating zero
115
+ table. received ( delimiter) ;
113
116
if let Ok ( frame) = table. decode ( ) {
114
117
process ( FrameKind :: Defmt ( frame) ) ;
115
118
} else {
116
119
log:: warn!( "Failed to decode defmt frame" ) ;
117
120
}
121
+ self . in_frame = false ;
118
122
}
119
- self . buffer . drain ( ..pos + delimiter. len ( ) ) ;
123
+ self . buffer . drain ( ..frame . len ( ) + delimiter. len ( ) ) ;
120
124
}
121
125
}
122
126
}
0 commit comments