mirror of
https://github.com/infiniteCable2/opendbc.git
synced 2026-06-08 10:54:51 +08:00
* fix * clearer * cleanup * more fix * hkg dbc * typo! * Add Custom MIT License (#26) * missed * better * more fixes * try this out * inherit in carcontroller properly * hyundai: main button handling * always disable * add main check for pcm cruise * revert * sunnyParams * Move car-specific changes to opendbc * no need * more fixes * more! * final? * static analysis * use new cereal * rename to lkas_button * rename * mads base for cars * add lkas for ford * enabled <-> active * MUST REMOVE test process replay * Revert "MUST REMOVE test process replay" This reverts commit 6dde2c8435b0e09158ab455aa215a573f5212c11. * subaru * ruff * more subaru * toyota * add them * mypy * fix * update name * FCA * assign directly * init directly * missing * not yet * missed * no longer needed * missed hd * fix * move to generator * more nissan * Apply suggestions from code review * no need * Revert "no need" This reverts commit 6156c62113d9abb626014947a9066b5580f6460a. * hyundai: move main logic out of main carstate * move around * move lkas and lfa icon logic to mads base * Parse more flags from alt exp, more tests, hyundai main cruise allowed * license * add code spell ignore * fix icon * remove toyota lta status for lkas, causes weird behaviors * parse signals inside mads methods * more codes in mads childs * Update opendbc/sunnypilot/car/hyundai/escc.py * revert * type hint * test type hint * more type hint * no * needs to be in carstate * in another PR --------- Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
171 lines
5.9 KiB
Python
171 lines
5.9 KiB
Python
from opendbc.can.parser import CANParser
|
|
from opendbc.can.can_define import CANDefine
|
|
from opendbc.car import Bus, create_button_events, structs
|
|
from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS
|
|
from opendbc.car.common.conversions import Conversions as CV
|
|
from opendbc.car.interfaces import CarStateBase
|
|
|
|
from opendbc.sunnypilot.car.chrysler.mads import MadsCarState
|
|
|
|
ButtonType = structs.CarState.ButtonEvent.Type
|
|
|
|
|
|
class CarState(CarStateBase, MadsCarState):
|
|
def __init__(self, CP):
|
|
CarStateBase.__init__(self, CP)
|
|
MadsCarState.__init__(self, CP)
|
|
self.CP = CP
|
|
can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
|
|
|
|
self.auto_high_beam = 0
|
|
self.button_counter = 0
|
|
self.lkas_car_model = -1
|
|
|
|
if CP.carFingerprint in RAM_CARS:
|
|
self.shifter_values = can_define.dv["Transmission_Status"]["Gear_State"]
|
|
else:
|
|
self.shifter_values = can_define.dv["GEAR"]["PRNDL"]
|
|
|
|
self.distance_button = 0
|
|
|
|
def update(self, can_parsers) -> structs.CarState:
|
|
cp = can_parsers[Bus.pt]
|
|
cp_cam = can_parsers[Bus.cam]
|
|
|
|
ret = structs.CarState()
|
|
|
|
prev_distance_button = self.distance_button
|
|
self.distance_button = cp.vl["CRUISE_BUTTONS"]["ACC_Distance_Dec"]
|
|
|
|
# lock info
|
|
ret.doorOpen = any([cp.vl["BCM_1"]["DOOR_OPEN_FL"],
|
|
cp.vl["BCM_1"]["DOOR_OPEN_FR"],
|
|
cp.vl["BCM_1"]["DOOR_OPEN_RL"],
|
|
cp.vl["BCM_1"]["DOOR_OPEN_RR"]])
|
|
ret.seatbeltUnlatched = cp.vl["ORC_1"]["SEATBELT_DRIVER_UNLATCHED"] == 1
|
|
|
|
# brake pedal
|
|
ret.brake = 0
|
|
ret.brakePressed = cp.vl["ESP_1"]['Brake_Pedal_State'] == 1 # Physical brake pedal switch
|
|
|
|
# gas pedal
|
|
ret.gas = cp.vl["ECM_5"]["Accelerator_Position"]
|
|
ret.gasPressed = ret.gas > 1e-5
|
|
|
|
# car speed
|
|
if self.CP.carFingerprint in RAM_CARS:
|
|
ret.vEgoRaw = cp.vl["ESP_8"]["Vehicle_Speed"] * CV.KPH_TO_MS
|
|
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["Transmission_Status"]["Gear_State"], None))
|
|
else:
|
|
ret.vEgoRaw = (cp.vl["SPEED_1"]["SPEED_LEFT"] + cp.vl["SPEED_1"]["SPEED_RIGHT"]) / 2.
|
|
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["GEAR"]["PRNDL"], None))
|
|
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
|
|
ret.standstill = not ret.vEgoRaw > 0.001
|
|
ret.wheelSpeeds = self.get_wheel_speeds(
|
|
cp.vl["ESP_6"]["WHEEL_SPEED_FL"],
|
|
cp.vl["ESP_6"]["WHEEL_SPEED_FR"],
|
|
cp.vl["ESP_6"]["WHEEL_SPEED_RL"],
|
|
cp.vl["ESP_6"]["WHEEL_SPEED_RR"],
|
|
unit=1,
|
|
)
|
|
|
|
# button presses
|
|
ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(200, cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 1,
|
|
cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 2)
|
|
ret.genericToggle = cp.vl["STEERING_LEVERS"]["HIGH_BEAM_PRESSED"] == 1
|
|
|
|
# steering wheel
|
|
ret.steeringAngleDeg = cp.vl["STEERING"]["STEERING_ANGLE"] + cp.vl["STEERING"]["STEERING_ANGLE_HP"]
|
|
ret.steeringRateDeg = cp.vl["STEERING"]["STEERING_RATE"]
|
|
ret.steeringTorque = cp.vl["EPS_2"]["COLUMN_TORQUE"]
|
|
ret.steeringTorqueEps = cp.vl["EPS_2"]["EPS_TORQUE_MOTOR"]
|
|
ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
|
|
|
|
# cruise state
|
|
cp_cruise = cp_cam if self.CP.carFingerprint in RAM_CARS else cp
|
|
|
|
ret.cruiseState.available = cp_cruise.vl["DAS_3"]["ACC_AVAILABLE"] == 1
|
|
ret.cruiseState.enabled = cp_cruise.vl["DAS_3"]["ACC_ACTIVE"] == 1
|
|
ret.cruiseState.speed = cp_cruise.vl["DAS_4"]["ACC_SET_SPEED_KPH"] * CV.KPH_TO_MS
|
|
ret.cruiseState.nonAdaptive = cp_cruise.vl["DAS_4"]["ACC_STATE"] in (1, 2) # 1 NormalCCOn and 2 NormalCCSet
|
|
ret.cruiseState.standstill = cp_cruise.vl["DAS_3"]["ACC_STANDSTILL"] == 1
|
|
ret.accFaulted = cp_cruise.vl["DAS_3"]["ACC_FAULTED"] != 0
|
|
|
|
if self.CP.carFingerprint in RAM_CARS:
|
|
# Auto High Beam isn't Located in this message on chrysler or jeep currently located in 729 message
|
|
self.auto_high_beam = cp_cam.vl["DAS_6"]['AUTO_HIGH_BEAM_ON']
|
|
ret.steerFaultTemporary = cp.vl["EPS_3"]["DASM_FAULT"] == 1
|
|
else:
|
|
ret.steerFaultTemporary = cp.vl["EPS_2"]["LKAS_TEMPORARY_FAULT"] == 1
|
|
ret.steerFaultPermanent = cp.vl["EPS_2"]["LKAS_STATE"] == 4
|
|
|
|
# blindspot sensors
|
|
if self.CP.enableBsm:
|
|
ret.leftBlindspot = cp.vl["BSM_1"]["LEFT_STATUS"] == 1
|
|
ret.rightBlindspot = cp.vl["BSM_1"]["RIGHT_STATUS"] == 1
|
|
|
|
self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"]
|
|
self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"]
|
|
|
|
MadsCarState.update_mads(self, ret, can_parsers)
|
|
|
|
ret.buttonEvents = [
|
|
*create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}),
|
|
*create_button_events(self.lkas_button, self.prev_lkas_button, {1: ButtonType.lkas}),
|
|
]
|
|
|
|
return ret
|
|
|
|
@staticmethod
|
|
def get_cruise_messages():
|
|
messages = [
|
|
("DAS_3", 50),
|
|
("DAS_4", 50),
|
|
]
|
|
return messages
|
|
|
|
@staticmethod
|
|
def get_can_parsers(CP):
|
|
pt_messages = [
|
|
# sig_address, frequency
|
|
("ESP_1", 50),
|
|
("EPS_2", 100),
|
|
("ESP_6", 50),
|
|
("STEERING", 100),
|
|
("ECM_5", 50),
|
|
("CRUISE_BUTTONS", 50),
|
|
("STEERING_LEVERS", 10),
|
|
("ORC_1", 2),
|
|
("BCM_1", 1),
|
|
]
|
|
|
|
if CP.enableBsm:
|
|
pt_messages.append(("BSM_1", 2))
|
|
|
|
if CP.carFingerprint in RAM_CARS:
|
|
pt_messages += [
|
|
("ESP_8", 50),
|
|
("EPS_3", 50),
|
|
("Transmission_Status", 50),
|
|
]
|
|
else:
|
|
pt_messages += [
|
|
("GEAR", 50),
|
|
("SPEED_1", 100),
|
|
]
|
|
pt_messages += CarState.get_cruise_messages()
|
|
|
|
cam_messages = [
|
|
("DAS_6", 4),
|
|
]
|
|
|
|
if CP.carFingerprint in RAM_CARS:
|
|
cam_messages += CarState.get_cruise_messages()
|
|
|
|
MadsCarState.get_parser(CP, pt_messages, cam_messages)
|
|
|
|
return {
|
|
Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0),
|
|
Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, 2),
|
|
}
|