6
6
import argparse
7
7
import unittest
8
8
import tempfile
9
+ import serial
10
+ import threading
9
11
import cProfile , pstats
10
12
import debug_backend , debug_backend_tests
11
13
27
29
}
28
30
}
29
31
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
+
30
66
def 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 )
31
74
log_formatter = logging .Formatter ('%(asctime)-15s %(name)s: %(levelname)s - %(message)s' )
32
75
ch = logging .StreamHandler ()
33
76
ch .setFormatter (log_formatter )
@@ -58,6 +101,9 @@ def setup_logger(logger, conh, fileh):
58
101
setup_logger (debug_backend .Oocd .get_logger (), ch , fh )
59
102
setup_logger (debug_backend .Gdb .get_logger (), ch , fh )
60
103
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 ()
61
107
board_tcl = BOARD_TCL_CONFIG [args .board_type ]
62
108
# start debugger, ideally we should run all tests w/o restarting it
63
109
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):
114
160
for m in suite .modules :
115
161
setup_logger (suite .modules [m ].get_logger (), ch , fh )
116
162
suite .load_app_bins = not args .no_load
117
- try :
163
+ try :
118
164
res = unittest .TextTestRunner (verbosity = 2 ).run (suite )
119
165
if not res .wasSuccessful () and args .retry :
120
166
print '==========================================='
@@ -132,6 +178,8 @@ def load_tests_by_pattern(search_dir, pattern):
132
178
finally :
133
179
# stop debugger
134
180
debug_backend .stop ()
181
+ if board_uart_reader :
182
+ board_uart_reader .stop ()
135
183
# check results
136
184
if not res .wasSuccessful ():
137
185
sys .exit (- 1 )
@@ -160,19 +208,21 @@ def load_tests_by_pattern(search_dir, pattern):
160
208
User can specify several strings separated by space. Wildcards (*) are supported in <module> and <test_case> parts""" ,
161
209
default = '*' )
162
210
parser .add_argument ('--no-load' , '-n' ,
163
- help = 'Do not load test app binaries' ,
211
+ help = 'Do not load test app binaries' ,
164
212
action = 'store_true' , default = False )
165
213
parser .add_argument ('--retry' , '-r' ,
166
- help = 'Try to re0run failed tests' ,
214
+ help = 'Try to re0run failed tests' ,
167
215
action = 'store_true' , default = False )
168
216
parser .add_argument ('--stats-file' , '-k' ,
169
217
help = 'Path to log file to store profiler stats. Use "stdout" to print.' ,
170
218
default = '' )
171
219
parser .add_argument ('--debug' , '-d' ,
172
- help = 'Debug level (0-4)' ,
220
+ help = 'Debug level (0-4)' ,
173
221
type = int , default = 2 )
174
222
parser .add_argument ('--log-file' , '-l' ,
175
223
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.' )
176
226
args = parser .parse_args ()
177
227
if len (args .stats_file ) > 0 :
178
228
if args .stats_file == 'stdout' :
0 commit comments