Files
sunnypilot-byd/opendbc_repo/opendbc/safety/modes/chrysler_cusw.h
T
github-actions[bot] de77c89cf6 sunnypilot v2026.002.000
version: sunnypilot v2026.002.000 (staging)
date: 2026-07-21T07:44:02
master commit: 2c334ede443d7391d27575af8c854a095ba702a8
2026-07-21 07:44:02 +00:00

108 lines
3.4 KiB
C

#include "opendbc/safety/modes/chrysler_common.h"
static safety_config chrysler_cusw_init(uint16_t param) {
SAFETY_UNUSED(param);
static const CanMsg CHRYSLER_CUSW_TX_MSGS[] = {
{0x1F6U, 0, 4, .check_relay = true},
{0x5DCU, 0, 4, .check_relay = true},
{0x2FAU, 0, 3, .check_relay = false},
};
static RxCheck chrysler_cusw_rx_checks[] = {
{.msg = {{0x1E4U, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
{.msg = {{0x1E8U, 0, 5, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
{.msg = {{0x1ECU, 0, 8, 100U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
{.msg = {{0x1FEU, 0, 5, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
{.msg = {{0x2ECU, 0, 8, 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}},
};
return BUILD_SAFETY_CFG(chrysler_cusw_rx_checks, CHRYSLER_CUSW_TX_MSGS);
}
static void chrysler_cusw_rx_hook(const CANPacket_t *msg) {
if (msg->bus == 0U) {
if (msg->addr == 0x1ECU) {
// Signal: EPS_STATUS.TORQUE_MOTOR
int torque_meas_new = ((msg->data[3] & 0xFU) << 8) + msg->data[4] - 2048U;
update_sample(&torque_meas, torque_meas_new);
}
if (msg->addr == 0x2ECU) {
// Signal: ACC_CONTROL.ACC_ACTIVE
bool cruise_engaged = GET_BIT(msg, 7U);
pcm_cruise_check(cruise_engaged);
}
if (msg->addr == 0x1E4U) {
// Signal: BRAKE_1.VEHICLE_SPEED
vehicle_moving = (((msg->data[4] & 0x7U) << 8) + msg->data[5]) != 0U;
}
if (msg->addr == 0x1FEU) {
// Signal: ACCEL_GAS.GAS_HUMAN
gas_pressed = msg->data[1] != 0U;
}
if (msg->addr == 0x1E8U) {
// Signal: BRAKE_3.DRIVER_BRAKE_SWITCH
brake_pressed = GET_BIT(msg, 18U);
}
}
}
static bool chrysler_cusw_tx_hook(const CANPacket_t *msg) {
const TorqueSteeringLimits CHRYSLER_CUSW_STEERING_LIMITS = {
.max_torque = 250, // TODO: Find the actual cap, think we're faulting before 261
.max_rt_delta = 150,
.max_rate_up = 4,
.max_rate_down = 4,
.max_torque_error = 80,
.type = TorqueMotorLimited,
};
bool tx = true;
if (msg->addr == 0x1F6U) {
// Signal: LKAS_COMMAND.STEERING_TORQUE
int desired_torque = ((msg->data[0]) << 3) | ((msg->data[1] & 0xE0U) >> 5);
desired_torque -= 1024;
// Signal: LKAS_COMMAND.LKAS_CONTROL_BIT
const bool steer_req = GET_BIT(msg, 12U);
if (steer_torque_cmd_checks(desired_torque, steer_req, CHRYSLER_CUSW_STEERING_LIMITS)) {
tx = false;
// FIXME: too many problems here right now, hotwire things while investigating
// tx = true;
}
}
if (msg->addr == 0x2FAU) {
// Signal: CRUISE_BUTTONS.ACC_Cancel
// Signal: CRUISE_BUTTONS.ACC_Resume
const bool is_cancel = GET_BIT(msg, 0U);
const bool is_resume = GET_BIT(msg, 4U);
const bool allowed = is_cancel || (is_resume && controls_allowed);
if (!allowed) {
tx = false;
}
}
return tx;
}
static uint8_t chrysler_cusw_get_counter(const CANPacket_t *msg) {
int counter_byte = GET_LEN(msg) - 2U;
return (uint8_t)(msg->data[counter_byte] & 0xFU);
}
const safety_hooks chrysler_cusw_hooks = {
.init = chrysler_cusw_init,
.rx = chrysler_cusw_rx_hook,
.tx = chrysler_cusw_tx_hook,
.get_counter = chrysler_cusw_get_counter,
.get_checksum = chrysler_get_checksum,
.compute_checksum = chrysler_compute_checksum,
};