66import argparse
77import unittest
88import tempfile
9+ import serial
10+ import threading
911import cProfile , pstats
1012import debug_backend , debug_backend_tests
1113
2729 }
2830}
2931
32+ class SerialPortReader (threading .Thread ):
33+ def __init__ (self , port_name ):
34+ threading .Thread .__init__ (self , name = 'serial_reader' )
35+ # connect to serial port
36+ self .ser = serial .serial_for_url (port_name , do_not_open = True )
37+ self .ser .baudrate = 115200
38+ # self.ser.parity = serial.PARITY_NONE
39+ self .ser .dtr = False
40+ self .ser .rts = False
41+ # self.ser.rtscts = False
42+ # self.ser.xonxoff = False
43+ self .ser .timeout = 0
44+ self .ser .open ()
45+ self .do_work = True
46+ self ._logger = logging .getLogger ('BOARD_UART' )
47+
48+ def get_logger (self ):
49+ return self ._logger
50+
51+ def stop (self ):
52+ self .do_work = False
53+ self ._logger .debug ('Wait for reader thread to finish...' )
54+ self .join ()
55+ self .ser .close ()
56+
57+ def run (self ):
58+ self ._logger .debug ('Start reading from "{}"' .format (self .ser .name ))
59+ line = ''
60+ while self .do_work :
61+ line += self .ser .read (1 )
62+ if line .endswith ('\n ' ):
63+ self ._logger .info (line .rstrip ('\r \n ' ))
64+ line = ''
65+
3066def main ():
67+ board_uart_reader = None
68+ if args .serial_port :
69+ try :
70+ board_uart_reader = SerialPortReader (args .serial_port )
71+ except serial .SerialException as e :
72+ sys .stderr .write ('Could not start reader for serial port {}: {}\n ' .format (args .serial_port , e ))
73+ sys .exit (1 )
3174 log_formatter = logging .Formatter ('%(asctime)-15s %(name)s: %(levelname)s - %(message)s' )
3275 ch = logging .StreamHandler ()
3376 ch .setFormatter (log_formatter )
@@ -58,6 +101,9 @@ def setup_logger(logger, conh, fileh):
58101 setup_logger (debug_backend .Oocd .get_logger (), ch , fh )
59102 setup_logger (debug_backend .Gdb .get_logger (), ch , fh )
60103 setup_logger (debug_backend_tests .get_logger (), ch , fh )
104+ if board_uart_reader :
105+ setup_logger (board_uart_reader .get_logger (), ch , fh )
106+ board_uart_reader .start ()
61107 board_tcl = BOARD_TCL_CONFIG [args .board_type ]
62108 # start debugger, ideally we should run all tests w/o restarting it
63109 debug_backend .start (args .toolchain , args .oocd , args .oocd_tcl , board_tcl ['files' ], board_tcl ['commands' ])
@@ -114,7 +160,7 @@ def load_tests_by_pattern(search_dir, pattern):
114160 for m in suite .modules :
115161 setup_logger (suite .modules [m ].get_logger (), ch , fh )
116162 suite .load_app_bins = not args .no_load
117- try :
163+ try :
118164 res = unittest .TextTestRunner (verbosity = 2 ).run (suite )
119165 if not res .wasSuccessful () and args .retry :
120166 print '==========================================='
@@ -132,6 +178,8 @@ def load_tests_by_pattern(search_dir, pattern):
132178 finally :
133179 # stop debugger
134180 debug_backend .stop ()
181+ if board_uart_reader :
182+ board_uart_reader .stop ()
135183 # check results
136184 if not res .wasSuccessful ():
137185 sys .exit (- 1 )
@@ -160,19 +208,21 @@ def load_tests_by_pattern(search_dir, pattern):
160208 User can specify several strings separated by space. Wildcards (*) are supported in <module> and <test_case> parts""" ,
161209 default = '*' )
162210 parser .add_argument ('--no-load' , '-n' ,
163- help = 'Do not load test app binaries' ,
211+ help = 'Do not load test app binaries' ,
164212 action = 'store_true' , default = False )
165213 parser .add_argument ('--retry' , '-r' ,
166- help = 'Try to re0run failed tests' ,
214+ help = 'Try to re0run failed tests' ,
167215 action = 'store_true' , default = False )
168216 parser .add_argument ('--stats-file' , '-k' ,
169217 help = 'Path to log file to store profiler stats. Use "stdout" to print.' ,
170218 default = '' )
171219 parser .add_argument ('--debug' , '-d' ,
172- help = 'Debug level (0-4)' ,
220+ help = 'Debug level (0-4)' ,
173221 type = int , default = 2 )
174222 parser .add_argument ('--log-file' , '-l' ,
175223 help = 'Path to log file. Use "stdout" to log to console.' )
224+ parser .add_argument ('--serial-port' , '-u' ,
225+ help = 'Name of serial port to grab ESP32 UART output.' )
176226 args = parser .parse_args ()
177227 if len (args .stats_file ) > 0 :
178228 if args .stats_file == 'stdout' :
0 commit comments