这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
f7ff079
add DBC
jyoung8607 Oct 18, 2025
b1fda92
add platform definition data
jyoung8607 Oct 18, 2025
68f41c0
carstate checkpoint
jyoung8607 Oct 18, 2025
03baa30
checkpoint carcontroller/mlbcan/interface
jyoung8607 Oct 18, 2025
c2ffb5d
checkpoint safety and safety test
jyoung8607 Oct 18, 2025
20a9fbd
PEBCAK
jyoung8607 Oct 18, 2025
2e9ac5d
checkpoint various fixes
jyoung8607 Oct 18, 2025
d71c605
fixes
jyoung8607 Oct 18, 2025
d138b69
more fixes
jyoung8607 Oct 18, 2025
763f88a
Blinkmodi_01 is genuinely on-demand only, add a fixme
jyoung8607 Oct 18, 2025
9df9cd8
get turn signal state from a less annoying source
jyoung8607 Oct 18, 2025
363a9ac
add @Bentley's route for dev/test only
jyoung8607 Oct 18, 2025
3b7b444
gearshift position
jyoung8607 Oct 18, 2025
1d43f0c
cleanup
jyoung8607 Oct 18, 2025
39adae7
auto_fingerprint e8dac44d3a3458a5/00000000--9b83a227ce
jyoung8607 Oct 18, 2025
98a3df5
smooth move, ex-lax
jyoung8607 Oct 18, 2025
87f6018
Kombi_01 COUNTER isn't real, at least not universal
jyoung8607 Oct 18, 2025
e045c97
use lat accel torque controller
jyoung8607 Oct 19, 2025
6f4167d
checkpoint refactor
jyoung8607 Oct 22, 2025
38e304f
Revert "always CANFD"
jyoung8607 Oct 22, 2025
a49092a
auto_fingerprint 3a4f7c559c2f1215/00000001--5dc72af277
jyoung8607 Oct 22, 2025
649ee8f
add the VIN just to be sure
jyoung8607 Oct 22, 2025
23eeb9a
Merge branch 'master' of ssh://github.com/commaai/opendbc into porsch…
jyoung8607 Nov 6, 2025
0e50073
auto_fingerprint a3bd1cb95d7c2f97/00000082--dbb4d37c0d
jyoung8607 Nov 6, 2025
86d0a7c
she's a quick one
jyoung8607 Nov 7, 2025
3969821
more torque
jyoung8607 Nov 7, 2025
fb33456
use different turn state signal
jyoung8607 Nov 7, 2025
66a5cb1
slight reduction in ramp-up rate for jerk limit safety
jyoung8607 Nov 7, 2025
df54a05
fix HCA status handling
jyoung8607 Nov 7, 2025
79a35e8
FINE
jyoung8607 Nov 7, 2025
f226e05
add seatbelt signal
jyoung8607 Nov 7, 2025
0a4fd93
enable door states
jyoung8607 Nov 7, 2025
d415e4e
Revert "use different turn state signal"
jyoung8607 Nov 7, 2025
59a7ee2
use turn stalk helper to handle one-touch lane changes
jyoung8607 Nov 7, 2025
ddd02c8
Merge branch 'master' of ssh://github.com/commaai/opendbc into porsch…
jyoung8607 Nov 7, 2025
c2d31b4
derp
jyoung8607 Nov 7, 2025
126119c
more friction
jyoung8607 Nov 7, 2025
9a3d2a8
a little more SR
jyoung8607 Nov 7, 2025
cf1046d
cleanup test routes
jyoung8607 Nov 8, 2025
2acb3e9
reduce whitespace diff
jyoung8607 Nov 8, 2025
b6e2253
unnecessary for now
jyoung8607 Nov 8, 2025
afae139
dashcam
jyoung8607 Nov 8, 2025
24c905b
cleanup
jyoung8607 Nov 8, 2025
0d5a643
Merge branch 'master' of ssh://github.com/commaai/opendbc into porsch…
jyoung8607 Nov 8, 2025
575d73d
Reapply "always CANFD"
jyoung8607 Nov 8, 2025
4e96437
VW: Safety code cleanup
jyoung8607 Nov 8, 2025
2014b21
not yet
jyoung8607 Nov 8, 2025
df2c921
consolidate ESP_05 for MQB
jyoung8607 Nov 8, 2025
5fd1b53
retry CI after pinning pycapnp
jyoung8607 Nov 9, 2025
05edd2a
Merge branch 'master' of github.com:commaai/opendbc into vw-safety-cl…
jyoung8607 Nov 9, 2025
0e2a206
DRY not worth it here
jyoung8607 Nov 9, 2025
67f784a
a little more DRY
jyoung8607 Nov 10, 2025
8edf2ec
convert another single-bit read to GET_BIT
jyoung8607 Nov 10, 2025
07f62bd
follow safety cleanup/refactor
jyoung8607 Nov 10, 2025
98a9035
separate MLB checksum handling, add XOR support
jyoung8607 Nov 10, 2025
462fed0
XOR checksum support for LS_01
jyoung8607 Nov 10, 2025
969b546
Merge branch 'master' of github.com:commaai/opendbc into porsche-macan
jyoung8607 Nov 10, 2025
4a176c0
shared message handling for LH_EPS_03 and LWI_01
jyoung8607 Nov 10, 2025
2035e79
Merge branch 'master' of github.com:commaai/opendbc into porsche-macan
jyoung8607 Nov 10, 2025
c47fed4
Merge branch 'master' of github.com:commaai/opendbc into porsche-macan
jyoung8607 Nov 10, 2025
61fbdff
selective signal pass-through for LS_01
jyoung8607 Nov 10, 2025
d99121c
add note for later consolidation
jyoung8607 Nov 10, 2025
953e465
consolidate create_lka_hud_control, unpretty but works
jyoung8607 Nov 10, 2025
2e2c241
XOR checksum support for TSK_05
jyoung8607 Nov 10, 2025
a95e3a6
add TODO
jyoung8607 Nov 10, 2025
ae4b949
try it out
jyoung8607 Nov 10, 2025
7a08521
good enough for who it's for
jyoung8607 Nov 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions opendbc/can/dbc.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from opendbc.car.subaru.subarucan import subaru_checksum
from opendbc.car.chrysler.chryslercan import chrysler_checksum, fca_giorgio_checksum
from opendbc.car.hyundai.hyundaicanfd import hkg_can_fd_checksum
from opendbc.car.volkswagen.mlbcan import volkswagen_mlb_checksum
from opendbc.car.volkswagen.mqbcan import volkswagen_mqb_meb_checksum, xor_checksum
from opendbc.car.tesla.teslacan import tesla_checksum
from opendbc.car.body.bodycan import body_checksum
Expand All @@ -31,6 +32,7 @@ class SignalType:
FCA_GIORGIO_CHECKSUM = 10
TESLA_CHECKSUM = 11
PSA_CHECKSUM = 12
VOLKSWAGEN_MLB_CHECKSUM = 13


@dataclass
Expand Down Expand Up @@ -186,6 +188,8 @@ def get_checksum_state(dbc_name: str) -> ChecksumState | None:
return ChecksumState(16, -1, 0, -1, True, SignalType.HKG_CAN_FD_CHECKSUM, hkg_can_fd_checksum)
elif dbc_name.startswith(("vw_mqb", "vw_mqbevo", "vw_meb")):
return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_CHECKSUM, volkswagen_mqb_meb_checksum)
elif dbc_name.startswith("vw_mlb"):
return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MLB_CHECKSUM, volkswagen_mlb_checksum)
elif dbc_name.startswith("vw_pq"):
return ChecksumState(8, 4, 0, -1, True, SignalType.XOR_CHECKSUM, xor_checksum)
elif dbc_name.startswith("subaru_global_"):
Expand Down
1 change: 1 addition & 0 deletions opendbc/car/tests/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ class CarTestRoute(NamedTuple):
CarTestRoute("66e5edc3a16459c5/2021-05-25--19-00-29", VOLKSWAGEN.SKODA_OCTAVIA_MK3),
CarTestRoute("026b6d18fba6417f/2021-03-26--09-17-04", VOLKSWAGEN.SKODA_KAMIQ_MK1), # Scala
CarTestRoute("b2e9858e29db492b/2021-03-26--16-58-42", VOLKSWAGEN.SKODA_SUPERB_MK3),
CarTestRoute("e8dac44d3a3458a5/0000008d--c3e9496f1c", VOLKSWAGEN.PORSCHE_MACAN_MK1), # placeholder, replace after merge

CarTestRoute("3c8f0c502e119c1c/2020-06-30--12-58-02", SUBARU.SUBARU_ASCENT),
CarTestRoute("c321c6b697c5a5ff/2020-06-23--11-04-33", SUBARU.SUBARU_FORESTER),
Expand Down
1 change: 1 addition & 0 deletions opendbc/car/torque_data/override.toml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"HONDA_ODYSSEY_5G_MMR" = [0.9, 0.9, 0.2]
"HONDA_NBOX_2G" = [1.2, 1.2, 0.2]
"ACURA_TLX_2G" = [1.2, 1.2, 0.15]
"PORSCHE_MACAN_MK1" = [2.0, 2.0, 0.2]

# Dashcam or fallback configured as ideal car
"MOCK" = [10.0, 10, 0.0]
Expand Down
10 changes: 8 additions & 2 deletions opendbc/car/volkswagen/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from opendbc.car.lateral import apply_driver_steer_torque_limits
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.interfaces import CarControllerBase
from opendbc.car.volkswagen import mqbcan, pqcan
from opendbc.car.volkswagen import mlbcan, mqbcan, pqcan
from opendbc.car.volkswagen.values import CanBus, CarControllerParams, VolkswagenFlags

VisualAlert = structs.CarControl.HUDControl.VisualAlert
Expand All @@ -16,10 +16,16 @@ def __init__(self, dbc_names, CP):
super().__init__(dbc_names, CP)
self.CCP = CarControllerParams(CP)
self.CAN = CanBus(CP)
self.CCS = pqcan if CP.flags & VolkswagenFlags.PQ else mqbcan
self.packer_pt = CANPacker(dbc_names[Bus.pt])
self.aeb_available = not CP.flags & VolkswagenFlags.PQ

if CP.flags & VolkswagenFlags.PQ:
self.CCS = pqcan
elif CP.flags & VolkswagenFlags.MLB:
self.CCS = mlbcan
else:
self.CCS = mqbcan

self.apply_torque_last = 0
self.gra_acc_counter_last = None
self.eps_timer_soft_disable_alert = False
Expand Down
72 changes: 66 additions & 6 deletions opendbc/car/volkswagen/carstate.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def __init__(self, CP):
self.esp_hold_confirmation = False
self.upscale_lead_car_signal = False
self.eps_stock_values = False
self.acc_type = 0

def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]):
if not self.CP.pcmCruise:
Expand Down Expand Up @@ -48,6 +49,8 @@ def update(self, can_parsers) -> structs.CarState:

if self.CP.flags & VolkswagenFlags.PQ:
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)

ret = structs.CarState()

Expand Down Expand Up @@ -227,6 +230,61 @@ def update_pq(self, pt_cp, cam_cp, ext_cp) -> structs.CarState:
self.frame += 1
return ret

def update_mlb(self, pt_cp, cam_cp, ext_cp) -> structs.CarState:
ret = structs.CarState()

self.parse_wheel_speeds(ret,
pt_cp.vl["ESP_03"]["ESP_VL_Radgeschw"],
pt_cp.vl["ESP_03"]["ESP_VR_Radgeschw"],
pt_cp.vl["ESP_03"]["ESP_HL_Radgeschw"],
pt_cp.vl["ESP_03"]["ESP_HR_Radgeschw"],
)

ret.gasPressed = pt_cp.vl["Motor_03"]["MO_Fahrpedalrohwert_01"] > 0
ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], None))

# ACC okay but disabled (1), ACC ready (2), a radar visibility or other fault/disruption (6 or 7)
# currently regulating speed (3), driver accel override (4), brake only (5)
# TODO: get this from the drivetrain side instead, for openpilot long support later
ret.cruiseState.available = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (2, 3, 4, 5)
ret.cruiseState.enabled = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (3, 4, 5)
ret.accFaulted = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (6, 7)

self.parse_mlb_mqb_steering_state(ret, pt_cp)

ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0
brake_pedal_pressed = bool(pt_cp.vl["Motor_03"]["MO_Fahrer_bremst"])
brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"])
ret.brakePressed = brake_pedal_pressed or brake_pressure_detected
ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"])
ret.espDisabled = pt_cp.vl["ESP_01"]["ESP_Tastung_passiv"] != 0

ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(300, pt_cp.vl["Gateway_11"]["BH_Blinker_li"],
pt_cp.vl["Gateway_11"]["BH_Blinker_re"])

ret.seatbeltUnlatched = pt_cp.vl["Gateway_06"]["AB_Gurtschloss_FA"] != 3
ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"],
pt_cp.vl["Gateway_05"]["BT_Tuer_geoeffnet"],
pt_cp.vl["Gateway_05"]["HL_Tuer_geoeffnet"],
pt_cp.vl["Gateway_05"]["HR_Tuer_geoeffnet"]])

# Consume blind-spot monitoring info/warning LED states, if available.
# Infostufe: BSM LED on, Warnung: BSM LED flashing
if self.CP.enableBsm:
ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"])
ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"])

self.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {}
self.gra_stock_values = pt_cp.vl["LS_01"]

ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS)

ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation
ret.standstill = ret.vEgoRaw == 0

self.frame += 1
return ret

def update_low_speed_alert(self, v_ego: float) -> bool:
# Low speed steer alert hysteresis logic
if (self.CP.minSteerSpeed - 1e-3) > CarControllerParams.DEFAULT_MIN_STEER_SPEED and v_ego < (self.CP.minSteerSpeed + 1.):
Expand Down Expand Up @@ -258,18 +316,20 @@ def get_can_parsers(CP):
if CP.flags & VolkswagenFlags.PQ:
return CarState.get_can_parsers_pq(CP)

# another case of the 1-50Hz
cam_messages = []
# manually configure some optional and variable-rate/edge-triggered messages
pt_messages, cam_messages = [], []

if not CP.flags & VolkswagenFlags.MLB:
pt_messages += [
("Blinkmodi_02", 1) # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active)
]
if CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT:
cam_messages += [
("HCA_01", 1), # From R242 Driver assistance camera, 50Hz if steering/1Hz if not
]

return {
Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [
# the 50->1Hz is currently too much for the CANParser to figure out
("Blinkmodi_02", 1), # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active)
], CanBus(CP).pt),
Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).pt),
Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, CanBus(CP).cam),
}

Expand Down
29 changes: 29 additions & 0 deletions opendbc/car/volkswagen/fingerprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,35 @@
b'\xf1\x872Q0907572T \xf1\x890383',
],
},
CAR.PORSCHE_MACAN_MK1: {
(Ecu.engine, 0x7e0, None): [
b'\xf1\x8795B906259BJ\xf1\x890001',
b'\xf1\x8795B90652013\xf1\x893485',
b'\xf1\x8795B90654002\xf1\x893495',
b'\xf1\x8795B907551D \xf1\x890006',
],
(Ecu.transmission, 0x7e1, None): [
b'\xf1\x8795B927156CE\xf1\x890022',
b'\xf1\x8795B927156JH\xf1\x890001',
b'\xf1\x8795B927156KK\xf1\x890001',
b'\xf1\x8795B927156R \xf1\x890021',
],
(Ecu.srs, 0x715, None): [
b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513',
b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x050682033514',
b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514',
b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CJ02D417',
],
(Ecu.eps, 0x712, None): [
b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04#\x04#',
b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04/\x04/',
],
(Ecu.fwdRadar, 0x757, None): [
b'\xf1\x8795B907567B\x00\xf1\x890800\xf1\x82108',
b'\xf1\x8795B907567G\x00\xf1\x890410\xf1\x82104',
b'\xf1\x8795B907567J \xf1\x890440\xf1\x82104',
],
},
CAR.SEAT_ATECA_MK1: {
(Ecu.engine, 0x7e0, None): [
b'\xf1\x8704E906027KA\xf1\x893749',
Expand Down
14 changes: 13 additions & 1 deletion opendbc/car/volkswagen/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alp
# Panda ALLOW_DEBUG firmware required.
ret.dashcamOnly = True

elif ret.flags & VolkswagenFlags.MLB:
# Set global MLB parameters
safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMlb)]
ret.enableBsm = 0x30F in fingerprint[0] # SWA_01
ret.networkLocation = NetworkLocation.gateway
ret.dashcamOnly = True # Pending HCA timeout fix, safety validation, harness termination, install procedure

else:
# Set global MQB parameters
safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagen)]
Expand All @@ -62,7 +69,7 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alp
# Global lateral tuning defaults, can be overridden per-vehicle

ret.steerLimitTimer = 0.4
if ret.flags & VolkswagenFlags.PQ:
if ret.flags & VolkswagenFlags.PQ or ret.flags & VolkswagenFlags.MLB:
ret.steerActuatorDelay = 0.2
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
else:
Expand All @@ -83,6 +90,11 @@ def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alp
if ret.transmissionType == TransmissionType.manual:
ret.minEnableSpeed = 4.5

# Per-vehicle overrides

if candidate == CAR.PORSCHE_MACAN_MK1:
ret.steerActuatorDelay = 0.07

ret.pcmCruise = not ret.openpilotLongitudinalControl
ret.stopAccel = -0.55
ret.vEgoStarting = 0.1
Expand Down
71 changes: 71 additions & 0 deletions opendbc/car/volkswagen/mlbcan.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from opendbc.car.volkswagen.mqbcan import (volkswagen_mqb_meb_checksum, xor_checksum,
create_lka_hud_control as mqb_create_lka_hud_control)

# TODO: Parameterize the hca control type (5 vs 7) and consolidate with MQB (and PQ?)
def create_steering_control(packer, bus, apply_steer, lkas_enabled):
values = {
"HCA_01_Status_HCA": 7 if lkas_enabled else 3,
"HCA_01_LM_Offset": abs(apply_steer),
"HCA_01_LM_OffSign": 1 if apply_steer < 0 else 0,
"HCA_01_Vib_Freq": 18,
"HCA_01_Sendestatus": 1 if lkas_enabled else 0,
"EA_ACC_Wunschgeschwindigkeit": 327.36,
}
return packer.make_can_msg("HCA_01", bus, values)


def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control):
return mqb_create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control)


def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False):
values = {s: gra_stock_values[s] for s in [
"LS_Hauptschalter",
"LS_Typ_Hauptschalter",
"LS_Codierung",
"LS_Tip_Stufe_2",
]}

values.update({
"COUNTER": (gra_stock_values["COUNTER"] + 1) % 16,
"LS_Abbrechen": cancel,
"LS_Tip_Wiederaufnahme": resume,
})

return packer.make_can_msg("LS_01", bus, values)


def acc_control_value(main_switch_on, acc_faulted, long_active):
return 0


def acc_hud_status_value(main_switch_on, acc_faulted, long_active):
return 0


def create_acc_accel_control(packer, bus, acc_type, acc_enabled, accel, acc_control, stopping, starting, esp_hold):
values = {}
return packer.make_can_msg("ACC_05", bus, values)


def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance, distance):
values = {}
return packer.make_can_msg("ACC_02", bus, values)

def volkswagen_mlb_checksum(address: int, sig, d: bytearray) -> int:
xor_starting_value = {
0x109: 0x08, # ACC_01
0x111: 0x10, # TSK_05
0x30C: 0x0F, # ACC_02
0x324: 0x27, # ACC_04
0x10B: 0xA, # LS_01
0x10D: 0x0C, # ACC_05
0x10F: 0x0E, # ACC_0x10F
0x311: 0x12, # ACC_0x311
0x397: 0x94, # LDW_02
0x10C: 0x0D, # TSK_02
}
if address in xor_starting_value:
return xor_checksum(address, sig, d, xor_starting_value[address])
else:
return volkswagen_mqb_meb_checksum(address, sig, d)
4 changes: 2 additions & 2 deletions opendbc/car/volkswagen/mqbcan.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,8 @@ def volkswagen_mqb_meb_checksum(address: int, sig, d: bytearray) -> int:
return crc ^ 0xFF


def xor_checksum(address: int, sig, d: bytearray) -> int:
checksum = 0
def xor_checksum(address: int, sig, d: bytearray, initial_value: int = 0) -> int:
checksum = initial_value
checksum_byte = sig.start_bit // 8
for i in range(len(d)):
if i != checksum_byte:
Expand Down
Loading