From 4edd1a602131ec2f09a604a4bd28e7d00e334458 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 2 Dec 2022 23:34:06 -0800 Subject: [PATCH] Hyundai: alt steering limits (#1186) * Hyundai: alt steering limits * parans --- .gitignore | 3 +++ board/safety/safety_hyundai.h | 37 +++++++++++++++------------- board/safety/safety_hyundai_common.h | 3 +++ python/__init__.py | 1 + tests/safety/test_hyundai.py | 12 +++++++++ 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 3a8ead1e..403d034e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ examples/output.csv nosetests.xml .mypy_cache/ .sconsign.dblite + +# CTU info files generated by Cppcheck +*.*.ctu-info diff --git a/board/safety/safety_hyundai.h b/board/safety/safety_hyundai.h index fca05a09..6202c1d7 100644 --- a/board/safety/safety_hyundai.h +++ b/board/safety/safety_hyundai.h @@ -1,22 +1,24 @@ #include "safety_hyundai_common.h" -const SteeringLimits HYUNDAI_STEERING_LIMITS = { - .max_steer = 384, - .max_rt_delta = 112, - .max_rt_interval = 250000, - .max_rate_up = 3, - .max_rate_down = 7, - .driver_torque_allowance = 50, - .driver_torque_factor = 2, - .type = TorqueDriverLimited, +#define HYUNDAI_LIMITS(steer, rate_up, rate_down) { \ + .max_steer = (steer), \ + .max_rate_up = (rate_up), \ + .max_rate_down = (rate_down), \ + .max_rt_delta = 112, \ + .max_rt_interval = 250000, \ + .driver_torque_allowance = 50, \ + .driver_torque_factor = 2, \ + .type = TorqueDriverLimited, \ + /* the EPS faults when the steering angle is above a certain threshold for too long. to prevent this, */ \ + /* we allow setting CF_Lkas_ActToi bit to 0 while maintaining the requested torque value for two consecutive frames */ \ + .min_valid_request_frames = 89, \ + .max_invalid_request_frames = 2, \ + .min_valid_request_rt_interval = 810000, /* 810ms; a ~10% buffer on cutting every 90 frames */ \ + .has_steer_req_tolerance = true, \ +} - // the EPS faults when the steering angle is above a certain threshold for too long. to prevent this, - // we allow setting CF_Lkas_ActToi bit to 0 while maintaining the requested torque value for two consecutive frames - .min_valid_request_frames = 89, - .max_invalid_request_frames = 2, - .min_valid_request_rt_interval = 810000, // 810ms; a ~10% buffer on cutting every 90 frames - .has_steer_req_tolerance = true, -}; +const SteeringLimits HYUNDAI_STEERING_LIMITS = HYUNDAI_LIMITS(384, 3, 7); +const SteeringLimits HYUNDAI_STEERING_LIMITS_ALT = HYUNDAI_LIMITS(270, 2, 3); const LongitudinalLimits HYUNDAI_LONG_LIMITS = { .max_accel = 200, // 1/100 m/s2 @@ -276,7 +278,8 @@ static int hyundai_tx_hook(CANPacket_t *to_send) { int desired_torque = ((GET_BYTES_04(to_send) >> 16) & 0x7ffU) - 1024U; bool steer_req = GET_BIT(to_send, 27U) != 0U; - if (steer_torque_cmd_checks(desired_torque, steer_req, HYUNDAI_STEERING_LIMITS)) { + const SteeringLimits limits = hyundai_alt_limits ? HYUNDAI_STEERING_LIMITS_ALT : HYUNDAI_STEERING_LIMITS; + if (steer_torque_cmd_checks(desired_torque, steer_req, limits)) { tx = 0; } } diff --git a/board/safety/safety_hyundai_common.h b/board/safety/safety_hyundai_common.h index f1f3b341..8bd84fea 100644 --- a/board/safety/safety_hyundai_common.h +++ b/board/safety/safety_hyundai_common.h @@ -5,6 +5,7 @@ const int HYUNDAI_PARAM_EV_GAS = 1; const int HYUNDAI_PARAM_HYBRID_GAS = 2; const int HYUNDAI_PARAM_LONGITUDINAL = 4; const int HYUNDAI_PARAM_CAMERA_SCC = 8; +const int HYUNDAI_PARAM_ALT_LIMITS = 64; // TODO: shift this down with the rest of the common flags const uint8_t HYUNDAI_PREV_BUTTON_SAMPLES = 8; // roughly 160 ms const uint32_t HYUNDAI_STANDSTILL_THRSLD = 30; // ~1kph @@ -21,12 +22,14 @@ bool hyundai_ev_gas_signal = false; bool hyundai_hybrid_gas_signal = false; bool hyundai_longitudinal = false; bool hyundai_camera_scc = false; +bool hyundai_alt_limits = false; uint8_t hyundai_last_button_interaction; // button messages since the user pressed an enable button void hyundai_common_init(uint16_t param) { 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_alt_limits = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS); hyundai_last_button_interaction = HYUNDAI_PREV_BUTTON_SAMPLES; diff --git a/python/__init__.py b/python/__init__.py index 730bebe5..3f3f964d 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -216,6 +216,7 @@ class Panda: FLAG_HYUNDAI_CAMERA_SCC = 8 FLAG_HYUNDAI_CANFD_HDA2 = 16 FLAG_HYUNDAI_CANFD_ALT_BUTTONS = 32 + FLAG_HYUNDAI_ALT_LIMITS = 64 FLAG_TESLA_POWERTRAIN = 1 FLAG_TESLA_LONG_CONTROL = 2 diff --git a/tests/safety/test_hyundai.py b/tests/safety/test_hyundai.py index b383e91c..d57cadeb 100755 --- a/tests/safety/test_hyundai.py +++ b/tests/safety/test_hyundai.py @@ -113,6 +113,18 @@ class TestHyundaiSafety(HyundaiButtonBase, common.PandaSafetyTest, common.Driver return self.packer.make_can_msg_panda("LKAS11", 0, values) +class TestHyundaiSafetyAltLimits(TestHyundaiSafety): + MAX_RATE_UP = 2 + MAX_RATE_DOWN = 3 + MAX_TORQUE = 270 + + 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_ALT_LIMITS) + self.safety.init_tests() + + class TestHyundaiSafetyCameraSCC(TestHyundaiSafety): BUTTONS_TX_BUS = 2 # tx on 2, rx on 0 SCC_BUS = 2 # rx on 2