From 1b06d3975d6152c6314cab5b2273924b709d52f7 Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Mon, 31 Mar 2025 14:15:19 +0800 Subject: [PATCH 1/4] VAG A0 SnG - init --- common/params_keys.h | 1 + opendbc_repo/opendbc/car/structs.py | 1 + .../opendbc/car/volkswagen/carcontroller.py | 19 +++++++++++++++---- .../opendbc/car/volkswagen/interface.py | 3 +++ opendbc_repo/opendbc/car/volkswagen/values.py | 1 + selfdrive/car/card.py | 3 +++ selfdrive/ui/qt/offroad/dp_panel.cc | 5 +++++ system/manager/manager.py | 1 + 8 files changed, 30 insertions(+), 4 deletions(-) diff --git a/common/params_keys.h b/common/params_keys.h index 6b11bfea0..35c274d0d 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -140,4 +140,5 @@ inline static std::unordered_map keys = { {"dp_lon_no_gas_gating", PERSISTENT}, {"dp_device_auto_shutdown_in", PERSISTENT}, {"dp_ui_radar_tracks", PERSISTENT}, + {"dp_vag_a0_sng", PERSISTENT}, }; diff --git a/opendbc_repo/opendbc/car/structs.py b/opendbc_repo/opendbc/car/structs.py index 7389cec8b..0c8c93067 100644 --- a/opendbc_repo/opendbc/car/structs.py +++ b/opendbc_repo/opendbc/car/structs.py @@ -22,4 +22,5 @@ CarParamsT = capnp.lib.capnp._StructModule class DPFlags: LateralALKA = 1 ExtRadar = 2 + VagA0SnG = 2 ** 2 pass diff --git a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py index e2a4fe86d..39ef9a9a5 100644 --- a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py +++ b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py @@ -111,11 +111,22 @@ class CarController(CarControllerBase): lead_distance, hud_control.leadDistanceBars)) # **** Stock ACC Button Controls **************************************** # + if self.CP.flags & VolkswagenFlags.A0SnG: + if self.CP.pcmCruise and CS.gra_stock_values["COUNTER"] != self.gra_acc_counter_last: + standing_resume_spam = CS.out.standstill + spam_window = self.frame % 50 < 15 - gra_send_ready = self.CP.pcmCruise and CS.gra_stock_values["COUNTER"] != self.gra_acc_counter_last - if gra_send_ready and (CC.cruiseControl.cancel or CC.cruiseControl.resume): - can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, self.ext_bus, CS.gra_stock_values, - cancel=CC.cruiseControl.cancel, resume=CC.cruiseControl.resume)) + send_cancel = CC.cruiseControl.cancel + send_resume = CC.cruiseControl.resume or (standing_resume_spam and spam_window) + + if send_cancel or send_resume: + can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, self.ext_bus, CS.gra_stock_values, + cancel=send_cancel, resume=send_resume)) + else: + gra_send_ready = self.CP.pcmCruise and CS.gra_stock_values["COUNTER"] != self.gra_acc_counter_last + if gra_send_ready and (CC.cruiseControl.cancel or CC.cruiseControl.resume): + can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, self.ext_bus, CS.gra_stock_values, + cancel=CC.cruiseControl.cancel, resume=CC.cruiseControl.resume)) new_actuators = actuators.as_builder() new_actuators.torque = self.apply_torque_last / self.CCP.STEER_MAX diff --git a/opendbc_repo/opendbc/car/volkswagen/interface.py b/opendbc_repo/opendbc/car/volkswagen/interface.py index 80c161953..0c628a11e 100644 --- a/opendbc_repo/opendbc/car/volkswagen/interface.py +++ b/opendbc_repo/opendbc/car/volkswagen/interface.py @@ -87,4 +87,7 @@ class CarInterface(CarInterfaceBase): ret.vEgoStopping = 0.5 ret.autoResumeSng = ret.minEnableSpeed == -1 + if dp_params & structs.DPFlags.VagA0SnG: + ret.flags |= VolkswagenFlags.A0SnG.value + return ret diff --git a/opendbc_repo/opendbc/car/volkswagen/values.py b/opendbc_repo/opendbc/car/volkswagen/values.py index 750a99e1c..9645c5bd1 100644 --- a/opendbc_repo/opendbc/car/volkswagen/values.py +++ b/opendbc_repo/opendbc/car/volkswagen/values.py @@ -144,6 +144,7 @@ class VolkswagenFlags(IntFlag): # Static flags PQ = 2 + A0SnG = 2 ** 2 @dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 067108352..45ccbcf0e 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -102,6 +102,9 @@ class Car: if self.params.get_bool("dp_lat_alka"): dp_params |= structs.DPFlags.LateralALKA + if self.params.get_bool("dp_vag_a0_sng"): + dp_params |= structs.DPFlags.VagA0SnG + self.CI = get_car(*self.can_callbacks, obd_callback(self.params), experimental_long_allowed, num_pandas, dp_params, cached_params) self.RI = interfaces[self.CI.CP.carFingerprint].RadarInterface(self.CI.CP) self.CP = self.CI.CP diff --git a/selfdrive/ui/qt/offroad/dp_panel.cc b/selfdrive/ui/qt/offroad/dp_panel.cc index 8868a6033..75253b53b 100644 --- a/selfdrive/ui/qt/offroad/dp_panel.cc +++ b/selfdrive/ui/qt/offroad/dp_panel.cc @@ -40,6 +40,11 @@ void DPPanel::add_vag_toggles() { QString::fromUtf8("🐉 ") + tr("VW / Audi / Skoda"), "", }, + { + "dp_vag_a0_sng", + tr("Enable MQB A0 SnG Mod"), + "", + }, }; QWidget *label = nullptr; diff --git a/system/manager/manager.py b/system/manager/manager.py index da9ed9e2d..a0019796c 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -62,6 +62,7 @@ def manager_init() -> None: ("dp_lon_no_gas_gating", "0"), ("dp_device_auto_shutdown_in", "-5"), ("dp_ui_radar_tracks", "0"), + ("dp_vag_a0_sng", "0"), ] if params.get_bool("RecordFrontLock"): From e99675400ebc558e2c43b499485bde61a827864d Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Mon, 12 May 2025 15:13:25 +0800 Subject: [PATCH 2/4] VAG Avoid EPS Lockout - 2025/05/17 --- common/params_keys.h | 1 + opendbc_repo/opendbc/car/structs.py | 1 + opendbc_repo/opendbc/car/volkswagen/carcontroller.py | 2 +- opendbc_repo/opendbc/car/volkswagen/interface.py | 3 +++ opendbc_repo/opendbc/car/volkswagen/values.py | 8 ++++++-- selfdrive/car/card.py | 3 +++ selfdrive/controls/lib/latcontrol.py | 3 ++- selfdrive/ui/qt/offroad/dp_panel.cc | 5 +++++ system/manager/manager.py | 1 + 9 files changed, 23 insertions(+), 4 deletions(-) diff --git a/common/params_keys.h b/common/params_keys.h index 6b11bfea0..bdd3f5979 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -140,4 +140,5 @@ inline static std::unordered_map keys = { {"dp_lon_no_gas_gating", PERSISTENT}, {"dp_device_auto_shutdown_in", PERSISTENT}, {"dp_ui_radar_tracks", PERSISTENT}, + {"dp_vag_avoid_eps_lockout", PERSISTENT}, }; diff --git a/opendbc_repo/opendbc/car/structs.py b/opendbc_repo/opendbc/car/structs.py index 7389cec8b..b91050efe 100644 --- a/opendbc_repo/opendbc/car/structs.py +++ b/opendbc_repo/opendbc/car/structs.py @@ -22,4 +22,5 @@ CarParamsT = capnp.lib.capnp._StructModule class DPFlags: LateralALKA = 1 ExtRadar = 2 + VagAvoidEPSLockout = 2 ** 2 pass diff --git a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py index e2a4fe86d..a43386a27 100644 --- a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py +++ b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py @@ -13,7 +13,7 @@ LongCtrlState = structs.CarControl.Actuators.LongControlState class CarController(CarControllerBase): def __init__(self, dbc_names, CP): super().__init__(dbc_names, CP) - self.CCP = CarControllerParams(CP) + self.CCP = CarControllerParams(CP, CP.flags & VolkswagenFlags.AVOID_EPS_LOCKOUT) self.CCS = pqcan if CP.flags & VolkswagenFlags.PQ else mqbcan self.packer_pt = CANPacker(dbc_names[Bus.pt]) self.ext_bus = CANBUS.pt if CP.networkLocation == structs.CarParams.NetworkLocation.fwdCamera else CANBUS.cam diff --git a/opendbc_repo/opendbc/car/volkswagen/interface.py b/opendbc_repo/opendbc/car/volkswagen/interface.py index 80c161953..c3be09ad9 100644 --- a/opendbc_repo/opendbc/car/volkswagen/interface.py +++ b/opendbc_repo/opendbc/car/volkswagen/interface.py @@ -87,4 +87,7 @@ class CarInterface(CarInterfaceBase): ret.vEgoStopping = 0.5 ret.autoResumeSng = ret.minEnableSpeed == -1 + if dp_params & structs.DPFlags.VagAvoidEPSLockout: + ret.flags |= VolkswagenFlags.AVOID_EPS_LOCKOUT.value + return ret diff --git a/opendbc_repo/opendbc/car/volkswagen/values.py b/opendbc_repo/opendbc/car/volkswagen/values.py index 750a99e1c..e98a1d85b 100644 --- a/opendbc_repo/opendbc/car/volkswagen/values.py +++ b/opendbc_repo/opendbc/car/volkswagen/values.py @@ -27,7 +27,8 @@ class CarControllerParams: # MQB vs PQ maximums are shared, but rate-of-change limited differently # based on safety requirements driven by lateral accel testing. - STEER_MAX = 300 # Max heading control assist torque 3.00 Nm + # rick - move to init so we can overwrite it with avoid eps lockout + # STEER_MAX = 300 # Max heading control assist torque 3.00 Nm STEER_DRIVER_MULTIPLIER = 3 # weight driver torque heavily STEER_DRIVER_FACTOR = 1 # from dbc @@ -40,8 +41,9 @@ class CarControllerParams: ACCEL_MAX = 2.0 # 2.0 m/s max acceleration ACCEL_MIN = -3.5 # 3.5 m/s max deceleration - def __init__(self, CP): + def __init__(self, CP, avoid_eps_lockout = False): can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + self.STEER_MAX = 300 if not avoid_eps_lockout else 288 if CP.flags & VolkswagenFlags.PQ: self.LDW_STEP = 5 # LDW_1 message frequency 20Hz @@ -144,6 +146,8 @@ class VolkswagenFlags(IntFlag): # Static flags PQ = 2 + AVOID_EPS_LOCKOUT = 2 ** 2 + @dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 067108352..cac89e24d 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -102,6 +102,9 @@ class Car: if self.params.get_bool("dp_lat_alka"): dp_params |= structs.DPFlags.LateralALKA + if self.params.get_bool("dp_vag_avoid_eps_lockout"): + dp_params |= structs.DPFlags.VagAvoidEPSLockout + self.CI = get_car(*self.can_callbacks, obd_callback(self.params), experimental_long_allowed, num_pandas, dp_params, cached_params) self.RI = interfaces[self.CI.CP.carFingerprint].RadarInterface(self.CI.CP) self.CP = self.CI.CP diff --git a/selfdrive/controls/lib/latcontrol.py b/selfdrive/controls/lib/latcontrol.py index dcf000343..f47f5a4c5 100644 --- a/selfdrive/controls/lib/latcontrol.py +++ b/selfdrive/controls/lib/latcontrol.py @@ -2,8 +2,9 @@ import numpy as np from abc import abstractmethod, ABC from openpilot.common.realtime import DT_CTRL +from openpilot.common.params import Params -MIN_LATERAL_CONTROL_SPEED = 0.3 # m/s +MIN_LATERAL_CONTROL_SPEED = 2.5 if Params().get_bool("dp_vag_avoid_eps_lockout") else 0.3 # m/s class LatControl(ABC): diff --git a/selfdrive/ui/qt/offroad/dp_panel.cc b/selfdrive/ui/qt/offroad/dp_panel.cc index 8868a6033..544fa9ba6 100644 --- a/selfdrive/ui/qt/offroad/dp_panel.cc +++ b/selfdrive/ui/qt/offroad/dp_panel.cc @@ -40,6 +40,11 @@ void DPPanel::add_vag_toggles() { QString::fromUtf8("🐉 ") + tr("VW / Audi / Skoda"), "", }, + { + "dp_vag_avoid_eps_lockout", + tr("Avoid EPS Lockout"), + "", + }, }; QWidget *label = nullptr; diff --git a/system/manager/manager.py b/system/manager/manager.py index da9ed9e2d..56b56e0c5 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -62,6 +62,7 @@ def manager_init() -> None: ("dp_lon_no_gas_gating", "0"), ("dp_device_auto_shutdown_in", "-5"), ("dp_ui_radar_tracks", "0"), + ("dp_vag_avoid_eps_lockout", "0"), ] if params.get_bool("RecordFrontLock"): From c957d58186c98fa74dc4575a67fb35ef779012e8 Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Mon, 12 May 2025 15:11:50 +0800 Subject: [PATCH 3/4] PQ No Dashcam - init --- opendbc_repo/opendbc/car/volkswagen/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc_repo/opendbc/car/volkswagen/interface.py b/opendbc_repo/opendbc/car/volkswagen/interface.py index 80c161953..4ebcf87b5 100644 --- a/opendbc_repo/opendbc/car/volkswagen/interface.py +++ b/opendbc_repo/opendbc/car/volkswagen/interface.py @@ -35,7 +35,7 @@ class CarInterface(CarInterfaceBase): # It is documented in a four-part blog series: # https://blog.willemmelching.nl/carhacking/2022/01/02/vw-part1/ # Panda ALLOW_DEBUG firmware required. - ret.dashcamOnly = True + # ret.dashcamOnly = True else: # Set global MQB parameters From 49c5184e73acffcabdde61c86d2f4d5fe1d5d4d4 Mon Sep 17 00:00:00 2001 From: Rick Lan Date: Mon, 12 May 2025 15:10:00 +0800 Subject: [PATCH 4/4] VAG PQ Steering Patch - init --- common/params_keys.h | 1 + opendbc_repo/opendbc/car/structs.py | 1 + opendbc_repo/opendbc/car/volkswagen/carcontroller.py | 3 ++- opendbc_repo/opendbc/car/volkswagen/interface.py | 3 +++ opendbc_repo/opendbc/car/volkswagen/mqbcan.py | 2 +- opendbc_repo/opendbc/car/volkswagen/pqcan.py | 4 ++-- opendbc_repo/opendbc/car/volkswagen/values.py | 1 + selfdrive/car/card.py | 3 +++ selfdrive/ui/qt/offroad/dp_panel.cc | 5 +++++ system/manager/manager.py | 1 + 10 files changed, 20 insertions(+), 4 deletions(-) diff --git a/common/params_keys.h b/common/params_keys.h index 6b11bfea0..1bf1388e0 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -140,4 +140,5 @@ inline static std::unordered_map keys = { {"dp_lon_no_gas_gating", PERSISTENT}, {"dp_device_auto_shutdown_in", PERSISTENT}, {"dp_ui_radar_tracks", PERSISTENT}, + {"dp_vag_pq_steering_patch", PERSISTENT}, }; diff --git a/opendbc_repo/opendbc/car/structs.py b/opendbc_repo/opendbc/car/structs.py index 7389cec8b..ca1bd0ba7 100644 --- a/opendbc_repo/opendbc/car/structs.py +++ b/opendbc_repo/opendbc/car/structs.py @@ -22,4 +22,5 @@ CarParamsT = capnp.lib.capnp._StructModule class DPFlags: LateralALKA = 1 ExtRadar = 2 + VAGPQSteeringPatch = 2 ** 2 pass diff --git a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py index e2a4fe86d..3bdb162c6 100644 --- a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py +++ b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py @@ -24,6 +24,7 @@ class CarController(CarControllerBase): self.eps_timer_soft_disable_alert = False self.hca_frame_timer_running = 0 self.hca_frame_same_torque = 0 + self.dp_vag_pq_steering_patch = 7 if CP.flags & VolkswagenFlags.PQSteeringPatch else 5 def update(self, CC, CS, now_nanos): actuators = CC.actuators @@ -63,7 +64,7 @@ class CarController(CarControllerBase): self.eps_timer_soft_disable_alert = self.hca_frame_timer_running > self.CCP.STEER_TIME_ALERT / DT_CTRL self.apply_torque_last = apply_torque - can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_torque, hca_enabled)) + can_sends.append(self.CCS.create_steering_control(self.packer_pt, CANBUS.pt, apply_torque, hca_enabled, self.dp_vag_pq_steering_patch)) if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: # Pacify VW Emergency Assist driver inactivity detection by changing its view of driver steering input torque diff --git a/opendbc_repo/opendbc/car/volkswagen/interface.py b/opendbc_repo/opendbc/car/volkswagen/interface.py index 80c161953..5f9e6e6ae 100644 --- a/opendbc_repo/opendbc/car/volkswagen/interface.py +++ b/opendbc_repo/opendbc/car/volkswagen/interface.py @@ -87,4 +87,7 @@ class CarInterface(CarInterfaceBase): ret.vEgoStopping = 0.5 ret.autoResumeSng = ret.minEnableSpeed == -1 + if ret.flags & VolkswagenFlags.PQ and dp_params & structs.DPFlags.VAGPQSteeringPatch: + ret.flags |= VolkswagenFlags.PQSteeringPatch.value + return ret diff --git a/opendbc_repo/opendbc/car/volkswagen/mqbcan.py b/opendbc_repo/opendbc/car/volkswagen/mqbcan.py index 4823d19bd..edff008e4 100644 --- a/opendbc_repo/opendbc/car/volkswagen/mqbcan.py +++ b/opendbc_repo/opendbc/car/volkswagen/mqbcan.py @@ -1,4 +1,4 @@ -def create_steering_control(packer, bus, apply_torque, lkas_enabled): +def create_steering_control(packer, bus, apply_torque, lkas_enabled, dp_vag_pq_steering_patch): values = { "HCA_01_Status_HCA": 5 if lkas_enabled else 3, "HCA_01_LM_Offset": abs(apply_torque), diff --git a/opendbc_repo/opendbc/car/volkswagen/pqcan.py b/opendbc_repo/opendbc/car/volkswagen/pqcan.py index a2f8a8b96..5e08f4b4c 100644 --- a/opendbc_repo/opendbc/car/volkswagen/pqcan.py +++ b/opendbc_repo/opendbc/car/volkswagen/pqcan.py @@ -1,8 +1,8 @@ -def create_steering_control(packer, bus, apply_torque, lkas_enabled): +def create_steering_control(packer, bus, apply_torque, lkas_enabled, dp_vag_pq_steering_patch = 5): values = { "LM_Offset": abs(apply_torque), "LM_OffSign": 1 if apply_torque < 0 else 0, - "HCA_Status": 5 if (lkas_enabled and apply_torque != 0) else 3, + "HCA_Status": dp_vag_pq_steering_patch if (lkas_enabled and apply_torque != 0) else 3, "Vib_Freq": 16, } diff --git a/opendbc_repo/opendbc/car/volkswagen/values.py b/opendbc_repo/opendbc/car/volkswagen/values.py index 750a99e1c..73deff960 100644 --- a/opendbc_repo/opendbc/car/volkswagen/values.py +++ b/opendbc_repo/opendbc/car/volkswagen/values.py @@ -144,6 +144,7 @@ class VolkswagenFlags(IntFlag): # Static flags PQ = 2 + PQSteeringPatch = 2 ** 2 @dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 067108352..05efb2c07 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -102,6 +102,9 @@ class Car: if self.params.get_bool("dp_lat_alka"): dp_params |= structs.DPFlags.LateralALKA + if self.params.get_bool("dp_vag_pq_steering_patch"): + dp_params |= structs.DPFlags.VAGPQSteeringPatch + self.CI = get_car(*self.can_callbacks, obd_callback(self.params), experimental_long_allowed, num_pandas, dp_params, cached_params) self.RI = interfaces[self.CI.CP.carFingerprint].RadarInterface(self.CI.CP) self.CP = self.CI.CP diff --git a/selfdrive/ui/qt/offroad/dp_panel.cc b/selfdrive/ui/qt/offroad/dp_panel.cc index 8868a6033..093bf89b0 100644 --- a/selfdrive/ui/qt/offroad/dp_panel.cc +++ b/selfdrive/ui/qt/offroad/dp_panel.cc @@ -40,6 +40,11 @@ void DPPanel::add_vag_toggles() { QString::fromUtf8("🐉 ") + tr("VW / Audi / Skoda"), "", }, + { + "dp_vag_pq_steering_patch", + tr("PQ Steering Patch"), + "" + }, }; QWidget *label = nullptr; diff --git a/system/manager/manager.py b/system/manager/manager.py index da9ed9e2d..f73c5ca6c 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -62,6 +62,7 @@ def manager_init() -> None: ("dp_lon_no_gas_gating", "0"), ("dp_device_auto_shutdown_in", "-5"), ("dp_ui_radar_tracks", "0"), + ("dp_vag_pq_steering_patch", "0"), ] if params.get_bool("RecordFrontLock"):