Skip to content

Commit

Permalink
Hyundai: Enhanced Smart Cruise Control (ESCC) (#39)
Browse files Browse the repository at this point in the history
* Integrate Enhanced SCC (ESCC) support for Hyundai vehicles

Add support for ESCC in Hyundai vehicles by introducing the ESCC class and modifying the CarController, safety hooks, and radar interface. This enhancement allows better longitudinal control by leveraging ESCC data, ensuring more reliable Advanced Emergency Braking (AEB) and Forward Collision Avoidance (FCA) alerts. Additional configurations and safety parameters have been incorporated to support this functionality.

* common escc

* misra

* escc unit test

* 100%

* we don't check if using escc

* bump submodules

* unit test!

---------

Co-authored-by: Jason Wen <[email protected]>
  • Loading branch information
devtekve and sunnyhaibin authored Nov 22, 2024
1 parent 623a7fa commit 97311d5
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 3 deletions.
19 changes: 16 additions & 3 deletions board/safety/safety_hyundai.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,10 @@ static bool hyundai_tx_hook(const CANPacket_t *to_send) {

violation |= longitudinal_accel_checks(desired_accel_raw, HYUNDAI_LONG_LIMITS);
violation |= longitudinal_accel_checks(desired_accel_val, HYUNDAI_LONG_LIMITS);
violation |= (aeb_decel_cmd != 0);
violation |= aeb_req;
if (!hyundai_escc) {
violation |= (aeb_decel_cmd != 0);
violation |= aeb_req;
}

if (violation) {
tx = false;
Expand Down Expand Up @@ -278,6 +280,16 @@ static safety_config hyundai_init(uint16_t param) {
{0x485, 0, 4}, // LFAHDA_MFC Bus 0
};

static const CanMsg HYUNDAI_LONG_ESCC_TX_MSGS[] = {
{0x340, 0, 8}, // LKAS11 Bus 0
{0x4F1, 0, 4}, // CLU11 Bus 0
{0x485, 0, 4}, // LFAHDA_MFC Bus 0
{0x420, 0, 8}, // SCC11 Bus 0
{0x421, 0, 8}, // SCC12 Bus 0
{0x50A, 0, 8}, // SCC13 Bus 0
{0x389, 0, 8}, // SCC14 Bus 0
};

hyundai_common_init(param);
hyundai_legacy = false;

Expand All @@ -293,7 +305,8 @@ static safety_config hyundai_init(uint16_t param) {
{.msg = {{0x4F1, 0, 4, .check_checksum = false, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}},
};

ret = BUILD_SAFETY_CFG(hyundai_long_rx_checks, HYUNDAI_LONG_TX_MSGS);
ret = hyundai_escc ? BUILD_SAFETY_CFG(hyundai_long_rx_checks, HYUNDAI_LONG_ESCC_TX_MSGS) :
BUILD_SAFETY_CFG(hyundai_long_rx_checks, HYUNDAI_LONG_TX_MSGS);
} else if (hyundai_camera_scc) {
static RxCheck hyundai_cam_scc_rx_checks[] = {
HYUNDAI_COMMON_RX_CHECKS(false)
Expand Down
6 changes: 6 additions & 0 deletions board/safety/safety_hyundai_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ bool hyundai_canfd_hda2 = false;
extern bool hyundai_alt_limits;
bool hyundai_alt_limits = false;

// ESCC
extern bool hyundai_escc;
bool hyundai_escc = false;

static uint8_t hyundai_last_button_interaction; // button messages since the user pressed an enable button

void hyundai_common_init(uint16_t param) {
Expand All @@ -44,12 +48,14 @@ void hyundai_common_init(uint16_t param) {
const int HYUNDAI_PARAM_CAMERA_SCC = 8;
const int HYUNDAI_PARAM_CANFD_HDA2 = 16;
const int HYUNDAI_PARAM_ALT_LIMITS = 64; // TODO: shift this down with the rest of the common flags
const int HYUNDAI_PARAM_ESCC = 512;

hyundai_ev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_EV_GAS);
hyundai_hybrid_gas_signal = !hyundai_ev_gas_signal && GET_FLAG(param, HYUNDAI_PARAM_HYBRID_GAS);
hyundai_camera_scc = GET_FLAG(param, HYUNDAI_PARAM_CAMERA_SCC);
hyundai_canfd_hda2 = GET_FLAG(param, HYUNDAI_PARAM_CANFD_HDA2);
hyundai_alt_limits = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS);
hyundai_escc = GET_FLAG(param, HYUNDAI_PARAM_ESCC);

hyundai_last_button_interaction = HYUNDAI_PREV_BUTTON_SAMPLES;

Expand Down
1 change: 1 addition & 0 deletions python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ class Panda:
FLAG_HYUNDAI_CANFD_ALT_BUTTONS = 32
FLAG_HYUNDAI_ALT_LIMITS = 64
FLAG_HYUNDAI_CANFD_HDA2_ALT_STEERING = 128
FLAG_HYUNDAI_ESCC = 512

FLAG_TESLA_POWERTRAIN = 1
FLAG_TESLA_LONG_CONTROL = 2
Expand Down
5 changes: 5 additions & 0 deletions tests/safety/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,11 @@ def test_tx_hook_on_wrong_safety_mode(self):
if attr.startswith('TestHonda'):
# exceptions for common msgs across different hondas
tx = list(filter(lambda m: m[0] not in [0x1FA, 0x30C, 0x33D, 0x33DB], tx))

# TODO-SP: Temporary, should be fixed in panda firmware, safety_hyundai.h
if attr.startswith('TestHyundaiLongitudinal'):
# exceptions for common msgs across different Hyundai CAN platforms
tx = list(filter(lambda m: m[0] not in [0x420, 0x50A, 0x389, 0x4A2], tx))
all_tx.append([[m[0], m[1], attr] for m in tx])

# make sure we got all the msgs
Expand Down
25 changes: 25 additions & 0 deletions tests/safety/test_hyundai.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,5 +212,30 @@ def test_no_aeb_scc12(self):
self.assertFalse(self._tx(self._accel_msg(0, aeb_decel=1.0)))


class TestHyundaiLongitudinalESCCSafety(HyundaiLongitudinalBase, TestHyundaiSafety):
TX_MSGS = [[0x340, 0], [0x4F1, 0], [0x485, 0], [0x420, 0], [0x421, 0], [0x50A, 0], [0x389, 0]]

RELAY_MALFUNCTION_ADDRS = {0: (0x340, 0x421)} # LKAS11, SCC12

def setUp(self):
self.packer = CANPackerPanda("hyundai_kia_generic")
self.safety = libpanda_py.libpanda
self.safety.set_safety_hooks(Panda.SAFETY_HYUNDAI, Panda.FLAG_HYUNDAI_LONG | Panda.FLAG_HYUNDAI_ESCC)
self.safety.init_tests()

def _accel_msg(self, accel, aeb_req=False, aeb_decel=0):
values = {
"aReqRaw": accel,
"aReqValue": accel,
}
return self.packer.make_can_msg_panda("SCC12", self.SCC_BUS, values)

def test_tester_present_allowed(self):
pass

def test_disabled_ecu_alive(self):
pass


if __name__ == "__main__":
unittest.main()

0 comments on commit 97311d5

Please sign in to comment.