f9fcc7adab
date: 2026-06-28T09:48:35 master commit: da6313dbe95b3f24bb5d8018b0e5f950f5823ca7
74 lines
2.8 KiB
Python
74 lines
2.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 openpilot.common.params import Params
|
|
from opendbc.car import structs
|
|
from opendbc.safety import ALTERNATIVE_EXPERIENCE
|
|
from opendbc.sunnypilot.car.hyundai.values import HyundaiFlagsSP, HyundaiSafetyFlagsSP
|
|
from opendbc.sunnypilot.car.tesla.values import TeslaFlagsSP
|
|
|
|
|
|
MADS_NO_ACC_MAIN_BUTTON = ("rivian", "tesla")
|
|
|
|
|
|
class MadsSteeringModeOnBrake:
|
|
REMAIN_ACTIVE = 0
|
|
PAUSE = 1
|
|
DISENGAGE = 2
|
|
|
|
|
|
def get_mads_limited_brands(CP: structs.CarParams, CP_SP: structs.CarParamsSP) -> bool:
|
|
if CP.brand == 'rivian':
|
|
return True
|
|
if CP.brand == 'tesla':
|
|
return not CP_SP.flags & TeslaFlagsSP.HAS_VEHICLE_BUS
|
|
|
|
return False
|
|
|
|
|
|
def read_steering_mode_param(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params):
|
|
if get_mads_limited_brands(CP, CP_SP):
|
|
return MadsSteeringModeOnBrake.DISENGAGE
|
|
|
|
return params.get("MadsSteeringMode", return_default=True)
|
|
|
|
|
|
def set_alternative_experience(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params):
|
|
enabled = params.get_bool("Mads")
|
|
steering_mode = read_steering_mode_param(CP, CP_SP, params)
|
|
|
|
if enabled:
|
|
CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.ENABLE_MADS
|
|
|
|
if steering_mode == MadsSteeringModeOnBrake.DISENGAGE:
|
|
CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.MADS_DISENGAGE_LATERAL_ON_BRAKE
|
|
elif steering_mode == MadsSteeringModeOnBrake.PAUSE:
|
|
CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.MADS_PAUSE_LATERAL_ON_BRAKE
|
|
|
|
|
|
def set_car_specific_params(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params: Params):
|
|
if CP.brand == "hyundai":
|
|
# TODO-SP: This should be separated from MADS module for future implementations
|
|
# Use "HyundaiLongitudinalMainCruiseToggleable" param
|
|
hyundai_cruise_main_toggleable = True
|
|
if hyundai_cruise_main_toggleable:
|
|
CP_SP.flags |= HyundaiFlagsSP.LONGITUDINAL_MAIN_CRUISE_TOGGLEABLE.value
|
|
CP_SP.safetyParam |= HyundaiSafetyFlagsSP.LONG_MAIN_CRUISE_TOGGLEABLE
|
|
|
|
# MADS Partial Support
|
|
# MADS is currently partially supported for these platforms due to lack of consistent states to engage controls
|
|
# Only MadsSteeringModeOnBrake.DISENGAGE is supported for these platforms
|
|
# TODO-SP: To enable MADS full support for Rivian and most Tesla, identify consistent signals for MADS toggling
|
|
mads_partial_support = get_mads_limited_brands(CP, CP_SP)
|
|
if mads_partial_support:
|
|
params.put("MadsSteeringMode", 2, block=True)
|
|
params.put_bool("MadsUnifiedEngagementMode", True, block=True)
|
|
|
|
# no ACC MAIN button for these brands
|
|
if CP.brand in MADS_NO_ACC_MAIN_BUTTON:
|
|
params.remove("MadsMainCruiseAllowed")
|