@@ -83,23 +83,52 @@ static void _reset_state(ethos_t *dev)
8383 dev -> frametype = 0 ;
8484}
8585
86+ static void _reset_tsrb (tsrb_t * tsrb )
87+ {
88+ tsrb -> reads = 0 ;
89+ tsrb -> writes = 0 ;
90+ }
91+
92+ static void _fail_frame (ethos_t * dev )
93+ {
94+ switch (dev -> frametype ) {
95+ case ETHOS_FRAME_TYPE_DATA :
96+ _reset_tsrb (& dev -> inbuf );
97+ /* signal to handler thread that frame is at an end (makes handler thread to
98+ * truncate frame) */
99+ tsrb_add_one (& dev -> inbuf , ETHOS_FRAME_DELIMITER );
100+ break ;
101+ case ETHOS_FRAME_TYPE_TEXT :
102+ mutex_lock (& ethos_stdio_isrpipe .mutex );
103+ _reset_tsrb (& ethos_stdio_isrpipe .tsrb );
104+ mutex_unlock (& ethos_stdio_isrpipe .mutex );
105+ /* signal to handler thread that frame is at an end (makes handler thread to
106+ * truncate frame) */
107+ isrpipe_write_one (& ethos_stdio_isrpipe , ETHOS_FRAME_DELIMITER );
108+ break ;
109+ case ETHOS_FRAME_TYPE_ERRORED :
110+ return ;
111+ default :
112+ assert (0 );
113+ break ;
114+ }
115+ dev -> frametype = ETHOS_FRAME_TYPE_ERRORED ;
116+ }
117+
86118static void _handle_char (ethos_t * dev , char c )
87119{
88120 switch (dev -> frametype ) {
89121 case ETHOS_FRAME_TYPE_DATA :
90122 if (tsrb_add_one (& dev -> inbuf , c ) < 0 ) {
91123 //puts("lost frame");
92- dev -> inbuf .reads = 0 ;
93- dev -> inbuf .writes = 0 ;
94- dev -> frametype = 0 ;
124+ _fail_frame (dev );
95125 }
96126 break ;
97127 case ETHOS_FRAME_TYPE_TEXT :
98128#ifdef MODULE_STDIO_ETHOS
99129 if (isrpipe_write_one (& ethos_stdio_isrpipe , c ) < 0 ) {
100130 //puts("lost frame");
101- dev -> inbuf .reads = 0 ;
102- dev -> inbuf .writes = 0 ;
131+ _fail_frame (dev );
103132 }
104133 break ;
105134#endif
@@ -175,9 +204,7 @@ static void ethos_isr(void *arg, uint8_t c)
175204 return ;
176205 default :
177206 /* unknown escaped character or raw delimiter */
178- dev -> frametype = ETHOS_FRAME_TYPE_ERRORED ;
179- dev -> inbuf .reads = 0 ;
180- dev -> inbuf .writes = 0 ;
207+ _fail_frame (dev );
181208 return ;
182209 }
183210 dev -> state = IN_FRAME ;
0 commit comments