volkswagen: select gateway or camera connection

This commit is contained in:
Comma Device
2026-10-23 21:13:01 +08:00
parent df4fa9719f
commit 67701e1833
9 changed files with 131 additions and 20 deletions
@@ -3,7 +3,20 @@ from opendbc.car.interfaces import CarInterfaceBase
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, TransmissionType, VolkswagenFlags, VolkswagenSafetyFlags
from opendbc.car.volkswagen.values import CanBus, CAR, DBC, NetworkLocation, TransmissionType, VolkswagenFlags, VolkswagenSafetyFlags, resolve_network_location
def _network_location_override() -> int | None:
try:
from openpilot.common.params import Params
value = Params().get("VagNetworkLocation")
except Exception:
return None
try:
return None if value is None else int(value)
except (TypeError, ValueError):
return None
class CarInterface(CarInterfaceBase):
CarState = CarState
@@ -17,6 +30,7 @@ class CarInterface(CarInterfaceBase):
def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
ret.brand = "volkswagen"
ret.radarUnavailable = Bus.radar not in DBC[candidate]
network_location_override = _network_location_override()
if ret.flags & VolkswagenFlags.PQ:
# Set global PQ35/PQ46/NMS parameters
@@ -33,6 +47,7 @@ class CarInterface(CarInterfaceBase):
ret.networkLocation = NetworkLocation.gateway
else:
ret.networkLocation = NetworkLocation.fwdCamera
ret.networkLocation = resolve_network_location(ret.networkLocation, network_location_override)
ret.dashcamOnly = is_release # Release support needs HCA timeout fix, safety validation
@@ -41,7 +56,7 @@ class CarInterface(CarInterfaceBase):
safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMlb)]
if 0x30F in fingerprint[0]: # SWA_01
ret.flags |= VolkswagenFlags.HAS_BSM.value
ret.networkLocation = NetworkLocation.gateway
ret.networkLocation = resolve_network_location(NetworkLocation.gateway, network_location_override)
ret.dashcamOnly = is_release # Release support needs HCA timeout fix, safety validation, revised J533 harness
elif ret.flags & VolkswagenFlags.MEB:
@@ -65,7 +80,8 @@ class CarInterface(CarInterfaceBase):
ret.networkLocation = NetworkLocation.gateway
else:
ret.networkLocation = NetworkLocation.fwdCamera
ret.radarUnavailable = True
ret.networkLocation = resolve_network_location(ret.networkLocation, network_location_override)
ret.radarUnavailable = ret.networkLocation == NetworkLocation.fwdCamera or Bus.radar not in DBC[candidate]
if 0x24C in fingerprint[0]: # MEB_Side_Assist_01
ret.flags |= VolkswagenFlags.HAS_BSM.value
@@ -95,6 +111,7 @@ class CarInterface(CarInterfaceBase):
ret.networkLocation = NetworkLocation.gateway
else:
ret.networkLocation = NetworkLocation.fwdCamera
ret.networkLocation = resolve_network_location(ret.networkLocation, network_location_override)
if 0x126 in fingerprint[2]: # HCA_01
ret.flags |= VolkswagenFlags.STOCK_HCA_PRESENT.value
@@ -5,7 +5,7 @@ import unittest
from opendbc.car import DT_CTRL
from opendbc.car.structs import CarParams
from opendbc.car.volkswagen.carcontroller import HCAMitigation
from opendbc.car.volkswagen.values import CAR, CarControllerParams as CCP, FW_QUERY_CONFIG, WMI
from opendbc.car.volkswagen.values import CAR, CarControllerParams as CCP, FW_QUERY_CONFIG, NetworkLocation, WMI, resolve_network_location
from opendbc.car.volkswagen.fingerprints import FW_VERSIONS
Ecu = CarParams.Ecu
@@ -29,6 +29,20 @@ class TestVolkswagenHCAMitigation(unittest.TestCase):
expected_torque = actuator_value - (1, -1)[actuator_value < 0] if should_nudge else actuator_value
assert hca_mitigation.update(actuator_value, actuator_value) == expected_torque, f"{frame=}"
class TestVolkswagenNetworkLocationOverride(unittest.TestCase):
def test_override(self):
assert resolve_network_location(NetworkLocation.gateway, 0) == NetworkLocation.gateway
assert resolve_network_location(NetworkLocation.gateway, 1) == NetworkLocation.fwdCamera
assert resolve_network_location(NetworkLocation.fwdCamera, 0) == NetworkLocation.gateway
assert resolve_network_location(NetworkLocation.fwdCamera, 1) == NetworkLocation.fwdCamera
def test_auto_and_invalid_values_preserve_detection(self):
assert resolve_network_location(NetworkLocation.gateway, None) == NetworkLocation.gateway
assert resolve_network_location(NetworkLocation.fwdCamera, None) == NetworkLocation.fwdCamera
assert resolve_network_location(NetworkLocation.gateway, 2) == NetworkLocation.gateway
assert resolve_network_location(NetworkLocation.fwdCamera, -1) == NetworkLocation.fwdCamera
class TestVolkswagenPlatformConfigs(unittest.TestCase):
def test_spare_part_fw_pattern(self):
# Relied on for determining if a FW is likely VW
@@ -13,6 +13,19 @@ from opendbc.car.vin import Vin
Ecu = structs.CarParams.Ecu
NetworkLocation = structs.CarParams.NetworkLocation
TransmissionType = structs.CarParams.TransmissionType
VAG_NETWORK_LOCATION_GATEWAY = 0
VAG_NETWORK_LOCATION_CAMERA = 1
def resolve_network_location(default: NetworkLocation, override: int | None) -> NetworkLocation:
if override == VAG_NETWORK_LOCATION_GATEWAY:
return NetworkLocation.gateway
if override == VAG_NETWORK_LOCATION_CAMERA:
return NetworkLocation.fwdCamera
return default
GearShifter = structs.CarState.GearShifter
Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
Binary file not shown.
+1
View File
@@ -236,6 +236,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"ToyotaStopAndGoHack", {PERSISTENT | BACKUP, BOOL, "0"}},
{"ToyotaAftermarketBsm", {PERSISTENT | BACKUP, BOOL, "0"}},
{"VagAvoidEPSLockout", {PERSISTENT | BACKUP, BOOL, "0"}},
{"VagNetworkLocation", {PERSISTENT | BACKUP, INT, "0"}},
{"BlindSpot", {PERSISTENT | BACKUP, BOOL, "0"}},
@@ -7,13 +7,16 @@ See the LICENSE.md file in the root directory for more details.
from openpilot.selfdrive.ui.sunnypilot.layouts.settings.vehicle.brands.base import BrandSettings
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.system.ui.lib.multilang import tr, tr_noop
from openpilot.system.ui.sunnypilot.widgets.list_view import toggle_item_sp
from openpilot.system.ui.sunnypilot.widgets.list_view import multiple_button_item_sp, toggle_item_sp
DESCRIPTIONS = {
'avoid_eps_lockout': tr_noop(
'Scale steering torque down at low speeds to avoid EPS lockout.'
)
),
'network_location': tr_noop(
'Choose whether the J533 harness is connected at the vehicle gateway or front camera. Changing this restarts the car interface.'
),
}
@@ -29,7 +32,16 @@ class VolkswagenSettings(BrandSettings):
enabled=lambda: not ui_state.engaged,
)
self.network_location = multiple_button_item_sp(
lambda: tr("Volkswagen Connection"),
lambda: tr(DESCRIPTIONS["network_location"]),
[lambda: tr("Gateway"), lambda: tr("Camera")],
callback=self._on_network_location_changed,
inline=False,
)
self.items = [
self.network_location,
self.avoid_eps_lockout,
]
@@ -37,5 +49,17 @@ class VolkswagenSettings(BrandSettings):
ui_state.params.put_bool("VagAvoidEPSLockout", state, block=True)
ui_state.params.put_bool("OnroadCycleRequested", True)
def _on_network_location_changed(self, index: int):
if index not in (0, 1):
return
ui_state.params.put("VagNetworkLocation", index, block=True)
ui_state.params.put_bool("OnroadCycleRequested", True)
def update_settings(self):
pass
value = ui_state.params.get("VagNetworkLocation")
try:
index = 0 if value is None else int(value)
except (TypeError, ValueError):
index = 0
self.network_location.action_item.set_selected_button(index if index in (0, 1) else 0)
self.network_location.action_item.set_enabled(ui_state.is_offroad())
+21 -7
View File
@@ -665,6 +665,7 @@ msgid "Reset Calibration"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "RESET"
msgstr ""
@@ -935,6 +936,10 @@ msgstr ""
msgid "Enable Always Offroad"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Reset Settings"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/platform_selector.py
msgid "Confirm"
@@ -966,11 +971,6 @@ msgstr ""
msgid "Training Guide"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Reset Settings"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "Are you sure you want to reset all sunnypilot settings to default? Once the settings are reset, there is no going back."
msgstr ""
@@ -1521,8 +1521,6 @@ msgstr ""
msgid "Show Advanced Controls"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/developer.py
msgid "copyparty Service"
msgstr ""
@@ -2025,10 +2023,26 @@ msgstr ""
msgid "Scale steering torque down at low speeds to avoid EPS lockout."
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Choose whether the J533 harness is connected at the vehicle gateway or front camera. Changing this restarts the car interface."
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Avoid EPS Lockout"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Volkswagen Connection"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Gateway"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Camera"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/onroad/speed_limit.py
msgid "Near"
msgstr ""
+17 -3
View File
@@ -328,6 +328,10 @@ msgstr ""
msgid "Calibration in Progress"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Camera"
msgstr "Camera"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Frame Rate Low"
msgstr ""
@@ -413,6 +417,10 @@ msgstr ""
msgid "Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot."
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Choose whether the J533 harness is connected at the vehicle gateway or front camera. Changing this restarts the car interface."
msgstr "Choose whether the J533 harness is connected at the vehicle gateway or front camera. Changing this restarts the car interface."
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "Clear Cache"
msgstr ""
@@ -804,7 +812,6 @@ msgstr ""
msgid "Enable your car's LKAS to engage"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/toyota.py
msgid "Enforce Factory Longitudinal Control"
msgstr ""
@@ -932,6 +939,10 @@ msgstr ""
msgid "GOOD"
msgstr "GOOD"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Gateway"
msgstr "Gateway"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Gear not D"
msgstr ""
@@ -940,7 +951,6 @@ msgstr ""
msgid "Getting the big model ready."
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "Go to https://connect.comma.ai on your phone"
msgstr "Go to https://connect.comma.ai on your phone"
@@ -1295,7 +1305,6 @@ msgstr ""
msgid "Onroad Brightness Delay"
msgstr ""
#: openpilot/selfdrive/ui/widgets/setup.py
msgid "Open"
msgstr "Open"
@@ -1468,6 +1477,7 @@ msgid "REMOVE"
msgstr "REMOVE"
#: openpilot/selfdrive/ui/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "RESET"
msgstr "RESET"
@@ -2134,6 +2144,10 @@ msgstr ""
msgid "Visuals"
msgstr ""
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Volkswagen Connection"
msgstr "Volkswagen Connection"
#: openpilot/selfdrive/selfdrived/events.py
msgid "WARNING: This branch is not tested"
msgstr ""
@@ -328,6 +328,10 @@ msgstr "标定无效:请重新安装设备并重新标定"
msgid "Calibration in Progress"
msgstr "标定进行中"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Camera"
msgstr "相机接入"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Camera Frame Rate Low"
msgstr "摄像头帧率过低"
@@ -413,6 +417,10 @@ msgstr "如果车辆已通电,更改此设置将重启 sunnypilot。"
msgid "Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot."
msgstr "选择在 sunnypilot 中手动踩下刹车踏板后自动车道居中(ALC)的行为。"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Choose whether the J533 harness is connected at the vehicle gateway or front camera. Changing this restarts the car interface."
msgstr "选择 J533 线束连接在车辆网关还是前视相机。切换后会重启车辆接口。"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/models.py
msgid "Clear Cache"
msgstr "清除缓存"
@@ -806,7 +814,6 @@ msgstr "启用此项以强制 sunnypilot 使用扭矩横向控制转向。"
msgid "Enable your car's LKAS to engage"
msgstr "请开启车辆的 LKAS 以启用"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/toyota.py
msgid "Enforce Factory Longitudinal Control"
msgstr "强制使用原厂纵向控制"
@@ -934,6 +941,10 @@ msgstr "摩擦"
msgid "GOOD"
msgstr "良好"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Gateway"
msgstr "网关接入"
#: openpilot/selfdrive/selfdrived/events.py
msgid "Gear not D"
msgstr "挡位不在 D 挡"
@@ -942,7 +953,6 @@ msgstr "挡位不在 D 挡"
msgid "Getting the big model ready."
msgstr "正在准备大模型。"
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "Go to https://connect.comma.ai on your phone"
msgstr "在手机上前往 https://connect.comma.ai"
@@ -1297,7 +1307,6 @@ msgstr "行车亮度"
msgid "Onroad Brightness Delay"
msgstr "行车亮度延迟"
#: openpilot/selfdrive/ui/widgets/setup.py
msgid "Open"
msgstr "打开"
@@ -1470,6 +1479,7 @@ msgid "REMOVE"
msgstr "移除"
#: openpilot/selfdrive/ui/layouts/settings/device.py
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/device.py
msgid "RESET"
msgstr "重置"
@@ -2139,6 +2149,10 @@ msgstr "虚拟移动摄像头视角,将模型中心向左(+值)或向右
msgid "Visuals"
msgstr "视觉"
#: openpilot/selfdrive/ui/sunnypilot/layouts/settings/vehicle/brands/volkswagen.py
msgid "Volkswagen Connection"
msgstr "大众接入方式"
#: openpilot/selfdrive/selfdrived/events.py
msgid "WARNING: This branch is not tested"
msgstr "警告:此分支未经测试"