|
|
|
from cereal import car
|
|
|
|
from common.conversions import Conversions as CV
|
|
|
|
from opendbc.can.parser import CANParser
|
|
|
|
from opendbc.can.can_define import CANDefine
|
|
|
|
from selfdrive.car.interfaces import CarStateBase
|
|
|
|
from selfdrive.car.chrysler.values import DBC, STEER_THRESHOLD
|
|
|
|
|
|
|
|
|
|
|
|
class CarState(CarStateBase):
|
|
|
|
def __init__(self, CP):
|
|
|
|
super().__init__(CP)
|
|
|
|
can_define = CANDefine(DBC[CP.carFingerprint]["pt"])
|
|
|
|
self.shifter_values = can_define.dv["GEAR"]["PRNDL"]
|
|
|
|
|
|
|
|
def update(self, cp, cp_cam):
|
|
|
|
|
|
|
|
ret = car.CarState.new_message()
|
|
|
|
|
|
|
|
self.frame = int(cp.vl["EPS_2"]["COUNTER"])
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
ret.espDisabled = (cp.vl["TRACTION_BUTTON"]["TRACTION_OFF"] == 1)
|
|
|
|
|
|
|
|
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,
|
|
|
|
)
|
|
|
|
ret.vEgoRaw = (cp.vl["SPEED_1"]["SPEED_LEFT"] + cp.vl["SPEED_1"]["SPEED_RIGHT"]) / 2.
|
|
|
|
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
|
|
|
|
ret.standstill = not ret.vEgoRaw > 0.001
|
|
|
|
|
|
|
|
ret.leftBlinker = cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 1
|
|
|
|
ret.rightBlinker = cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 2
|
|
|
|
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["GEAR"]["PRNDL"], None))
|
|
|
|
|
|
|
|
ret.cruiseState.available = cp.vl["DAS_3"]["ACC_AVAILABLE"] == 1 # ACC is white
|
|
|
|
ret.cruiseState.enabled = cp.vl["DAS_3"]["ACC_ACTIVE"] == 1 # ACC is green
|
|
|
|
ret.cruiseState.speed = cp.vl["DAS_4"]["ACC_SPEED_CONFIG_KPH"] * CV.KPH_TO_MS
|
|
|
|
# CRUISE_STATE is a three bit msg, 0 is off, 1 and 2 are Non-ACC mode, 3 and 4 are ACC mode, find if there are other states too
|
|
|
|
ret.cruiseState.nonAdaptive = cp.vl["DAS_4"]["CRUISE_STATE"] in (1, 2)
|
|
|
|
ret.accFaulted = cp.vl["DAS_3"]["ACC_FAULTED"] != 0
|
|
|
|
|
|
|
|
ret.steeringAngleDeg = cp.vl["STEERING"]["STEER_ANGLE"]
|
|
|
|
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
|
|
|
|
steer_state = cp.vl["EPS_2"]["LKAS_STATE"]
|
|
|
|
ret.steerFaultPermanent = steer_state == 4 or (steer_state == 0 and ret.vEgo > self.CP.minSteerSpeed)
|
|
|
|
|
|
|
|
ret.genericToggle = bool(cp.vl["STEERING_LEVERS"]["HIGH_BEAM_PRESSED"])
|
|
|
|
|
|
|
|
if self.CP.enableBsm:
|
|
|
|
ret.leftBlindspot = cp.vl["BSM_1"]["LEFT_STATUS"] == 1
|
|
|
|
ret.rightBlindspot = cp.vl["BSM_1"]["RIGHT_STATUS"] == 1
|
|
|
|
|
|
|
|
self.lkas_counter = cp_cam.vl["LKAS_COMMAND"]["COUNTER"]
|
|
|
|
self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"]
|
|
|
|
self.lkas_status_ok = cp_cam.vl["LKAS_HEARTBIT"]["LKAS_STATUS_OK"]
|
|
|
|
self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"]
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_can_parser(CP):
|
|
|
|
signals = [
|
|
|
|
# sig_name, sig_address
|
|
|
|
("PRNDL", "GEAR"),
|
|
|
|
("DOOR_OPEN_FL", "BCM_1"),
|
|
|
|
("DOOR_OPEN_FR", "BCM_1"),
|
|
|
|
("DOOR_OPEN_RL", "BCM_1"),
|
|
|
|
("DOOR_OPEN_RR", "BCM_1"),
|
|
|
|
("Brake_Pedal_State", "ESP_1"),
|
|
|
|
("Accelerator_Position", "ECM_5"),
|
|
|
|
("SPEED_LEFT", "SPEED_1"),
|
|
|
|
("SPEED_RIGHT", "SPEED_1"),
|
|
|
|
("WHEEL_SPEED_FL", "ESP_6"),
|
|
|
|
("WHEEL_SPEED_RR", "ESP_6"),
|
|
|
|
("WHEEL_SPEED_RL", "ESP_6"),
|
|
|
|
("WHEEL_SPEED_FR", "ESP_6"),
|
|
|
|
("STEER_ANGLE", "STEERING"),
|
|
|
|
("STEERING_RATE", "STEERING"),
|
|
|
|
("TURN_SIGNALS", "STEERING_LEVERS"),
|
|
|
|
("ACC_AVAILABLE", "DAS_3"),
|
|
|
|
("ACC_ACTIVE", "DAS_3"),
|
|
|
|
("ACC_FAULTED", "DAS_3"),
|
|
|
|
("HIGH_BEAM_PRESSED", "STEERING_LEVERS"),
|
|
|
|
("ACC_SPEED_CONFIG_KPH", "DAS_4"),
|
|
|
|
("CRUISE_STATE", "DAS_4"),
|
|
|
|
("COLUMN_TORQUE", "EPS_2"),
|
|
|
|
("EPS_TORQUE_MOTOR", "EPS_2"),
|
|
|
|
("LKAS_STATE", "EPS_2"),
|
|
|
|
("COUNTER", "EPS_2",),
|
|
|
|
("TRACTION_OFF", "TRACTION_BUTTON"),
|
|
|
|
("SEATBELT_DRIVER_UNLATCHED", "ORC_1"),
|
|
|
|
("COUNTER", "CRUISE_BUTTONS"),
|
|
|
|
]
|
|
|
|
|
|
|
|
checks = [
|
|
|
|
# sig_address, frequency
|
|
|
|
("ESP_1", 50),
|
|
|
|
("EPS_2", 100),
|
|
|
|
("SPEED_1", 100),
|
|
|
|
("ESP_6", 50),
|
|
|
|
("STEERING", 100),
|
|
|
|
("DAS_3", 50),
|
|
|
|
("GEAR", 50),
|
|
|
|
("ECM_5", 50),
|
|
|
|
("CRUISE_BUTTONS", 50),
|
|
|
|
("DAS_4", 15),
|
|
|
|
("STEERING_LEVERS", 10),
|
|
|
|
("ORC_1", 2),
|
|
|
|
("BCM_1", 1),
|
|
|
|
("TRACTION_BUTTON", 1),
|
|
|
|
]
|
|
|
|
|
|
|
|
if CP.enableBsm:
|
|
|
|
signals += [
|
|
|
|
("RIGHT_STATUS", "BSM_1"),
|
|
|
|
("LEFT_STATUS", "BSM_1"),
|
|
|
|
]
|
|
|
|
checks.append(("BSM_1", 2))
|
|
|
|
|
|
|
|
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 0)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_cam_can_parser(CP):
|
|
|
|
signals = [
|
|
|
|
# sig_name, sig_address
|
|
|
|
("COUNTER", "LKAS_COMMAND"),
|
|
|
|
("CAR_MODEL", "DAS_6"),
|
|
|
|
("LKAS_STATUS_OK", "LKAS_HEARTBIT")
|
|
|
|
]
|
|
|
|
checks = [
|
|
|
|
("LKAS_COMMAND", 100),
|
|
|
|
("LKAS_HEARTBIT", 10),
|
|
|
|
("DAS_6", 4),
|
|
|
|
]
|
|
|
|
|
|
|
|
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 2)
|