|
|
|
@ -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] |
|
|
|
|