From e82f8aa23c000ba02aee21bececa8e709543738a Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 14 Mar 2023 20:57:52 -0400 Subject: [PATCH 01/37] VW MLB: Audi A4/S4 --- opendbc | 2 +- panda | 2 +- selfdrive/car/tests/routes.py | 1 + selfdrive/car/tests/test_models.py | 2 +- selfdrive/car/torque_data/substitute.yaml | 1 + selfdrive/car/volkswagen/carcontroller.py | 12 +- selfdrive/car/volkswagen/carstate.py | 302 +++++++++++++++++----- selfdrive/car/volkswagen/interface.py | 19 +- selfdrive/car/volkswagen/mlbcan.py | 39 +++ selfdrive/car/volkswagen/values.py | 65 ++++- 10 files changed, 359 insertions(+), 86 deletions(-) create mode 100644 selfdrive/car/volkswagen/mlbcan.py diff --git a/opendbc b/opendbc index 510bfc06954e31..8ed5fdcaeb4925 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 510bfc06954e31257f8d8de17adf92f9a68a1b71 +Subproject commit 8ed5fdcaeb492559a44fd9a8ac6d36ceee86a700 diff --git a/panda b/panda index b231281c8b2c79..bb9cd1ee50fb89 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit b231281c8b2c79c46892576dee4c8a56d5e0b2d2 +Subproject commit bb9cd1ee50fb898d838480210e59b4ac60cd1385 diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 4ca7c0a16c9644..cd6d27c1d53751 100644 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -202,6 +202,7 @@ CarTestRoute("a459f4556782eba1|2021-09-19--09-48-00", VOLKSWAGEN.TRANSPORTER_T61), CarTestRoute("0cd0b7f7e31a3853|2021-11-18--00-38-32", VOLKSWAGEN.TROC_MK1), CarTestRoute("07667b885add75fd|2021-01-23--19-48-42", VOLKSWAGEN.AUDI_A3_MK3), + CarTestRoute("6b170e78d823566b|2023-01-18--21-28-08", VOLKSWAGEN.AUDI_A4_MK4), CarTestRoute("6c6b466346192818|2021-06-06--14-17-47", VOLKSWAGEN.AUDI_Q2_MK1), CarTestRoute("0cd0b7f7e31a3853|2021-12-03--03-12-05", VOLKSWAGEN.AUDI_Q3_MK2), CarTestRoute("8f205bdd11bcbb65|2021-03-26--01-00-17", VOLKSWAGEN.SEAT_ATECA_MK1), diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 6fbe1436f10836..ce93901c7385de 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -47,7 +47,7 @@ class TestCarModelBase(unittest.TestCase): car_model = None test_route = None - ci = True + ci = False @unittest.skipIf(SKIP_ENV_VAR in os.environ, f"Long running test skipped. Unset {SKIP_ENV_VAR} to run") @classmethod diff --git a/selfdrive/car/torque_data/substitute.yaml b/selfdrive/car/torque_data/substitute.yaml index 696d9829d13716..8cd62f288a0aae 100644 --- a/selfdrive/car/torque_data/substitute.yaml +++ b/selfdrive/car/torque_data/substitute.yaml @@ -67,6 +67,7 @@ VOLKSWAGEN T-ROC 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN T-CROSS 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN TOURAN 2ND GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN TRANSPORTER T6.1: VOLKSWAGEN TIGUAN 2ND GEN +AUDI A4 4TH GEN: VOLKSWAGEN TIGUAN 2ND GEN AUDI Q2 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN TAOS 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN POLO 6TH GEN: VOLKSWAGEN GOLF 7TH GEN diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index c17b6324507222..068ad59fd066da 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -4,8 +4,8 @@ from common.conversions import Conversions as CV from common.realtime import DT_CTRL from selfdrive.car import apply_driver_steer_torque_limits -from selfdrive.car.volkswagen import mqbcan, pqcan -from selfdrive.car.volkswagen.values import CANBUS, PQ_CARS, CarControllerParams +from selfdrive.car.volkswagen import mlbcan, mqbcan, pqcan +from selfdrive.car.volkswagen.values import CANBUS, MLB_CARS, PQ_CARS, CarControllerParams VisualAlert = car.CarControl.HUDControl.VisualAlert LongCtrlState = car.CarControl.Actuators.LongControlState @@ -15,9 +15,15 @@ class CarController: def __init__(self, dbc_name, CP, VM): self.CP = CP self.CCP = CarControllerParams(CP) - self.CCS = pqcan if CP.carFingerprint in PQ_CARS else mqbcan self.packer_pt = CANPacker(dbc_name) + if CP.carFingerprint in PQ_CARS: + self.CCS = pqcan + elif CP.carFingerprint in MLB_CARS: + self.CCS = mlbcan + else: + self.CCS = mqbcan + self.apply_steer_last = 0 self.gra_acc_counter_last = None self.frame = 0 diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 64d124688043a5..e174449687f0a9 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -3,8 +3,8 @@ from common.conversions import Conversions as CV from selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser -from selfdrive.car.volkswagen.values import DBC, CANBUS, PQ_CARS, NetworkLocation, TransmissionType, GearShifter, \ - CarControllerParams +from selfdrive.car.volkswagen.values import DBC, CANBUS, MLB_CARS, PQ_CARS, NetworkLocation, TransmissionType,\ + GearShifter, CarControllerParams class CarState(CarStateBase): @@ -12,6 +12,7 @@ def __init__(self, CP): super().__init__(CP) self.CCP = CarControllerParams(CP) self.button_states = {button.event_type: False for button in self.CCP.BUTTONS} + self.acc_type = False self.esp_hold_confirmation = False self.upscale_lead_car_signal = False @@ -34,13 +35,116 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): return self.update_pq(pt_cp, cam_cp, ext_cp, trans_type) ret = car.CarState.new_message() - # Update vehicle speed and acceleration from ABS wheel speeds. - ret.wheelSpeeds = self.get_wheel_speeds( - pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"], - pt_cp.vl["ESP_19"]["ESP_VR_Radgeschw_02"], - pt_cp.vl["ESP_19"]["ESP_HL_Radgeschw_02"], - pt_cp.vl["ESP_19"]["ESP_HR_Radgeschw_02"], - ) + + if self.CP.carFingerprint in MLB_CARS: + # MLB platform specific signals + ret.wheelSpeeds = self.get_wheel_speeds( + pt_cp.vl["ESP_03"]["ESP_VL_Radgeschw"], + pt_cp.vl["ESP_03"]["ESP_VR_Radgeschw"], + pt_cp.vl["ESP_03"]["ESP_HL_Radgeschw"], + pt_cp.vl["ESP_03"]["ESP_HR_Radgeschw"], + ) + ret.gas = pt_cp.vl["Motor_03"]["MO_Fahrpedalrohwert_01"] / 100.0 + ret.gasPressed = ret.gas > 0 + brake_pedal_pressed = bool(pt_cp.vl["Motor_03"]["MO_Fahrer_bremst"]) + ret.espDisabled = pt_cp.vl["ESP_01"]["ESP_Tastung_passiv"] != 0 + + # TODO: find gearshift signal + ret.gearShifter = GearShifter.drive + + # TODO: this is only present on powertrain + #ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"], + # pt_cp.vl["Gateway_05"]["BT_Tuer_geoeffnet"], + # pt_cp.vl["Gateway_05"]["HL_Tuer_geoeffnet"], + # pt_cp.vl["Gateway_05"]["HR_Tuer_geoeffnet"]]) + + # TODO: is this the instantaneous or the comfort blink signal? + ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_links"]) + ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_rechts"]) + + # Update ACC radar status. + # TODO: find an explicit ACC main switch state + if pt_cp.vl["TSK_02"]["TSK_Status"] == 0: + # ACC okay and enabled, but not currently engaged + ret.cruiseState.available = True + ret.cruiseState.enabled = False + elif pt_cp.vl["TSK_02"]["TSK_Status"] in (1, 2): + # ACC okay and enabled, currently regulating speed (1) or driver override (2) + ret.cruiseState.available = True + ret.cruiseState.enabled = True + else: + # ACC disabled due to error (3) + ret.cruiseState.available = False + ret.cruiseState.enabled = False + ret.accFaulted = True + + self.gra_stock_values = pt_cp.vl["LS_01"] + + else: + # MQB platform specific signals + ret.wheelSpeeds = self.get_wheel_speeds( + pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_VR_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_HL_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_HR_Radgeschw_02"], + ) + + ret.gas = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] / 100.0 + ret.gasPressed = ret.gas > 0 + brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) + self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) + ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 + + # Digital instrument clusters expect the ACC HUD lead car distance to be scaled differently + self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) + + if trans_type == TransmissionType.automatic: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_11"]["GE_Fahrstufe"], None)) + elif trans_type == TransmissionType.direct: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["EV_Gearshift"]["GearPosition"], None)) + elif trans_type == TransmissionType.manual: + ret.clutchPressed = not pt_cp.vl["Motor_14"]["MO_Kuppl_schalter"] + if bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]): + ret.gearShifter = GearShifter.reverse + else: + ret.gearShifter = GearShifter.drive + + ret.doorOpen = any([pt_cp.vl["Gateway_72"]["ZV_FT_offen"], + pt_cp.vl["Gateway_72"]["ZV_BT_offen"], + pt_cp.vl["Gateway_72"]["ZV_HFS_offen"], + pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], + pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) + + # Update ACC radar status. + if pt_cp.vl["TSK_06"]["TSK_Status"] == 2: + # ACC okay and enabled, but not currently engaged + ret.cruiseState.available = True + ret.cruiseState.enabled = False + elif pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5): + # ACC okay and enabled, currently regulating speed (3) or driver accel override (4) or brake only (5) + ret.cruiseState.available = True + ret.cruiseState.enabled = True + else: + # ACC okay but disabled (1), or a radar visibility or other fault/disruption (6 or 7) + ret.cruiseState.available = False + ret.cruiseState.enabled = False + ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) + + self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] + + # Stock FCW is considered active if the release bit for brake-jerk warning + # is set. Stock AEB considered active if the partial braking or target + # braking release bits are set. + # Refer to VW Self Study Program 890253: Volkswagen Driver Assistance + # Systems, chapter on Front Assist with Braking: Golf Family for all MQB + ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"]) + ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"]) + + self.acc_type = ext_cp.vl["ACC_06"]["ACC_Typ"] + ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Left"]) + ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) + + # Common MLB/MQB signal handling ret.vEgoRaw = float(np.mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])) ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) @@ -60,32 +164,10 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED") # Update gas, brakes, and gearshift. - ret.gas = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] / 100.0 - ret.gasPressed = ret.gas > 0 ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects - brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"]) ret.brakePressed = brake_pedal_pressed or brake_pressure_detected - ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # FIXME: need to include an EPB check as well - - # Update gear and/or clutch position data. - if trans_type == TransmissionType.automatic: - ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_11"]["GE_Fahrstufe"], None)) - elif trans_type == TransmissionType.direct: - ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["EV_Gearshift"]["GearPosition"], None)) - elif trans_type == TransmissionType.manual: - ret.clutchPressed = not pt_cp.vl["Motor_14"]["MO_Kuppl_schalter"] - if bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]): - ret.gearShifter = GearShifter.reverse - else: - ret.gearShifter = GearShifter.drive - - # Update door and trunk/hatch lid open status. - ret.doorOpen = any([pt_cp.vl["Gateway_72"]["ZV_FT_offen"], - pt_cp.vl["Gateway_72"]["ZV_BT_offen"], - pt_cp.vl["Gateway_72"]["ZV_HFS_offen"], - pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], - pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) + ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # Update seatbelt fastened status. ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 @@ -100,50 +182,18 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): # and capture it for forwarding to the blind spot radar controller self.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} - # Stock FCW is considered active if the release bit for brake-jerk warning - # is set. Stock AEB considered active if the partial braking or target - # braking release bits are set. - # Refer to VW Self Study Program 890253: Volkswagen Driver Assistance - # Systems, chapter on Front Assist with Braking: Golf Family for all MQB - ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"]) - ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"]) - - # Update ACC radar status. - self.acc_type = ext_cp.vl["ACC_06"]["ACC_Typ"] - if pt_cp.vl["TSK_06"]["TSK_Status"] == 2: - # ACC okay and enabled, but not currently engaged - ret.cruiseState.available = True - ret.cruiseState.enabled = False - elif pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5): - # ACC okay and enabled, currently regulating speed (3) or driver accel override (4) or brake only (5) - ret.cruiseState.available = True - ret.cruiseState.enabled = True - else: - # ACC okay but disabled (1), or a radar visibility or other fault/disruption (6 or 7) - ret.cruiseState.available = False - ret.cruiseState.enabled = False - self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation - ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) # Update ACC setpoint. When the setpoint is zero or there's an error, the # radar sends a set-speed of ~90.69 m/s / 203mph. - if self.CP.pcmCruise: + # TODO: ugly hack while testing CC-only S4 + if self.CP.pcmCruise and self.CP.carFingerprint not in MLB_CARS: ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS if ret.cruiseState.speed > 90: ret.cruiseState.speed = 0 # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough - ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Left"]) - ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) - self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] - - # Additional safety checks performed in CarInterface. - ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 - - # Digital instrument clusters expect the ACC HUD lead car distance to be scaled differently - self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) return ret @@ -253,6 +303,8 @@ def update_pq(self, pt_cp, cam_cp, ext_cp, trans_type): def get_can_parser(CP): if CP.carFingerprint in PQ_CARS: return CarState.get_can_parser_pq(CP) + elif CP.carFingerprint in MLB_CARS: + return CarState.get_can_parser_mlb(CP) signals = [ # sig_name, sig_address @@ -344,6 +396,8 @@ def get_can_parser(CP): def get_cam_can_parser(CP): if CP.carFingerprint in PQ_CARS: return CarState.get_cam_can_parser_pq(CP) + elif CP.carFingerprint in MLB_CARS: + return CarState.get_cam_can_parser_mlb(CP) signals = [] checks = [] @@ -371,6 +425,122 @@ def get_cam_can_parser(CP): return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.cam) + @staticmethod + def get_can_parser_mlb(CP): + + signals = [ + # sig_name, sig_address + ("LWI_Lenkradwinkel", "LWI_01"), # Absolute steering angle + ("LWI_VZ_Lenkradwinkel", "LWI_01"), # Steering angle sign + ("LWI_Lenkradw_Geschw", "LWI_01"), # Absolute steering rate + ("LWI_VZ_Lenkradw_Geschw", "LWI_01"), # Steering rate sign + ("ESP_VL_Radgeschw", "ESP_03"), # ABS wheel speed, front left + ("ESP_VR_Radgeschw", "ESP_03"), # ABS wheel speed, front right + ("ESP_HL_Radgeschw", "ESP_03"), # ABS wheel speed, rear left + ("ESP_HR_Radgeschw", "ESP_03"), # ABS wheel speed, rear right + ("ESP_Gierrate", "ESP_02"), # Absolute yaw rate + ("ESP_VZ_Gierrate", "ESP_02"), # Yaw rate sign + #("FT_Tuer_geoeffnet", "Gateway_05"), # Door open, driver + #("BT_Tuer_geoeffnet", "Gateway_05"), # Door open, passenger + #("HL_Tuer_geoeffnet", "Gateway_05"), # Door open, rear left + #("HR_Tuer_geoeffnet", "Gateway_05"), # Door open, rear right + ("BM_links", "Blinkmodi_01"), # Left turn signal including comfort blink interval + ("BM_rechts", "Blinkmodi_01"), # Right turn signal including comfort blink interval + ("AB_Gurtschloss_FA", "Airbag_02"), # Seatbelt status, driver + ("AB_Gurtschloss_BF", "Airbag_02"), # Seatbelt status, passenger + ("ESP_Fahrer_bremst", "ESP_05"), # Driver applied brake pressure over threshold + ("MO_Fahrer_bremst", "Motor_03"), # Brake pedal switch + ("ESP_Bremsdruck", "ESP_05"), # Brake pressure + ("MO_Fahrpedalrohwert_01", "Motor_03"), # Accelerator pedal value + ("EPS_Lenkmoment", "LH_EPS_03"), # Absolute driver torque input + ("EPS_VZ_Lenkmoment", "LH_EPS_03"), # Driver torque input sign + ("EPS_HCA_Status", "LH_EPS_03"), # EPS HCA control status + ("ESP_Tastung_passiv", "ESP_01"), # Stability control disabled + ("KBI_Handbremse", "Kombi_01"), # Manual handbrake applied + ("TSK_Status", "TSK_02"), # ACC engagement status from drivetrain coordinator + ("LS_Hauptschalter", "LS_01"), # ACC button, on/off + ("LS_Abbrechen", "LS_01"), # ACC button, cancel + ("LS_Tip_Setzen", "LS_01"), # ACC button, set + ("LS_Tip_Hoch", "LS_01"), # ACC button, increase or accel + ("LS_Tip_Runter", "LS_01"), # ACC button, decrease or decel + ("LS_Tip_Wiederaufnahme", "LS_01"), # ACC button, resume + ("LS_Verstellung_Zeitluecke", "LS_01"), # ACC button, time gap adj + ("LS_Typ_Hauptschalter", "LS_01"), # ACC main button type + ("LS_Codierung", "LS_01"), # ACC button configuration/coding + ("LS_Tip_Stufe_2", "LS_01"), # unknown related to stalk type + ("LS_GRA_ACC_2stufig", "LS_01"), # unknown related to stalk type + ("COUNTER", "LS_01"), # GRA_ACC_01 CAN message counter + ] + + checks = [ + # sig_address, frequency + ("LWI_01", 100), # From J500 Steering Assist with integrated sensors + ("LH_EPS_03", 100), # From J500 Steering Assist with integrated sensors + ("Motor_03", 100), # From J623 Engine control module + ("ESP_03", 50), # From J104 ABS/ESP controller + ("ESP_05", 50), # From J104 ABS/ESP controller + ("ESP_02", 50), # From J104 ABS/ESP controller + ("ESP_01", 33), # From J104 ABS/ESP controller + ("LS_01", 5), # From J533 CAN gateway (via LIN from steering wheel controls) + ("TSK_02", 33), # From J623 Engine control module + #("Gateway_05", 10), # From J533 CAN gateway (aggregated data) + ("Airbag_02", 5), # From J234 Airbag control module + ("Kombi_01", 2), # From J285 Instrument cluster + ("Blinkmodi_01", 0), # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active) + ("Kombi_03", 0), # From J285 instrument cluster (not present on older cars, 1Hz when present) + ] + + # TODO: gear shift parsing + #if CP.transmissionType == TransmissionType.automatic: + # signals.append(("GE_Fahrstufe", "Getriebe_11")) # Auto trans gear selector position + # checks.append(("Getriebe_11", 20)) # From J743 Auto transmission control module + #elif CP.transmissionType == TransmissionType.direct: + # signals.append(("GearPosition", "EV_Gearshift")) # EV gear selector position + # checks.append(("EV_Gearshift", 10)) # From J??? unknown EV control module + #elif CP.transmissionType == TransmissionType.manual: + # signals += [("MO_Kuppl_schalter", "Motor_14"), # Clutch switch + # ("BCM1_Rueckfahrlicht_Schalter", "Gateway_72")] # Reverse light from BCM + + if CP.networkLocation == NetworkLocation.fwdCamera: + # Radars are here on CANBUS.pt + # TODO: enable radar, testing on CC only car + #signals += MqbExtraSignals.fwd_radar_signals + #checks += MqbExtraSignals.fwd_radar_checks + if CP.enableBsm: + signals += MqbExtraSignals.bsm_radar_signals + checks += MqbExtraSignals.bsm_radar_checks + + return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.pt) + + @staticmethod + def get_cam_can_parser_mlb(CP): + signals = [] + checks = [] + + if CP.networkLocation == NetworkLocation.fwdCamera: + signals += [ + # sig_name, sig_address + ("LDW_SW_Warnung_links", "LDW_02"), # Blind spot in warning mode on left side due to lane departure + ("LDW_SW_Warnung_rechts", "LDW_02"), # Blind spot in warning mode on right side due to lane departure + ("LDW_Seite_DLCTLC", "LDW_02"), # Direction of most likely lane departure (left or right) + ("LDW_DLC", "LDW_02"), # Lane departure, distance to line crossing + ("LDW_TLC", "LDW_02"), # Lane departure, time to line crossing + ] + checks += [ + # sig_address, frequency + ("LDW_02", 10) # From R242 Driver assistance camera + ] + else: + # Radars are here on CANBUS.cam + # TODO: enable radar, testing on CC only car + #signals += MqbExtraSignals.fwd_radar_signals + #checks += MqbExtraSignals.fwd_radar_checks + if CP.enableBsm: + signals += MqbExtraSignals.bsm_radar_signals + checks += MqbExtraSignals.bsm_radar_checks + + return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.cam) + @staticmethod def get_can_parser_pq(CP): signals = [ diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 2f8bd8661b95f4..0ed10353955833 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -3,7 +3,7 @@ from common.conversions import Conversions as CV from selfdrive.car import STD_CARGO_KG, get_safety_config from selfdrive.car.interfaces import CarInterfaceBase -from selfdrive.car.volkswagen.values import CAR, PQ_CARS, CANBUS, NetworkLocation, TransmissionType, GearShifter +from selfdrive.car.volkswagen.values import CAR, MLB_CARS, PQ_CARS, CANBUS, NetworkLocation, TransmissionType, GearShifter ButtonType = car.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName @@ -50,6 +50,19 @@ def _get_params(ret, candidate, fingerprint, car_fw, experimental_long): # Panda ALLOW_DEBUG firmware required. ret.dashcamOnly = True + elif candidate in MLB_CARS: + # Set global MLB parameters + ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.volkswagenMlb)] + ret.enableBsm = 0x30F in fingerprint[0] # SWA_01 + + # TODO: trans message/gear position ID + ret.transmissionType = TransmissionType.automatic + + if any(msg in fingerprint[1] for msg in (0x40, 0x86, 0x103)): # Airbag_01, LWI_01, ESP_03 + ret.networkLocation = NetworkLocation.gateway + else: + ret.networkLocation = NetworkLocation.fwdCamera + else: # Set global MQB parameters ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.volkswagen)] @@ -171,6 +184,10 @@ def _get_params(ret, candidate, fingerprint, car_fw, experimental_long): ret.mass = 1335 + STD_CARGO_KG ret.wheelbase = 2.61 + elif candidate == CAR.AUDI_A4_MK4: + ret.mass = 1650 + STD_CARGO_KG + ret.wheelbase = 2.81 + elif candidate == CAR.AUDI_Q2_MK1: ret.mass = 1205 + STD_CARGO_KG ret.wheelbase = 2.61 diff --git a/selfdrive/car/volkswagen/mlbcan.py b/selfdrive/car/volkswagen/mlbcan.py new file mode 100644 index 00000000000000..a12dbcb0278855 --- /dev/null +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -0,0 +1,39 @@ +def create_steering_control(packer, bus, apply_steer, lkas_enabled): + values = { + "SET_ME_0X3": 0x3, + "Assist_Torque": abs(apply_steer), + "Assist_Requested": lkas_enabled, + "Assist_VZ": 1 if apply_steer < 0 else 0, + "HCA_Available": 1, + "HCA_Standby": not lkas_enabled, + "HCA_Active": lkas_enabled, + "SET_ME_0XFE": 0xFE, + "SET_ME_0X07": 0x07, + } + return packer.make_can_msg("HCA_01", bus, values) + + +def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control): + values = ldw_stock_values.copy() + + values.update({ + "LDW_Status_LED_gelb": 1 if enabled and steering_pressed else 0, + "LDW_Status_LED_gruen": 1 if enabled and not steering_pressed else 0, + "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible, + "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible, + "LDW_Texte": hud_alert, + }) + return packer.make_can_msg("LDW_02", bus, values) + + +def create_acc_buttons_control(packer, bus, gra_stock_values, counter, cancel=False, resume=False): + values = gra_stock_values.copy() + + values.update({ + "COUNTER": counter, + "LS_Abbrechen": cancel, + "LS_Tip_Wiederaufnahme": resume, + }) + + return packer.make_can_msg("LS_01", bus, values) + diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 8e129239831616..4f234445f089a7 100755 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -70,20 +70,33 @@ def __init__(self, CP): self.STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50)) self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) - if CP.transmissionType == TransmissionType.automatic: - self.shifter_values = can_define.dv["Getriebe_11"]["GE_Fahrstufe"] - elif CP.transmissionType == TransmissionType.direct: - self.shifter_values = can_define.dv["EV_Gearshift"]["GearPosition"] self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"] - self.BUTTONS = [ - Button(car.CarState.ButtonEvent.Type.setCruise, "GRA_ACC_01", "GRA_Tip_Setzen", [1]), - Button(car.CarState.ButtonEvent.Type.resumeCruise, "GRA_ACC_01", "GRA_Tip_Wiederaufnahme", [1]), - Button(car.CarState.ButtonEvent.Type.accelCruise, "GRA_ACC_01", "GRA_Tip_Hoch", [1]), - Button(car.CarState.ButtonEvent.Type.decelCruise, "GRA_ACC_01", "GRA_Tip_Runter", [1]), - Button(car.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Abbrechen", [1]), - Button(car.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_ACC_01", "GRA_Verstellung_Zeitluecke", [1]), - ] + if CP.carFingerprint in MLB_CARS: + # TODO: populate shifter enums + self.shifter_values = None + self.BUTTONS = [ + Button(car.CarState.ButtonEvent.Type.setCruise, "LS_01", "LS_Tip_Setzen", [1]), + Button(car.CarState.ButtonEvent.Type.resumeCruise, "LS_01", "LS_Tip_Wiederaufnahme", [1]), + Button(car.CarState.ButtonEvent.Type.accelCruise, "LS_01", "LS_Tip_Hoch", [1]), + Button(car.CarState.ButtonEvent.Type.decelCruise, "LS_01", "LS_Tip_Runter", [1]), + Button(car.CarState.ButtonEvent.Type.cancel, "LS_01", "LS_Abbrechen", [1]), + Button(car.CarState.ButtonEvent.Type.gapAdjustCruise, "LS_01", "LS_Verstellung_Zeitluecke", [1]), + ] + else: + if CP.transmissionType == TransmissionType.automatic: + self.shifter_values = can_define.dv["Getriebe_11"]["GE_Fahrstufe"] + elif CP.transmissionType == TransmissionType.direct: + self.shifter_values = can_define.dv["EV_Gearshift"]["GearPosition"] + + self.BUTTONS = [ + Button(car.CarState.ButtonEvent.Type.setCruise, "GRA_ACC_01", "GRA_Tip_Setzen", [1]), + Button(car.CarState.ButtonEvent.Type.resumeCruise, "GRA_ACC_01", "GRA_Tip_Wiederaufnahme", [1]), + Button(car.CarState.ButtonEvent.Type.accelCruise, "GRA_ACC_01", "GRA_Tip_Hoch", [1]), + Button(car.CarState.ButtonEvent.Type.decelCruise, "GRA_ACC_01", "GRA_Tip_Runter", [1]), + Button(car.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Abbrechen", [1]), + Button(car.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_ACC_01", "GRA_Verstellung_Zeitluecke", [1]), + ] self.LDW_MESSAGES = { "none": 0, # Nothing to display @@ -125,6 +138,7 @@ class CAR: TRANSPORTER_T61 = "VOLKSWAGEN TRANSPORTER T6.1" # Chassis 7H/7L, T6-facelift Transporter/Multivan/Caravelle/California TROC_MK1 = "VOLKSWAGEN T-ROC 1ST GEN" # Chassis A1, Mk1 VW T-Roc and variants AUDI_A3_MK3 = "AUDI A3 3RD GEN" # Chassis 8V/FF, Mk3 Audi A3 and variants + AUDI_A4_MK4 = "AUDI A4 4TH GEN" # Chassis FL, Mk4 (B8) Audi A4 and S4 AUDI_Q2_MK1 = "AUDI Q2 1ST GEN" # Chassis GA, Mk1 Audi Q2 (RoW) and Q2L (China only) AUDI_Q3_MK2 = "AUDI Q3 2ND GEN" # Chassis 8U/F3/FS, Mk2 Audi Q3 and variants SEAT_ATECA_MK1 = "SEAT ATECA 1ST GEN" # Chassis 5F, Mk1 SEAT Ateca and CUPRA Ateca @@ -139,11 +153,13 @@ class CAR: PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2} - +MLB_CARS = {CAR.AUDI_A4_MK4} DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict("vw_mqb_2010", None)) for car_type in PQ_CARS: DBC[car_type] = dbc_dict("vw_golf_mk4", None) +for car_type in MLB_CARS: + DBC[car_type] = dbc_dict("vw_mlb", None) class Footnote(Enum): @@ -236,6 +252,10 @@ def init_make(self, CP: car.CarParams): VWCarInfo("Audi RS3 2018"), VWCarInfo("Audi S3 2015-17"), ], + CAR.AUDI_A4_MK4: [ + VWCarInfo("Audi A4 2015-16"), + VWCarInfo("Audi S4 2015-16"), + ], CAR.AUDI_Q2_MK1: VWCarInfo("Audi Q2 2018"), CAR.AUDI_Q3_MK2: VWCarInfo("Audi Q3 2019-23"), CAR.SEAT_ATECA_MK1: VWCarInfo("SEAT Ateca 2018"), @@ -915,6 +935,25 @@ def init_make(self, CP: car.CarParams): b'\xf1\x875Q0907572P \xf1\x890682', ], }, + CAR.AUDI_A4_MK4: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x878K5907551G \xf1\x890007', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x878K5927156D \xf1\x890003', + ], + # SRS needs to be probed on the test car + #(Ecu.srs, 0x715, None): [ + # b'\xf1\x875Q0959655BD\xf1\x890336\xf1\x82\x1311111111111100311211011231129321312111', + #], + (Ecu.eps, 0x712, None): [ + b'\xf1\x878K0909144J \xf1\x890509\xf1\x82\x01\n\x1a', + ], + # Test car lacks a radar + #(Ecu.fwdRadar, 0x757, None): [ + # b'\xf1\x872Q0907572M \xf1\x890233', + #], + }, CAR.AUDI_Q2_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704E906027JT\xf1\x894145', From 2124345142d7930e5b25ba9adbd395b3ec74a1a0 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 14 Mar 2023 20:59:19 -0400 Subject: [PATCH 02/37] revert that --- selfdrive/car/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index ce93901c7385de..6fbe1436f10836 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -47,7 +47,7 @@ class TestCarModelBase(unittest.TestCase): car_model = None test_route = None - ci = False + ci = True @unittest.skipIf(SKIP_ENV_VAR in os.environ, f"Long running test skipped. Unset {SKIP_ENV_VAR} to run") @classmethod From 350010b5bc67d56137e3acdf98b1780c687f036e Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 14 Mar 2023 21:24:09 -0400 Subject: [PATCH 03/37] add DBC to release files --- release/files_common | 1 + 1 file changed, 1 insertion(+) diff --git a/release/files_common b/release/files_common index a20f71018bb4f3..fd6fd2449c727c 100644 --- a/release/files_common +++ b/release/files_common @@ -573,6 +573,7 @@ opendbc/toyota_adas.dbc opendbc/toyota_tss2_adas.dbc opendbc/vw_golf_mk4.dbc +opendbc/vw_mlb.dbc opendbc/vw_mqb_2010.dbc opendbc/tesla_can.dbc From 5d3cddc143c4da8c56682a5985b3d9b7ca4c56ba Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 14 Mar 2023 21:36:52 -0400 Subject: [PATCH 04/37] retry CI From 4eca169e606647f291938e41f0118a8b6deecab7 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 14 Mar 2023 22:08:43 -0400 Subject: [PATCH 05/37] regen CARS.md --- docs/CARS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/CARS.md b/docs/CARS.md index 070d068cab8967..c6d2b24082d1d2 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma three. All supported cars provide a better experience than any stock system. -# 238 Supported Cars +# 240 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Harness|Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -13,10 +13,12 @@ A supported vehicle is one that just works when you install a comma three. All s |Acura|RDX 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|Honda Bosch A|| |Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| |Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| +|Audi|A4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| |Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| |Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| |Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| |Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| +|Audi|S4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,9](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|J533|| |Cadillac|Escalade 2017[3](#footnotes)|Driver Assist Package|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|OBD-II|| |Cadillac|Escalade ESV 2016[3](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|OBD-II|| |Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|GM|| From 825a65e16d97232e72015c78e0f508b298277843 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Fri, 17 Mar 2023 09:12:55 -0400 Subject: [PATCH 06/37] switch to lateral accel controller --- selfdrive/car/torque_data/override.yaml | 1 + selfdrive/car/torque_data/substitute.yaml | 1 - selfdrive/car/volkswagen/interface.py | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/torque_data/override.yaml b/selfdrive/car/torque_data/override.yaml index cc1681bce156e0..3cd4bb75cf8ee3 100644 --- a/selfdrive/car/torque_data/override.yaml +++ b/selfdrive/car/torque_data/override.yaml @@ -30,6 +30,7 @@ CADILLAC ESCALADE 2017: [1.899999976158142, 1.842270016670227, 0.112000003457069 CHEVROLET BOLT EUV 2022: [2.0, 2.0, 0.05] CHEVROLET SILVERADO 1500 2020: [1.9, 1.9, 0.112] CHEVROLET EQUINOX 2019: [2.0, 2.0, 0.05] +AUDI A4 4TH GEN: [1.4, 1.4, 0.1] VOLKSWAGEN PASSAT NMS: [2.5, 2.5, 0.1] VOLKSWAGEN SHARAN 2ND GEN: [2.5, 2.5, 0.1] HYUNDAI SANTA CRUZ 1ST GEN: [2.7, 2.7, 0.1] diff --git a/selfdrive/car/torque_data/substitute.yaml b/selfdrive/car/torque_data/substitute.yaml index 8cd62f288a0aae..696d9829d13716 100644 --- a/selfdrive/car/torque_data/substitute.yaml +++ b/selfdrive/car/torque_data/substitute.yaml @@ -67,7 +67,6 @@ VOLKSWAGEN T-ROC 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN T-CROSS 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN TOURAN 2ND GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN TRANSPORTER T6.1: VOLKSWAGEN TIGUAN 2ND GEN -AUDI A4 4TH GEN: VOLKSWAGEN TIGUAN 2ND GEN AUDI Q2 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN TAOS 1ST GEN: VOLKSWAGEN TIGUAN 2ND GEN VOLKSWAGEN POLO 6TH GEN: VOLKSWAGEN GOLF 7TH GEN diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 0ed10353955833..5c46c1fadb184b 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -187,6 +187,7 @@ def _get_params(ret, candidate, fingerprint, car_fw, experimental_long): elif candidate == CAR.AUDI_A4_MK4: ret.mass = 1650 + STD_CARGO_KG ret.wheelbase = 2.81 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.AUDI_Q2_MK1: ret.mass = 1205 + STD_CARGO_KG From 94bf11a165cb69e5c8c5f52c1c9185018dde470b Mon Sep 17 00:00:00 2001 From: Jason Young Date: Fri, 17 Mar 2023 09:17:57 -0400 Subject: [PATCH 07/37] adjust ramp rates and driver torque allowance --- panda | 2 +- selfdrive/car/volkswagen/values.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/panda b/panda index bb9cd1ee50fb89..e5449f1d4e84f7 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit bb9cd1ee50fb898d838480210e59b4ac60cd1385 +Subproject commit e5449f1d4e84f77e468b741b76bb73a80b516d9d diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index d0d33305f96a14..aedef4645ef281 100755 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -66,13 +66,14 @@ def __init__(self, CP): else: self.LDW_STEP = 10 # LDW_02 message frequency 10Hz self.ACC_HUD_STEP = 6 # ACC_02 message frequency 16Hz - self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm - self.STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50)) - self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"] if CP.carFingerprint in MLB_CARS: + self.STEER_DRIVER_ALLOWANCE = 60 # Driver intervention threshold 0.6 Nm + self.STEER_DELTA_UP = 10 # Max HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + # TODO: populate shifter enums self.shifter_values = None self.BUTTONS = [ @@ -84,6 +85,10 @@ def __init__(self, CP): Button(car.CarState.ButtonEvent.Type.gapAdjustCruise, "LS_01", "LS_Verstellung_Zeitluecke", [1]), ] else: + self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm + self.STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50)) + self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + if CP.transmissionType == TransmissionType.automatic: self.shifter_values = can_define.dv["Getriebe_11"]["GE_Fahrstufe"] elif CP.transmissionType == TransmissionType.direct: From 03b9bc73ee30d7dcf4cf60ca96cdc365bf9e3b6f Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 18 Mar 2023 21:01:46 -0400 Subject: [PATCH 08/37] this code is bad and I should feel bad --- selfdrive/car/volkswagen/carcontroller.py | 32 +++++++++++++---------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 068ad59fd066da..56fb9dc4aff8e2 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -28,6 +28,7 @@ def __init__(self, dbc_name, CP, VM): self.gra_acc_counter_last = None self.frame = 0 self.hcaSameTorqueCount = 0 + self.hcaLowTorqueCount = 0 self.hcaEnabledFrameCount = 0 def update(self, CC, CS, ext_bus, now_nanos): @@ -51,23 +52,26 @@ def update(self, CC, CS, ext_bus, now_nanos): if CC.latActive: new_steer = int(round(actuators.steer * self.CCP.STEER_MAX)) apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.CCP) - if apply_steer == 0: - hcaEnabled = False - self.hcaEnabledFrameCount = 0 + self.hcaEnabledFrameCount += 1 + if abs(apply_steer) <= 60: # 20% output + self.hcaLowTorqueCount += 1 else: - self.hcaEnabledFrameCount += 1 - if self.hcaEnabledFrameCount >= 118 * (100 / self.CCP.STEER_STEP): # 118s - hcaEnabled = False + self.hcaLowTorqueCount = 0 + # start trying for opportunistic resets after 4 minutes of engagement + if self.hcaEnabledFrameCount >= 240 * (100 / self.CCP.STEER_STEP) and self.hcaLowTorqueCount >= 0.5 * (100 / self.CCP.STEER_STEP): # 10s + hcaEnabled = False + apply_steer = 0 + if self.hcaLowTorqueCount >= 1.55 * (100 / self.CCP.STEER_STEP): self.hcaEnabledFrameCount = 0 - else: - hcaEnabled = True - if self.apply_steer_last == apply_steer: - self.hcaSameTorqueCount += 1 - if self.hcaSameTorqueCount > 1.9 * (100 / self.CCP.STEER_STEP): # 1.9s - apply_steer -= (1, -1)[apply_steer < 0] - self.hcaSameTorqueCount = 0 - else: + else: + hcaEnabled = True + if self.apply_steer_last == apply_steer: + self.hcaSameTorqueCount += 1 + if self.hcaSameTorqueCount > 1.9 * (100 / self.CCP.STEER_STEP): # 1.9s + apply_steer -= (1, -1)[apply_steer < 0] self.hcaSameTorqueCount = 0 + else: + self.hcaSameTorqueCount = 0 else: hcaEnabled = False apply_steer = 0 From 8c829a32f60478e94899f3411635db63ab7bd5d3 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 18 Mar 2023 21:03:45 -0400 Subject: [PATCH 09/37] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index e5449f1d4e84f7..33827d08a02358 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit e5449f1d4e84f77e468b741b76bb73a80b516d9d +Subproject commit 33827d08a0235831cd59d36f7ef8594d9783ef0a From b9962421ef75440249a967e0e309124b49ffcf24 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 18 Mar 2023 21:05:13 -0400 Subject: [PATCH 10/37] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 33827d08a02358..7c3b78d31b31cc 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 33827d08a0235831cd59d36f7ef8594d9783ef0a +Subproject commit 7c3b78d31b31ccb0d53577e34049f59a46d9f4e6 From d8f331ff0b23948e6733c750abf933219c0afb3b Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 18 Mar 2023 21:30:53 -0400 Subject: [PATCH 11/37] it really was bad --- selfdrive/car/volkswagen/carcontroller.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 56fb9dc4aff8e2..c647c6c36be503 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -60,9 +60,10 @@ def update(self, CC, CS, ext_bus, now_nanos): # start trying for opportunistic resets after 4 minutes of engagement if self.hcaEnabledFrameCount >= 240 * (100 / self.CCP.STEER_STEP) and self.hcaLowTorqueCount >= 0.5 * (100 / self.CCP.STEER_STEP): # 10s hcaEnabled = False - apply_steer = 0 + output_steer = 0 if self.hcaLowTorqueCount >= 1.55 * (100 / self.CCP.STEER_STEP): self.hcaEnabledFrameCount = 0 + apply_steer = 0 else: hcaEnabled = True if self.apply_steer_last == apply_steer: @@ -72,12 +73,13 @@ def update(self, CC, CS, ext_bus, now_nanos): self.hcaSameTorqueCount = 0 else: self.hcaSameTorqueCount = 0 + output_steer = apply_steer else: hcaEnabled = False apply_steer = 0 self.apply_steer_last = apply_steer - can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_steer, hcaEnabled)) + can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, output_steer, hcaEnabled)) # **** Acceleration Controls ******************************************** # From 4a2eb637461d351eb3d3a31923b29e3fcd8a0536 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 18 Mar 2023 21:55:30 -0400 Subject: [PATCH 12/37] oops --- selfdrive/car/volkswagen/carcontroller.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index c647c6c36be503..538b9b86359035 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -77,6 +77,7 @@ def update(self, CC, CS, ext_bus, now_nanos): else: hcaEnabled = False apply_steer = 0 + output_steer = 0 self.apply_steer_last = apply_steer can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, output_steer, hcaEnabled)) From c0f118151e9260ff13a312accc02cd525201b731 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sun, 19 Mar 2023 11:38:46 -0400 Subject: [PATCH 13/37] refactor --- selfdrive/car/volkswagen/carcontroller.py | 62 ++++++++++++----------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 538b9b86359035..024d8359663c28 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -27,9 +27,11 @@ def __init__(self, dbc_name, CP, VM): self.apply_steer_last = 0 self.gra_acc_counter_last = None self.frame = 0 - self.hcaSameTorqueCount = 0 - self.hcaLowTorqueCount = 0 - self.hcaEnabledFrameCount = 0 + self.eps_timer_workaround = True # For testing, replace with CP.carFingerprint in (PQ_CARS, MLB_CARS) + self.hca_frame_timer_running = 0 + self.hca_frame_timer_resetting = 0 + self.hca_frame_low_torque = 0 + self.hca_frame_same_torque = 0 def update(self, CC, CS, ext_bus, now_nanos): actuators = CC.actuators @@ -45,42 +47,44 @@ def update(self, CC, CS, ext_bus, now_nanos): # * Don't send > 3.00 Newton-meters torque # * Don't send the same torque for > 6 seconds # * Don't send uninterrupted steering for > 360 seconds - # One frame of HCA disabled is enough to reset the timer, without zeroing the - # torque value. Do that anytime we happen to have 0 torque, or failing that, - # when exceeding ~1/3 the 360 second timer. + # MQB racks reset the uninterrupted steering timer after a single frame + # of HCA disabled; this is done whenever output happens to be zero. + # PQ35, PQ46, NMS and MLB racks need >1 second to reset. Try to perform + # resets when engaged for >240 seconds and output stays under 20%. if CC.latActive: new_steer = int(round(actuators.steer * self.CCP.STEER_MAX)) apply_steer = apply_driver_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.CCP) - self.hcaEnabledFrameCount += 1 - if abs(apply_steer) <= 60: # 20% output - self.hcaLowTorqueCount += 1 + self.hca_frame_timer_running += self.CCP.STEER_STEP + if self.apply_steer_last == apply_steer: + self.hca_frame_same_torque += self.CCP.STEER_STEP + if self.hca_frame_same_torque > 1.9 * DT_CTRL: + apply_steer -= (1, -1)[apply_steer < 0] + self.hca_frame_same_torque = 0 else: - self.hcaLowTorqueCount = 0 - # start trying for opportunistic resets after 4 minutes of engagement - if self.hcaEnabledFrameCount >= 240 * (100 / self.CCP.STEER_STEP) and self.hcaLowTorqueCount >= 0.5 * (100 / self.CCP.STEER_STEP): # 10s - hcaEnabled = False - output_steer = 0 - if self.hcaLowTorqueCount >= 1.55 * (100 / self.CCP.STEER_STEP): - self.hcaEnabledFrameCount = 0 - apply_steer = 0 - else: - hcaEnabled = True - if self.apply_steer_last == apply_steer: - self.hcaSameTorqueCount += 1 - if self.hcaSameTorqueCount > 1.9 * (100 / self.CCP.STEER_STEP): # 1.9s - apply_steer -= (1, -1)[apply_steer < 0] - self.hcaSameTorqueCount = 0 + self.hca_frame_same_torque = 0 + hca_enabled = abs(apply_steer) > 0 + if self.eps_timer_workaround and self.hca_frame_timer_running >= 240 * DT_CTRL: + if abs(apply_steer) <= self.CCP.STEER_MAX * 0.2: + self.hca_frame_low_torque += self.CCP.STEER_STEP else: - self.hcaSameTorqueCount = 0 - output_steer = apply_steer + self.hca_frame_low_torque = 0 + if self.hca_frame_low_torque >= 0.5 * DT_CTRL: + hca_enabled = False # else: - hcaEnabled = False + self.hca_frame_low_torque = 0 + hca_enabled = False apply_steer = 0 - output_steer = 0 + if hca_enabled: + self.hca_frame_timer_resetting = 0 + else: + self.hca_frame_timer_resetting += self.CCP.STEER_STEP + if self.hca_frame_timer_resetting >= 1.1 * DT_CTRL: + self.hca_frame_timer_running = 0 + + can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_steer, hca_enabled)) self.apply_steer_last = apply_steer - can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, output_steer, hcaEnabled)) # **** Acceleration Controls ******************************************** # From 977b0f5c8cd912addcdce7358b144a275000c15b Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sun, 19 Mar 2023 12:08:23 -0400 Subject: [PATCH 14/37] output to zero during long resets --- selfdrive/car/volkswagen/carcontroller.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 024d8359663c28..e1f03f08c47a53 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -32,6 +32,7 @@ def __init__(self, dbc_name, CP, VM): self.hca_frame_timer_resetting = 0 self.hca_frame_low_torque = 0 self.hca_frame_same_torque = 0 + self.hca_output_steer = 0 def update(self, CC, CS, ext_bus, now_nanos): actuators = CC.actuators @@ -58,32 +59,36 @@ def update(self, CC, CS, ext_bus, now_nanos): self.hca_frame_timer_running += self.CCP.STEER_STEP if self.apply_steer_last == apply_steer: self.hca_frame_same_torque += self.CCP.STEER_STEP - if self.hca_frame_same_torque > 1.9 * DT_CTRL: + if self.hca_frame_same_torque > 1.9 / DT_CTRL: apply_steer -= (1, -1)[apply_steer < 0] self.hca_frame_same_torque = 0 else: self.hca_frame_same_torque = 0 hca_enabled = abs(apply_steer) > 0 - if self.eps_timer_workaround and self.hca_frame_timer_running >= 240 * DT_CTRL: + self.hca_output_steer = apply_steer + if self.eps_timer_workaround and self.hca_frame_timer_running >= 10 / DT_CTRL: if abs(apply_steer) <= self.CCP.STEER_MAX * 0.2: self.hca_frame_low_torque += self.CCP.STEER_STEP else: self.hca_frame_low_torque = 0 - if self.hca_frame_low_torque >= 0.5 * DT_CTRL: - hca_enabled = False # + if self.hca_frame_low_torque >= 0.5 / DT_CTRL: + hca_enabled = False + self.hca_output_steer = 0 else: self.hca_frame_low_torque = 0 hca_enabled = False apply_steer = 0 + self.hca_output_steer = 0 if hca_enabled: self.hca_frame_timer_resetting = 0 else: self.hca_frame_timer_resetting += self.CCP.STEER_STEP - if self.hca_frame_timer_resetting >= 1.1 * DT_CTRL: + if self.hca_frame_timer_resetting >= 1.1 / DT_CTRL: self.hca_frame_timer_running = 0 + apply_steer = 0 - can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_steer, hca_enabled)) + can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, self.hca_output_steer, hca_enabled)) self.apply_steer_last = apply_steer # **** Acceleration Controls ******************************************** # @@ -123,7 +128,7 @@ def update(self, CC, CS, ext_bus, now_nanos): cancel=CC.cruiseControl.cancel, resume=CC.cruiseControl.resume)) new_actuators = actuators.copy() - new_actuators.steer = self.apply_steer_last / self.CCP.STEER_MAX + new_actuators.steer = self.hca_output_steer / self.CCP.STEER_MAX new_actuators.steerOutputCan = self.apply_steer_last self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"] From 51e1a2cde4f08e76d2bde02616854dd3c7366909 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sun, 19 Mar 2023 12:09:17 -0400 Subject: [PATCH 15/37] timer back to four minutes --- selfdrive/car/volkswagen/carcontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index e1f03f08c47a53..2f01b3035b6dc0 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -66,7 +66,7 @@ def update(self, CC, CS, ext_bus, now_nanos): self.hca_frame_same_torque = 0 hca_enabled = abs(apply_steer) > 0 self.hca_output_steer = apply_steer - if self.eps_timer_workaround and self.hca_frame_timer_running >= 10 / DT_CTRL: + if self.eps_timer_workaround and self.hca_frame_timer_running >= 240 / DT_CTRL: if abs(apply_steer) <= self.CCP.STEER_MAX * 0.2: self.hca_frame_low_torque += self.CCP.STEER_STEP else: From 2d9103c51f20101b82afaf774a345b3ce36011e9 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sun, 19 Mar 2023 12:43:34 -0400 Subject: [PATCH 16/37] fix moar bugs --- selfdrive/car/volkswagen/carcontroller.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 2f01b3035b6dc0..dd0f64abed6d75 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -69,15 +69,18 @@ def update(self, CC, CS, ext_bus, now_nanos): if self.eps_timer_workaround and self.hca_frame_timer_running >= 240 / DT_CTRL: if abs(apply_steer) <= self.CCP.STEER_MAX * 0.2: self.hca_frame_low_torque += self.CCP.STEER_STEP + if self.hca_frame_low_torque >= 0.5 / DT_CTRL: + hca_enabled = False + self.hca_output_steer = 0 else: self.hca_frame_low_torque = 0 - if self.hca_frame_low_torque >= 0.5 / DT_CTRL: - hca_enabled = False - self.hca_output_steer = 0 + if self.hca_frame_timer_resetting > 0: + apply_steer = clip(apply_steer, -self.CCP.STEER_DELTA_UP, self.CCP.STEER_DELTA_UP) + self.hca_output_steer = apply_steer else: - self.hca_frame_low_torque = 0 hca_enabled = False apply_steer = 0 + self.hca_frame_low_torque = 0 self.hca_output_steer = 0 if hca_enabled: From fc1877dcddf26e4fc3f1c5180f82af374bda1fa4 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 13 Feb 2024 22:35:32 -0500 Subject: [PATCH 17/37] regen CARS.md --- docs/CARS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/CARS.md b/docs/CARS.md index 48e2e77e624a29..5787b429989b82 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 279 Supported Cars +# 281 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -13,10 +13,12 @@ A supported vehicle is one that just works when you install a comma device. All |Acura|RDX 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|A4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|S4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Buick|LaCrosse 2017-19[4](#footnotes)|Driver Confidence Package 2|openpilot|18 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Cadillac|Escalade 2017[4](#footnotes)|Driver Assist Package|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Cadillac|Escalade ESV 2016[4](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| From 052b3605c4cad4f2082da03be37f998a7d75ae17 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 17 Feb 2024 22:43:59 -0500 Subject: [PATCH 18/37] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 8ccfda4147150f..368010034ac57d 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 8ccfda4147150f6266b901cbcb211b6c7a8387f8 +Subproject commit 368010034ac57d1e0c0be57ee8bb2030112a286b From 9d3f13ab9c4a59cd1dbd1943ea7e33d10ab16463 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 17 Feb 2024 22:58:06 -0500 Subject: [PATCH 19/37] stub long control CAN packers --- selfdrive/car/volkswagen/mlbcan.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/selfdrive/car/volkswagen/mlbcan.py b/selfdrive/car/volkswagen/mlbcan.py index 0f954418afa46f..1142b1f089590c 100644 --- a/selfdrive/car/volkswagen/mlbcan.py +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -36,3 +36,19 @@ def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resu }) return packer.make_can_msg("LS_01", bus, values) + + +def acc_control_value(main_switch_on, acc_faulted, long_active): + pass + + +def acc_hud_status_value(main_switch_on, acc_faulted, long_active): + pass + + +def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_control, stopping, starting, esp_hold): + pass + + +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): + pass From cd23040ff92f56d0039055e995d62720edb0467e Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 17 Feb 2024 23:13:15 -0500 Subject: [PATCH 20/37] temp hack in SWA_01 check --- selfdrive/car/volkswagen/carstate.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index c965191b62bdd5..6c10869c8defc6 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -404,7 +404,9 @@ def get_cam_can_parser_mlb(CP): if CP.networkLocation == NetworkLocation.fwdCamera: messages += [ # sig_address, frequency - ("LDW_02", 10) # From R242 Driver assistance camera + ("LDW_02", 10), # From R242 Driver assistance camera + ("SWA_01", 20), # FIXME: needs to move to MlbExtraSignals when that gets added + ] # TODO: BSM parsing From 6ce1d11e8af8bb73ea9e062ec25860f55f7de989 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 17 Feb 2024 23:13:40 -0500 Subject: [PATCH 21/37] whitespace --- selfdrive/car/volkswagen/carstate.py | 1 - 1 file changed, 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 6c10869c8defc6..44f694c5a3e143 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -406,7 +406,6 @@ def get_cam_can_parser_mlb(CP): # sig_address, frequency ("LDW_02", 10), # From R242 Driver assistance camera ("SWA_01", 20), # FIXME: needs to move to MlbExtraSignals when that gets added - ] # TODO: BSM parsing From 7d1b140ab2543bba1663c67e4d4b619c6969e2ee Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 17 Feb 2024 23:29:10 -0500 Subject: [PATCH 22/37] hack in SWA_01 correctly this time --- selfdrive/car/volkswagen/carstate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 44f694c5a3e143..0b52177758caf2 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -405,10 +405,10 @@ def get_cam_can_parser_mlb(CP): messages += [ # sig_address, frequency ("LDW_02", 10), # From R242 Driver assistance camera - ("SWA_01", 20), # FIXME: needs to move to MlbExtraSignals when that gets added ] - - # TODO: BSM parsing + else: + if CP.enableBsm: + messages += MqbExtraSignals.bsm_radar_messages # FIXME: switch this to MlbExtraSignals later return CANParser(DBC[CP.carFingerprint]["pt"], messages, CANBUS.cam) From 3f384d28185aa9d9a6fa522f4377b0be5d411e1d Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 17 Feb 2024 23:41:20 -0500 Subject: [PATCH 23/37] retry CI From edd60f4038c16ba5f7ff9c2ed48a74cdbcc6fd61 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 2 Mar 2024 21:54:58 -0500 Subject: [PATCH 24/37] regen CARS.md --- docs/CARS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/CARS.md b/docs/CARS.md index 7ad12189cb0c7b..5f973d91108350 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 288 Supported Cars +# 290 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -13,10 +13,12 @@ A supported vehicle is one that just works when you install a comma device. All |Acura|RDX 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|A4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|S4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Buick|LaCrosse 2017-19[4](#footnotes)|Driver Confidence Package 2|openpilot|18 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Cadillac|Escalade 2017[4](#footnotes)|Driver Assist Package|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Cadillac|Escalade ESV 2016[4](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 OBD-II connector
- 1 comma 3X
- 2 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| From f9fcbb4a777dee4b24919e37150e8f8a3f68eecc Mon Sep 17 00:00:00 2001 From: Jason Young Date: Sat, 2 Mar 2024 22:10:11 -0500 Subject: [PATCH 25/37] fix indentation --- selfdrive/car/volkswagen/values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 9883183073cac9..a0ed00b604356d 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -345,8 +345,8 @@ class CAR(Platforms): AUDI_A4_MK4 = VolkswagenMLBPlatformConfig( "AUDI A4 4TH GEN", # Chassis FL [ - VWCarInfo("Audi A4 2015-16"), - VWCarInfo("Audi S4 2015-16"), + VWCarInfo("Audi A4 2015-16"), + VWCarInfo("Audi S4 2015-16"), ], VolkswagenCarSpecs(mass=1650, wheelbase=2.81), ) From 8a92f8893eda96c6751515792a044a06d2a30a29 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Tue, 5 Mar 2024 10:48:16 -0500 Subject: [PATCH 26/37] put MLB back on lateral accel torque control --- selfdrive/car/volkswagen/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 55dac416f5c9e8..3236f07b3c0317 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -85,7 +85,7 @@ def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, doc # Global lateral tuning defaults, can be overridden per-vehicle ret.steerLimitTimer = 0.4 - if ret.flags & VolkswagenFlags.PQ: + if ret.flags & VolkswagenFlags.PQ or ret.flags & VolkswagenFlags.MLB: ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) else: From 743a78758a4a80b96a66b32f5f1c00f25ba95a39 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 11:54:03 -0400 Subject: [PATCH 27/37] regen CARS.md --- docs/CARS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/CARS.md b/docs/CARS.md index 4364f10b08da9f..f8ad8c43c75c6b 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 287 Supported Cars +# 289 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -13,10 +13,12 @@ A supported vehicle is one that just works when you install a comma device. All |Acura|RDX 2019-22|All|openpilot available[1](#footnotes)|0 mph|3 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Honda Bosch A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 2014-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|A3 Sportback e-tron 2017-18|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|A4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q2 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|Q3 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|RS3 2018|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Audi|S3 2015-17|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Audi|S4 2015-16|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[12](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Bolt EUV 2022-23|Premier or Premier Redline Trim without Super Cruise Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Bolt EV 2022-23|2LT Trim with Adaptive Cruise Control Package|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Chevrolet|Equinox 2019-22|Adaptive Cruise Control (ACC)|openpilot available[1](#footnotes)|3 mph|6 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 GM connector
- 1 comma 3X
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| From 1c94cc3997667a6c7420079794207ce8e243d5b9 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 12:32:54 -0400 Subject: [PATCH 28/37] bugfixes --- selfdrive/car/volkswagen/carstate.py | 2 +- selfdrive/car/volkswagen/fingerprints.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index f7871fdccd3739..40cce61ca57c19 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -14,7 +14,7 @@ def __init__(self, CP): self.eps_init_complete = False self.CCP = CarControllerParams(CP) self.button_states = {button.event_type: False for button in self.CCP.BUTTONS} - self.acc_type = False + self.acc_type = 0 self.esp_hold_confirmation = False self.upscale_lead_car_signal = False self.eps_stock_values = False diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 3d6df3e984d909..09f9c7059b5214 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -836,16 +836,16 @@ b'\xf1\x878K5927156D \xf1\x890003', ], # SRS needs to be probed on the test car - # (Ecu.srs, 0x715, None): [ - # b'\xf1\x875Q0959655BD\xf1\x890336\xf1\x82\x1311111111111100311211011231129321312111', - # ], + (Ecu.srs, 0x715, None): [ + b'PLACEHOLDER', + ], (Ecu.eps, 0x712, None): [ b'\xf1\x878K0909144J \xf1\x890509\xf1\x82\x01\n\x1a', ], # Test car lacks a radar - # (Ecu.fwdRadar, 0x757, None): [ - # b'\xf1\x872Q0907572M \xf1\x890233', - # ], + (Ecu.fwdRadar, 0x757, None): [ + b'PLACEHOLDER', + ], }, CAR.AUDI_Q2_MK1: { (Ecu.engine, 0x7e0, None): [ From 7ed7994c2ec72402ced6b9bc157436b1c305d035 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 12:36:39 -0400 Subject: [PATCH 29/37] fix whitespace --- selfdrive/car/volkswagen/fingerprints.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 09f9c7059b5214..7ad9601f87f041 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -837,7 +837,7 @@ ], # SRS needs to be probed on the test car (Ecu.srs, 0x715, None): [ - b'PLACEHOLDER', + b'PLACEHOLDER', ], (Ecu.eps, 0x712, None): [ b'\xf1\x878K0909144J \xf1\x890509\xf1\x82\x01\n\x1a', From c6d2831cbba34fc7115c7606f8c71dc800cf5f73 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 12:42:02 -0400 Subject: [PATCH 30/37] follow HCA_01 signal refactor --- selfdrive/car/volkswagen/mlbcan.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/selfdrive/car/volkswagen/mlbcan.py b/selfdrive/car/volkswagen/mlbcan.py index 1142b1f089590c..e359086f63bf7c 100644 --- a/selfdrive/car/volkswagen/mlbcan.py +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -1,14 +1,11 @@ def create_steering_control(packer, bus, apply_steer, lkas_enabled): values = { - "SET_ME_0X3": 0x3, - "Assist_Torque": abs(apply_steer), - "Assist_Requested": lkas_enabled, - "Assist_VZ": 1 if apply_steer < 0 else 0, - "HCA_Available": 1, - "HCA_Standby": not lkas_enabled, - "HCA_Active": lkas_enabled, - "SET_ME_0XFE": 0xFE, - "SET_ME_0X07": 0x07, + "HCA_01_Status_HCA": 5 if lkas_enabled else 3, + "HCA_01_LM_Offset": abs(apply_steer), + "HCA_01_LM_OffSign": 1 if apply_steer < 0 else 0, + "HCA_01_Vib_Freq": 18, + "HCA_01_Sendestatus": 1 if lkas_enabled else 0, + "EA_ACC_Wunschgeschwindigkeit": 327.36, } return packer.make_can_msg("HCA_01", bus, values) From 9e3a3d50840138db4f0a6420149fee0f04b33d85 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 12:55:37 -0400 Subject: [PATCH 31/37] bump opendbc --- opendbc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc b/opendbc index 8e98a9d3b148ee..ef1744ae495f69 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 8e98a9d3b148ee1c9896100f24a5f8ceec32fd51 +Subproject commit ef1744ae495f699cdc361599993985dd524ee336 From e536b1c58636aa60ee7f6fdb08fcffdebdeeff96 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 13:03:21 -0400 Subject: [PATCH 32/37] placeholders for CI --- selfdrive/car/volkswagen/mlbcan.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/mlbcan.py b/selfdrive/car/volkswagen/mlbcan.py index e359086f63bf7c..2aacb9230f4b34 100644 --- a/selfdrive/car/volkswagen/mlbcan.py +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -36,16 +36,18 @@ def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resu def acc_control_value(main_switch_on, acc_faulted, long_active): - pass + return 0 def acc_hud_status_value(main_switch_on, acc_faulted, long_active): - pass + return 0 def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_control, stopping, starting, esp_hold): - pass + values = {} + return packer.make_can_msg("ACC_05", bus, values) def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): - pass + values = {} + return packer.make_can_msg("ACC_02", bus, values) From 643a4eab72f64bdec2630ab106df39460fae0972 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 13:06:12 -0400 Subject: [PATCH 33/37] bring back TSK_06 cleanup and nonAdaptive support --- selfdrive/car/volkswagen/carstate.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 40cce61ca57c19..905e4db0dc80ae 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -65,6 +65,14 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_links"]) ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_rechts"]) + # ACC okay but disabled (1), ACC ready (2), a radar visibility or other fault/disruption (6 or 7) + # currently regulating speed (3), driver accel override (4), brake only (5) + ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) + ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) + # Speed limiter mode; ECM faults if we command ACC while not pcmCruise + ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) + ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) + # Update ACC radar status. # TODO: find an explicit ACC main switch state if pt_cp.vl["TSK_02"]["TSK_Status"] == 0: @@ -118,19 +126,12 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) - # Update ACC radar status. - if pt_cp.vl["TSK_06"]["TSK_Status"] == 2: - # ACC okay and enabled, but not currently engaged - ret.cruiseState.available = True - ret.cruiseState.enabled = False - elif pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5): - # ACC okay and enabled, currently regulating speed (3) or driver accel override (4) or brake only (5) - ret.cruiseState.available = True - ret.cruiseState.enabled = True - else: - # ACC okay but disabled (1), or a radar visibility or other fault/disruption (6 or 7) - ret.cruiseState.available = False - ret.cruiseState.enabled = False + # ACC okay but disabled (1), ACC ready (2), a radar visibility or other fault/disruption (6 or 7) + # currently regulating speed (3), driver accel override (4), brake only (5) + ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) + ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) + # Speed limiter mode; ECM faults if we command ACC while not pcmCruise + ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] From 8ae27fb1697d2629efcf969e02bbccabd4c1e27f Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 13:11:25 -0400 Subject: [PATCH 34/37] remove wrong extra copy --- selfdrive/car/volkswagen/carstate.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 905e4db0dc80ae..a7a60fc1aab07c 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -65,14 +65,6 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_links"]) ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_rechts"]) - # ACC okay but disabled (1), ACC ready (2), a radar visibility or other fault/disruption (6 or 7) - # currently regulating speed (3), driver accel override (4), brake only (5) - ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) - ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) - # Speed limiter mode; ECM faults if we command ACC while not pcmCruise - ret.cruiseState.nonAdaptive = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) - ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) - # Update ACC radar status. # TODO: find an explicit ACC main switch state if pt_cp.vl["TSK_02"]["TSK_Status"] == 0: From 5c70bba4184a3aa7ed4483470ffd561076aa6c65 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 13:14:34 -0400 Subject: [PATCH 35/37] more concise --- selfdrive/car/volkswagen/carstate.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index a7a60fc1aab07c..54882a54cba7ed 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -65,21 +65,9 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_links"]) ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_rechts"]) - # Update ACC radar status. - # TODO: find an explicit ACC main switch state - if pt_cp.vl["TSK_02"]["TSK_Status"] == 0: - # ACC okay and enabled, but not currently engaged - ret.cruiseState.available = True - ret.cruiseState.enabled = False - elif pt_cp.vl["TSK_02"]["TSK_Status"] in (1, 2): - # ACC okay and enabled, currently regulating speed (1) or driver override (2) - ret.cruiseState.available = True - ret.cruiseState.enabled = True - else: - # ACC disabled due to error (3) - ret.cruiseState.available = False - ret.cruiseState.enabled = False - ret.accFaulted = True + ret.cruiseState.available = pt_cp.vl["TSK_02"]["TSK_Status"] in (0, 1, 2) + ret.cruiseState.enabled = pt_cp.vl["TSK_02"]["TSK_Status"] in (1, 2) + ret.accFaulted = pt_cp.vl["TSK_02"]["TSK_Status"] == 3 self.gra_stock_values = pt_cp.vl["LS_01"] From c738365efccff3a74e3b10bf921dba81d5ecec35 Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 13:27:01 -0400 Subject: [PATCH 36/37] update create_acc_hud_control function signature --- selfdrive/car/volkswagen/mlbcan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/mlbcan.py b/selfdrive/car/volkswagen/mlbcan.py index 2aacb9230f4b34..784829d16c0723 100644 --- a/selfdrive/car/volkswagen/mlbcan.py +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -48,6 +48,6 @@ def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_cont return packer.make_can_msg("ACC_05", bus, values) -def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance): values = {} return packer.make_can_msg("ACC_02", bus, values) From 230ae8fa1299ab2085bbeeced6907bcdd59f351e Mon Sep 17 00:00:00 2001 From: Jason Young Date: Mon, 20 May 2024 13:28:10 -0400 Subject: [PATCH 37/37] tweak UDS firmware placeholders --- selfdrive/car/volkswagen/fingerprints.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 7ad9601f87f041..61f13c1bdff1d0 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -835,16 +835,16 @@ (Ecu.transmission, 0x7e1, None): [ b'\xf1\x878K5927156D \xf1\x890003', ], - # SRS needs to be probed on the test car + # FIXME: placeholder (Ecu.srs, 0x715, None): [ b'PLACEHOLDER', ], (Ecu.eps, 0x712, None): [ b'\xf1\x878K0909144J \xf1\x890509\xf1\x82\x01\n\x1a', ], - # Test car lacks a radar (Ecu.fwdRadar, 0x757, None): [ - b'PLACEHOLDER', + # FIXME: placeholder + b'\xf1\x872Q0907572M \xf1\x890233', ], }, CAR.AUDI_Q2_MK1: {