wip
This commit is contained in:
@@ -4,18 +4,19 @@ from openpilot.common.numpy_fast import clip
|
||||
from openpilot.common.conversions import Conversions as CV
|
||||
from openpilot.common.realtime import DT_CTRL
|
||||
from openpilot.selfdrive.car import apply_driver_steer_torque_limits
|
||||
from openpilot.selfdrive.car.interfaces import CarControllerBase
|
||||
from openpilot.selfdrive.car.volkswagen import mqbcan, pqcan
|
||||
from openpilot.selfdrive.car.volkswagen.values import CANBUS, PQ_CARS, CarControllerParams, VolkswagenFlags
|
||||
from openpilot.selfdrive.car.volkswagen.values import CANBUS, CarControllerParams, VolkswagenFlags
|
||||
|
||||
VisualAlert = car.CarControl.HUDControl.VisualAlert
|
||||
LongCtrlState = car.CarControl.Actuators.LongControlState
|
||||
|
||||
|
||||
class CarController:
|
||||
class CarController(CarControllerBase):
|
||||
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.CCS = pqcan if CP.flags & VolkswagenFlags.PQ else mqbcan
|
||||
self.packer_pt = CANPacker(dbc_name)
|
||||
|
||||
self.apply_steer_last = 0
|
||||
@@ -104,7 +105,7 @@ class CarController:
|
||||
# FIXME: follow the recent displayed-speed updates, also use mph_kmh toggle to fix display rounding problem?
|
||||
set_speed = hud_control.setSpeed * CV.MS_TO_KPH
|
||||
can_sends.append(self.CCS.create_acc_hud_control(self.packer_pt, CANBUS.pt, acc_hud_status, set_speed,
|
||||
lead_distance, CS.personality_profile))
|
||||
lead_distance, hud_control.leadDistanceBars))
|
||||
|
||||
# **** Stock ACC Button Controls **************************************** #
|
||||
|
||||
|
||||
@@ -3,13 +3,15 @@ from cereal import car
|
||||
from openpilot.common.conversions import Conversions as CV
|
||||
from openpilot.selfdrive.car.interfaces import CarStateBase
|
||||
from opendbc.can.parser import CANParser
|
||||
from openpilot.selfdrive.car.volkswagen.values import DBC, CANBUS, PQ_CARS, NetworkLocation, TransmissionType, GearShifter, \
|
||||
from openpilot.selfdrive.car.volkswagen.values import DBC, CANBUS, NetworkLocation, TransmissionType, GearShifter, \
|
||||
CarControllerParams, VolkswagenFlags
|
||||
|
||||
|
||||
class CarState(CarStateBase):
|
||||
def __init__(self, CP):
|
||||
super().__init__(CP)
|
||||
self.frame = 0
|
||||
self.eps_init_complete = False
|
||||
self.CCP = CarControllerParams(CP)
|
||||
self.button_states = {button.event_type: False for button in self.CCP.BUTTONS}
|
||||
self.esp_hold_confirmation = False
|
||||
@@ -31,7 +33,7 @@ class CarState(CarStateBase):
|
||||
return button_events
|
||||
|
||||
def update(self, pt_cp, cam_cp, ext_cp, trans_type, frogpilot_variables):
|
||||
if self.CP.carFingerprint in PQ_CARS:
|
||||
if self.CP.flags & VolkswagenFlags.PQ:
|
||||
return self.update_pq(pt_cp, cam_cp, ext_cp, trans_type, frogpilot_variables)
|
||||
|
||||
ret = car.CarState.new_message()
|
||||
@@ -47,18 +49,14 @@ class CarState(CarStateBase):
|
||||
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
|
||||
ret.standstill = ret.vEgoRaw == 0
|
||||
|
||||
# Update steering angle, rate, yaw rate, and driver input torque. VW send
|
||||
# the sign/direction in a separate signal so they must be recombined.
|
||||
# Update EPS position and state info. For signed values, VW sends the sign in a separate signal.
|
||||
ret.steeringAngleDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradwinkel"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradwinkel"])]
|
||||
ret.steeringRateDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradw_Geschw"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradw_Geschw"])]
|
||||
ret.steeringTorque = pt_cp.vl["LH_EPS_03"]["EPS_Lenkmoment"] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]["EPS_VZ_Lenkmoment"])]
|
||||
ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE
|
||||
ret.yawRate = pt_cp.vl["ESP_02"]["ESP_Gierrate"] * (1, -1)[int(pt_cp.vl["ESP_02"]["ESP_VZ_Gierrate"])] * CV.DEG_TO_RAD
|
||||
|
||||
# Verify EPS readiness to accept steering commands
|
||||
hca_status = self.CCP.hca_status_values.get(pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"])
|
||||
ret.steerFaultPermanent = hca_status in ("DISABLED", "FAULT")
|
||||
ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED")
|
||||
ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status)
|
||||
|
||||
# VW Emergency Assist status tracking and mitigation
|
||||
self.eps_stock_values = pt_cp.vl["LH_EPS_03"]
|
||||
@@ -151,25 +149,7 @@ class CarState(CarStateBase):
|
||||
# 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"])
|
||||
|
||||
# Driving personalities function
|
||||
if frogpilot_variables.personalities_via_wheel and ret.cruiseState.available:
|
||||
# Sync with the onroad UI button
|
||||
if self.fpf.personality_changed_via_ui:
|
||||
self.personality_profile = self.fpf.current_personality
|
||||
self.previous_personality_profile = self.personality_profile
|
||||
self.fpf.reset_personality_changed_param()
|
||||
|
||||
# Change personality upon steering wheel button press
|
||||
distance_button = pt_cp.vl["GRA_ACC_01"]["GRA_Verstellung_Zeitluecke"]
|
||||
|
||||
if distance_button and not self.distance_previously_pressed:
|
||||
self.personality_profile = (self.previous_personality_profile + 2) % 3
|
||||
self.distance_previously_pressed = distance_button
|
||||
|
||||
if self.personality_profile != self.previous_personality_profile:
|
||||
self.fpf.distance_button_function(self.personality_profile)
|
||||
self.previous_personality_profile = self.personality_profile
|
||||
|
||||
self.frame += 1
|
||||
return ret
|
||||
|
||||
def update_pq(self, pt_cp, cam_cp, ext_cp, trans_type, frogpilot_variables):
|
||||
@@ -187,18 +167,14 @@ class CarState(CarStateBase):
|
||||
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
|
||||
ret.standstill = ret.vEgoRaw == 0
|
||||
|
||||
# Update steering angle, rate, yaw rate, and driver input torque. VW send
|
||||
# the sign/direction in a separate signal so they must be recombined.
|
||||
# Update EPS position and state info. For signed values, VW sends the sign in a separate signal.
|
||||
ret.steeringAngleDeg = pt_cp.vl["Lenkhilfe_3"]["LH3_BLW"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"])]
|
||||
ret.steeringRateDeg = pt_cp.vl["Lenkwinkel_1"]["Lenkradwinkel_Geschwindigkeit"] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]["Lenkradwinkel_Geschwindigkeit_S"])]
|
||||
ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]["LH3_LM"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_LMSign"])]
|
||||
ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE
|
||||
ret.yawRate = pt_cp.vl["Bremse_5"]["Giergeschwindigkeit"] * (1, -1)[int(pt_cp.vl["Bremse_5"]["Vorzeichen_der_Giergeschwindigk"])] * CV.DEG_TO_RAD
|
||||
|
||||
# Verify EPS readiness to accept steering commands
|
||||
hca_status = self.CCP.hca_status_values.get(pt_cp.vl["Lenkhilfe_2"]["LH2_Sta_HCA"])
|
||||
ret.steerFaultPermanent = hca_status in ("DISABLED", "FAULT")
|
||||
ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED")
|
||||
ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status)
|
||||
|
||||
# Update gas, brakes, and gearshift.
|
||||
ret.gas = pt_cp.vl["Motor_3"]["Fahrpedal_Rohsignal"] / 100.0
|
||||
@@ -272,11 +248,20 @@ class CarState(CarStateBase):
|
||||
# Additional safety checks performed in CarInterface.
|
||||
ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["ESP_Passiv_getastet"])
|
||||
|
||||
self.frame += 1
|
||||
return ret
|
||||
|
||||
def update_hca_state(self, hca_status):
|
||||
# Treat INITIALIZING and FAULT as temporary for worst likely EPS recovery time, for cars without factory Lane Assist
|
||||
# DISABLED means the EPS hasn't been configured to support Lane Assist
|
||||
self.eps_init_complete = self.eps_init_complete or (hca_status in ("DISABLED", "READY", "ACTIVE") or self.frame > 600)
|
||||
perm_fault = hca_status == "DISABLED" or (self.eps_init_complete and hca_status in ("INITIALIZING", "FAULT"))
|
||||
temp_fault = hca_status == "REJECTED" or not self.eps_init_complete
|
||||
return temp_fault, perm_fault
|
||||
|
||||
@staticmethod
|
||||
def get_can_parser(CP):
|
||||
if CP.carFingerprint in PQ_CARS:
|
||||
if CP.flags & VolkswagenFlags.PQ:
|
||||
return CarState.get_can_parser_pq(CP)
|
||||
|
||||
messages = [
|
||||
@@ -313,7 +298,7 @@ class CarState(CarStateBase):
|
||||
|
||||
@staticmethod
|
||||
def get_cam_can_parser(CP):
|
||||
if CP.carFingerprint in PQ_CARS:
|
||||
if CP.flags & VolkswagenFlags.PQ:
|
||||
return CarState.get_cam_can_parser_pq(CP)
|
||||
|
||||
messages = []
|
||||
|
||||
@@ -80,6 +80,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x873Q0959655BN\xf1\x890713\xf1\x82\x0e2214152212001105141122052900',
|
||||
b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e1114151112001105111122052900',
|
||||
b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e2214152212001105141122052900',
|
||||
b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105111122052J00',
|
||||
b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105161122052J00',
|
||||
b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1115151112001105171122052J00',
|
||||
],
|
||||
@@ -87,6 +88,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B60924A1',
|
||||
b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6G920A1',
|
||||
b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6M921A1',
|
||||
b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6N920A1',
|
||||
b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6080105',
|
||||
b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6090105',
|
||||
],
|
||||
@@ -99,6 +101,17 @@ FW_VERSIONS = {
|
||||
b'\xf1\x875Q0907572P \xf1\x890682',
|
||||
],
|
||||
},
|
||||
CAR.CADDY_MK3: {
|
||||
(Ecu.engine, 0x7e0, None): [
|
||||
b'\xf1\x8704E906027T \xf1\x892363',
|
||||
],
|
||||
(Ecu.srs, 0x715, None): [
|
||||
b'\xf1\x872K5959655E \xf1\x890018\xf1\x82\x05000P037605',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x757, None): [
|
||||
b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0155',
|
||||
],
|
||||
},
|
||||
CAR.CRAFTER_MK2: {
|
||||
(Ecu.engine, 0x7e0, None): [
|
||||
b'\xf1\x8704L906056BP\xf1\x894729',
|
||||
@@ -164,6 +177,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x875G0906259T \xf1\x890003',
|
||||
b'\xf1\x878V0906259H \xf1\x890002',
|
||||
b'\xf1\x878V0906259J \xf1\x890003',
|
||||
b'\xf1\x878V0906259J \xf1\x890103',
|
||||
b'\xf1\x878V0906259K \xf1\x890001',
|
||||
b'\xf1\x878V0906259K \xf1\x890003',
|
||||
b'\xf1\x878V0906259P \xf1\x890001',
|
||||
@@ -209,6 +223,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x870DD300046F \xf1\x891601',
|
||||
b'\xf1\x870GC300012A \xf1\x891401',
|
||||
b'\xf1\x870GC300012A \xf1\x891403',
|
||||
b'\xf1\x870GC300012M \xf1\x892301',
|
||||
b'\xf1\x870GC300014B \xf1\x892401',
|
||||
b'\xf1\x870GC300014B \xf1\x892403',
|
||||
b'\xf1\x870GC300014B \xf1\x892405',
|
||||
@@ -227,6 +242,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x875Q0959655AR\xf1\x890317\xf1\x82\x13141500111233003142114A2131219333313100',
|
||||
b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333423100',
|
||||
b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333463100',
|
||||
b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x13141600111233003142115A2232229333463100',
|
||||
b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100',
|
||||
b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2251229333463100',
|
||||
b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2252229333463100',
|
||||
@@ -317,6 +333,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x8704E906024BC\xf1\x899971',
|
||||
b'\xf1\x8704E906024BG\xf1\x891057',
|
||||
b'\xf1\x8704E906024C \xf1\x899970',
|
||||
b'\xf1\x8704E906024C \xf1\x899971',
|
||||
b'\xf1\x8704E906024L \xf1\x895595',
|
||||
b'\xf1\x8704E906024L \xf1\x899970',
|
||||
b'\xf1\x8704E906027MS\xf1\x896223',
|
||||
@@ -370,6 +387,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x8704L906026FP\xf1\x892012',
|
||||
b'\xf1\x8704L906026GA\xf1\x892013',
|
||||
b'\xf1\x8704L906026KD\xf1\x894798',
|
||||
b'\xf1\x8705L906022A \xf1\x890827',
|
||||
b'\xf1\x873G0906259 \xf1\x890004',
|
||||
b'\xf1\x873G0906259B \xf1\x890002',
|
||||
b'\xf1\x873G0906264 \xf1\x890004',
|
||||
@@ -389,6 +407,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x870DL300011H \xf1\x895201',
|
||||
b'\xf1\x870GC300042H \xf1\x891404',
|
||||
b'\xf1\x870GC300043 \xf1\x892301',
|
||||
b'\xf1\x870GC300046P \xf1\x892805',
|
||||
],
|
||||
(Ecu.srs, 0x715, None): [
|
||||
b'\xf1\x873Q0959655AE\xf1\x890195\xf1\x82\r56140056130012416612124111',
|
||||
@@ -404,6 +423,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e5915005914001354701311542900',
|
||||
b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e5915005914001305701311052900',
|
||||
b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011111200631145171716121691132111',
|
||||
b'\xf1\x875QF959655S \xf1\x890639\xf1\x82\x13131100131300111111000120----2211114A48',
|
||||
],
|
||||
(Ecu.eps, 0x712, None): [
|
||||
b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566B00611A1',
|
||||
@@ -564,6 +584,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x8709G927158GM\xf1\x893936',
|
||||
b'\xf1\x8709G927158GN\xf1\x893938',
|
||||
b'\xf1\x8709G927158HB\xf1\x894069',
|
||||
b'\xf1\x8709G927158HC\xf1\x894070',
|
||||
b'\xf1\x870D9300043 \xf1\x895202',
|
||||
b'\xf1\x870DD300046K \xf1\x892302',
|
||||
b'\xf1\x870DL300011N \xf1\x892001',
|
||||
@@ -622,24 +643,32 @@ FW_VERSIONS = {
|
||||
},
|
||||
CAR.TOURAN_MK2: {
|
||||
(Ecu.engine, 0x7e0, None): [
|
||||
b'\xf1\x8704E906025BE\xf1\x890720',
|
||||
b'\xf1\x8704E906027HQ\xf1\x893746',
|
||||
b'\xf1\x8704L906026HM\xf1\x893017',
|
||||
b'\xf1\x8705E906018CQ\xf1\x890808',
|
||||
],
|
||||
(Ecu.transmission, 0x7e1, None): [
|
||||
b'\xf1\x870CW300020A \xf1\x891936',
|
||||
b'\xf1\x870CW300041E \xf1\x891005',
|
||||
b'\xf1\x870CW300041Q \xf1\x891606',
|
||||
b'\xf1\x870CW300051M \xf1\x891926',
|
||||
],
|
||||
(Ecu.srs, 0x715, None): [
|
||||
b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x1336350021353335314132014730479333313100',
|
||||
b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x13363500213533353141324C4732479333313100',
|
||||
b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1336350021353336314740025250529333613100',
|
||||
b'\xf1\x875QD959655AJ\xf1\x890421\xf1\x82\x1336350021313300314240023330339333663100',
|
||||
],
|
||||
(Ecu.eps, 0x712, None): [
|
||||
b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105',
|
||||
b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A8090400',
|
||||
b'\xf1\x875QD909144F \xf1\x891082\xf1\x82\x0521A00642A1',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x757, None): [
|
||||
b'\xf1\x872Q0907572AA\xf1\x890396',
|
||||
b'\xf1\x873Q0907572C \xf1\x890195',
|
||||
b'\xf1\x875Q0907572R \xf1\x890771',
|
||||
],
|
||||
},
|
||||
CAR.TRANSPORTER_T61: {
|
||||
@@ -938,6 +967,7 @@ FW_VERSIONS = {
|
||||
},
|
||||
CAR.SKODA_KAROQ_MK1: {
|
||||
(Ecu.engine, 0x7e0, None): [
|
||||
b'\xf1\x8705E906013CL\xf1\x892541',
|
||||
b'\xf1\x8705E906013H \xf1\x892407',
|
||||
b'\xf1\x8705E906018P \xf1\x895472',
|
||||
b'\xf1\x8705E906018P \xf1\x896020',
|
||||
@@ -957,6 +987,7 @@ FW_VERSIONS = {
|
||||
(Ecu.eps, 0x712, None): [
|
||||
b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563T6090500',
|
||||
b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100500',
|
||||
b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100600',
|
||||
b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100700',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x757, None): [
|
||||
@@ -977,7 +1008,9 @@ FW_VERSIONS = {
|
||||
b'\xf1\x8704L906026HT\xf1\x893617',
|
||||
b'\xf1\x8705E906018DJ\xf1\x890915',
|
||||
b'\xf1\x8705E906018DJ\xf1\x891903',
|
||||
b'\xf1\x8705L906022GM\xf1\x893411',
|
||||
b'\xf1\x875NA906259E \xf1\x890003',
|
||||
b'\xf1\x875NA907115D \xf1\x890003',
|
||||
b'\xf1\x875NA907115E \xf1\x890003',
|
||||
b'\xf1\x875NA907115E \xf1\x890005',
|
||||
b'\xf1\x8783A907115E \xf1\x890001',
|
||||
@@ -986,14 +1019,17 @@ FW_VERSIONS = {
|
||||
b'\xf1\x870D9300014S \xf1\x895201',
|
||||
b'\xf1\x870D9300043 \xf1\x895202',
|
||||
b'\xf1\x870DL300011N \xf1\x892014',
|
||||
b'\xf1\x870DL300012G \xf1\x892006',
|
||||
b'\xf1\x870DL300012M \xf1\x892107',
|
||||
b'\xf1\x870DL300012N \xf1\x892110',
|
||||
b'\xf1\x870DL300013G \xf1\x892119',
|
||||
b'\xf1\x870GC300014N \xf1\x892801',
|
||||
b'\xf1\x870GC300018S \xf1\x892803',
|
||||
b'\xf1\x870GC300019H \xf1\x892806',
|
||||
b'\xf1\x870GC300046Q \xf1\x892802',
|
||||
],
|
||||
(Ecu.srs, 0x715, None): [
|
||||
b'\xf1\x873Q0959655AN\xf1\x890306\xf1\x82\r11110011110011031111310311',
|
||||
b'\xf1\x873Q0959655AP\xf1\x890306\xf1\x82\r11110011110011421111314211',
|
||||
b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1213001211001205212111052100',
|
||||
b'\xf1\x873Q0959655BJ\xf1\x890703\xf1\x82\x0e1213001211001205212111052100',
|
||||
@@ -1002,6 +1038,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x873Q0959655CQ\xf1\x890720\xf1\x82\x0e1213111211001205212112052111',
|
||||
b'\xf1\x873Q0959655DJ\xf1\x890731\xf1\x82\x0e1513001511001205232113052J00',
|
||||
b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121240749',
|
||||
b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121246149',
|
||||
],
|
||||
(Ecu.eps, 0x712, None): [
|
||||
b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6050405',
|
||||
@@ -1009,6 +1046,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6070405',
|
||||
b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G500',
|
||||
b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G600',
|
||||
b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x0025T6BA25OM',
|
||||
b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x002LT61A2LOM',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x757, None): [
|
||||
@@ -1027,6 +1065,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x8704E906027HD\xf1\x893742',
|
||||
b'\xf1\x8704E906027MH\xf1\x894786',
|
||||
b'\xf1\x8704L906021DT\xf1\x898127',
|
||||
b'\xf1\x8704L906021ER\xf1\x898361',
|
||||
b'\xf1\x8704L906026BP\xf1\x897608',
|
||||
b'\xf1\x8704L906026BS\xf1\x891541',
|
||||
b'\xf1\x875G0906259C \xf1\x890002',
|
||||
@@ -1036,6 +1075,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x870CW300041N \xf1\x891605',
|
||||
b'\xf1\x870CW300043B \xf1\x891601',
|
||||
b'\xf1\x870CW300043P \xf1\x891605',
|
||||
b'\xf1\x870D9300012H \xf1\x894518',
|
||||
b'\xf1\x870D9300041C \xf1\x894936',
|
||||
b'\xf1\x870D9300041H \xf1\x895220',
|
||||
b'\xf1\x870D9300041J \xf1\x894902',
|
||||
@@ -1061,6 +1101,7 @@ FW_VERSIONS = {
|
||||
b'\xf1\x875QD909144E \xf1\x891081\xf1\x82\x0521T00503A1',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x757, None): [
|
||||
b'\xf1\x875Q0907567P \xf1\x890100\xf1\x82\x0101',
|
||||
b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101',
|
||||
b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101',
|
||||
b'\xf1\x875Q0907572H \xf1\x890620',
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
from cereal import car
|
||||
from panda import Panda
|
||||
from openpilot.common.conversions import Conversions as CV
|
||||
from openpilot.selfdrive.car import get_safety_config
|
||||
from openpilot.selfdrive.car.interfaces import CarInterfaceBase
|
||||
from openpilot.selfdrive.car.volkswagen.values import CAR, PQ_CARS, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags
|
||||
from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags
|
||||
|
||||
ButtonType = car.CarState.ButtonEvent.Type
|
||||
EventName = car.CarEvent.EventName
|
||||
@@ -23,11 +22,11 @@ class CarInterface(CarInterfaceBase):
|
||||
self.eps_timer_soft_disable_alert = False
|
||||
|
||||
@staticmethod
|
||||
def _get_params(ret, params, candidate, fingerprint, car_fw, experimental_long, docs):
|
||||
def _get_params(ret, params, candidate: CAR, fingerprint, car_fw, disable_openpilot_long, experimental_long, docs):
|
||||
ret.carName = "volkswagen"
|
||||
ret.radarUnavailable = True
|
||||
|
||||
if candidate in PQ_CARS:
|
||||
if ret.flags & VolkswagenFlags.PQ:
|
||||
# Set global PQ35/PQ46/NMS parameters
|
||||
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.volkswagenPq)]
|
||||
ret.enableBsm = 0x3BA in fingerprint[0] # SWA_1
|
||||
@@ -72,21 +71,24 @@ class CarInterface(CarInterfaceBase):
|
||||
|
||||
# Global lateral tuning defaults, can be overridden per-vehicle
|
||||
|
||||
ret.steerActuatorDelay = 0.1
|
||||
ret.steerLimitTimer = 0.4
|
||||
ret.steerRatio = 15.6 # Let the params learner figure this out
|
||||
ret.lateralTuning.pid.kpBP = [0.]
|
||||
ret.lateralTuning.pid.kiBP = [0.]
|
||||
ret.lateralTuning.pid.kf = 0.00006
|
||||
ret.lateralTuning.pid.kpV = [0.6]
|
||||
ret.lateralTuning.pid.kiV = [0.2]
|
||||
if ret.flags & VolkswagenFlags.PQ:
|
||||
ret.steerActuatorDelay = 0.2
|
||||
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
|
||||
else:
|
||||
ret.steerActuatorDelay = 0.1
|
||||
ret.lateralTuning.pid.kpBP = [0.]
|
||||
ret.lateralTuning.pid.kiBP = [0.]
|
||||
ret.lateralTuning.pid.kf = 0.00006
|
||||
ret.lateralTuning.pid.kpV = [0.6]
|
||||
ret.lateralTuning.pid.kiV = [0.2]
|
||||
|
||||
# Global longitudinal tuning defaults, can be overridden per-vehicle
|
||||
|
||||
ret.experimentalLongitudinalAvailable = ret.networkLocation == NetworkLocation.gateway or docs
|
||||
if experimental_long:
|
||||
# Proof-of-concept, prep for E2E only. No radar points available. Panda ALLOW_DEBUG firmware required.
|
||||
ret.openpilotLongitudinalControl = True and not params.get_bool("DisableOpenpilotLongitudinal")
|
||||
ret.openpilotLongitudinalControl = True
|
||||
ret.safetyConfigs[0].safetyParam |= Panda.FLAG_VOLKSWAGEN_LONG_CONTROL
|
||||
if ret.transmissionType == TransmissionType.manual:
|
||||
ret.minEnableSpeed = 4.5
|
||||
@@ -98,137 +100,15 @@ class CarInterface(CarInterfaceBase):
|
||||
ret.vEgoStopping = 0.5
|
||||
ret.longitudinalTuning.kpV = [0.1]
|
||||
ret.longitudinalTuning.kiV = [0.0]
|
||||
|
||||
# Per-chassis tuning values, override tuning defaults here if desired
|
||||
|
||||
if candidate == CAR.ARTEON_MK1:
|
||||
ret.mass = 1733
|
||||
ret.wheelbase = 2.84
|
||||
|
||||
elif candidate == CAR.ATLAS_MK1:
|
||||
ret.mass = 2011
|
||||
ret.wheelbase = 2.98
|
||||
|
||||
elif candidate == CAR.CRAFTER_MK2:
|
||||
ret.mass = 2100
|
||||
ret.wheelbase = 3.64 # SWB, LWB is 4.49, TBD how to detect difference
|
||||
ret.minSteerSpeed = 50 * CV.KPH_TO_MS
|
||||
|
||||
elif candidate == CAR.GOLF_MK7:
|
||||
ret.mass = 1397
|
||||
ret.wheelbase = 2.62
|
||||
|
||||
elif candidate == CAR.JETTA_MK7:
|
||||
ret.mass = 1328
|
||||
ret.wheelbase = 2.71
|
||||
|
||||
elif candidate == CAR.PASSAT_MK8:
|
||||
ret.mass = 1551
|
||||
ret.wheelbase = 2.79
|
||||
|
||||
elif candidate == CAR.PASSAT_NMS:
|
||||
ret.mass = 1503
|
||||
ret.wheelbase = 2.80
|
||||
ret.minEnableSpeed = 20 * CV.KPH_TO_MS # ACC "basic", no FtS
|
||||
ret.minSteerSpeed = 50 * CV.KPH_TO_MS
|
||||
ret.steerActuatorDelay = 0.2
|
||||
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
|
||||
|
||||
elif candidate == CAR.POLO_MK6:
|
||||
ret.mass = 1230
|
||||
ret.wheelbase = 2.55
|
||||
|
||||
elif candidate == CAR.SHARAN_MK2:
|
||||
ret.mass = 1639
|
||||
ret.wheelbase = 2.92
|
||||
ret.minSteerSpeed = 50 * CV.KPH_TO_MS
|
||||
ret.steerActuatorDelay = 0.2
|
||||
|
||||
elif candidate == CAR.TAOS_MK1:
|
||||
ret.mass = 1498
|
||||
ret.wheelbase = 2.69
|
||||
|
||||
elif candidate == CAR.TCROSS_MK1:
|
||||
ret.mass = 1150
|
||||
ret.wheelbase = 2.60
|
||||
|
||||
elif candidate == CAR.TIGUAN_MK2:
|
||||
ret.mass = 1715
|
||||
ret.wheelbase = 2.74
|
||||
|
||||
elif candidate == CAR.TOURAN_MK2:
|
||||
ret.mass = 1516
|
||||
ret.wheelbase = 2.79
|
||||
|
||||
elif candidate == CAR.TRANSPORTER_T61:
|
||||
ret.mass = 1926
|
||||
ret.wheelbase = 3.00 # SWB, LWB is 3.40, TBD how to detect difference
|
||||
ret.minSteerSpeed = 14.0
|
||||
|
||||
elif candidate == CAR.TROC_MK1:
|
||||
ret.mass = 1413
|
||||
ret.wheelbase = 2.63
|
||||
|
||||
elif candidate == CAR.AUDI_A3_MK3:
|
||||
ret.mass = 1335
|
||||
ret.wheelbase = 2.61
|
||||
|
||||
elif candidate == CAR.AUDI_Q2_MK1:
|
||||
ret.mass = 1205
|
||||
ret.wheelbase = 2.61
|
||||
|
||||
elif candidate == CAR.AUDI_Q3_MK2:
|
||||
ret.mass = 1623
|
||||
ret.wheelbase = 2.68
|
||||
|
||||
elif candidate == CAR.SEAT_ATECA_MK1:
|
||||
ret.mass = 1900
|
||||
ret.wheelbase = 2.64
|
||||
|
||||
elif candidate == CAR.SEAT_LEON_MK3:
|
||||
ret.mass = 1227
|
||||
ret.wheelbase = 2.64
|
||||
|
||||
elif candidate == CAR.SKODA_FABIA_MK4:
|
||||
ret.mass = 1266
|
||||
ret.wheelbase = 2.56
|
||||
|
||||
elif candidate == CAR.SKODA_KAMIQ_MK1:
|
||||
ret.mass = 1265
|
||||
ret.wheelbase = 2.66
|
||||
|
||||
elif candidate == CAR.SKODA_KAROQ_MK1:
|
||||
ret.mass = 1278
|
||||
ret.wheelbase = 2.66
|
||||
|
||||
elif candidate == CAR.SKODA_KODIAQ_MK1:
|
||||
ret.mass = 1569
|
||||
ret.wheelbase = 2.79
|
||||
|
||||
elif candidate == CAR.SKODA_OCTAVIA_MK3:
|
||||
ret.mass = 1388
|
||||
ret.wheelbase = 2.68
|
||||
|
||||
elif candidate == CAR.SKODA_SCALA_MK1:
|
||||
ret.mass = 1192
|
||||
ret.wheelbase = 2.65
|
||||
|
||||
elif candidate == CAR.SKODA_SUPERB_MK3:
|
||||
ret.mass = 1505
|
||||
ret.wheelbase = 2.84
|
||||
|
||||
else:
|
||||
raise ValueError(f"unsupported car {candidate}")
|
||||
|
||||
ret.autoResumeSng = ret.minEnableSpeed == -1
|
||||
ret.centerToFront = ret.wheelbase * 0.45
|
||||
|
||||
return ret
|
||||
|
||||
# returns a car.CarState
|
||||
def _update(self, c, frogpilot_variables):
|
||||
ret = self.CS.update(self.cp, self.cp_cam, self.cp_ext, self.CP.transmissionType, frogpilot_variables)
|
||||
|
||||
events = self.create_common_events(ret, frogpilot_variables, extra_gears=[GearShifter.eco, GearShifter.sport, GearShifter.manumatic],
|
||||
events = self.create_common_events(ret, extra_gears=[GearShifter.eco, GearShifter.sport, GearShifter.manumatic],
|
||||
pcm_enable=not self.CS.CP.openpilotLongitudinalControl,
|
||||
enable_buttons=(ButtonType.setCruise, ButtonType.resumeCruise))
|
||||
|
||||
|
||||
@@ -125,11 +125,11 @@ def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_cont
|
||||
return commands
|
||||
|
||||
|
||||
def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, personality_profile):
|
||||
def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance):
|
||||
values = {
|
||||
"ACC_Status_Anzeige": acc_hud_status,
|
||||
"ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36,
|
||||
"ACC_Gesetzte_Zeitluecke": 1 if personality_profile == 0 else 3 if personality_profile == 1 else 5,
|
||||
"ACC_Gesetzte_Zeitluecke": distance + 2,
|
||||
"ACC_Display_Prio": 3,
|
||||
"ACC_Abstandsindex": lead_distance,
|
||||
}
|
||||
|
||||
@@ -91,10 +91,10 @@ def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_cont
|
||||
return commands
|
||||
|
||||
|
||||
def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, personality_profile):
|
||||
def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance):
|
||||
values = {
|
||||
"ACA_StaACC": acc_hud_status,
|
||||
"ACA_Zeitluecke": 2,
|
||||
"ACA_Zeitluecke": distance + 2,
|
||||
"ACA_V_Wunsch": set_speed,
|
||||
"ACA_gemZeitl": lead_distance,
|
||||
"ACA_PrioDisp": 3,
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
from collections import defaultdict, namedtuple
|
||||
from collections import namedtuple
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum, IntFlag, StrEnum
|
||||
from typing import Dict, List, Union
|
||||
from enum import Enum, IntFlag
|
||||
|
||||
from cereal import car
|
||||
from panda.python import uds
|
||||
from opendbc.can.can_define import CANDefine
|
||||
from openpilot.selfdrive.car import dbc_dict
|
||||
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \
|
||||
from openpilot.common.conversions import Conversions as CV
|
||||
from openpilot.selfdrive.car import dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms
|
||||
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, \
|
||||
Device
|
||||
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16
|
||||
|
||||
@@ -41,7 +41,7 @@ class CarControllerParams:
|
||||
def __init__(self, CP):
|
||||
can_define = CANDefine(DBC[CP.carFingerprint]["pt"])
|
||||
|
||||
if CP.carFingerprint in PQ_CARS:
|
||||
if CP.flags & VolkswagenFlags.PQ:
|
||||
self.LDW_STEP = 5 # LDW_1 message frequency 20Hz
|
||||
self.ACC_HUD_STEP = 4 # ACC_GRA_Anzeige frequency 25Hz
|
||||
self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm
|
||||
@@ -111,50 +111,30 @@ class CANBUS:
|
||||
|
||||
|
||||
class VolkswagenFlags(IntFlag):
|
||||
# Detected flags
|
||||
STOCK_HCA_PRESENT = 1
|
||||
|
||||
|
||||
# Check the 7th and 8th characters of the VIN before adding a new CAR. If the
|
||||
# chassis code is already listed below, don't add a new CAR, just add to the
|
||||
# FW_VERSIONS for that existing CAR.
|
||||
# Exception: SEAT Leon and SEAT Ateca share a chassis code
|
||||
|
||||
class CAR(StrEnum):
|
||||
ARTEON_MK1 = "VOLKSWAGEN ARTEON 1ST GEN" # Chassis AN, Mk1 VW Arteon and variants
|
||||
ATLAS_MK1 = "VOLKSWAGEN ATLAS 1ST GEN" # Chassis CA, Mk1 VW Atlas and Atlas Cross Sport
|
||||
CRAFTER_MK2 = "VOLKSWAGEN CRAFTER 2ND GEN" # Chassis SY/SZ, Mk2 VW Crafter, VW Grand California, MAN TGE
|
||||
GOLF_MK7 = "VOLKSWAGEN GOLF 7TH GEN" # Chassis 5G/AU/BA/BE, Mk7 VW Golf and variants
|
||||
JETTA_MK7 = "VOLKSWAGEN JETTA 7TH GEN" # Chassis BU, Mk7 VW Jetta
|
||||
PASSAT_MK8 = "VOLKSWAGEN PASSAT 8TH GEN" # Chassis 3G, Mk8 VW Passat and variants
|
||||
PASSAT_NMS = "VOLKSWAGEN PASSAT NMS" # Chassis A3, North America/China/Mideast NMS Passat, incl. facelift
|
||||
POLO_MK6 = "VOLKSWAGEN POLO 6TH GEN" # Chassis AW, Mk6 VW Polo
|
||||
SHARAN_MK2 = "VOLKSWAGEN SHARAN 2ND GEN" # Chassis 7N, Mk2 Volkswagen Sharan and SEAT Alhambra
|
||||
TAOS_MK1 = "VOLKSWAGEN TAOS 1ST GEN" # Chassis B2, Mk1 VW Taos and Tharu
|
||||
TCROSS_MK1 = "VOLKSWAGEN T-CROSS 1ST GEN" # Chassis C1, Mk1 VW T-Cross SWB and LWB variants
|
||||
TIGUAN_MK2 = "VOLKSWAGEN TIGUAN 2ND GEN" # Chassis AD/BW, Mk2 VW Tiguan and variants
|
||||
TOURAN_MK2 = "VOLKSWAGEN TOURAN 2ND GEN" # Chassis 1T, Mk2 VW Touran and variants
|
||||
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_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
|
||||
SEAT_LEON_MK3 = "SEAT LEON 3RD GEN" # Chassis 5F, Mk3 SEAT Leon and variants
|
||||
SKODA_FABIA_MK4 = "SKODA FABIA 4TH GEN" # Chassis PJ, Mk4 Skoda Fabia
|
||||
SKODA_KAMIQ_MK1 = "SKODA KAMIQ 1ST GEN" # Chassis NW, Mk1 Skoda Kamiq
|
||||
SKODA_KAROQ_MK1 = "SKODA KAROQ 1ST GEN" # Chassis NU, Mk1 Skoda Karoq
|
||||
SKODA_KODIAQ_MK1 = "SKODA KODIAQ 1ST GEN" # Chassis NS, Mk1 Skoda Kodiaq
|
||||
SKODA_SCALA_MK1 = "SKODA SCALA 1ST GEN" # Chassis NW, Mk1 Skoda Scala and Skoda Kamiq
|
||||
SKODA_SUPERB_MK3 = "SKODA SUPERB 3RD GEN" # Chassis 3V/NP, Mk3 Skoda Superb and variants
|
||||
SKODA_OCTAVIA_MK3 = "SKODA OCTAVIA 3RD GEN" # Chassis NE, Mk3 Skoda Octavia and variants
|
||||
# Static flags
|
||||
PQ = 2
|
||||
|
||||
|
||||
PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2}
|
||||
@dataclass
|
||||
class VolkswagenMQBPlatformConfig(PlatformConfig):
|
||||
dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_mqb_2010', None))
|
||||
|
||||
|
||||
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)
|
||||
@dataclass
|
||||
class VolkswagenPQPlatformConfig(PlatformConfig):
|
||||
dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None))
|
||||
|
||||
def init(self):
|
||||
self.flags |= VolkswagenFlags.PQ
|
||||
|
||||
|
||||
@dataclass(frozen=True, kw_only=True)
|
||||
class VolkswagenCarSpecs(CarSpecs):
|
||||
centerToFrontRatio: float = 0.45
|
||||
steerRatio: float = 15.6
|
||||
|
||||
|
||||
class Footnote(Enum):
|
||||
@@ -179,7 +159,7 @@ class Footnote(Enum):
|
||||
|
||||
|
||||
@dataclass
|
||||
class VWCarInfo(CarInfo):
|
||||
class VWCarDocs(CarDocs):
|
||||
package: str = "Adaptive Cruise Control (ACC) & Lane Assist"
|
||||
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.j533]))
|
||||
|
||||
@@ -192,88 +172,208 @@ class VWCarInfo(CarInfo):
|
||||
self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533])
|
||||
|
||||
|
||||
CAR_INFO: Dict[str, Union[VWCarInfo, List[VWCarInfo]]] = {
|
||||
CAR.ARTEON_MK1: [
|
||||
VWCarInfo("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
VWCarInfo("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
VWCarInfo("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
VWCarInfo("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
],
|
||||
CAR.ATLAS_MK1: [
|
||||
VWCarInfo("Volkswagen Atlas 2018-23"),
|
||||
VWCarInfo("Volkswagen Atlas Cross Sport 2020-22"),
|
||||
VWCarInfo("Volkswagen Teramont 2018-22"),
|
||||
VWCarInfo("Volkswagen Teramont Cross Sport 2021-22"),
|
||||
VWCarInfo("Volkswagen Teramont X 2021-22"),
|
||||
],
|
||||
CAR.CRAFTER_MK2: [
|
||||
VWCarInfo("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarInfo("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarInfo("Volkswagen Grand California 2019-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarInfo("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarInfo("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
],
|
||||
CAR.GOLF_MK7: [
|
||||
VWCarInfo("Volkswagen e-Golf 2014-20"),
|
||||
VWCarInfo("Volkswagen Golf 2015-20", auto_resume=False),
|
||||
VWCarInfo("Volkswagen Golf Alltrack 2015-19", auto_resume=False),
|
||||
VWCarInfo("Volkswagen Golf GTD 2015-20"),
|
||||
VWCarInfo("Volkswagen Golf GTE 2015-20"),
|
||||
VWCarInfo("Volkswagen Golf GTI 2015-21", auto_resume=False),
|
||||
VWCarInfo("Volkswagen Golf R 2015-19"),
|
||||
VWCarInfo("Volkswagen Golf SportsVan 2015-20"),
|
||||
],
|
||||
CAR.JETTA_MK7: [
|
||||
VWCarInfo("Volkswagen Jetta 2018-24"),
|
||||
VWCarInfo("Volkswagen Jetta GLI 2021-24"),
|
||||
],
|
||||
CAR.PASSAT_MK8: [
|
||||
VWCarInfo("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]),
|
||||
VWCarInfo("Volkswagen Passat Alltrack 2015-22"),
|
||||
VWCarInfo("Volkswagen Passat GTE 2015-22"),
|
||||
],
|
||||
CAR.PASSAT_NMS: VWCarInfo("Volkswagen Passat NMS 2017-22"),
|
||||
CAR.POLO_MK6: [
|
||||
VWCarInfo("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]),
|
||||
VWCarInfo("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]),
|
||||
],
|
||||
CAR.SHARAN_MK2: [
|
||||
VWCarInfo("Volkswagen Sharan 2018-22"),
|
||||
VWCarInfo("SEAT Alhambra 2018-20"),
|
||||
],
|
||||
CAR.TAOS_MK1: VWCarInfo("Volkswagen Taos 2022-23"),
|
||||
CAR.TCROSS_MK1: VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0]),
|
||||
CAR.TIGUAN_MK2: [
|
||||
VWCarInfo("Volkswagen Tiguan 2018-24"),
|
||||
VWCarInfo("Volkswagen Tiguan eHybrid 2021-23"),
|
||||
],
|
||||
CAR.TOURAN_MK2: VWCarInfo("Volkswagen Touran 2016-23"),
|
||||
CAR.TRANSPORTER_T61: [
|
||||
VWCarInfo("Volkswagen Caravelle 2020"),
|
||||
VWCarInfo("Volkswagen California 2021-23"),
|
||||
],
|
||||
CAR.TROC_MK1: VWCarInfo("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0]),
|
||||
CAR.AUDI_A3_MK3: [
|
||||
VWCarInfo("Audi A3 2014-19"),
|
||||
VWCarInfo("Audi A3 Sportback e-tron 2017-18"),
|
||||
VWCarInfo("Audi RS3 2018"),
|
||||
VWCarInfo("Audi S3 2015-17"),
|
||||
],
|
||||
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"),
|
||||
CAR.SEAT_LEON_MK3: VWCarInfo("SEAT Leon 2014-20"),
|
||||
CAR.SKODA_FABIA_MK4: VWCarInfo("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0]),
|
||||
CAR.SKODA_KAMIQ_MK1: VWCarInfo("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]),
|
||||
CAR.SKODA_KAROQ_MK1: VWCarInfo("Škoda Karoq 2019-23"),
|
||||
CAR.SKODA_KODIAQ_MK1: VWCarInfo("Škoda Kodiaq 2017-23"),
|
||||
CAR.SKODA_SCALA_MK1: VWCarInfo("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]),
|
||||
CAR.SKODA_SUPERB_MK3: VWCarInfo("Škoda Superb 2015-22"),
|
||||
CAR.SKODA_OCTAVIA_MK3: [
|
||||
VWCarInfo("Škoda Octavia 2015-19"),
|
||||
VWCarInfo("Škoda Octavia RS 2016"),
|
||||
],
|
||||
}
|
||||
# Check the 7th and 8th characters of the VIN before adding a new CAR. If the
|
||||
# chassis code is already listed below, don't add a new CAR, just add to the
|
||||
# FW_VERSIONS for that existing CAR.
|
||||
# Exception: SEAT Leon and SEAT Ateca share a chassis code
|
||||
|
||||
class CAR(Platforms):
|
||||
ARTEON_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN ARTEON 1ST GEN", # Chassis AN
|
||||
[
|
||||
VWCarDocs("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
VWCarDocs("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
VWCarDocs("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
VWCarDocs("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1733, wheelbase=2.84),
|
||||
)
|
||||
ATLAS_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN ATLAS 1ST GEN", # Chassis CA
|
||||
[
|
||||
VWCarDocs("Volkswagen Atlas 2018-23"),
|
||||
VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"),
|
||||
VWCarDocs("Volkswagen Teramont 2018-22"),
|
||||
VWCarDocs("Volkswagen Teramont Cross Sport 2021-22"),
|
||||
VWCarDocs("Volkswagen Teramont X 2021-22"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=2011, wheelbase=2.98),
|
||||
)
|
||||
CADDY_MK3 = VolkswagenPQPlatformConfig(
|
||||
"VOLKSWAGEN CADDY 3RD GEN", # Chassis 2K
|
||||
[
|
||||
VWCarDocs("Volkswagen Caddy 2019"),
|
||||
VWCarDocs("Volkswagen Caddy Maxi 2019"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1613, wheelbase=2.6, minSteerSpeed=21 * CV.KPH_TO_MS),
|
||||
)
|
||||
CRAFTER_MK2 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN CRAFTER 2ND GEN", # Chassis SY/SZ
|
||||
[
|
||||
VWCarDocs("Volkswagen Crafter 2017-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarDocs("Volkswagen e-Crafter 2018-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarDocs("Volkswagen Grand California 2019-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarDocs("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
VWCarDocs("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS),
|
||||
)
|
||||
GOLF_MK7 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN GOLF 7TH GEN", # Chassis 5G/AU/BA/BE
|
||||
[
|
||||
VWCarDocs("Volkswagen e-Golf 2014-20"),
|
||||
VWCarDocs("Volkswagen Golf 2015-20", auto_resume=False),
|
||||
VWCarDocs("Volkswagen Golf Alltrack 2015-19", auto_resume=False),
|
||||
VWCarDocs("Volkswagen Golf GTD 2015-20"),
|
||||
VWCarDocs("Volkswagen Golf GTE 2015-20"),
|
||||
VWCarDocs("Volkswagen Golf GTI 2015-21", auto_resume=False),
|
||||
VWCarDocs("Volkswagen Golf R 2015-19"),
|
||||
VWCarDocs("Volkswagen Golf SportsVan 2015-20"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1397, wheelbase=2.62),
|
||||
)
|
||||
JETTA_MK7 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN JETTA 7TH GEN", # Chassis BU
|
||||
[
|
||||
VWCarDocs("Volkswagen Jetta 2018-24"),
|
||||
VWCarDocs("Volkswagen Jetta GLI 2021-24"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1328, wheelbase=2.71),
|
||||
)
|
||||
PASSAT_MK8 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN PASSAT 8TH GEN", # Chassis 3G
|
||||
[
|
||||
VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]),
|
||||
VWCarDocs("Volkswagen Passat Alltrack 2015-22"),
|
||||
VWCarDocs("Volkswagen Passat GTE 2015-22"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1551, wheelbase=2.79),
|
||||
)
|
||||
PASSAT_NMS = VolkswagenPQPlatformConfig(
|
||||
"VOLKSWAGEN PASSAT NMS", # Chassis A3
|
||||
[VWCarDocs("Volkswagen Passat NMS 2017-22")],
|
||||
VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minSteerSpeed=50*CV.KPH_TO_MS, minEnableSpeed=20*CV.KPH_TO_MS),
|
||||
)
|
||||
POLO_MK6 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN POLO 6TH GEN", # Chassis AW
|
||||
[
|
||||
VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]),
|
||||
VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1230, wheelbase=2.55),
|
||||
)
|
||||
SHARAN_MK2 = VolkswagenPQPlatformConfig(
|
||||
"VOLKSWAGEN SHARAN 2ND GEN", # Chassis 7N
|
||||
[
|
||||
VWCarDocs("Volkswagen Sharan 2018-22"),
|
||||
VWCarDocs("SEAT Alhambra 2018-20"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS),
|
||||
)
|
||||
TAOS_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN TAOS 1ST GEN", # Chassis B2
|
||||
[VWCarDocs("Volkswagen Taos 2022-23")],
|
||||
VolkswagenCarSpecs(mass=1498, wheelbase=2.69),
|
||||
)
|
||||
TCROSS_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1
|
||||
[VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])],
|
||||
VolkswagenCarSpecs(mass=1150, wheelbase=2.60),
|
||||
)
|
||||
TIGUAN_MK2 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN TIGUAN 2ND GEN", # Chassis AD/BW
|
||||
[
|
||||
VWCarDocs("Volkswagen Tiguan 2018-24"),
|
||||
VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1715, wheelbase=2.74),
|
||||
)
|
||||
TOURAN_MK2 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T
|
||||
[VWCarDocs("Volkswagen Touran 2016-23")],
|
||||
VolkswagenCarSpecs(mass=1516, wheelbase=2.79),
|
||||
)
|
||||
TRANSPORTER_T61 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN TRANSPORTER T6.1", # Chassis 7H/7L
|
||||
[
|
||||
VWCarDocs("Volkswagen Caravelle 2020"),
|
||||
VWCarDocs("Volkswagen California 2021-23"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0),
|
||||
)
|
||||
TROC_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"VOLKSWAGEN T-ROC 1ST GEN", # Chassis A1
|
||||
[VWCarDocs("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0])],
|
||||
VolkswagenCarSpecs(mass=1413, wheelbase=2.63),
|
||||
)
|
||||
AUDI_A3_MK3 = VolkswagenMQBPlatformConfig(
|
||||
"AUDI A3 3RD GEN", # Chassis 8V/FF
|
||||
[
|
||||
VWCarDocs("Audi A3 2014-19"),
|
||||
VWCarDocs("Audi A3 Sportback e-tron 2017-18"),
|
||||
VWCarDocs("Audi RS3 2018"),
|
||||
VWCarDocs("Audi S3 2015-17"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1335, wheelbase=2.61),
|
||||
)
|
||||
AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"AUDI Q2 1ST GEN", # Chassis GA
|
||||
[VWCarDocs("Audi Q2 2018")],
|
||||
VolkswagenCarSpecs(mass=1205, wheelbase=2.61),
|
||||
)
|
||||
AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig(
|
||||
"AUDI Q3 2ND GEN", # Chassis 8U/F3/FS
|
||||
[VWCarDocs("Audi Q3 2019-23")],
|
||||
VolkswagenCarSpecs(mass=1623, wheelbase=2.68),
|
||||
)
|
||||
SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"SEAT ATECA 1ST GEN", # Chassis 5F
|
||||
[VWCarDocs("SEAT Ateca 2018")],
|
||||
VolkswagenCarSpecs(mass=1900, wheelbase=2.64),
|
||||
)
|
||||
SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig(
|
||||
"SEAT LEON 3RD GEN", # Chassis 5F
|
||||
[VWCarDocs("SEAT Leon 2014-20")],
|
||||
VolkswagenCarSpecs(mass=1227, wheelbase=2.64),
|
||||
)
|
||||
SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA FABIA 4TH GEN", # Chassis PJ
|
||||
[VWCarDocs("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])],
|
||||
VolkswagenCarSpecs(mass=1266, wheelbase=2.56),
|
||||
)
|
||||
SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA KAMIQ 1ST GEN", # Chassis NW
|
||||
[VWCarDocs("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ])],
|
||||
VolkswagenCarSpecs(mass=1265, wheelbase=2.66),
|
||||
)
|
||||
SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA KAROQ 1ST GEN", # Chassis NU
|
||||
[VWCarDocs("Škoda Karoq 2019-23")],
|
||||
VolkswagenCarSpecs(mass=1278, wheelbase=2.66),
|
||||
)
|
||||
SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA KODIAQ 1ST GEN", # Chassis NS
|
||||
[VWCarDocs("Škoda Kodiaq 2017-23")],
|
||||
VolkswagenCarSpecs(mass=1569, wheelbase=2.79),
|
||||
)
|
||||
SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA OCTAVIA 3RD GEN", # Chassis NE
|
||||
[
|
||||
VWCarDocs("Škoda Octavia 2015-19"),
|
||||
VWCarDocs("Škoda Octavia RS 2016"),
|
||||
],
|
||||
VolkswagenCarSpecs(mass=1388, wheelbase=2.68),
|
||||
)
|
||||
SKODA_SCALA_MK1 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA SCALA 1ST GEN", # Chassis NW
|
||||
[VWCarDocs("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0])],
|
||||
VolkswagenCarSpecs(mass=1192, wheelbase=2.65),
|
||||
)
|
||||
SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig(
|
||||
"SKODA SUPERB 3RD GEN", # Chassis 3V/NP
|
||||
[VWCarDocs("Škoda Superb 2015-22")],
|
||||
VolkswagenCarSpecs(mass=1505, wheelbase=2.84),
|
||||
)
|
||||
|
||||
|
||||
# All supported cars should return FW from the engine, srs, eps, and fwdRadar. Cars
|
||||
@@ -294,18 +394,27 @@ VOLKSWAGEN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER +
|
||||
VOLKSWAGEN_RX_OFFSET = 0x6a
|
||||
|
||||
FW_QUERY_CONFIG = FwQueryConfig(
|
||||
requests=[
|
||||
# TODO: add back whitelists after we gather enough data
|
||||
requests=[request for bus, obd_multiplexing in [(1, True), (1, False), (0, False)] for request in [
|
||||
Request(
|
||||
[VOLKSWAGEN_VERSION_REQUEST_MULTI],
|
||||
[VOLKSWAGEN_VERSION_RESPONSE],
|
||||
whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar],
|
||||
# whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar],
|
||||
rx_offset=VOLKSWAGEN_RX_OFFSET,
|
||||
bus=bus,
|
||||
logging=(bus != 1 or not obd_multiplexing),
|
||||
obd_multiplexing=obd_multiplexing,
|
||||
),
|
||||
Request(
|
||||
[VOLKSWAGEN_VERSION_REQUEST_MULTI],
|
||||
[VOLKSWAGEN_VERSION_RESPONSE],
|
||||
whitelist_ecus=[Ecu.engine, Ecu.transmission],
|
||||
# whitelist_ecus=[Ecu.engine, Ecu.transmission],
|
||||
bus=bus,
|
||||
logging=(bus != 1 or not obd_multiplexing),
|
||||
obd_multiplexing=obd_multiplexing,
|
||||
),
|
||||
],
|
||||
]],
|
||||
extra_ecus=[(Ecu.fwdCamera, 0x74f, None)],
|
||||
)
|
||||
|
||||
DBC = CAR.create_dbc_map()
|
||||
|
||||
Reference in New Issue
Block a user