27
27
PROC_REPLAY_DIR = os .path .dirname (os .path .abspath (__file__ ))
28
28
FAKEDATA = os .path .join (PROC_REPLAY_DIR , "fakedata/" )
29
29
30
- ProcessConfig = namedtuple ('ProcessConfig' , ['proc_name' , 'pub_sub' , 'ignore' , 'init_callback' , 'should_recv_callback' , 'tolerance' , 'fake_pubsubmaster' , 'submaster_config' ], defaults = ({},))
30
+ ProcessConfig = namedtuple ('ProcessConfig' , ['proc_name' , 'pub_sub' , 'ignore' , 'init_callback' , 'should_recv_callback' , 'tolerance' , 'fake_pubsubmaster' , 'submaster_config' , 'environ' , 'subtest_name' ], defaults = ({}, {}, "" ))
31
31
32
32
33
33
def wait_for_event (evt ):
34
34
if not evt .wait (TIMEOUT ):
35
35
if threading .currentThread ().getName () == "MainThread" :
36
36
# tested process likely died. don't let test just hang
37
- raise Exception ("Timeout reached. Tested process likely crashed." )
37
+ raise Exception (f "Timeout reached. Tested process { os . environ [ 'PROC_NAME' ] } likely crashed." )
38
38
else :
39
39
# done testing this process, let it die
40
40
sys .exit (0 )
@@ -190,6 +190,7 @@ def get_car_params(msgs, fsm, can_sock, fingerprint):
190
190
_ , CP = get_car (can , sendcan )
191
191
Params ().put ("CarParams" , CP .to_bytes ())
192
192
193
+
193
194
def controlsd_rcv_callback (msg , CP , cfg , fsm ):
194
195
# no sendcan until controlsd is initialized
195
196
socks = [s for s in cfg .pub_sub [msg .which ()] if
@@ -198,6 +199,7 @@ def controlsd_rcv_callback(msg, CP, cfg, fsm):
198
199
socks .remove ("sendcan" )
199
200
return socks , len (socks ) > 0
200
201
202
+
201
203
def radar_rcv_callback (msg , CP , cfg , fsm ):
202
204
if msg .which () != "can" :
203
205
return [], False
@@ -240,7 +242,7 @@ def laika_rcv_callback(msg, CP, cfg, fsm):
240
242
if msg .ubloxGnss .which () == "measurementReport" :
241
243
return ["gnssMeasurements" ], True
242
244
else :
243
- return [], False
245
+ return [], True
244
246
245
247
246
248
CONFIGS = [
@@ -345,6 +347,19 @@ def laika_rcv_callback(msg, CP, cfg, fsm):
345
347
tolerance = None ,
346
348
fake_pubsubmaster = False ,
347
349
),
350
+ ProcessConfig (
351
+ proc_name = "laikad" ,
352
+ subtest_name = "Offline" ,
353
+ pub_sub = {
354
+ "ubloxGnss" : ["gnssMeasurements" ],
355
+ },
356
+ ignore = ["logMonoTime" ],
357
+ init_callback = get_car_params ,
358
+ should_recv_callback = laika_rcv_callback ,
359
+ tolerance = NUMPY_TOLERANCE ,
360
+ fake_pubsubmaster = True ,
361
+ environ = {"LAIKAD_NO_INTERNET" : "1" },
362
+ ),
348
363
ProcessConfig (
349
364
proc_name = "laikad" ,
350
365
pub_sub = {
@@ -366,7 +381,8 @@ def replay_process(cfg, lr, fingerprint=None):
366
381
else :
367
382
return cpp_replay_process (cfg , lr , fingerprint )
368
383
369
- def setup_env (simulation = False , CP = None ):
384
+
385
+ def setup_env (simulation = False , CP = None , cfg = None ):
370
386
params = Params ()
371
387
params .clear_all ()
372
388
params .put_bool ("OpenpilotEnabledToggle" , True )
@@ -380,6 +396,16 @@ def setup_env(simulation=False, CP=None):
380
396
os .environ ['SKIP_FW_QUERY' ] = ""
381
397
os .environ ['FINGERPRINT' ] = ""
382
398
399
+ if cfg is not None :
400
+ # Clear all custom processConfig environment variables
401
+ for cfg in CONFIGS :
402
+ for k , _ in cfg .environ .items ():
403
+ if k in os .environ :
404
+ del os .environ [k ]
405
+
406
+ os .environ .update (cfg .environ )
407
+ os .environ ['PROC_NAME' ] = cfg .proc_name
408
+
383
409
if simulation :
384
410
os .environ ["SIMULATION" ] = "1"
385
411
elif "SIMULATION" in os .environ :
@@ -396,6 +422,7 @@ def setup_env(simulation=False, CP=None):
396
422
os .environ ['SKIP_FW_QUERY' ] = "1"
397
423
os .environ ['FINGERPRINT' ] = CP .carFingerprint
398
424
425
+
399
426
def python_replay_process (cfg , lr , fingerprint = None ):
400
427
sub_sockets = [s for _ , sub in cfg .pub_sub .items () for s in sub ]
401
428
pub_sockets = [s for s in cfg .pub_sub .keys () if s != 'can' ]
@@ -413,10 +440,10 @@ def python_replay_process(cfg, lr, fingerprint=None):
413
440
if fingerprint is not None :
414
441
os .environ ['SKIP_FW_QUERY' ] = "1"
415
442
os .environ ['FINGERPRINT' ] = fingerprint
416
- setup_env ()
443
+ setup_env (cfg = cfg )
417
444
else :
418
445
CP = [m for m in lr if m .which () == 'carParams' ][0 ].carParams
419
- setup_env (CP = CP )
446
+ setup_env (CP = CP , cfg = cfg )
420
447
421
448
assert (type (managed_processes [cfg .proc_name ]) is PythonProcess )
422
449
managed_processes [cfg .proc_name ].prepare ()
@@ -477,7 +504,7 @@ def cpp_replay_process(cfg, lr, fingerprint=None):
477
504
log_msgs = []
478
505
479
506
# We need to fake SubMaster alive since we can't inject a fake clock
480
- setup_env (simulation = True )
507
+ setup_env (simulation = True , cfg = cfg )
481
508
482
509
managed_processes [cfg .proc_name ].prepare ()
483
510
managed_processes [cfg .proc_name ].start ()
0 commit comments