Skip to content

Commit bf5db45

Browse files
committed
Safety: made the driver steer check common so it can be shared across multiple safety files
1 parent ef079e6 commit bf5db45

File tree

2 files changed

+29
-22
lines changed

2 files changed

+29
-22
lines changed

board/safety.h

+25
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ void update_sample(struct sample_t *sample, int sample_new);
1515
int max_limit_check(int val, const int MAX);
1616
int dist_to_meas_check(int val, int val_last, struct sample_t *val_meas,
1717
const int MAX_RATE_UP, const int MAX_RATE_DOWN, const int MAX_ERROR);
18+
int driver_limit_check(int val, int val_last, struct sample_t *val_driver,
19+
const int MAX, const int MAX_RATE_UP, const int MAX_RATE_DOWN,
20+
const int MAX_ALLOWANCE, const int DRIVER_FACTOR);
1821
int rt_rate_limit_check(int val, int val_last, const int MAX_RT_DELTA);
1922

2023
typedef void (*safety_hook_init)(int16_t param);
@@ -166,6 +169,28 @@ int dist_to_meas_check(int val, int val_last, struct sample_t *val_meas,
166169
return (val < lowest_allowed_val) || (val > highest_allowed_val);
167170
}
168171

172+
// check that commanded value isn't fighting against driver
173+
int driver_limit_check(int val, int val_last, struct sample_t *val_driver,
174+
const int MAX, const int MAX_RATE_UP, const int MAX_RATE_DOWN,
175+
const int MAX_ALLOWANCE, const int DRIVER_FACTOR) {
176+
177+
int highest_allowed = max(val_last, 0) + MAX_RATE_UP;
178+
int lowest_allowed = min(val_last, 0) - MAX_RATE_UP;
179+
180+
int driver_max_limit = MAX + (MAX_ALLOWANCE + val_driver->max) * DRIVER_FACTOR;
181+
int driver_min_limit = -MAX + (-MAX_ALLOWANCE + val_driver->min) * DRIVER_FACTOR;
182+
183+
// if we've exceeded the applied torque, we must start moving toward 0
184+
highest_allowed = min(highest_allowed, max(val_last - MAX_RATE_DOWN,
185+
max(driver_max_limit, 0)));
186+
lowest_allowed = max(lowest_allowed, min(val_last + MAX_RATE_DOWN,
187+
min(driver_min_limit, 0)));
188+
189+
// check for violation
190+
return (val < lowest_allowed) || (val > highest_allowed);
191+
}
192+
193+
169194
// real time check, mainly used for steer torque rate limiter
170195
int rt_rate_limit_check(int val, int val_last, const int MAX_RT_DELTA) {
171196

board/safety/safety_cadillac.h

+4-22
Original file line numberDiff line numberDiff line change
@@ -74,28 +74,10 @@ static int cadillac_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
7474
violation |= max_limit_check(desired_torque, CADILLAC_STEER_MAX);
7575

7676
// *** torque rate limit check ***
77-
int highest_allowed_torque = max(cadillac_desired_torque_last[idx], 0) + CADILLAC_MAX_RATE_UP;
78-
int lowest_allowed_torque = min(cadillac_desired_torque_last[idx], 0) - CADILLAC_MAX_RATE_UP;
79-
80-
int driver_torque_max_limit = CADILLAC_STEER_MAX +
81-
(CADILLAC_DRIVER_TORQUE_ALLOWANCE + cadillac_torque_driver.max) *
82-
CADILLAC_DRIVER_TORQUE_FACTOR;
83-
int driver_torque_min_limit = -CADILLAC_STEER_MAX +
84-
(-CADILLAC_DRIVER_TORQUE_ALLOWANCE + cadillac_torque_driver.min) *
85-
CADILLAC_DRIVER_TORQUE_FACTOR;
86-
87-
// if we've exceeded the applied torque, we must start moving toward 0
88-
highest_allowed_torque = min(highest_allowed_torque,
89-
max(cadillac_desired_torque_last[idx] - CADILLAC_MAX_RATE_DOWN,
90-
max(driver_torque_max_limit, 0)));
91-
lowest_allowed_torque = max(lowest_allowed_torque,
92-
min(cadillac_desired_torque_last[idx] + CADILLAC_MAX_RATE_DOWN,
93-
min(driver_torque_min_limit, 0)));
94-
95-
// check for violation
96-
if ((desired_torque < lowest_allowed_torque) || (desired_torque > highest_allowed_torque)) {
97-
violation = 1;
98-
}
77+
int desired_torque_last = cadillac_desired_torque_last[idx];
78+
violation |= driver_limit_check(desired_torque, desired_torque_last, &cadillac_torque_driver,
79+
CADILLAC_STEER_MAX, CADILLAC_MAX_RATE_UP, CADILLAC_MAX_RATE_DOWN,
80+
CADILLAC_DRIVER_TORQUE_ALLOWANCE, CADILLAC_DRIVER_TORQUE_FACTOR);
9981

10082
// used next time
10183
cadillac_desired_torque_last[idx] = desired_torque;

0 commit comments

Comments
 (0)