diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index de9baab3bf..59fa5c662d 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -26,6 +26,8 @@ from openpilot.selfdrive.test.helpers import SKIP_ENV_VAR PandaType = log.PandaState.PandaType SafetyModel = car.CarParams.SafetyModel +RELAY_CLOSED_MODES = (SafetyModel.silent, SafetyModel.elm327, SafetyModel.noOutput) + NUM_JOBS = int(os.environ.get("NUM_JOBS", "1")) JOB_ID = int(os.environ.get("JOB_ID", "0")) INTERNAL_SEG_LIST = os.environ.get("INTERNAL_SEG_LIST", "") @@ -72,6 +74,7 @@ class TestCarModelBase(unittest.TestCase): can_msgs: List[capnp.lib.capnp._DynamicStructReader] elm_frame: Optional[int] + relay_open_frame: Optional[int] @unittest.skipIf(SKIP_ENV_VAR in os.environ, f"Long running test skipped. Unset {SKIP_ENV_VAR} to run") @classmethod @@ -107,11 +110,11 @@ class TestCarModelBase(unittest.TestCase): car_fw = [] can_msgs = [] - cls.elm_frame = None + cls.elm_frame = None # can frame when bus 1 is not multiplexed (from fingerprinting) + cls.relay_open_frame = None # can frame when/if relay opens fingerprint = defaultdict(dict) experimental_long = False - enabled_toggle = True - dashcam_only = False + safety_models: List[SafetyModel] = [SafetyModel.elm327] for msg in lr: if msg.which() == "can": can_msgs.append(msg) @@ -120,37 +123,31 @@ class TestCarModelBase(unittest.TestCase): if m.src < 64: fingerprint[m.src][m.address] = len(m.dat) + # Log which can frame the panda safety mode left ELM327, for CAN validity checks. + # And when the relay opened for the relay malfunction check + if cls.elm_frame is None and any(model != SafetyModel.elm327 for model in safety_models): + cls.elm_frame = len(can_msgs) + if cls.relay_open_frame is None and any(model not in RELAY_CLOSED_MODES for model in safety_models): + cls.relay_open_frame = len(can_msgs) + elif msg.which() == "carParams": car_fw = msg.carParams.carFw - dashcam_only = msg.carParams.dashcamOnly if msg.carParams.openpilotLongitudinalControl: experimental_long = True if cls.car_model is None and not cls.ci: cls.car_model = msg.carParams.carFingerprint - elif msg.which() == 'initData': - for param in msg.initData.params.entries: - 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) + safety_models = [ps.safetyModel for ps in msg.pandaStates] elif msg.which() == 'pandaStateDEPRECATED': - if cls.elm_frame is None and msg.pandaStateDEPRECATED.safetyModel != SafetyModel.elm327: - cls.elm_frame = len(can_msgs) + safety_models = [msg.pandaStateDEPRECATED.safetyModel] if len(can_msgs) > int(50 / DT_CTRL): break else: raise Exception(f"Route: {repr(cls.test_route.route)} with segments: {test_segs} not found or no CAN msgs found. Is it uploaded?") - # if relay is expected to be open in the route - cls.openpilot_enabled = enabled_toggle and not dashcam_only - cls.can_msgs = sorted(can_msgs, key=lambda msg: msg.logMonoTime) cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.car_model]