Skip to content

Commit bb75afc

Browse files
authored
safety: add safety param for gas interceptor (commaai#1735)
* some refactoring still needing to be done here * 50hz * set rx checks * tx msgs * test * fix * forgot to check this since it's static now * enable_gas_interceptor * more * remove int funcs since are common * generic! * not generic * need to set counter now * set_enable_gas_interceptor not needed * already reset in safety init * fix test * remove gas_interceptor_detected (partly) * oof need for hjonda too * edit structs * more honda (still broken) * fix typo * shift these down * can also make this extensible * stash * defining classes is much simpler, maybe in future we will have some sort of wrapper after some more thought * remove create_interceptor_test now * add lta interceptor * clean up print * clean up * once * type hint * rm * no interceptor with stock long + good test * add interceptor counter to honda * need alt interceptor + set rx checks for honda * we were never testing button enable with nidec + interceptor! honda almost all passing * these fixes make sense * clean up * better * clean up test cov * clean up * not needed * fix tx msgs * clean up * cppcheck * fix * unnecessary
1 parent 30647d6 commit bb75afc

13 files changed

+195
-78
lines changed

board/health.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// When changing these structs, python/__init__.py needs to be kept up to date!
22

3-
#define HEALTH_PACKET_VERSION 14
3+
#define HEALTH_PACKET_VERSION 15
44
struct __attribute__((packed)) health_t {
55
uint32_t uptime_pkt;
66
uint32_t voltage_pkt;
@@ -14,7 +14,6 @@ struct __attribute__((packed)) health_t {
1414
uint8_t ignition_line_pkt;
1515
uint8_t ignition_can_pkt;
1616
uint8_t controls_allowed_pkt;
17-
uint8_t gas_interceptor_detected_pkt;
1817
uint8_t car_harness_status_pkt;
1918
uint8_t safety_mode_pkt;
2019
uint16_t safety_param_pkt;

board/main_comms.h

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ int get_health_pkt(void *dat) {
1717
health->ignition_can_pkt = (uint8_t)(ignition_can);
1818

1919
health->controls_allowed_pkt = controls_allowed;
20-
health->gas_interceptor_detected_pkt = gas_interceptor_detected;
2120
health->safety_tx_blocked_pkt = safety_tx_blocked;
2221
health->safety_rx_invalid_pkt = safety_rx_invalid;
2322
health->tx_buffer_overflow_pkt = tx_buffer_overflow;

board/safety.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ int set_safety_hooks(uint16_t mode, uint16_t param) {
332332
// reset state set by safety mode
333333
safety_mode_cnt = 0U;
334334
relay_malfunction = false;
335-
gas_interceptor_detected = false;
335+
enable_gas_interceptor = false;
336336
gas_interceptor_prev = 0;
337337
gas_pressed = false;
338338
gas_pressed_prev = false;

board/safety/safety_honda.h

+38-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
const CanMsg HONDA_N_TX_MSGS[] = {{0xE4, 0, 5}, {0x194, 0, 4}, {0x1FA, 0, 8}, {0x200, 0, 6}, {0x30C, 0, 8}, {0x33D, 0, 5}};
1+
const CanMsg HONDA_N_TX_MSGS[] = {{0xE4, 0, 5}, {0x194, 0, 4}, {0x1FA, 0, 8}, {0x30C, 0, 8}, {0x33D, 0, 5}};
2+
const CanMsg HONDA_N_INTERCEPTOR_TX_MSGS[] = {{0xE4, 0, 5}, {0x194, 0, 4}, {0x1FA, 0, 8}, {0x200, 0, 6}, {0x30C, 0, 8}, {0x33D, 0, 5}};
23
const CanMsg HONDA_BOSCH_TX_MSGS[] = {{0xE4, 0, 5}, {0xE5, 0, 8}, {0x296, 1, 4}, {0x33D, 0, 5}, {0x33DA, 0, 5}, {0x33DB, 0, 8}}; // Bosch
34
const CanMsg HONDA_BOSCH_LONG_TX_MSGS[] = {{0xE4, 1, 5}, {0x1DF, 1, 8}, {0x1EF, 1, 8}, {0x1FA, 1, 8}, {0x30C, 1, 8}, {0x33D, 1, 5}, {0x33DA, 1, 5}, {0x33DB, 1, 8}, {0x39F, 1, 8}, {0x18DAB0F1, 1, 8}}; // Bosch w/ gas and brakes
45
const CanMsg HONDA_RADARLESS_TX_MSGS[] = {{0xE4, 0, 5}, {0x296, 2, 4}, {0x33D, 0, 8}}; // Bosch radarless
@@ -46,6 +47,11 @@ RxCheck honda_common_rx_checks[] = {
4647
HONDA_COMMON_RX_CHECKS(0)
4748
};
4849

50+
RxCheck honda_common_interceptor_rx_checks[] = {
51+
HONDA_COMMON_RX_CHECKS(0)
52+
{.msg = {{0x201, 0, 6, .check_checksum = false, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}},
53+
};
54+
4955
RxCheck honda_common_alt_brake_rx_checks[] = {
5056
HONDA_COMMON_RX_CHECKS(0)
5157
HONDA_ALT_BRAKE_ADDR_CHECK(0)
@@ -56,6 +62,11 @@ RxCheck honda_nidec_alt_rx_checks[] = {
5662
HONDA_COMMON_NO_SCM_FEEDBACK_RX_CHECKS(0)
5763
};
5864

65+
RxCheck honda_nidec_alt_interceptor_rx_checks[] = {
66+
HONDA_COMMON_NO_SCM_FEEDBACK_RX_CHECKS(0)
67+
{.msg = {{0x201, 0, 6, .check_checksum = false, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}},
68+
};
69+
5970
// Bosch has pt on bus 1, verified 0x1A6 does not exist
6071
RxCheck honda_bosch_rx_checks[] = {
6172
HONDA_COMMON_RX_CHECKS(1)
@@ -70,6 +81,7 @@ const uint16_t HONDA_PARAM_ALT_BRAKE = 1;
7081
const uint16_t HONDA_PARAM_BOSCH_LONG = 2;
7182
const uint16_t HONDA_PARAM_NIDEC_ALT = 4;
7283
const uint16_t HONDA_PARAM_RADARLESS = 8;
84+
const uint16_t HONDA_PARAM_GAS_INTERCEPTOR = 16;
7385

7486
enum {
7587
HONDA_BTN_NONE = 0,
@@ -115,13 +127,22 @@ static uint32_t honda_compute_checksum(CANPacket_t *to_push) {
115127
}
116128

117129
static uint8_t honda_get_counter(CANPacket_t *to_push) {
118-
int counter_byte = GET_LEN(to_push) - 1U;
119-
return ((uint8_t)(GET_BYTE(to_push, counter_byte)) >> 4U) & 0x3U;
130+
int addr = GET_ADDR(to_push);
131+
132+
uint8_t cnt = 0U;
133+
if (addr == 0x201) {
134+
// Signal: COUNTER_PEDAL
135+
cnt = GET_BYTE(to_push, 4) & 0x0FU;
136+
} else {
137+
int counter_byte = GET_LEN(to_push) - 1U;
138+
cnt = (GET_BYTE(to_push, counter_byte) >> 4U) & 0x3U;
139+
}
140+
return cnt;
120141
}
121142

122143
static void honda_rx_hook(CANPacket_t *to_push) {
123144
const bool pcm_cruise = ((honda_hw == HONDA_BOSCH) && !honda_bosch_long) || \
124-
((honda_hw == HONDA_NIDEC) && !gas_interceptor_detected);
145+
((honda_hw == HONDA_NIDEC) && !enable_gas_interceptor);
125146
int pt_bus = honda_get_pt_bus();
126147

127148
int addr = GET_ADDR(to_push);
@@ -198,14 +219,13 @@ static void honda_rx_hook(CANPacket_t *to_push) {
198219
}
199220

200221
// length check because bosch hardware also uses this id (0x201 w/ len = 8)
201-
if ((addr == 0x201) && (len == 6)) {
202-
gas_interceptor_detected = 1;
222+
if ((addr == 0x201) && (len == 6) && enable_gas_interceptor) {
203223
int gas_interceptor = HONDA_GET_INTERCEPTOR(to_push);
204224
gas_pressed = gas_interceptor > HONDA_GAS_INTERCEPTOR_THRESHOLD;
205225
gas_interceptor_prev = gas_interceptor;
206226
}
207227

208-
if (!gas_interceptor_detected) {
228+
if (!enable_gas_interceptor) {
209229
if (addr == 0x17C) {
210230
gas_pressed = GET_BYTE(to_push, 0) != 0U;
211231
}
@@ -359,12 +379,21 @@ static safety_config honda_nidec_init(uint16_t param) {
359379
honda_alt_brake_msg = false;
360380
honda_bosch_long = false;
361381
honda_bosch_radarless = false;
382+
enable_gas_interceptor = GET_FLAG(param, HONDA_PARAM_GAS_INTERCEPTOR);
362383

363384
safety_config ret;
364385
if (GET_FLAG(param, HONDA_PARAM_NIDEC_ALT)) {
365-
ret = BUILD_SAFETY_CFG(honda_nidec_alt_rx_checks, HONDA_N_TX_MSGS);
386+
enable_gas_interceptor ? SET_RX_CHECKS(honda_nidec_alt_interceptor_rx_checks, ret) : \
387+
SET_RX_CHECKS(honda_nidec_alt_rx_checks, ret);
388+
} else {
389+
enable_gas_interceptor ? SET_RX_CHECKS(honda_common_interceptor_rx_checks, ret) : \
390+
SET_RX_CHECKS(honda_common_rx_checks, ret);
391+
}
392+
393+
if (enable_gas_interceptor) {
394+
SET_TX_MSGS(HONDA_N_INTERCEPTOR_TX_MSGS, ret);
366395
} else {
367-
ret= BUILD_SAFETY_CFG(honda_common_rx_checks, HONDA_N_TX_MSGS);
396+
SET_TX_MSGS(HONDA_N_TX_MSGS, ret);
368397
}
369398
return ret;
370399
}

board/safety/safety_toyota.h

+49-10
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,19 @@ const LongitudinalLimits TOYOTA_LONG_LIMITS = {
4343
const int TOYOTA_GAS_INTERCEPTOR_THRSLD = 805;
4444
#define TOYOTA_GET_INTERCEPTOR(msg) (((GET_BYTE((msg), 0) << 8) + GET_BYTE((msg), 1) + (GET_BYTE((msg), 2) << 8) + GET_BYTE((msg), 3)) / 2U) // avg between 2 tracks
4545

46-
const CanMsg TOYOTA_TX_MSGS[] = {{0x283, 0, 7}, {0x2E6, 0, 8}, {0x2E7, 0, 8}, {0x33E, 0, 7}, {0x344, 0, 8}, {0x365, 0, 7}, {0x366, 0, 7}, {0x4CB, 0, 8}, // DSU bus 0
47-
{0x128, 1, 6}, {0x141, 1, 4}, {0x160, 1, 8}, {0x161, 1, 7}, {0x470, 1, 4}, // DSU bus 1
48-
{0x2E4, 0, 5}, {0x191, 0, 8}, {0x411, 0, 8}, {0x412, 0, 8}, {0x343, 0, 8}, {0x1D2, 0, 8}, // LKAS + ACC
49-
{0x200, 0, 6}}; // gas interceptor
46+
#define TOYOTA_COMMON_TX_MSGS \
47+
{0x283, 0, 7}, {0x2E6, 0, 8}, {0x2E7, 0, 8}, {0x33E, 0, 7}, {0x344, 0, 8}, {0x365, 0, 7}, {0x366, 0, 7}, {0x4CB, 0, 8}, /* DSU bus 0 */ \
48+
{0x128, 1, 6}, {0x141, 1, 4}, {0x160, 1, 8}, {0x161, 1, 7}, {0x470, 1, 4}, /* DSU bus 1 */ \
49+
{0x2E4, 0, 5}, {0x191, 0, 8}, {0x411, 0, 8}, {0x412, 0, 8}, {0x343, 0, 8}, {0x1D2, 0, 8}, /* LKAS + ACC */ \
50+
51+
const CanMsg TOYOTA_TX_MSGS[] = {
52+
TOYOTA_COMMON_TX_MSGS
53+
};
54+
55+
const CanMsg TOYOTA_INTERCEPTOR_TX_MSGS[] = {
56+
TOYOTA_COMMON_TX_MSGS
57+
{0x200, 0, 6}, // gas interceptor
58+
};
5059

5160
#define TOYOTA_COMMON_RX_CHECKS(lta) \
5261
{.msg = {{ 0xaa, 0, 8, .check_checksum = false, .frequency = 83U}, { 0 }, { 0 }}}, \
@@ -59,18 +68,29 @@ RxCheck toyota_lka_rx_checks[] = {
5968
TOYOTA_COMMON_RX_CHECKS(false)
6069
};
6170

71+
RxCheck toyota_lka_interceptor_rx_checks[] = {
72+
TOYOTA_COMMON_RX_CHECKS(false)
73+
{.msg = {{0x201, 0, 6, .check_checksum = false, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}},
74+
};
75+
76+
// Check the quality flag for angle measurement when using LTA, since it's not set on TSS-P cars
6277
RxCheck toyota_lta_rx_checks[] = {
63-
// Check the quality flag for angle measurement when using LTA, since it's not set on TSS-P cars
6478
TOYOTA_COMMON_RX_CHECKS(true)
6579
};
6680

81+
RxCheck toyota_lta_interceptor_rx_checks[] = {
82+
TOYOTA_COMMON_RX_CHECKS(true)
83+
{.msg = {{0x201, 0, 6, .check_checksum = false, .max_counter = 15U, .frequency = 50U}, { 0 }, { 0 }}},
84+
};
85+
6786
// safety param flags
6887
// first byte is for EPS factor, second is for flags
6988
const uint32_t TOYOTA_PARAM_OFFSET = 8U;
7089
const uint32_t TOYOTA_EPS_FACTOR = (1U << TOYOTA_PARAM_OFFSET) - 1U;
7190
const uint32_t TOYOTA_PARAM_ALT_BRAKE = 1U << TOYOTA_PARAM_OFFSET;
7291
const uint32_t TOYOTA_PARAM_STOCK_LONGITUDINAL = 2U << TOYOTA_PARAM_OFFSET;
7392
const uint32_t TOYOTA_PARAM_LTA = 4U << TOYOTA_PARAM_OFFSET;
93+
const uint32_t TOYOTA_PARAM_GAS_INTERCEPTOR = 8U << TOYOTA_PARAM_OFFSET;
7494

7595
bool toyota_alt_brake = false;
7696
bool toyota_stock_longitudinal = false;
@@ -92,6 +112,17 @@ static uint32_t toyota_get_checksum(CANPacket_t *to_push) {
92112
return (uint8_t)(GET_BYTE(to_push, checksum_byte));
93113
}
94114

115+
static uint8_t toyota_get_counter(CANPacket_t *to_push) {
116+
int addr = GET_ADDR(to_push);
117+
118+
uint8_t cnt = 0U;
119+
if (addr == 0x201) {
120+
// Signal: COUNTER_PEDAL
121+
cnt = GET_BYTE(to_push, 4) & 0x0FU;
122+
}
123+
return cnt;
124+
}
125+
95126
static bool toyota_get_quality_flag_valid(CANPacket_t *to_push) {
96127
int addr = GET_ADDR(to_push);
97128

@@ -144,7 +175,7 @@ static void toyota_rx_hook(CANPacket_t *to_push) {
144175
pcm_cruise_check(cruise_engaged);
145176

146177
// sample gas pedal
147-
if (!gas_interceptor_detected) {
178+
if (!enable_gas_interceptor) {
148179
gas_pressed = GET_BIT(to_push, 4U) == 0U;
149180
}
150181
}
@@ -170,8 +201,7 @@ static void toyota_rx_hook(CANPacket_t *to_push) {
170201
}
171202

172203
// sample gas interceptor
173-
if (addr == 0x201) {
174-
gas_interceptor_detected = 1;
204+
if ((addr == 0x201) && enable_gas_interceptor) {
175205
int gas_interceptor = TOYOTA_GET_INTERCEPTOR(to_push);
176206
gas_pressed = gas_interceptor > TOYOTA_GAS_INTERCEPTOR_THRSLD;
177207

@@ -304,13 +334,21 @@ static safety_config toyota_init(uint16_t param) {
304334
toyota_alt_brake = GET_FLAG(param, TOYOTA_PARAM_ALT_BRAKE);
305335
toyota_stock_longitudinal = GET_FLAG(param, TOYOTA_PARAM_STOCK_LONGITUDINAL);
306336
toyota_lta = GET_FLAG(param, TOYOTA_PARAM_LTA);
337+
enable_gas_interceptor = GET_FLAG(param, TOYOTA_PARAM_GAS_INTERCEPTOR);
307338
toyota_dbc_eps_torque_factor = param & TOYOTA_EPS_FACTOR;
308339

340+
// Gas interceptor should not be used if openpilot is not controlling longitudinal
341+
if (toyota_stock_longitudinal) {
342+
enable_gas_interceptor = false;
343+
}
344+
309345
safety_config ret;
310346
if (toyota_lta) {
311-
ret = BUILD_SAFETY_CFG(toyota_lta_rx_checks, TOYOTA_TX_MSGS);
347+
ret = enable_gas_interceptor ? BUILD_SAFETY_CFG(toyota_lta_interceptor_rx_checks, TOYOTA_INTERCEPTOR_TX_MSGS) : \
348+
BUILD_SAFETY_CFG(toyota_lta_rx_checks, TOYOTA_TX_MSGS);
312349
} else {
313-
ret = BUILD_SAFETY_CFG(toyota_lka_rx_checks, TOYOTA_TX_MSGS);
350+
ret = enable_gas_interceptor ? BUILD_SAFETY_CFG(toyota_lka_interceptor_rx_checks, TOYOTA_INTERCEPTOR_TX_MSGS) : \
351+
BUILD_SAFETY_CFG(toyota_lka_rx_checks, TOYOTA_TX_MSGS);
314352
}
315353
return ret;
316354
}
@@ -345,5 +383,6 @@ const safety_hooks toyota_hooks = {
345383
.fwd = toyota_fwd_hook,
346384
.get_checksum = toyota_get_checksum,
347385
.compute_checksum = toyota_compute_checksum,
386+
.get_counter = toyota_get_counter,
348387
.get_quality_flag_valid = toyota_get_quality_flag_valid,
349388
};

board/safety_declarations.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ void safety_tick(const safety_config *safety_config);
212212
// This can be set by the safety hooks
213213
bool controls_allowed = false;
214214
bool relay_malfunction = false;
215-
bool gas_interceptor_detected = false;
215+
bool enable_gas_interceptor = false;
216216
int gas_interceptor_prev = 0;
217217
bool gas_pressed = false;
218218
bool gas_pressed_prev = false;

drivers/windows/panda_shared/panda.h

-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ namespace panda {
9090
uint8_t ignition_line;
9191
uint8_t ignition_can;
9292
uint8_t controls_allowed;
93-
uint8_t gas_interceptor_detected;
9493
uint8_t car_harness_status;
9594
uint8_t usb_power_mode;
9695
uint8_t safety_mode;

python/__init__.py

+19-18
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,9 @@ class Panda:
167167
HW_TYPE_TRES = b'\x09'
168168

169169
CAN_PACKET_VERSION = 4
170-
HEALTH_PACKET_VERSION = 14
170+
HEALTH_PACKET_VERSION = 15
171171
CAN_HEALTH_PACKET_VERSION = 5
172-
HEALTH_STRUCT = struct.Struct("<IIIIIIIIIBBBBBBHBBBHfBBHBHHB")
172+
HEALTH_STRUCT = struct.Struct("<IIIIIIIIIBBBBBHBBBHfBBHBHHB")
173173
CAN_HEALTH_STRUCT = struct.Struct("<BIBBBBBBBBIIIIIIIHHBBBIIII")
174174

175175
F2_DEVICES = [HW_TYPE_PEDAL, ]
@@ -193,11 +193,13 @@ class Panda:
193193
FLAG_TOYOTA_ALT_BRAKE = (1 << 8)
194194
FLAG_TOYOTA_STOCK_LONGITUDINAL = (2 << 8)
195195
FLAG_TOYOTA_LTA = (4 << 8)
196+
FLAG_TOYOTA_GAS_INTERCEPTOR = (8 << 8)
196197

197198
FLAG_HONDA_ALT_BRAKE = 1
198199
FLAG_HONDA_BOSCH_LONG = 2
199200
FLAG_HONDA_NIDEC_ALT = 4
200201
FLAG_HONDA_RADARLESS = 8
202+
FLAG_HONDA_GAS_INTERCEPTOR = 16
201203

202204
FLAG_HYUNDAI_EV_GAS = 1
203205
FLAG_HYUNDAI_HYBRID_GAS = 2
@@ -591,22 +593,21 @@ def health(self):
591593
"ignition_line": a[9],
592594
"ignition_can": a[10],
593595
"controls_allowed": a[11],
594-
"gas_interceptor_detected": a[12],
595-
"car_harness_status": a[13],
596-
"safety_mode": a[14],
597-
"safety_param": a[15],
598-
"fault_status": a[16],
599-
"power_save_enabled": a[17],
600-
"heartbeat_lost": a[18],
601-
"alternative_experience": a[19],
602-
"interrupt_load": a[20],
603-
"fan_power": a[21],
604-
"safety_rx_checks_invalid": a[22],
605-
"spi_checksum_error_count": a[23],
606-
"fan_stall_count": a[24],
607-
"sbu1_voltage_mV": a[25],
608-
"sbu2_voltage_mV": a[26],
609-
"som_reset_triggered": a[27],
596+
"car_harness_status": a[12],
597+
"safety_mode": a[13],
598+
"safety_param": a[14],
599+
"fault_status": a[15],
600+
"power_save_enabled": a[16],
601+
"heartbeat_lost": a[17],
602+
"alternative_experience": a[18],
603+
"interrupt_load": a[19],
604+
"fan_power": a[20],
605+
"safety_rx_checks_invalid": a[21],
606+
"spi_checksum_error_count": a[22],
607+
"fan_stall_count": a[23],
608+
"sbu1_voltage_mV": a[24],
609+
"sbu2_voltage_mV": a[25],
610+
"som_reset_triggered": a[26],
610611
}
611612

612613
@ensure_can_health_packet_version

tests/libpanda/safety_helpers.h

-8
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ void set_relay_malfunction(bool c){
3131
relay_malfunction = c;
3232
}
3333

34-
void set_gas_interceptor_detected(bool c){
35-
gas_interceptor_detected = c;
36-
}
37-
3834
bool get_controls_allowed(void){
3935
return controls_allowed;
4036
}
@@ -47,10 +43,6 @@ bool get_relay_malfunction(void){
4743
return relay_malfunction;
4844
}
4945

50-
bool get_gas_interceptor_detected(void){
51-
return gas_interceptor_detected;
52-
}
53-
5446
int get_gas_interceptor_prev(void){
5547
return gas_interceptor_prev;
5648
}

tests/libpanda/safety_helpers.py

-4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ def setup_safety_helpers(ffi):
1010
int get_alternative_experience(void);
1111
void set_relay_malfunction(bool c);
1212
bool get_relay_malfunction(void);
13-
void set_gas_interceptor_detected(bool c);
14-
bool get_gas_interceptor_detected(void);
1513
int get_gas_interceptor_prev(void);
1614
bool get_gas_pressed_prev(void);
1715
bool get_brake_pressed_prev(void);
@@ -62,8 +60,6 @@ def set_alternative_experience(self, mode: int) -> None: ...
6260
def get_alternative_experience(self) -> int: ...
6361
def set_relay_malfunction(self, c: bool) -> None: ...
6462
def get_relay_malfunction(self) -> bool: ...
65-
def set_gas_interceptor_detected(self, c: bool) -> None: ...
66-
def get_gas_interceptor_detected(self) -> bool: ...
6763
def get_gas_interceptor_prev(self) -> int: ...
6864
def get_gas_pressed_prev(self) -> bool: ...
6965
def get_brake_pressed_prev(self) -> bool: ...

0 commit comments

Comments
 (0)