From 33d4a134abb6af44e268e3506236bd8345d75439 Mon Sep 17 00:00:00 2001 From: dparring Date: Fri, 28 Jun 2024 09:44:31 -0500 Subject: [PATCH 01/23] seatbelt signal --- selfdrive/car/volkswagen/carstate.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index a8f68b3474b8fe..45e9588671c4fa 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -158,8 +158,7 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # Update seatbelt fastened status. - # FIXME: disabled for Macan testing - #ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 + ret.seatbeltUnlatched = pt_cp.vl["Gateway_06"]["AB_Gurtschloss_FA"] != 3 # Consume blind-spot monitoring info/warning LED states, if available. # Infostufe: BSM LED on, Warnung: BSM LED flashing @@ -376,7 +375,7 @@ def get_can_parser_mlb(CP): #("TSK_02", 33), # From J623 Engine control module # FIXME: Macan gateway and airbag state on powertrain #("Airbag_02", 5), # From J234 Airbag control module - #("Gateway_05", 10), # From J533 CAN gateway (aggregated data) + ("Gateway_06", 10), # TODO: update comment: From J533 CAN gateway (aggregated data) ("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) From 4b91c18e606ab3b9c37dcbbbdd5d26aba4095661 Mon Sep 17 00:00:00 2001 From: dparring Date: Fri, 28 Jun 2024 10:45:21 -0500 Subject: [PATCH 02/23] forking opendbc --- opendbc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc b/opendbc index 45eb0465f34dc3..5468ed8e94db41 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 45eb0465f34dc3d837bbe77733002650464678cf +Subproject commit 5468ed8e94db41160233c0313bb3028c65b4e962 From ce0f962267cf59d4988236fdfb47b113d0e130a8 Mon Sep 17 00:00:00 2001 From: dparring Date: Tue, 2 Jul 2024 22:33:56 -0500 Subject: [PATCH 03/23] gear shift signal --- selfdrive/car/volkswagen/carstate.py | 7 ++++--- selfdrive/car/volkswagen/values.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 45e9588671c4fa..b6f09f74262e85 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -52,8 +52,8 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): 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 + # Gearshift signal + ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], None)).replace('Position ', '')) # TODO: this is only present on powertrain #ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"], @@ -375,10 +375,11 @@ def get_can_parser_mlb(CP): #("TSK_02", 33), # From J623 Engine control module # FIXME: Macan gateway and airbag state on powertrain #("Airbag_02", 5), # From J234 Airbag control module - ("Gateway_06", 10), # TODO: update comment: From J533 CAN gateway (aggregated data) + ("Gateway_06", 10), # TODO: what is source of this signal? ("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) + ("Getriebe_03", 50), # TODO: what is the source of this signal? transmission ecu? ] # TODO: gear shift parsing diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index eb6dcb0df7061d..a48189f428c46b 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -83,7 +83,7 @@ def __init__(self, CP): 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.shifter_values = can_define.dv["Getriebe_03"]["GE_Waehlhebel"] 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]), From 693c51dcdca25bc8e63a62400bc9e71de9bfa7fc Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Mon, 8 Jul 2024 22:15:05 -0500 Subject: [PATCH 04/23] Adding fingerprint for 2021 Macan Turbo --- selfdrive/car/volkswagen/fingerprints.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index c595f9be7464b2..2464af84ec2804 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -956,18 +956,23 @@ CAR.PORSCHE_MACAN_MK1: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8795B90652013\xf1\x893485', + b'\xf1\x8795B907551D \xf1\x890006', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x8795B927156CE\xf1\x890022', + b'\xf1\x8795B927156JH\xf1\x890001', ], (Ecu.srs, 0x715, None): [ b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513', + b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514', ], (Ecu.eps, 0x712, None): [ b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04#\x04#', + b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04/\x04/', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x8795B907567B\x00\xf1\x890800\xf1\x82108', + b'\xf1\x8795B907567G\x00\xf1\x890410\xf1\x82104', ], }, CAR.SKODA_FABIA_MK4: { From 054c487ad9be2418685a97836f7ade243a3d86f1 Mon Sep 17 00:00:00 2001 From: dparring Date: Tue, 9 Jul 2024 15:19:04 -0500 Subject: [PATCH 05/23] testing --- selfdrive/car/volkswagen/carstate.py | 3 ++- selfdrive/car/volkswagen/mlbcan.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index b6f09f74262e85..212fd689766143 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -53,7 +53,8 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.espDisabled = pt_cp.vl["ESP_01"]["ESP_Tastung_passiv"] != 0 # Gearshift signal - ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], None)).replace('Position ', '')) + print(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], 'P'))) + ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], 'D')).replace('Position ', '')) # TODO: this is only present on powertrain #ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"], diff --git a/selfdrive/car/volkswagen/mlbcan.py b/selfdrive/car/volkswagen/mlbcan.py index 784829d16c0723..2d836e0a770496 100644 --- a/selfdrive/car/volkswagen/mlbcan.py +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -3,7 +3,7 @@ def create_steering_control(packer, bus, apply_steer, lkas_enabled): "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_Vib_Freq": 30, "HCA_01_Sendestatus": 1 if lkas_enabled else 0, "EA_ACC_Wunschgeschwindigkeit": 327.36, } From 491baf7f06a515ee5da6674bfdf2fe50210aa37c Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Tue, 9 Jul 2024 20:56:53 -0500 Subject: [PATCH 06/23] reverting test --- 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 2d836e0a770496..784829d16c0723 100644 --- a/selfdrive/car/volkswagen/mlbcan.py +++ b/selfdrive/car/volkswagen/mlbcan.py @@ -3,7 +3,7 @@ def create_steering_control(packer, bus, apply_steer, lkas_enabled): "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": 30, + "HCA_01_Vib_Freq": 18, "HCA_01_Sendestatus": 1 if lkas_enabled else 0, "EA_ACC_Wunschgeschwindigkeit": 327.36, } From 77e89edc7956b49615308800691fc0f08105dec2 Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:44:54 -0500 Subject: [PATCH 07/23] Update carstate.py --- selfdrive/car/volkswagen/carstate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 212fd689766143..abbacb37207450 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -55,7 +55,8 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): # Gearshift signal print(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], 'P'))) ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], 'D')).replace('Position ', '')) - + 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"], From 3b0ed536af80b4734e27f86b5b2fbfb087f31769 Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Wed, 17 Jul 2024 21:23:08 -0500 Subject: [PATCH 08/23] shifter --- selfdrive/car/volkswagen/carstate.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index abbacb37207450..9e44782de2c62b 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -53,9 +53,8 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.espDisabled = pt_cp.vl["ESP_01"]["ESP_Tastung_passiv"] != 0 # Gearshift signal - print(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], 'P'))) - ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], 'D')).replace('Position ', '')) - ret.gearShifter = GearShifter.drive + # TODO: alternatives to string parsing? edit parse_gear_shifter or edit DBC string values + ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], GearShifter.None)).replace('POSITION_', '')) # TODO: this is only present on powertrain #ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"], From 579da40b8c1184cf07b3ffc53c5f7eaaa98119a3 Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Wed, 17 Jul 2024 21:38:37 -0500 Subject: [PATCH 09/23] default to park --- selfdrive/car/volkswagen/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 9e44782de2c62b..8fff209a325047 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -54,7 +54,7 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): # Gearshift signal # TODO: alternatives to string parsing? edit parse_gear_shifter or edit DBC string values - ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], GearShifter.None)).replace('POSITION_', '')) + ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], "P")).replace('POSITION_', '')) # TODO: this is only present on powertrain #ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"], From 988142da15674a10217929b27d7ea5d1997af934 Mon Sep 17 00:00:00 2001 From: dparring Date: Thu, 25 Jul 2024 16:09:57 -0500 Subject: [PATCH 10/23] door signals --- selfdrive/car/volkswagen/carstate.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 8fff209a325047..a0bbf7e178cc20 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -55,12 +55,12 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): # Gearshift signal # TODO: alternatives to string parsing? edit parse_gear_shifter or edit DBC string values ret.gearShifter = self.parse_gear_shifter(str(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], "P")).replace('POSITION_', '')) - + # 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"]]) + 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"]) @@ -376,6 +376,7 @@ def get_can_parser_mlb(CP): #("TSK_02", 33), # From J623 Engine control module # FIXME: Macan gateway and airbag state on powertrain #("Airbag_02", 5), # From J234 Airbag control module + ("Gateway_05", 10), # ("Gateway_06", 10), # TODO: what is source of this signal? ("Kombi_01", 2), # From J285 Instrument cluster ("Blinkmodi_01", 0), # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active) From 6227ac54e692ac7ea660e443b7b4f83bd9483674 Mon Sep 17 00:00:00 2001 From: dparring Date: Thu, 25 Jul 2024 16:12:53 -0500 Subject: [PATCH 11/23] cleanup --- selfdrive/car/volkswagen/carstate.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index a0bbf7e178cc20..ad6f9cb7bd238c 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -374,9 +374,7 @@ def get_can_parser_mlb(CP): ("LS_01", 5), # From J533 CAN gateway (via LIN from steering wheel controls) # FIXME: Testing using radar state instead of TSK state for Macan #("TSK_02", 33), # From J623 Engine control module - # FIXME: Macan gateway and airbag state on powertrain - #("Airbag_02", 5), # From J234 Airbag control module - ("Gateway_05", 10), # + ("Gateway_05", 10), # From J533 CAN gateway (aggregated data) ("Gateway_06", 10), # TODO: what is source of this signal? ("Kombi_01", 2), # From J285 Instrument cluster ("Blinkmodi_01", 0), # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active) From 7c334c954abfd90364bb2eacf2c2f14cca2596f1 Mon Sep 17 00:00:00 2001 From: dparring Date: Thu, 25 Jul 2024 23:20:58 -0500 Subject: [PATCH 12/23] update LDW frequency --- selfdrive/car/volkswagen/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index a48189f428c46b..9c2618197dd033 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -72,7 +72,7 @@ def __init__(self, CP): } else: - self.LDW_STEP = 10 # LDW_02 message frequency 10Hz + self.LDW_STEP = 4 # LDW_02 message frequency 10Hz self.ACC_HUD_STEP = 6 # ACC_02 message frequency 16Hz self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"] From 4f605d3e43fc427dca0f101ced5c271e17d13118 Mon Sep 17 00:00:00 2001 From: DP Date: Thu, 16 Jan 2025 23:58:59 -0600 Subject: [PATCH 13/23] merging in EPS timer reset --- selfdrive/car/volkswagen/carcontroller.py | 33 ++++++++++++++++++++--- selfdrive/car/volkswagen/values.py | 4 +++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index cde7705f1ed800..4c652be8411e83 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -29,14 +29,18 @@ def __init__(self, dbc_name, CP, VM): self.apply_steer_last = 0 self.gra_acc_counter_last = None self.frame = 0 + self.eps_timer_workaround = True # For testing, replace with CP.carFingerprint in (PQ_CARS, MLB_CARS) self.eps_timer_soft_disable_alert = False 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, now_nanos): actuators = CC.actuators hud_control = CC.hudControl can_sends = [] + output_steer = 0 # **** Steering Controls ************************************************ # @@ -49,6 +53,10 @@ def update(self, CC, CS, now_nanos): # * Don't send uninterrupted steering for > 360 seconds # 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 reset + # if engaged for a long time and torque output is currently low. Resets + # are aborted early if torque demand rises. Long resets, completed or + # not, need apply_steer reset to 0 on exit due to rate limit safety. if CC.latActive: new_steer = int(round(actuators.steer * self.CCP.STEER_MAX)) @@ -62,16 +70,33 @@ def update(self, CC, CS, now_nanos): else: self.hca_frame_same_torque = 0 hca_enabled = abs(apply_steer) > 0 + if self.eps_timer_workaround and self.hca_frame_timer_running >= self.CCP.STEER_TIME_BM / DT_CTRL: + if abs(apply_steer) <= self.CCP.STEER_LOW_TORQUE: + self.hca_frame_low_torque += self.CCP.STEER_STEP + if self.hca_frame_low_torque >= self.CCP.STEER_TIME_LOW_TORQUE / DT_CTRL: + hca_enabled = False + else: + self.hca_frame_low_torque = 0 + if self.hca_frame_timer_resetting > 0: + apply_steer = 0 else: + self.hca_frame_low_torque = 0 hca_enabled = False apply_steer = 0 - if not hca_enabled: - self.hca_frame_timer_running = 0 + if hca_enabled: + output_steer = apply_steer + self.hca_frame_timer_resetting = 0 + else: + output_steer = 0 + self.hca_frame_timer_resetting += self.CCP.STEER_STEP + if self.hca_frame_timer_resetting >= 1.1 / DT_CTRL or not self.eps_timer_workaround: + self.hca_frame_timer_running = 0 + apply_steer = 0 self.eps_timer_soft_disable_alert = self.hca_frame_timer_running > self.CCP.STEER_TIME_ALERT / DT_CTRL self.apply_steer_last = apply_steer - 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, output_steer, hca_enabled)) if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: # Pacify VW Emergency Assist driver inactivity detection by changing its view of driver steering input torque @@ -120,7 +145,7 @@ def update(self, CC, CS, 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.output_steer / self.CCP.STEER_MAX new_actuators.steerOutputCan = self.apply_steer_last self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"] diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 9c2618197dd033..ed3abba28ccf3f 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -31,8 +31,12 @@ class CarControllerParams: STEER_DRIVER_FACTOR = 1 # from dbc STEER_TIME_MAX = 360 # Max time that EPS allows uninterrupted HCA steering control + STEER_TIME_BM = STEER_TIME_MAX - 120 # Attempts to mitigate the EPS max steer timer begin STEER_TIME_ALERT = STEER_TIME_MAX - 10 # If mitigation fails, time to soft disengage before EPS timer expires + STEER_LOW_TORQUE = STEER_MAX * 0.2 # Steer timer mitigation performed when torque output under 20% + STEER_TIME_LOW_TORQUE = 0.5 # Wait for this duration of STEER_LOW_TORQUE to begin mitigation STEER_TIME_STUCK_TORQUE = 1.9 # EPS limits same torque to 6 seconds, reset timer 3x within that period + STEER_TIME_RESET = 1.1 # Duration of HCA disable needed for effective EPS timer reset DEFAULT_MIN_STEER_SPEED = 0.4 # m/s, newer EPS racks fault below this speed, don't show a low speed alert From 40d822934f1fe8d08a7c91930392c19b8346dea4 Mon Sep 17 00:00:00 2001 From: DP Date: Tue, 4 Mar 2025 19:25:25 -0600 Subject: [PATCH 14/23] fix: correct variable reference for steering output calculation --- 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 4c652be8411e83..732aaa4dbd59cd 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -145,7 +145,7 @@ def update(self, CC, CS, now_nanos): cancel=CC.cruiseControl.cancel, resume=CC.cruiseControl.resume)) new_actuators = actuators.copy() - new_actuators.steer = self.output_steer / self.CCP.STEER_MAX + new_actuators.steer = output_steer / self.CCP.STEER_MAX new_actuators.steerOutputCan = self.apply_steer_last self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"] From 33a28dfbd9d494dcaf4d8a1d9f8abd2d0c92806b Mon Sep 17 00:00:00 2001 From: DP Date: Sun, 30 Mar 2025 00:37:39 -0500 Subject: [PATCH 15/23] feat: add new firmware versions for 2020 Macan S --- selfdrive/car/volkswagen/fingerprints.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 2464af84ec2804..98f9a1b138830f 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -957,13 +957,16 @@ (Ecu.engine, 0x7e0, None): [ b'\xf1\x8795B90652013\xf1\x893485', b'\xf1\x8795B907551D \xf1\x890006', + b'\xf1\x8795B907559E \xf1\x890006', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x8795B927156CE\xf1\x890022', + b'\xf1\x8795B927156FG\xf1\x890005', b'\xf1\x8795B927156JH\xf1\x890001', ], (Ecu.srs, 0x715, None): [ b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513', + b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x050690033514', b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514', ], (Ecu.eps, 0x712, None): [ @@ -972,6 +975,7 @@ ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x8795B907567B\x00\xf1\x890800\xf1\x82108', + b'\xf1\x8795B907567C\x00\xf1\x890400\xf1\x82104', b'\xf1\x8795B907567G\x00\xf1\x890410\xf1\x82104', ], }, From fb9a034a1581748ced65c6758604d27229258acf Mon Sep 17 00:00:00 2001 From: DP Date: Wed, 23 Apr 2025 22:50:18 -0500 Subject: [PATCH 16/23] fixing cc set point display --- selfdrive/car/volkswagen/carstate.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index ad6f9cb7bd238c..f77675df71a819 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -174,11 +174,12 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation # 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. - # TODO: ugly hack while testing CC-only S4 - if self.CP.pcmCruise and not self.CP.flags & VolkswagenFlags.MLB: + # radar sends a set-speed of ~90.69 m/s / 203.19 mph / 327.04 kph + # TODO: ugly hack while testing CC-only S4, also macan. + # EDIT: bumping the upper limit to 100 to match the stock functionality (100 max CC set point on USA Macan) + if self.CP.pcmCruise: ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS - if ret.cruiseState.speed > 90: + if ret.cruiseState.speed > 100: ret.cruiseState.speed = 0 # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough @@ -380,6 +381,7 @@ def get_can_parser_mlb(CP): ("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) ("Getriebe_03", 50), # TODO: what is the source of this signal? transmission ecu? + ("ACC_02", 50), # Macan test: CC speed setting ] # TODO: gear shift parsing From fd388c0f4145c0d770ed81d143fbf996d399d78c Mon Sep 17 00:00:00 2001 From: DP Date: Thu, 24 Apr 2025 13:03:44 -0500 Subject: [PATCH 17/23] fixing frequency of ACC_02 on macan --- selfdrive/car/volkswagen/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index f77675df71a819..f08de0ce7effca 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -381,7 +381,7 @@ def get_can_parser_mlb(CP): ("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) ("Getriebe_03", 50), # TODO: what is the source of this signal? transmission ecu? - ("ACC_02", 50), # Macan test: CC speed setting + ("ACC_02", 25), # Macan test: CC speed setting ] # TODO: gear shift parsing From a90ce7715020f6576f4638609912da4986e34222 Mon Sep 17 00:00:00 2001 From: DP Date: Thu, 24 Apr 2025 13:18:28 -0500 Subject: [PATCH 18/23] moving signal to cam bus, pt cuts out when OP goes into TX on ACC_02 pt bus 0 for some reason --- selfdrive/car/volkswagen/carstate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index f08de0ce7effca..f5f29cf9558956 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -178,7 +178,7 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): # TODO: ugly hack while testing CC-only S4, also macan. # EDIT: bumping the upper limit to 100 to match the stock functionality (100 max CC set point on USA Macan) if self.CP.pcmCruise: - ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS + ret.cruiseState.speed = cam_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS if ret.cruiseState.speed > 100: ret.cruiseState.speed = 0 @@ -381,7 +381,6 @@ def get_can_parser_mlb(CP): ("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) ("Getriebe_03", 50), # TODO: what is the source of this signal? transmission ecu? - ("ACC_02", 25), # Macan test: CC speed setting ] # TODO: gear shift parsing @@ -393,6 +392,7 @@ def get_can_parser_mlb(CP): def get_cam_can_parser_mlb(CP): messages = [ ("ACC_05", 50), # Macan test: from radar + ("ACC_02", 25), # Macan test: CC speed setting ] if CP.networkLocation == NetworkLocation.fwdCamera: From 6ee7f58324d262c73088f25b154dd517a4ce5fbc Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Sat, 3 May 2025 15:03:19 -0500 Subject: [PATCH 19/23] fix until fixed --- selfdrive/car/volkswagen/carstate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index f5f29cf9558956..b86dbc197ffd6f 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -177,8 +177,8 @@ def update(self, pt_cp, cam_cp, ext_cp, trans_type): # radar sends a set-speed of ~90.69 m/s / 203.19 mph / 327.04 kph # TODO: ugly hack while testing CC-only S4, also macan. # EDIT: bumping the upper limit to 100 to match the stock functionality (100 max CC set point on USA Macan) - if self.CP.pcmCruise: - ret.cruiseState.speed = cam_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS + if self.CP.pcmCruise and not self.CP.flags & VolkswagenFlags.MLB: + ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS if ret.cruiseState.speed > 100: ret.cruiseState.speed = 0 From 82af692584c06eb85de970fe735b6b1106342ffa Mon Sep 17 00:00:00 2001 From: dparring <114614741+dparring@users.noreply.github.com> Date: Sat, 3 May 2025 15:23:43 -0500 Subject: [PATCH 20/23] Update carstate.py --- 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 b86dbc197ffd6f..cf6a40ccc4de83 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -392,7 +392,6 @@ def get_can_parser_mlb(CP): def get_cam_can_parser_mlb(CP): messages = [ ("ACC_05", 50), # Macan test: from radar - ("ACC_02", 25), # Macan test: CC speed setting ] if CP.networkLocation == NetworkLocation.fwdCamera: From 3d02c2dacef9783ee5edfdcdecd7620a2ba3da1c Mon Sep 17 00:00:00 2001 From: DP Date: Sun, 8 Jun 2025 22:36:13 -0500 Subject: [PATCH 21/23] adding fingerprints from ColdHeat - 2023 Macan --- selfdrive/car/chrysler/values.py | 2 +- selfdrive/car/volkswagen/fingerprints.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 42ea94cf86c069..a6d0174e0b9873 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -84,7 +84,7 @@ class CAR(Platforms): ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), ], - ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), + ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16., tireStiffnessFront=192150, tireStiffnessRear=202500), dbc_dict('chrysler_ram_hd_generated', None), ) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 98f9a1b138830f..a997950f3cc707 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -958,25 +958,31 @@ b'\xf1\x8795B90652013\xf1\x893485', b'\xf1\x8795B907551D \xf1\x890006', b'\xf1\x8795B907559E \xf1\x890006', + b'\xf1\x8795B906259BE\xf1\x890001', ], (Ecu.transmission, 0x7e1, None): [ b'\xf1\x8795B927156CE\xf1\x890022', b'\xf1\x8795B927156FG\xf1\x890005', b'\xf1\x8795B927156JH\xf1\x890001', + b'\xf1\x8795B927156KB\xf1\x890001', ], (Ecu.srs, 0x715, None): [ b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513', b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x050690033514', b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514', + b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CJ02D417', ], (Ecu.eps, 0x712, None): [ b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04#\x04#', b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04/\x04/', + #TODO: garon missing + b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x046\x046', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x8795B907567B\x00\xf1\x890800\xf1\x82108', b'\xf1\x8795B907567C\x00\xf1\x890400\xf1\x82104', b'\xf1\x8795B907567G\x00\xf1\x890410\xf1\x82104', + b'\xf1\x8795B907567H\x00\xf1\x890430\xf1\x82104', ], }, CAR.SKODA_FABIA_MK4: { From f9a88299f60295fe1a375705b6338a5fbd27cdc7 Mon Sep 17 00:00:00 2001 From: DP Date: Sun, 8 Jun 2025 22:54:35 -0500 Subject: [PATCH 22/23] wrong branch --- selfdrive/car/chrysler/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index a6d0174e0b9873..42ea94cf86c069 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -84,7 +84,7 @@ class CAR(Platforms): ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), ], - ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16., tireStiffnessFront=192150, tireStiffnessRear=202500), + ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), dbc_dict('chrysler_ram_hd_generated', None), ) From e1f5cb2a656e098723c7812c0e571e2d7ae9fe11 Mon Sep 17 00:00:00 2001 From: dparring Date: Tue, 26 Aug 2025 22:16:59 -0500 Subject: [PATCH 23/23] adding fingerprint for 2015 non ACC from FOREVERZAX --- selfdrive/car/volkswagen/fingerprints.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index a997950f3cc707..dcfaabddb96cc4 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -955,24 +955,28 @@ }, CAR.PORSCHE_MACAN_MK1: { (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8795B906259 \xf1\x890005', b'\xf1\x8795B90652013\xf1\x893485', b'\xf1\x8795B907551D \xf1\x890006', b'\xf1\x8795B907559E \xf1\x890006', b'\xf1\x8795B906259BE\xf1\x890001', ], (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8795B927156AH\xf1\x890014', b'\xf1\x8795B927156CE\xf1\x890022', b'\xf1\x8795B927156FG\xf1\x890005', b'\xf1\x8795B927156JH\xf1\x890001', b'\xf1\x8795B927156KB\xf1\x890001', ], (Ecu.srs, 0x715, None): [ + b'\xf1\x8795B959655D \xf1\x890110\xf1\x82\x05064702D312', b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513', b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x050690033514', b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514', b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CJ02D417', ], (Ecu.eps, 0x712, None): [ + b'\xf1\x8795B909144B \xf1\x890902\xf1\x82\x01m', b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04#\x04#', b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04/\x04/', #TODO: garon missing