@@ -348,53 +348,64 @@ def process_data(self):
348
348
pass new_data to data_logger and print_func if specified, return new_data.'''
349
349
new_data = []
350
350
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 )
367
398
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 ())
391
400
elif new_byte == b'\x04 ' : # End of framework run.
392
401
self .framework_running = False
393
402
data_err = self .read_until (2 , b'\x04 >' , timeout = 10 )
394
403
if len (data_err ) > 2 :
395
404
error_message = data_err [:- 3 ].decode ()
396
405
new_data .append (('!' , error_message ))
397
406
break
407
+ else :
408
+ unexpected_input .append (new_byte .decode ())
398
409
if new_data and self .data_logger :
399
410
self .data_logger .process_data (new_data )
400
411
if error_message :
0 commit comments