@ -24,6 +24,7 @@ from panda.tests.libpanda import libpanda_py
from openpilot . selfdrive . test . helpers import SKIP_ENV_VAR
PandaType = log . PandaState . PandaType
SafetyModel = car . CarParams . SafetyModel
NUM_JOBS = int ( os . environ . get ( " NUM_JOBS " , " 1 " ) )
JOB_ID = int ( os . environ . get ( " JOB_ID " , " 0 " ) )
@ -70,6 +71,7 @@ class TestCarModelBase(unittest.TestCase):
ci : bool = True
can_msgs : List [ capnp . lib . capnp . _DynamicStructReader ]
elm_frame : Optional [ int ]
@unittest . skipIf ( SKIP_ENV_VAR in os . environ , f " Long running test skipped. Unset { SKIP_ENV_VAR } to run " )
@classmethod
@ -105,6 +107,7 @@ class TestCarModelBase(unittest.TestCase):
car_fw = [ ]
can_msgs = [ ]
cls . elm_frame = None
fingerprint = defaultdict ( dict )
experimental_long = False
enabled_toggle = True
@ -130,6 +133,16 @@ class TestCarModelBase(unittest.TestCase):
if param . key == ' OpenpilotEnabledToggle ' :
enabled_toggle = param . value . strip ( b ' \x00 ' ) == b ' 1 '
# Log which can frame the panda safety mode left ELM327, for CAN validity checks
if msg . which ( ) == ' pandaStates ' :
for ps in msg . pandaStates :
if cls . elm_frame is None and ps . safetyModel != SafetyModel . elm327 :
cls . elm_frame = len ( can_msgs )
elif msg . which ( ) == ' pandaStateDEPRECATED ' :
if cls . elm_frame is None and msg . pandaStateDEPRECATED . safetyModel != SafetyModel . elm327 :
cls . elm_frame = len ( can_msgs )
if len ( can_msgs ) > int ( 50 / DT_CTRL ) :
break
else :
@ -204,8 +217,10 @@ class TestCarModelBase(unittest.TestCase):
RI = RadarInterface ( self . CP )
assert RI
# Since OBD port is multiplexed to bus 1 (commonly radar bus) while fingerprinting,
# start parsing CAN messages after we've left ELM mode and can expect CAN traffic
error_cnt = 0
for i , msg in enumerate ( self . can_msgs ) :
for i , msg in enumerate ( self . can_msgs [ self . elm_frame : ] ) :
rr = RI . update ( ( msg . as_builder ( ) . to_bytes ( ) , ) )
if rr is not None and i > 50 :
error_cnt + = car . RadarData . Error . canError in rr . errors
@ -238,9 +253,9 @@ class TestCarModelBase(unittest.TestCase):
if t > 1e6 :
self . assertTrue ( self . safety . addr_checks_valid ( ) )
# No need to check relay malfunction on disabled routes (relay closed) or for reasonable fingerprinting time
# TODO: detect when relay has flipped to properly check relay malfunction
if self . openpilot_enabled and t > 5e6 :
# No need to check relay malfunction on disabled routes (relay closed),
# or before fingerprinting is done (1s of tolerance to exit silent mode)
if self . openpilot_enabled and t / 1e4 > ( self . elm_frame + 100 ) :
self . assertFalse ( self . safety . get_relay_malfunction ( ) )
else :
self . safety . set_relay_malfunction ( False )