Revert MQB EVO port (car port, safety, panda firmware, radar fixes)

This commit is contained in:
mawei
2026-10-08 21:02:43 +08:00
parent aa78f45549
commit 770c824464
40 changed files with 143 additions and 5985 deletions
-2
View File
@@ -1,8 +1,6 @@
#!/usr/bin/env bash
export ATHENA_HOST='ws://athena.mr-one.cn'
export API_HOST='http://res.mr-one.cn'
# TEMPORARY: this device hangs in the VIN/FW query, skip it
export SKIP_FW_QUERY=1
# Skip onboarding on startup
echo -n "2" > /data/params/d/HasAcceptedTerms
echo -n "1.0" > /data/params/d/HasAcceptedTermsSP
-4
View File
@@ -196,10 +196,6 @@ class CarInterfaceBase(ABC, CarInterfaceBaseSP):
carlog.debug(f"Car {stock_cp.carFingerprint} does not have a _get_longitudinal_tuning_sp method, using defaults")
return ret
@staticmethod
def pre_init(CP: structs.CarParams, CP_SP: structs.CarParamsSP, can_recv: CanRecvCallable, can_send: CanSendCallable):
"""Called before the car is set up, can adjust CarParams (e.g. dashcamOnly)"""
@staticmethod
def init(CP: structs.CarParams, CP_SP: structs.CarParamsSP, can_recv: CanRecvCallable, can_send: CanSendCallable):
"""Used to disable longitudinal ECUs as needed"""
-3
View File
@@ -53,9 +53,6 @@ non_tested_cars = [
GM.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN,
GM.CHEVROLET_MALIBU_NON_ACC_9TH_GEN,
GM.CADILLAC_XT5_NON_ACC_1ST_GEN,
VOLKSWAGEN.AUDI_A3_MK4,
VOLKSWAGEN.VOLKSWAGEN_GOLF_MK8,
VOLKSWAGEN.SEAT_LEON_MK4,
]
@@ -117,8 +117,3 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
# port extensions
"HONDA_CLARITY" = [0.96, 0.4018518740819229, 0.19]
"CHEVROLET_MALIBU_NON_ACC_9TH_GEN" = [1.85, 1.85, 0.075]
"VOLKSWAGEN_GOLF_MK8" = [nan, 2.5, nan]
"SEAT_LEON_MK4" = [nan, 2.5, nan]
"AUDI_A3_MK4" = [nan, 2.5, nan]
@@ -44,7 +44,7 @@ class CarController(CarControllerBase):
self.aeb_available = not CP.flags & VolkswagenFlags.PQ
self.dp_avoid_eps_lockout = bool(self.CP_SP.flags & VolkswagenFlagsSP.AVOID_EPS_LOCKOUT)
if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if CP.flags & VolkswagenFlags.MEB:
self.meb_long_state = mebcan.MebLongStateMachine(self.CP, self.CCP)
if CP.flags & VolkswagenFlags.PQ:
@@ -72,7 +72,7 @@ class CarController(CarControllerBase):
if self.frame % self.CCP.STEER_STEP == 0:
apply_torque = 0
if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if self.CP.flags & VolkswagenFlags.MEB:
# Logic to avoid HCA refused state:
# * steering power as counter and near zero before OP lane assist deactivation
# MEB rack can be used continuously without time limits
@@ -135,7 +135,7 @@ class CarController(CarControllerBase):
can_sends.append(self.CCS.create_eps_update(self.packer_pt, self.CAN.cam, CS.eps_stock_values, ea_simulated_torque))
# Emergency Assist intervention
if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) and self.CP.flags & VolkswagenFlags.STOCK_KLR_PRESENT:
if self.CP.flags & VolkswagenFlags.MEB and self.CP.flags & VolkswagenFlags.STOCK_KLR_PRESENT:
# send capacitive steering wheel hands-on message to keep ACC resume active and control Emergency Assist
# MEB Emergency Assist brake jerks after 30s of continued hands-off time.
# We send the stock wheeltouch message to start the stock DM timer when openpilot latches the critical driver monitoring alert
@@ -148,7 +148,7 @@ class CarController(CarControllerBase):
if self.CP.openpilotLongitudinalControl:
if self.frame % self.CCP.ACC_CONTROL_STEP == 0:
if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if self.CP.flags & VolkswagenFlags.MEB:
accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX))
accel, acc_status, acc_hold_type, braking_to_stop, leaving_standstill = self.meb_long_state.update(CS, CC, accel)
can_sends.extend(mebcan.create_acc_accel_control(self.packer_pt, self.CAN.pt, self.CCP, CS.acc_type, CC.enabled,
@@ -177,18 +177,14 @@ class CarController(CarControllerBase):
hud_alert = 0
if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw):
hud_alert = self.CCP.LDW_MESSAGES["laneAssistTakeOver"]
if self.CP.flags & VolkswagenFlags.MQB_EVO_GEN2:
can_sends.append(mebcan.create_lka_hud_control(self.packer_pt, self.CAN.pt, self.CP, CS.ldw_stock_values,
CC.latActive, CS.out.steeringPressed, hud_alert, hud_control))
else:
can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, self.CAN.pt, CS.ldw_stock_values, CC.latActive,
CS.out.steeringPressed, hud_alert, hud_control))
can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, self.CAN.pt, CS.ldw_stock_values, CC.latActive,
CS.out.steeringPressed, hud_alert, hud_control))
if hud_control.leadDistanceBars != self.lead_distance_bars_last:
self.distance_bar_frame = self.frame
if self.frame % self.CCP.ACC_HUD_STEP == 0 and self.CP.openpilotLongitudinalControl:
if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if self.CP.flags & VolkswagenFlags.MEB:
fcw_alert = hud_control.visualAlert == VisualAlert.fcw
show_distance_bars = self.frame - self.distance_bar_frame < 400
lead_distance = 0
@@ -55,7 +55,7 @@ class CarState(CarStateBase):
return self.update_pq(pt_cp, cam_cp, ext_cp)
elif self.CP.flags & VolkswagenFlags.MLB:
return self.update_mlb(pt_cp, cam_cp, ext_cp, alt_cp)
elif self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
elif self.CP.flags & VolkswagenFlags.MEB:
return self.update_meb(pt_cp, cam_cp, ext_cp)
else:
return self.update_mqb(pt_cp, cam_cp, ext_cp)
@@ -153,8 +153,6 @@ class CarState(CarStateBase):
# vEgo obtained from Bremse_1 vehicle speed rather than Bremse_3 wheel speeds because Bremse_3 isn't present on NSF
ret.vEgoRaw = pt_cp.vl["Bremse_1"]["BR1_Rad_kmh"] * CV.KPH_TO_MS
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
if self.CP.flags & VolkswagenFlags.KOMBI_PRESENT:
ret.vEgoCluster = pt_cp.vl["Kombi_01"]["KBI_angez_Geschw"] * CV.KPH_TO_MS
ret.standstill = ret.vEgoRaw == 0
# Update EPS position and state info. For signed values, VW sends the sign in a separate signal.
@@ -284,10 +282,7 @@ class CarState(CarStateBase):
ret.espActive = bool(pt_cp.vl["ESP_21"]["ESP_Eingriff"])
self.acc_type = ext_cp.vl["ACC_18"]["ACC_Typ"]
if self.CP.flags & VolkswagenFlags.MQB_EVO:
self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"])
else:
self.esp_hold_confirmation = bool(pt_cp.vl["ESC_50"]["Standstill"])
self.esp_hold_confirmation = bool(pt_cp.vl["ESC_50"]["Standstill"])
self.travel_assist_available = bool(cam_cp.vl["TA_01"]["Travel_Assist_Available"])
ret.stockFcw = bool(ext_cp.vl["AWV_03"]["FCW_Active"])
ret.stockAeb = bool(ext_cp.vl["AWV_03"]["AEB_Active"])
@@ -298,11 +293,7 @@ class CarState(CarStateBase):
tsk_faulted = pt_cp.vl["Motor_51"]["TSK_Status"] in (6, 7)
engine_off = pt_cp.vl["Motor_54"]["Engine_On"] == 0
# Long_Control_Inhibit is currently identified only in the MEB DBC, not in the MQB EVO one.
# bool() is required: CP.flags is an int, so "& IntFlag" returns an IntFlag instance and the
# False case (MQB EVO) would leak that object into the capnp bool field carNotReady.
long_control_inhibit = (bool(self.CP.flags & VolkswagenFlags.MEB)
and pt_cp.vl.get("VMM_02", {}).get("Long_Control_Inhibit", 0) == 2)
long_control_inhibit = pt_cp.vl["VMM_02"]["Long_Control_Inhibit"] == 2
ret.accFaulted = (self.update_acc_fault(tsk_faulted, engine_off, long_control_inhibit) or
ext_cp.vl["AWV_03"]["AWV_Unavailable"] == 1) # AEB unavailable (i.e. radar covered)
@@ -315,7 +306,7 @@ class CarState(CarStateBase):
pt_cp.vl["SMLS_01"]["BH_Blinker_re"])
if self.CP.enableBsm:
bsm_cp = pt_cp if self.CP.flags & (VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO) else ext_cp
bsm_cp = pt_cp if self.CP.flags & VolkswagenFlags.MEB_GEN2 else ext_cp
ret.leftBlindspot = (bool(bsm_cp.vl["MEB_Side_Assist_01"]["Blind_Spot_Info_Driver"]) or
bool(bsm_cp.vl["MEB_Side_Assist_01"]["Blind_Spot_Warn_Driver"]))
ret.rightBlindspot = (bool(bsm_cp.vl["MEB_Side_Assist_01"]["Blind_Spot_Info_Passenger"]) or
@@ -423,7 +414,7 @@ class CarState(CarStateBase):
def get_can_parsers(CP, CP_SP):
if CP.flags & VolkswagenFlags.PQ:
return CarState.get_can_parsers_pq(CP)
elif CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
elif CP.flags & VolkswagenFlags.MEB:
return CarState.get_can_parsers_meb(CP)
# manually configure some optional and variable-rate/edge-triggered messages
@@ -8,62 +8,6 @@ Ecu = CarParams.Ecu
FW_VERSIONS = {
CAR.AUDI_A3_MK4: {
(Ecu.engine, 0x7e0, None): [],
(Ecu.transmission, 0x7e1, None): [],
(Ecu.srs, 0x715, None): [],
(Ecu.eps, 0x712, None): [],
(Ecu.fwdRadar, 0x757, None): [
b'\xf1\x871N3907567E \xf1\x890550',
],
},
CAR.VOLKSWAGEN_GOLF_MK8: {
(Ecu.engine, 0x7e0, None): [],
(Ecu.transmission, 0x7e1, None): [],
(Ecu.srs, 0x715, None): [],
(Ecu.eps, 0x712, None): [],
(Ecu.cornerRadar, 0x74e, None): [
b'\xf1\x872Q0907686J \xf1\x890288',
],
(Ecu.adas, 0x769, None): [
b'\xf1\x875WA980556C \xf1\x890314',
b'\xf1\x875WA980556D \xf1\x890364',
],
(Ecu.parkingAdas, 0x70a, None): [],
(Ecu.fwdRadar, 0x757, None): [
b'\xf1\x875WA907572B \xf1\x890395',
b'\xf1\x875WA907572C \xf1\x890461',
],
(Ecu.fwdCamera, 0x74f, None): [
b'\xf1\x875WA980653C \xf1\x893301',
b'\xf1\x875WA980653D \xf1\x893405',
],
},
CAR.SEAT_LEON_MK4: {
(Ecu.engine, 0x7e0, None): [],
(Ecu.transmission, 0x7e1, None): [
b'\xf1\x870CW906556JA\xf1\x890780',
],
(Ecu.srs, 0x715, None): [
b'\xf1\x871EA959655CK\xf1\x890166',
],
(Ecu.eps, 0x712, None): [],
(Ecu.cornerRadar, 0x74e, None): [
b'\xf1\x872Q0907686E \xf1\x890284',
],
(Ecu.adas, 0x769, None): [
b'\xf1\x875WA980556D \xf1\x890344',
],
(Ecu.parkingAdas, 0x70a, None): [
b'\xf1\x875WA919298A \xf1\x890230',
],
(Ecu.fwdRadar, 0x757, None): [
b'\xf1\x875WA907572B \xf1\x890395',
],
(Ecu.fwdCamera, 0x74f, None): [
b'\xf1\x875WA980653A \xf1\x893129',
],
},
CAR.VOLKSWAGEN_ARTEON_MK1: {
(Ecu.engine, 0x7e0, None): [
b'\xf1\x8704L906026TM\xf1\x896847',
@@ -1,14 +1,9 @@
import time
from opendbc.car import Bus, get_safety_config, structs, uds
from opendbc.car.carlog import carlog
from opendbc.car import Bus, get_safety_config, structs
from opendbc.car.interfaces import CarInterfaceBase
from opendbc.car.isotp_parallel_query import IsoTpParallelQuery
from opendbc.car.volkswagen.carcontroller import CarController
from opendbc.car.volkswagen.carstate import CarState
from opendbc.car.volkswagen.radar_interface import RadarInterface
from opendbc.car.volkswagen.values import (CanBus, CAR, DBC, NetworkLocation, RADAR_DISABLE_STATE, TransmissionType,
VolkswagenFlags, VolkswagenSafetyFlags)
from opendbc.car.volkswagen.values import CanBus, CAR, DBC, NetworkLocation, TransmissionType, VolkswagenFlags, VolkswagenSafetyFlags
class CarInterface(CarInterfaceBase):
CarState = CarState
@@ -47,15 +42,10 @@ class CarInterface(CarInterfaceBase):
ret.networkLocation = NetworkLocation.gateway
ret.dashcamOnly = is_release # Release support needs HCA timeout fix, safety validation, revised J533 harness
elif ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
elif ret.flags & VolkswagenFlags.MEB:
# Set global MEB parameters
if ret.flags & VolkswagenFlags.MEB:
safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMeb)]
elif ret.flags & VolkswagenFlags.MQB_EVO:
safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMqbEvo)]
if ret.flags & (VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO_GEN2):
# Gen2 uses the alt CRC lengths for QFK_01/ESC_51/Motor_51
safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMeb)]
if ret.flags & VolkswagenFlags.MEB_GEN2:
safety_configs[0].safetyParam |= VolkswagenSafetyFlags.MEB_ALT_CRC.value
ret.transmissionType = TransmissionType.direct
@@ -71,30 +61,19 @@ class CarInterface(CarInterfaceBase):
if any(msg in fingerprint[1] for msg in (0x520, 0x86, 0xFD, 0x13D)): # Airbag_02, LWI_01, ESP_21, QFK_01
ret.networkLocation = NetworkLocation.gateway
# The filtered radar tracks are published as Strukturen_01 (0x24F); not every car
# emits it, so only claim radar is available when it's actually on the bus.
ret.radarUnavailable = 0x24F not in fingerprint[0]
else:
ret.networkLocation = NetworkLocation.fwdCamera
ret.radarUnavailable = True
# The camera side of the relay can not see the radar, so openpilot disables it over UDS
if ret.networkLocation == NetworkLocation.fwdCamera:
ret.flags |= VolkswagenFlags.DISABLE_RADAR.value
safety_configs[0].safetyParam |= VolkswagenSafetyFlags.DISABLE_RADAR.value
ret.enableBsm = 0x24C in fingerprint[0] # MEB_Side_Assist_01
if 0x25D in fingerprint[0]: # KLR_01
ret.flags |= VolkswagenFlags.STOCK_KLR_PRESENT.value
if 0x3DC in fingerprint[0]: # Gateway_73
ret.flags |= VolkswagenFlags.ALT_GEAR.value
if ret.flags & VolkswagenFlags.MQB_EVO and 0x30B in fingerprint[0]: # Kombi_01
ret.flags |= VolkswagenFlags.KOMBI_PRESENT.value
# only allow gateway harness to escalate Emergency Assist
if ret.flags & VolkswagenFlags.MEB:
ret.dashcamOnly = ret.networkLocation == NetworkLocation.fwdCamera and not docs
ret.dashcamOnly = ret.networkLocation == NetworkLocation.fwdCamera and not docs
else:
# Set global MQB parameters
@@ -124,7 +103,7 @@ class CarInterface(CarInterfaceBase):
if ret.flags & VolkswagenFlags.PQ or ret.flags & VolkswagenFlags.MLB:
ret.steerActuatorDelay = 0.2
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
elif ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
elif ret.flags & VolkswagenFlags.MEB:
ret.steerActuatorDelay = 0.3
else:
ret.steerActuatorDelay = 0.1
@@ -136,10 +115,9 @@ class CarInterface(CarInterfaceBase):
# Global longitudinal tuning defaults, can be overridden per-vehicle
if ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if ret.flags & VolkswagenFlags.MEB:
ret.openpilotLongitudinalControl = True
ret.longitudinalActuatorDelay = 0.3
ret.radarDelay = 0.15
ret.longitudinalTuning.kiBP = [0., 30.]
ret.longitudinalTuning.kiV = [0.4, 0.]
else:
@@ -165,114 +143,3 @@ class CarInterface(CarInterfaceBase):
ret.safetyConfigs = safety_configs
return ret
@staticmethod
def pre_init(CP, CP_SP, can_recv, can_send):
# check pre conditions for a successful radar disable
# put the device into dashcam mode if necessary: no relay switching, no bus blocking with relay malfunction
if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR):
if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if not CarInterface._is_engine_state_allowed_meb(can_recv):
CP.dashcamOnly = True
carlog.warning("Radar can not be disabled with engine on - dashcam only")
@staticmethod
def init(CP, CP_SP, can_recv, can_send):
# communication control can be rejected with engine on
# uds.CONTROL_TYPE.ENABLE_RX_DISABLE_TX is lost with engine on transition for newer MEB and MQBevo cars
# uds.CONTROL_TYPE.DISABLE_RX_DISABLE_TX is probably not lost but the radar has to be revived manually
# -> deinit is not called in OP -> errors in dash, recovers after second ignition cycle
# Programming session is also rejected while engine on but recovers after key off on
if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR):
RADAR_DISABLE_STATE["error"] = False
if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
if CarInterface._is_engine_state_allowed_meb(can_recv): # prevent programming session request, it will not work
carlog.warning("Trying to disable the radar")
if not CarInterface._radar_communication_control(CP, can_recv, can_send):
RADAR_DISABLE_STATE["error"] = True
else:
RADAR_DISABLE_STATE["error"] = True
carlog.warning("The radar can not be disabled")
@staticmethod
def deinit(CP, can_recv, can_send):
# deinit is currently never executed in the current state of openpilot
# CarD is just killed, no reaction handling on SIGINT
if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR):
if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
CarInterface._radar_communication_control(CP, can_recv, can_send, disable=False)
@staticmethod
def _radar_communication_control(CP, can_recv, can_send, disable=True):
# disable/enable radar tx
bus = CanBus(CP).pt
addr_radar, addr_diag, volkswagen_rx_offset = 0x757, 0x700, 0x6A
retry, timeout = 3, 0.5
tp_req = bytes([uds.SERVICE_TYPE.TESTER_PRESENT, 0x00])
tp_resp = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40, 0x00])
ext_diag_req = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC])
ext_diag_resp = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC])
flash_req = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, uds.SESSION_TYPE.PROGRAMMING])
empty_resp = b""
txt = "disable" if disable else "enable"
for i in range(retry):
try:
if disable:
# Tester Present
query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)], [tp_req], [tp_resp],
volkswagen_rx_offset, functional_addrs=[addr_diag])
if not query.get_data(timeout):
carlog.warning(f"Tester Present returned no data on attempt {i+1}")
continue
# Extended Diagnostic Session
query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)], [ext_diag_req], [ext_diag_resp],
volkswagen_rx_offset)
if not query.get_data(timeout):
carlog.warning(f"Radar extended session returned no data on attempt {i+1}")
continue
# Programming Session
query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)], [flash_req], [empty_resp],
volkswagen_rx_offset)
# no waiting time, start sending our own commands as fast as possible to prevent cruise faults
query.get_data(0)
carlog.warning(f"Radar {txt} by programming session sent on attempt {i+1}")
return True
except Exception as e:
carlog.error(f"Radar {txt} exception on attempt {i+1}: {repr(e)}")
continue
carlog.error(f"Radar {txt} failed")
return False
@staticmethod
def _is_engine_state_allowed_meb(can_recv, timeout: float = 0.5) -> bool:
# this is a safety measure
# detect if the radar can be disabled in the current engine state
# [Motor_54][Engine_On]
end_time = time.monotonic() + timeout
while time.monotonic() < end_time:
packets = can_recv(wait_for_one=True) or []
for packet in packets:
for msg in packet:
if msg.address != 0x14C:
continue
engine_on = bool((msg.dat[9] >> 5) & 0x01)
if engine_on:
carlog.warning(f"Engine state is not allowed: Engine_On={engine_on}")
return False
else:
carlog.warning(f"Engine state is allowed: Engine_On={engine_on}")
return True
carlog.warning("Engine state unknown")
return True
@@ -1,7 +1,7 @@
from opendbc.car import Bus, structs
from opendbc.can import CANDefine
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.volkswagen.values import DBC, VolkswagenFlags
from opendbc.car.volkswagen.values import DBC
LongCtrlState = structs.CarControl.Actuators.LongControlState
@@ -35,8 +35,8 @@ def create_eps_update(packer, bus, eps_stock_values, ea_simulated_torque):
return packer.make_can_msg("LH_EPS_03", bus, values)
def create_lka_hud_control(packer, bus, CP, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, sound_alert=False):
display_mode = 1 if lat_active and not (CP.flags & VolkswagenFlags.CLUSTER_NO_TA_LANES) else 0 # travel assist style showing yellow lanes when op is active
def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, sound_alert=False):
display_mode = 1 if lat_active else 0 # travel assist style showing yellow lanes when op is active
values = {}
if len(ldw_stock_values):
@@ -168,12 +168,12 @@ def create_acc_accel_control(packer, bus, CCP, acc_type, acc_enabled, accel, acc
commands = []
# ACC_Anhalteweg: when stopping: MEB: values <> 0 the car can execute a hard brake probably if target is too close, MQBEvo: value 0 results in hard brake
terminal_rollout = 0.5 if CP.flags & VolkswagenFlags.MQB_EVO else 0
terminal_rollout = 0
values = {
"ACC_Typ": acc_type,
"ACC_Status_ACC": acc_status,
"ACC_StartStopp_Info": 2 if (acc_enabled and leaving_standstill and (CP.flags & VolkswagenFlags.MQB_EVO)) else (1 if acc_enabled else 0),
"ACC_StartStopp_Info": acc_enabled,
"ACC_Sollbeschleunigung_02": accel,
"ACC_zul_Regelabw_unten": 0,
"ACC_zul_Regelabw_oben": 0,
@@ -4,13 +4,6 @@ from opendbc.car.interfaces import RadarInterfaceBase
from opendbc.car.volkswagen.values import DBC, VolkswagenFlags, CanBus
NO_OBJECT_ID = 0
DISTANCE_STATUS_VALID = 0
RADAR_UNAVAILABLE_THRESH = 5
# radar object drel is not the end of the radar facing side but probably the longitudinal
# center of the object; the DBC drel offset of -3.6 m is measured for a point mass (person)
# type object, so statically subtract something between the first half and the end of a
# typical car length.
DREL_FRONT_EDGE_MARGIN = 1.5 # in m
LANE_TYPES = ("Same_Lane", "Left_Lane", "Right_Lane")
SIGNAL_SETS = tuple(
(
@@ -25,51 +18,24 @@ SIGNAL_SETS = tuple(
)
# The gateway harness does not expose the raw radar points, but the camera publishes filtered
# tracks: two per lane, for the left, center and right lanes. MEB calls that message
# MEB_Distance_01, while the MQB EVO DBC carries the exact same payload as Strukturen_01.
RADAR_TRACK_MESSAGE = (
(VolkswagenFlags.MEB, "MEB_Distance_01"),
(VolkswagenFlags.MQB_EVO, "Strukturen_01"),
)
def get_radar_message(CP):
if not (CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO)):
return None
if CP.flags & VolkswagenFlags.MQB_EVO_GEN2: # generation specific, no track message on the bus
return None
for flag, message in RADAR_TRACK_MESSAGE:
if CP.flags & flag:
return message
return None
class RadarInterface(RadarInterfaceBase):
def __init__(self, CP, CP_SP):
super().__init__(CP, CP_SP)
self.radar_off_can: bool = CP.radarUnavailable
self.radar_unavailable_cnt: int = 0
# With the MEB gateway harness, we do not have access to the raw points from the radar.
# However, the camera publishes decent, albeit filtered, tracks. Two for each lane; left, center, and right.
self.rcp: CANParser | None = None
self.radar_message: str | None = get_radar_message(CP)
if self.radar_message is not None:
self.rcp = CANParser(DBC[CP.carFingerprint][Bus.radar], [(self.radar_message, 25)], CanBus(CP).cam)
if CP.flags & VolkswagenFlags.MEB and not self.CP.radarUnavailable:
self.rcp = CANParser(DBC[CP.carFingerprint][Bus.radar], [("MEB_Distance_01", 25)], CanBus(CP).cam)
def update(self, can_strings):
if self.radar_off_can or self.rcp is None:
if self.rcp is None:
return super().update(None)
self.rcp.update(can_strings)
if len(self.rcp.vl_all[self.radar_message]["Distance_Status"]) == 0:
# The track message hasn't been seen yet. Keep publishing empty radar data instead of
# nothing, so consumers waiting on radarTracks don't stall.
return super().update(None)
if len(self.rcp.vl_all["MEB_Distance_01"]["Distance_Status"]) == 0:
return None
return self._update()
@@ -80,19 +46,11 @@ class RadarInterface(RadarInterfaceBase):
ret.errors.canError = True
return ret
msg = self.rcp.vl[self.radar_message]
msg = self.rcp.vl["MEB_Distance_01"]
# Radar reports its overall validity via Distance_Status (0 = Valid, 3 = Invalid).
# Treat consecutive invalid reports as a temporary radar unavailability, similar to Ford MRR.
if msg["Distance_Status"] != DISTANCE_STATUS_VALID:
self.radar_unavailable_cnt += 1
else:
self.radar_unavailable_cnt = 0
if self.radar_unavailable_cnt >= RADAR_UNAVAILABLE_THRESH:
self.pts.clear()
# Can be 3 when radar sensor is obstructed
if msg["Distance_Status"] != 0:
ret.errors.radarUnavailableTemporary = True
return ret
seen_ids = set()
for obj_id_sig, long_sig, lat_sig, vel_sig in SIGNAL_SETS:
@@ -102,7 +60,7 @@ class RadarInterface(RadarInterfaceBase):
# We shouldn't see duplicate track ids
if obj_id in seen_ids:
ret.errors.canError = True
ret.errors.radarFault = True
return ret
seen_ids.add(obj_id)
@@ -115,7 +73,7 @@ class RadarInterface(RadarInterfaceBase):
else:
pt = self.pts[obj_id]
pt.dRel = msg[long_sig] - DREL_FRONT_EDGE_MARGIN
pt.dRel = msg[long_sig]
pt.yRel = msg[lat_sig]
pt.vRel = msg[vel_sig]
+1 -42
View File
@@ -16,8 +16,6 @@ TransmissionType = structs.CarParams.TransmissionType
GearShifter = structs.CarState.GearShifter
Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
RADAR_DISABLE_STATE: dict[str, bool] = {"error": False}
class CanBus(CanBusBase):
def __init__(self, CP=None, fingerprint=None) -> None:
@@ -102,7 +100,7 @@ class CarControllerParams:
"laneAssistDeactivTrailer": 5, # "Lane Assist: no function with trailer"
}
elif CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO):
elif CP.flags & VolkswagenFlags.MEB:
self.LDW_STEP = 10 # LDW_02 message frequency 10Hz
self.ACC_HUD_STEP = 6
self.KLR_01_STEP = 6 # KLR_01 message frequency 17Hz
@@ -217,7 +215,6 @@ class WMI(StrEnum):
class VolkswagenSafetyFlags(IntFlag):
LONG_CONTROL = 1
MEB_ALT_CRC = 2
DISABLE_RADAR = 8
class VolkswagenFlags(IntFlag):
@@ -232,10 +229,6 @@ class VolkswagenFlags(IntFlag):
MLB = 8
MEB = 16
MEB_GEN2 = 128
MQB_EVO = 256
MQB_EVO_GEN2 = 8192
DISABLE_RADAR = 2 ** 12
CLUSTER_NO_TA_LANES = 65536
@dataclass
@@ -269,19 +262,6 @@ class VolkswagenMEBPlatformConfig(PlatformConfig):
self.dbc_dict = {Bus.pt: 'vw_meb_2024_generated', Bus.radar: 'vw_meb_2024_generated'}
@dataclass
class VolkswagenMQBevoPlatformConfig(PlatformConfig):
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mqbevo', Bus.radar: 'vw_mqbevo'})
chassis_codes: set[str] = field(default_factory=set)
wmis: set[WMI] = field(default_factory=set)
def init(self):
self.flags |= VolkswagenFlags.MQB_EVO
if self.flags & VolkswagenFlags.MQB_EVO_GEN2:
self.dbc_dict = {Bus.pt: 'vw_mqbevo_2024', Bus.radar: 'vw_mqbevo_2024'}
@dataclass
class VolkswagenPQPlatformConfig(VolkswagenMQBPlatformConfig):
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_pq'})
@@ -404,12 +384,6 @@ class CAR(Platforms):
chassis_codes={"5G", "AU", "BA", "BE"},
wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR},
)
VOLKSWAGEN_GOLF_MK8 = VolkswagenMQBevoPlatformConfig(
[VWCarDocs("Volkswagen Golf 2020-25")],
VolkswagenCarSpecs(mass=1397, wheelbase=2.62),
chassis_codes={"CD"},
wmis={WMI.VOLKSWAGEN_EUROPE_CAR},
)
VOLKSWAGEN_ID4_MK1 = VolkswagenMEBPlatformConfig(
[
VWCarDocs("Volkswagen ID.4 2021-23"),
@@ -527,13 +501,6 @@ class CAR(Platforms):
chassis_codes={"8V", "FF"},
wmis={WMI.AUDI_GERMANY_CAR, WMI.AUDI_SPORT, WMI.VOLKSWAGEN_CHINA_FAW},
)
AUDI_A3_MK4 = VolkswagenMQBevoPlatformConfig(
[VWCarDocs("Audi RS3 2026")],
VolkswagenCarSpecs(mass=1650, wheelbase=2.631),
chassis_codes={"GY"},
wmis={WMI.AUDI_EUROPE_MPV},
flags=VolkswagenFlags.MQB_EVO_GEN2 | VolkswagenFlags.CLUSTER_NO_TA_LANES,
)
AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig(
[VWCarDocs("Audi Q2 2018")],
VolkswagenCarSpecs(mass=1205, wheelbase=2.61),
@@ -568,14 +535,6 @@ class CAR(Platforms):
chassis_codes={"5F"},
wmis={WMI.SEAT},
)
SEAT_LEON_MK4 = VolkswagenMQBevoPlatformConfig(
[
VWCarDocs("SEAT Leon 2020-25"),
],
VolkswagenCarSpecs(mass=1300, wheelbase=2.685),
chassis_codes={"KL"},
wmis={WMI.SEAT},
)
CUPRA_BORN_MK1 = VolkswagenMEBPlatformConfig(
[VWCarDocs("CUPRA Born 2021-23"),],
VolkswagenCarSpecs(mass=1956, wheelbase=2.766),
File diff suppressed because it is too large Load Diff
@@ -1,99 +0,0 @@
CM_ "IMPORT _vw_mqbevo_common.dbc";
BO_ 252 ESC_51: 48 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" XXX
SG_ AEB_Breaking_01 : 24|8@1+ (1,0) [0|255] "" XXX
SG_ AEB_Breaking_02 : 32|8@1+ (1,0) [0|255] "" XXX
SG_ Accelerator_Higher_Speed : 40|1@0+ (1,0) [0|1] "" XXX
SG_ Brake_Pressure : 42|9@1+ (0.195,0) [0|100] "Unit_Percent" XXX
SG_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" XXX
SG_ HL_Radgeschw : 64|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ HR_Radgeschw : 80|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ VL_Radgeschw : 96|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ VR_Radgeschw : 112|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" XXX
SG_ HL_Brake_Pressure : 152|8@1+ (1,0) [0|100] "" XXX
SG_ HR_Brake_Pressure : 160|8@1+ (1,0) [0|100] "" XXX
SG_ VL_Brake_Pressure : 168|8@1+ (1,0) [0|100] "" XXX
SG_ VR_Brake_Pressure : 176|8@1+ (1,0) [0|100] "" XXX
SG_ Steering_Wheel_CW : 184|8@1+ (1.67,0) [0|255] "" XXX
SG_ Steering_Wheel_CCW : 192|8@1+ (1.67,0) [0|255] "" XXX
SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX
SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" XXX
BO_ 267 Motor_51: 32 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ Accel_Pedal_Pressure : 12|9@1+ (0.4,0) [0|255] "" XXX
SG_ Accel_Low_Pressed_Support : 21|1@1+ (1,0) [0|7] "" XXX
SG_ TSK_Status : 88|3@1+ (1,0) [0|7] "" XXX
SG_ TSK_Limiter_ausgewaehlt : 95|1@1+ (1,0) [0|3] "" XXX
BO_ 333 ACC_18: 32 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX
SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX
SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX
SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX
SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX
SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX
SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX
SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX
SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Anhalteweg : 64|11@1+ (0.01,0) [0|2046] "" XXX
SG_ ACC_Anforderung_HMS : 77|3@1+ (1,0) [0|7] "" XXX
SG_ SET_ME_0XFE : 80|8@1+ (1,0) [0|255] "" XXX
SG_ ACC_AKTIV_regelt : 90|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_0X1 : 92|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX
SG_ Speed : 236|12@1+ (0.1,0) [0|15] "" XXX
SG_ Accel_Boost : 248|6@1+ (1,0) [0|3] "" XXX
SG_ Reversing : 254|1@0+ (1,0) [0|1] "" XXX
BO_ 588 MEB_Side_Assist_01: 16 XXX
SG_ Blind_Spot_Passenger : 12|7@1+ (1,0) [0|15] "" XXX
SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX
SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX
SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX
SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX
SG_ Blind_Spot_Warn_Driver : 30|1@0+ (1,0) [0|1] "" XXX
SG_ Lower_Speed_01 : 32|1@0+ (1,0) [0|1] "" XXX
SG_ Higher_Speed_01 : 33|1@0+ (1,0) [0|1] "" XXX
SG_ Higher_Speed_02 : 83|1@0+ (1,0) [0|1] "" XXX
SG_ Lower_Speed_02 : 84|1@0+ (1,0) [0|1] "" XXX
SG_ Standstill : 86|1@0+ (1,0) [0|1] "" XXX
SG_ NEW_SIGNAL_1 : 98|1@0+ (1,0) [0|1] "" XXX
SG_ NEW_SIGNAL_6 : 119|1@0+ (1,0) [0|1] "" XXX
BO_ 619 TA_01: 8 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ Travel_Assist_Status : 13|3@1+ (1,0) [0|3] "" XXX
SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX
SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX
VAL_ 267 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault";
VAL_ 333 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert";
VAL_ 333 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert";
VAL_ 333 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler";
VAL_ 333 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler";
VAL_ 333 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren";
VAL_ 333 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht";
VAL_ 333 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert";
VAL_ 333 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System";
VAL_ 333 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv";
VAL_ 333 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler";
VAL_ 333 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe";
VAL_ 333 Accel_Boost 3 "Driving" 0 "Stop" 2 "Driving" 1 "Driving";
VAL_ 619 Travel_Assist_Status 4 "enabled" 0 "disabled" 2 "ready" 3 "pre_ready";
VAL_ 619 Travel_Assist_Request 4 "enable" 3 "disable" 0 "no_request" 1 "error";
VAL_ 619 Travel_Assist_Available 0 "not_available" 1 "available";
@@ -1,109 +0,0 @@
CM_ "IMPORT _vw_mqbevo_common.dbc";
BO_ 252 ESC_51: 64 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" XXX
SG_ AEB_Breaking_01 : 24|8@1+ (1,0) [0|255] "" XXX
SG_ AEB_Breaking_02 : 32|8@1+ (1,0) [0|255] "" XXX
SG_ Accelerator_Higher_Speed : 40|1@0+ (1,0) [0|1] "" XXX
SG_ Brake_Pressure : 42|9@1+ (0.195,0) [0|100] "Unit_Percent" XXX
SG_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" XXX
SG_ HL_Radgeschw : 64|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ HR_Radgeschw : 80|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ VL_Radgeschw : 96|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ VR_Radgeschw : 112|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX
SG_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" XXX
SG_ HL_Brake_Pressure : 152|8@1+ (1,0) [0|100] "" XXX
SG_ HR_Brake_Pressure : 160|8@1+ (1,0) [0|100] "" XXX
SG_ VL_Brake_Pressure : 168|8@1+ (1,0) [0|100] "" XXX
SG_ VR_Brake_Pressure : 176|8@1+ (1,0) [0|100] "" XXX
SG_ Steering_Wheel_CW : 184|8@1+ (1.67,0) [0|255] "" XXX
SG_ Steering_Wheel_CCW : 192|8@1+ (1.67,0) [0|255] "" XXX
SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX
SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" XXX
BO_ 267 Motor_51: 48 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ Accel_Pedal_Pressure : 12|9@1+ (0.4,0) [0|255] "" XXX
SG_ Accel_Low_Pressed_Support : 21|1@1+ (1,0) [0|7] "" XXX
SG_ TSK_Status : 88|3@1+ (1,0) [0|7] "" XXX
SG_ TSK_Limiter_ausgewaehlt : 95|1@1+ (1,0) [0|3] "" XXX
BO_ 333 ACC_18: 32 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX
SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX
SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX
SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX
SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX
SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX
SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX
SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX
SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX
SG_ ACC_Anhalteweg : 64|11@1+ (0.01,0) [0|2046] "" XXX
SG_ ACC_Anforderung_HMS : 77|3@1+ (1,0) [0|7] "" XXX
SG_ SET_ME_0XFE : 80|8@1+ (1,0) [0|255] "" XXX
SG_ ACC_AKTIV_regelt : 90|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_0X1 : 92|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_0x2FE : 98|10@1+ (1,0) [0|63] "" XXX
SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX
SG_ Speed : 236|12@1+ (0.1,0) [0|15] "" XXX
SG_ Accel_Boost : 248|6@1+ (1,0) [0|3] "" XXX
SG_ Reversing : 254|1@0+ (1,0) [0|1] "" XXX
BO_ 588 MEB_Side_Assist_01: 16 XXX
SG_ Blind_Spot_Passenger : 12|7@1+ (1,0) [0|15] "" XXX
SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX
SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX
SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX
SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX
SG_ Blind_Spot_Warn_Driver : 30|1@0+ (1,0) [0|1] "" XXX
SG_ Lower_Speed_01 : 32|1@0+ (1,0) [0|1] "" XXX
SG_ Higher_Speed_01 : 33|1@0+ (1,0) [0|1] "" XXX
SG_ Higher_Speed_02 : 83|1@0+ (1,0) [0|1] "" XXX
SG_ Lower_Speed_02 : 84|1@0+ (1,0) [0|1] "" XXX
SG_ NEW_SIGNAL_1 : 98|1@0+ (1,0) [0|1] "" XXX
SG_ NEW_SIGNAL_6 : 119|1@0+ (1,0) [0|1] "" XXX
SG_ Motion_State : 171|2@0+ (1,0) [0|1] "" XXX
BO_ 619 TA_01: 8 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX
SG_ Travel_Assist_Status : 13|3@1+ (1,0) [0|3] "" XXX
SG_ Speed_Mode_01 : 16|1@0+ (1,0) [0|1] "" XXX
SG_ Speed_Mode_02 : 18|1@0+ (1,0) [0|1] "" XXX
SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX
SG_ Init : 22|1@0+ (1,0) [0|1] "" XXX
SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX
SG_ Unknown_01 : 26|1@0+ (1,0) [0|1] "" XXX
SG_ Unknown_02 : 28|1@0+ (1,0) [0|1] "" XXX
SG_ Unknown_03 : 31|1@0+ (1,0) [0|1] "" XXX
SG_ Speed_Mode_Status : 32|3@1+ (1,0) [0|7] "" XXX
SG_ Lane_Unsure : 37|2@1+ (1,0) [0|3] "" XXX
VAL_ 267 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault";
VAL_ 333 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert";
VAL_ 333 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert";
VAL_ 333 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler";
VAL_ 333 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler";
VAL_ 333 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren";
VAL_ 333 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht";
VAL_ 333 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert";
VAL_ 333 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System";
VAL_ 333 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv";
VAL_ 333 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler";
VAL_ 333 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe";
VAL_ 333 Accel_Boost 3 "Driving" 0 "Stop" 2 "Driving" 1 "Driving";
VAL_ 588 Motion_State 1 "Forwards" 2 "Reversing" 3 "Stopped";
VAL_ 619 Travel_Assist_Status 4 "enabled" 0 "disabled" 2 "ready" 3 "pre_ready";
VAL_ 619 Travel_Assist_Request 4 "enable" 3 "disable" 0 "no_request" 1 "error";
VAL_ 619 Travel_Assist_Available 0 "not_available" 1 "available";
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -30,7 +30,6 @@
#define SAFETY_FAW 26U
#define SAFETY_BODY 27U
#define SAFETY_HYUNDAI_CANFD 28U
#define SAFETY_VOLKSWAGEN_MQBEVO 29U
#define SAFETY_CHRYSLER_CUSW 30U
#define SAFETY_PSA 31U
#define SAFETY_RIVIAN 33U
@@ -1,19 +1,13 @@
#pragma once
extern const uint16_t FLAG_VOLKSWAGEN_LONG_CONTROL;
extern const uint16_t FLAG_VOLKSWAGEN_DISABLE_RADAR;
const uint16_t FLAG_VOLKSWAGEN_LONG_CONTROL = 1;
const uint16_t FLAG_VOLKSWAGEN_DISABLE_RADAR = 8;
static uint8_t volkswagen_crc8_lut_8h2f[256]; // Static lookup table for CRC8 poly 0x2F, aka 8H2F/AUTOSAR
extern bool volkswagen_longitudinal;
bool volkswagen_longitudinal = false;
extern bool volkswagen_disable_radar;
bool volkswagen_disable_radar = false;
extern bool volkswagen_set_button_prev;
bool volkswagen_set_button_prev = false;
@@ -46,7 +40,6 @@ bool volkswagen_brake_pressure_detected = false;
static void volkswagen_common_init(void) {
volkswagen_longitudinal = false;
volkswagen_disable_radar = false;
volkswagen_set_button_prev = false;
volkswagen_resume_button_prev = false;
volkswagen_brake_pedal_switch = false;
@@ -12,8 +12,6 @@
#define MSG_Motor_51 0x10BU // RX for TSK state and accel pedal
#define MSG_KLR_01 0x25DU // TX, for capacitive steering wheel
#define MSG_TA_01 0x26BU // TX by OP, Travel Assist status
#define MSG_DIAGNOSTIC 0x700U // TX, functional tester present for the radar disable
#define MSG_RADAR_DIAG 0x757U // TX, physical radar diagnostic address
// ACC_18.ACC_Anforderung_HMS, the states openpilot is allowed to request
#define VOLKSWAGEN_MEB_HMS_KEINE_ANFORDERUNG 0U
@@ -118,28 +116,10 @@ static safety_config volkswagen_meb_init(uint16_t param) {
{MSG_TA_01, 0, 8, .check_relay = true},
};
// With the radar disabled (camera side of the relay) openpilot needs the diagnostic
// addresses to put the radar into a programming session
static const CanMsg VOLKSWAGEN_MEB_TX_MSGS_NO_RADAR[] = {
{MSG_HCA_03, 0, 24, .check_relay = true},
{MSG_LDW_02, 0, 8, .check_relay = true},
{MSG_KLR_01, 0, 8, .check_relay = false},
{MSG_KLR_01, 2, 8, .check_relay = true},
{MSG_ACC_19, 0, 48, .check_relay = true},
{MSG_ACC_18, 0, 32, .check_relay = true},
{MSG_TA_01, 0, 8, .check_relay = true},
{MSG_DIAGNOSTIC, 0, 8, .check_relay = false},
{MSG_RADAR_DIAG, 0, 8, .check_relay = false},
};
volkswagen_common_init();
const uint16_t FLAG_VOLKSWAGEN_MEB_ALT_CRC = 2;
volkswagen_meb_alt_crc = GET_FLAG(param, FLAG_VOLKSWAGEN_MEB_ALT_CRC);
#ifdef ALLOW_DEBUG
volkswagen_disable_radar = GET_FLAG(param, FLAG_VOLKSWAGEN_DISABLE_RADAR);
#endif
safety_config ret;
if (volkswagen_meb_alt_crc) {
static RxCheck volkswagen_meb_gen2_rx_checks[] = {
@@ -148,8 +128,7 @@ static safety_config volkswagen_meb_init(uint16_t param) {
{.msg = {{MSG_ESC_51, 0, 64, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
};
ret = volkswagen_disable_radar ? BUILD_SAFETY_CFG(volkswagen_meb_gen2_rx_checks, VOLKSWAGEN_MEB_TX_MSGS_NO_RADAR)
: BUILD_SAFETY_CFG(volkswagen_meb_gen2_rx_checks, VOLKSWAGEN_MEB_TX_MSGS);
ret = BUILD_SAFETY_CFG(volkswagen_meb_gen2_rx_checks, VOLKSWAGEN_MEB_TX_MSGS);
} else {
static RxCheck volkswagen_meb_rx_checks[] = {
VOLKSWAGEN_MEB_COMMON_RX_CHECKS
@@ -157,8 +136,7 @@ static safety_config volkswagen_meb_init(uint16_t param) {
{.msg = {{MSG_ESC_51, 0, 48, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
};
ret = volkswagen_disable_radar ? BUILD_SAFETY_CFG(volkswagen_meb_rx_checks, VOLKSWAGEN_MEB_TX_MSGS_NO_RADAR)
: BUILD_SAFETY_CFG(volkswagen_meb_rx_checks, VOLKSWAGEN_MEB_TX_MSGS);
ret = BUILD_SAFETY_CFG(volkswagen_meb_rx_checks, VOLKSWAGEN_MEB_TX_MSGS);
}
return ret;
}
-1
View File
@@ -414,7 +414,6 @@ int set_safety_hooks(uint16_t mode, uint16_t param) {
{SAFETY_SUBARU, &subaru_hooks},
{SAFETY_VOLKSWAGEN_MQB, &volkswagen_mqb_hooks},
{SAFETY_VOLKSWAGEN_MEB, &volkswagen_meb_hooks},
{SAFETY_VOLKSWAGEN_MQBEVO, &volkswagen_meb_hooks},
{SAFETY_NISSAN, &nissan_hooks},
{SAFETY_NOOUTPUT, &nooutput_hooks},
{SAFETY_HYUNDAI_LEGACY, &hyundai_legacy_hooks},
@@ -4866,70 +4866,5 @@
"2023"
],
"package": "Adaptive Cruise Control (ACC) & Lane Assist"
},
"Seat Leon 2020-25": {
"platform": "SEAT_LEON_MK4",
"make": "Volkswagen",
"brand": "volkswagen",
"model": "Leon IV",
"year": [
"2020",
"2021",
"2022",
"2023",
"2024",
"2025"
],
"package": "Adaptive Cruise Control (ACC) & Lane Assist"
},
"Volkswagen Golf 2020-25": {
"platform": "VOLKSWAGEN_GOLF_MK8",
"make": "Volkswagen",
"brand": "volkswagen",
"model": "Golf 8",
"year": [
"2020",
"2021",
"2022",
"2023",
"2024",
"2025"
],
"package": "Adaptive Cruise Control (ACC) & Lane Assist"
},
"Volkswagen MQBevo 2020-25": {
"platform": "VOLKSWAGEN_GOLF_MK8",
"make": "Volkswagen",
"brand": "volkswagen",
"model": "MQBevo",
"year": [
"2020",
"2021",
"2022",
"2023",
"2024",
"2025"
],
"package": "Adaptive Cruise Control (ACC) & Lane Assist"
},
"Audi RS3 2026": {
"platform": "AUDI_A3_MK4",
"make": "Audi",
"brand": "volkswagen",
"model": "RS3",
"year": [
"2026"
],
"package": "Adaptive Cruise Control (ACC) & Lane Assist"
},
"Volkswagen MQBevo Gen 2 2026": {
"platform": "AUDI_A3_MK4",
"make": "Volkswagen",
"brand": "volkswagen",
"model": "MQBevo Gen 2",
"year": [
"2026"
],
"package": "Adaptive Cruise Control (ACC) & Lane Assist"
}
}
}
-3
View File
@@ -130,9 +130,6 @@ class Car:
# Dynamic Experimental Control
self.dynamic_experimental_control = self.params.get_bool("DynamicExperimentalControl")
# let the interface adjust CarParams (e.g. dashcamOnly) before control availability is computed
self.CI.pre_init(self.CP, self.CP_SP, *self.can_callbacks)
openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle")
controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly
self.CP.passive = not controller_available or self.CP.dashcamOnly
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,2 +1,2 @@
extern const uint8_t gitversion[19];
const uint8_t gitversion[19] = "DEV-0389d815-DEBUG";
const uint8_t gitversion[19] = "DEV-462b3a88-DEBUG";
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
DEV-0389d815-DEBUG
DEV-462b3a88-DEBUG
Binary file not shown.