@@ -348,53 +348,64 @@ def process_data(self):
348348 pass new_data to data_logger and print_func if specified, return new_data.'''
349349 new_data = []
350350 error_message = None
351- while self .serial .inWaiting () > 0 :
352- new_byte = self .serial .read (1 )
353- if new_byte == b'A' : # Analog data, 13 byte header + variable size content.
354- data_header = self .serial .read (13 )
355- typecode = data_header [0 :1 ].decode ()
356- if typecode not in ('b' ,'B' ,'h' ,'H' ,'l' ,'L' ):
357- new_data .append (('!' ,'bad typecode A' ))
358- continue
359- ID = int .from_bytes (data_header [1 :3 ], 'little' )
360- sampling_rate = int .from_bytes (data_header [3 :5 ], 'little' )
361- data_len = int .from_bytes (data_header [5 :7 ], 'little' )
362- timestamp = int .from_bytes (data_header [7 :11 ], 'little' )
363- checksum = int .from_bytes (data_header [11 :13 ], 'little' )
364- data_array = array (typecode , self .serial .read (data_len ))
365- if checksum == (sum (data_header [:- 2 ]) + sum (data_array )) & 0xffff : # Checksum OK.
366- new_data .append (('A' ,ID , sampling_rate , timestamp , data_array ))
351+ unexpected_input = []
352+ while self .serial .in_waiting > 0 :
353+ new_byte = self .serial .read (1 )
354+ if new_byte == b'\x07 ' : # Start of pyControl message.
355+ if unexpected_input : # Output any unexpected characters recived prior to message start.
356+ new_data .append (('!' ,'Unexpected input recieved from board: ' +
357+ '' .join (unexpected_input )))
358+ unexpected_input = []
359+ type_byte = self .serial .read (1 ) # Message type identifier.
360+ if type_byte == b'A' : # Analog data, 13 byte header + variable size content.
361+ data_header = self .serial .read (13 )
362+ typecode = data_header [0 :1 ].decode ()
363+ if typecode not in ('b' ,'B' ,'h' ,'H' ,'l' ,'L' ):
364+ new_data .append (('!' ,'bad typecode A' ))
365+ continue
366+ ID = int .from_bytes (data_header [1 :3 ], 'little' )
367+ sampling_rate = int .from_bytes (data_header [3 :5 ], 'little' )
368+ data_len = int .from_bytes (data_header [5 :7 ], 'little' )
369+ timestamp = int .from_bytes (data_header [7 :11 ], 'little' )
370+ checksum = int .from_bytes (data_header [11 :13 ], 'little' )
371+ data_array = array (typecode , self .serial .read (data_len ))
372+ if checksum == (sum (data_header [:- 2 ]) + sum (data_array )) & 0xffff : # Checksum OK.
373+ new_data .append (('A' ,ID , sampling_rate , timestamp , data_array ))
374+ else :
375+ new_data .append (('!' ,'bad checksum A' ))
376+ elif type_byte == b'D' : # Event or state entry, 8 byte data header only.
377+ data_header = self .serial .read (8 )
378+ timestamp = int .from_bytes (data_header [ :4 ], 'little' )
379+ ID = int .from_bytes (data_header [4 :6 ], 'little' )
380+ checksum = int .from_bytes (data_header [6 :8 ], 'little' )
381+ if checksum == sum (data_header [:- 2 ]): # Checksum OK.
382+ new_data .append (('D' ,timestamp , ID ))
383+ else :
384+ new_data .append (('!' ,'bad checksum D' ))
385+ elif type_byte in (b'P' , b'V' ): # User print statement or set variable, 8 byte data header + variable size content.
386+ data_header = self .serial .read (8 )
387+ data_len = int .from_bytes (data_header [ :2 ], 'little' )
388+ timestamp = int .from_bytes (data_header [2 :6 ], 'little' )
389+ checksum = int .from_bytes (data_header [6 :8 ], 'little' )
390+ data_bytes = self .serial .read (data_len )
391+ if not checksum == (sum (data_header [:- 2 ]) + sum (data_bytes )) & 0xffff : # Bad checksum.
392+ new_data .append (('!' ,'bad checksum ' + type_byte .decode ()))
393+ continue
394+ new_data .append ((type_byte .decode (),timestamp , data_bytes .decode ()))
395+ if type_byte == b'V' : # Store new variable value in sm_info
396+ v_name , v_str = data_bytes .decode ().split (' ' , 1 )
397+ self .sm_info ['variables' ][v_name ] = eval (v_str )
367398 else :
368- new_data .append (('!' ,'bad checksum A' ))
369- elif new_byte == b'D' : # Event or state entry, 8 byte data header only.
370- data_header = self .serial .read (8 )
371- timestamp = int .from_bytes (data_header [ :4 ], 'little' )
372- ID = int .from_bytes (data_header [4 :6 ], 'little' )
373- checksum = int .from_bytes (data_header [6 :8 ], 'little' )
374- if checksum == sum (data_header [:- 2 ]): # Checksum OK.
375- new_data .append (('D' ,timestamp , ID ))
376- else :
377- new_data .append (('!' ,'bad checksum D' ))
378- elif new_byte in (b'P' , b'V' ): # User print statement or set variable, 8 byte data header + variable size content.
379- data_header = self .serial .read (8 )
380- data_len = int .from_bytes (data_header [ :2 ], 'little' )
381- timestamp = int .from_bytes (data_header [2 :6 ], 'little' )
382- checksum = int .from_bytes (data_header [6 :8 ], 'little' )
383- data_bytes = self .serial .read (data_len )
384- if not checksum == (sum (data_header [:- 2 ]) + sum (data_bytes )) & 0xffff : # Bad checksum.
385- new_data .append (('!' ,'bad checksum ' + new_byte .decode ()))
386- continue
387- new_data .append ((new_byte .decode (),timestamp , data_bytes .decode ()))
388- if new_byte == b'V' : # Store new variable value in sm_info
389- v_name , v_str = data_bytes .decode ().split (' ' , 1 )
390- self .sm_info ['variables' ][v_name ] = eval (v_str )
399+ unexpected_input .append (type_byte .decode ())
391400 elif new_byte == b'\x04 ' : # End of framework run.
392401 self .framework_running = False
393402 data_err = self .read_until (2 , b'\x04 >' , timeout = 10 )
394403 if len (data_err ) > 2 :
395404 error_message = data_err [:- 3 ].decode ()
396405 new_data .append (('!' , error_message ))
397406 break
407+ else :
408+ unexpected_input .append (new_byte .decode ())
398409 if new_data and self .data_logger :
399410 self .data_logger .process_data (new_data )
400411 if error_message :
0 commit comments