From 28ea8d0c09990ab3239dd508dddb786ffae9e0eb Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:24:04 -0500 Subject: [PATCH] dsu bypass --- opendbc_repo/opendbc/car/toyota/carstate.py | 5 +- opendbc_repo/opendbc/car/toyota/interface.py | 7 +++ .../opendbc/car/toyota/tests/test_toyota.py | 59 ++++++++++++++++++- opendbc_repo/opendbc/car/toyota/values.py | 2 + 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/opendbc_repo/opendbc/car/toyota/carstate.py b/opendbc_repo/opendbc/car/toyota/carstate.py index e8c41a5df..fcd61e7de 100644 --- a/opendbc_repo/opendbc/car/toyota/carstate.py +++ b/opendbc_repo/opendbc/car/toyota/carstate.py @@ -96,7 +96,8 @@ class CarState(CarStateBase): cp_cam = can_parsers[Bus.cam] ret = structs.CarState() - cp_acc = cp_cam if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) else cp + dsu_bypass = bool(self.CP.flags & ToyotaFlags.DSU_BYPASS.value) + cp_acc = cp_cam if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) or dsu_bypass else cp if not self.CP.flags & ToyotaFlags.SECOC.value: self.gvc = cp.vl["VSC1S07"]["GVC"] @@ -188,7 +189,7 @@ class CarState(CarStateBase): conversion_factor = CV.KPH_TO_MS if is_metric else CV.MPH_TO_MS ret.cruiseState.speedCluster = cluster_set_speed * conversion_factor - if self.CP.carFingerprint in TSS2_CAR and not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value: + if dsu_bypass or (self.CP.carFingerprint in TSS2_CAR and not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value): # smartDSU can intercept ACC_CONTROL, so don't require it when it's no # longer forwarded on the PT bus. if not self.has_SDSU: diff --git a/opendbc_repo/opendbc/car/toyota/interface.py b/opendbc_repo/opendbc/car/toyota/interface.py index 95b156274..29cb7fd77 100644 --- a/opendbc_repo/opendbc/car/toyota/interface.py +++ b/opendbc_repo/opendbc/car/toyota/interface.py @@ -60,6 +60,12 @@ class CarInterface(CarInterfaceBase): # sDSU / radar filter hardware needs the Toyota safety long-filter TX set. ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.LONG_FILTER.value + # A DSU bypass adapter reroutes the stock DSU messages to the camera bus. + # These messages are normally absent there on pre-TSS2 platforms. + camera_fingerprint = fingerprint.get(2, {}) + if not use_sdsu and candidate not in TSS2_CAR and (0x343 in camera_fingerprint or 0x4CB in camera_fingerprint): + ret.flags |= ToyotaFlags.DSU_BYPASS.value + # In TSS2 cars, the camera does long control found_ecus = [fw.ecu for fw in car_fw] @@ -137,6 +143,7 @@ class CarInterface(CarInterfaceBase): # - TSS2 radar ACC cars (disables radar) ret.openpilotLongitudinalControl = (use_sdsu or + bool(ret.flags & ToyotaFlags.DSU_BYPASS.value) or candidate in (TSS2_CAR - RADAR_ACC_CAR) or bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value)) diff --git a/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py b/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py index 020037c6d..12e4aaa26 100644 --- a/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py +++ b/opendbc_repo/opendbc/car/toyota/tests/test_toyota.py @@ -11,7 +11,7 @@ from opendbc.car.toyota import toyotacan from opendbc.car.toyota.carcontroller import CarController, get_long_tune, get_prius_positive_feedforward_scale, limit_interceptor_pcm_accel, \ limit_interceptor_stopping_accel, limit_no_lead_cruise_sign_flip, \ limit_prius_stopping_accel, update_permit_braking -from opendbc.car.toyota.carstate import LKAS_BUTTON_CAR, calculate_interceptor_gas_pressed, create_lkas_button_events +from opendbc.car.toyota.carstate import CarState, LKAS_BUTTON_CAR, calculate_interceptor_gas_pressed, create_lkas_button_events from opendbc.car.toyota.fingerprints import FW_VERSIONS from opendbc.car.toyota.interface import CarInterface from opendbc.car.toyota.radar_interface import RadarInterface, TSSP_RADAR_EGO_SPEED_SCALE @@ -82,6 +82,63 @@ class TestToyotaInterfaces: assert abs(car_params.vEgoStopping - 0.25) < 1e-6 assert abs(car_params.vEgoStarting - 0.25) < 1e-6 + @pytest.mark.parametrize("camera_message", [0x343, 0x4CB]) + def test_dsu_bypass_enables_longitudinal(self, camera_message): + fingerprint = {bus: {} for bus in range(8)} + fingerprint[2][camera_message] = 8 + + car_params = CarInterface.get_params( + CAR.TOYOTA_COROLLA, + fingerprint, + [], + alpha_long=False, + is_release=False, + docs=False, + starpilot_toggles=SimpleNamespace(), + ) + + assert car_params.flags & ToyotaFlags.DSU_BYPASS.value + assert car_params.openpilotLongitudinalControl + assert not car_params.safetyConfigs[0].safetyParam & ToyotaSafetyFlags.STOCK_LONGITUDINAL.value + + starpilot_params = CarInterface.get_starpilot_params( + CAR.TOYOTA_COROLLA, fingerprint, [], car_params, SimpleNamespace(), + ) + car_state = CarState(car_params, starpilot_params) + can_parsers = car_state.get_can_parsers(car_params) + car_state.update(can_parsers, SimpleNamespace(cluster_offset=1.0)) + + for message in ("ACC_CONTROL", "PRE_COLLISION", "PCS_HUD"): + assert message not in can_parsers[Bus.pt].vl + assert message in can_parsers[Bus.cam].vl + + def test_dsu_bypass_does_not_change_tss2_or_smart_dsu(self): + fingerprint = {bus: {} for bus in range(8)} + fingerprint[0][0x2FF] = 8 + fingerprint[2][0x343] = 8 + + smart_dsu_params = CarInterface.get_params( + CAR.TOYOTA_COROLLA, + fingerprint, + [], + alpha_long=False, + is_release=False, + docs=False, + starpilot_toggles=SimpleNamespace(), + ) + tss2_params = CarInterface.get_params( + CAR.TOYOTA_CAMRY_TSS2, + fingerprint, + [], + alpha_long=False, + is_release=False, + docs=False, + starpilot_toggles=SimpleNamespace(), + ) + + assert not smart_dsu_params.flags & ToyotaFlags.DSU_BYPASS.value + assert not tss2_params.flags & ToyotaFlags.DSU_BYPASS.value + def test_camry_hybrid_continental_radar_uses_ths_longitudinal_tune(self): fingerprint = {bus: ({0x2FF: 8} if bus == 0 else {}) for bus in range(8)} hybrid_fw = [CarParams.CarFw(ecu=Ecu.hybrid, address=0x7D2, fwVersion=b"test")] diff --git a/opendbc_repo/opendbc/car/toyota/values.py b/opendbc_repo/opendbc/car/toyota/values.py index daab53fe6..1517ca4db 100644 --- a/opendbc_repo/opendbc/car/toyota/values.py +++ b/opendbc_repo/opendbc/car/toyota/values.py @@ -64,6 +64,8 @@ class ToyotaFlags(IntFlag): # Detected flags HYBRID = 1 DISABLE_RADAR = 4 + # The DSU's ACC messages are rerouted through the camera bus by an adapter. + DSU_BYPASS = 8192 # Static flags TSS2 = 8