f9fcc7adab
date: 2026-06-28T09:48:35 master commit: da6313dbe95b3f24bb5d8018b0e5f950f5823ca7
135 lines
4.8 KiB
Python
135 lines
4.8 KiB
Python
"""
|
|
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
|
|
|
|
This file is part of sunnypilot and is licensed under the MIT License.
|
|
See the LICENSE.md file in the root directory for more details.
|
|
"""
|
|
from typing import Any
|
|
|
|
from opendbc.car import structs
|
|
from opendbc.car.interfaces import CarInterfaceBase
|
|
from openpilot.common.params import Params
|
|
from openpilot.common.swaglog import cloudlog
|
|
from openpilot.sunnypilot.selfdrive.controls.lib.nnlc.helpers import get_nn_model_path
|
|
from openpilot.sunnypilot.selfdrive.controls.lib.speed_limit.helpers import set_speed_limit_assist_availability
|
|
|
|
import openpilot.system.sentry as sentry
|
|
|
|
from openpilot.sunnypilot.sunnylink.statsd import STATSLOGSP
|
|
|
|
|
|
def log_fingerprint(CP: structs.CarParams) -> None:
|
|
if CP.carFingerprint == "MOCK":
|
|
sentry.capture_fingerprint_mock()
|
|
else:
|
|
sentry.capture_fingerprint(CP.carFingerprint, CP.brand)
|
|
|
|
|
|
def _enforce_torque_lateral_control(CP: structs.CarParams, params: Params = None, enabled: bool = False) -> bool:
|
|
if params is None:
|
|
params = Params()
|
|
|
|
if CP.steerControlType != structs.CarParams.SteerControlType.angle:
|
|
enabled = params.get_bool("EnforceTorqueControl")
|
|
|
|
return enabled
|
|
|
|
|
|
def _initialize_neural_network_lateral_control(CP: structs.CarParams, CP_SP: structs.CarParamsSP,
|
|
params: Params = None, enabled: bool = False) -> bool:
|
|
if params is None:
|
|
params = Params()
|
|
|
|
nnlc_model_path, nnlc_model_name, exact_match = get_nn_model_path(CP)
|
|
|
|
if nnlc_model_name == "MOCK":
|
|
cloudlog.error({"nnlc event": "car doesn't match any Neural Network model"})
|
|
|
|
if nnlc_model_name != "MOCK" and CP.steerControlType != structs.CarParams.SteerControlType.angle:
|
|
enabled = params.get_bool("NeuralNetworkLateralControl")
|
|
|
|
CP_SP.neuralNetworkLateralControl.model.path = nnlc_model_path
|
|
CP_SP.neuralNetworkLateralControl.model.name = nnlc_model_name
|
|
CP_SP.neuralNetworkLateralControl.fuzzyFingerprint = not exact_match
|
|
|
|
return enabled
|
|
|
|
|
|
def _initialize_intelligent_cruise_button_management(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params = None) -> None:
|
|
if params is None:
|
|
params = Params()
|
|
|
|
icbm_enabled = params.get_bool("IntelligentCruiseButtonManagement")
|
|
if icbm_enabled and CP_SP.intelligentCruiseButtonManagementAvailable and not CP.openpilotLongitudinalControl:
|
|
CP_SP.pcmCruiseSpeed = False
|
|
|
|
|
|
def _initialize_torque_lateral_control(CI: CarInterfaceBase, CP: structs.CarParams, enforce_torque: bool, nnlc_enabled: bool) -> None:
|
|
if nnlc_enabled or enforce_torque:
|
|
CI.configure_torque_tune(CP.carFingerprint, CP.lateralTuning)
|
|
|
|
|
|
def _cleanup_unsupported_params(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params = None) -> None:
|
|
if params is None:
|
|
params = Params()
|
|
|
|
if CP.steerControlType == structs.CarParams.SteerControlType.angle:
|
|
cloudlog.warning("SteerControlType is angle, cleaning up params")
|
|
params.remove("NeuralNetworkLateralControl")
|
|
params.remove("EnforceTorqueControl")
|
|
|
|
if not CP_SP.intelligentCruiseButtonManagementAvailable or CP.openpilotLongitudinalControl:
|
|
cloudlog.warning("ICBM not available or openpilot Longitudinal Control enabled, cleaning up params")
|
|
params.remove("IntelligentCruiseButtonManagement")
|
|
|
|
if not CP.openpilotLongitudinalControl and CP_SP.pcmCruiseSpeed:
|
|
cloudlog.warning("openpilot Longitudinal Control and ICBM not available, cleaning up params")
|
|
params.remove("DynamicExperimentalControl")
|
|
params.remove("CustomAccIncrementsEnabled")
|
|
params.remove("SmartCruiseControlVision")
|
|
params.remove("SmartCruiseControlMap")
|
|
|
|
set_speed_limit_assist_availability(CP, CP_SP, params)
|
|
|
|
|
|
def setup_interfaces(CI: CarInterfaceBase, params: Params = None) -> None:
|
|
enforce_torque = _enforce_torque_lateral_control(CI.CP, params)
|
|
nnlc_enabled = _initialize_neural_network_lateral_control(CI.CP, CI.CP_SP, params)
|
|
_initialize_intelligent_cruise_button_management(CI.CP, CI.CP_SP, params)
|
|
_initialize_torque_lateral_control(CI, CI.CP, enforce_torque, nnlc_enabled)
|
|
_cleanup_unsupported_params(CI.CP, CI.CP_SP)
|
|
|
|
try:
|
|
STATSLOGSP.raw('sunnypilot.car_params', CI.CP.to_dict())
|
|
except RuntimeError:
|
|
pass # to_dict fails on macOS due to library issues.
|
|
# STATSLOGSP.raw('sunnypilot_params.car_params_sp', CP_SP.to_dict()) # https://github.com/sunnypilot/opendbc/pull/361
|
|
|
|
|
|
def initialize_params(params) -> list[dict[str, Any]]:
|
|
keys: list = []
|
|
|
|
# hyundai
|
|
keys.extend([
|
|
"HyundaiLongitudinalTuning",
|
|
])
|
|
|
|
# subaru
|
|
keys.extend([
|
|
"SubaruStopAndGo",
|
|
"SubaruStopAndGoManualParkingBrake",
|
|
])
|
|
|
|
# tesla
|
|
keys.extend([
|
|
"TeslaCoopSteering",
|
|
])
|
|
|
|
# toyota
|
|
keys.extend([
|
|
"ToyotaEnforceStockLongitudinal",
|
|
"ToyotaStopAndGoHack",
|
|
])
|
|
|
|
return [{k: params.get(k, return_default=True)} for k in keys]
|