You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.4 KiB
129 lines
3.4 KiB
7 years ago
|
// board enforces
|
||
|
// in-state
|
||
|
// accel set/resume
|
||
|
// out-state
|
||
|
// cancel button
|
||
|
// accel rising edge
|
||
|
// brake rising edge
|
||
|
// brake > 0mph
|
||
|
|
||
|
// these are set in the Honda safety hooks...this is the wrong place
|
||
|
int gas_interceptor_detected = 0;
|
||
|
int brake_prev = 0;
|
||
|
int gas_prev = 0;
|
||
|
int gas_interceptor_prev = 0;
|
||
|
int ego_speed = 0;
|
||
|
|
||
|
static void honda_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
|
||
|
|
||
|
// sample speed
|
||
|
if ((to_push->RIR>>21) == 0x158) {
|
||
|
// first 2 bytes
|
||
|
ego_speed = to_push->RDLR & 0xFFFF;
|
||
|
}
|
||
|
|
||
|
// state machine to enter and exit controls
|
||
|
// 0x1A6 for the ILX, 0x296 for the Civic Touring
|
||
|
if ((to_push->RIR>>21) == 0x1A6 || (to_push->RIR>>21) == 0x296) {
|
||
|
int buttons = (to_push->RDLR & 0xE0) >> 5;
|
||
|
if (buttons == 4 || buttons == 3) {
|
||
|
controls_allowed = 1;
|
||
|
} else if (buttons == 2) {
|
||
|
controls_allowed = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// exit controls on rising edge of brake press or on brake press when
|
||
|
// speed > 0
|
||
|
if ((to_push->RIR>>21) == 0x17C) {
|
||
|
// bit 53
|
||
|
int brake = to_push->RDHR & 0x200000;
|
||
|
if (brake && (!(brake_prev) || ego_speed)) {
|
||
|
controls_allowed = 0;
|
||
|
}
|
||
|
brake_prev = brake;
|
||
|
}
|
||
|
|
||
|
// exit controls on rising edge of gas press if interceptor
|
||
|
if ((to_push->RIR>>21) == 0x201) {
|
||
|
gas_interceptor_detected = 1;
|
||
|
int gas_interceptor = ((to_push->RDLR & 0xFF) << 8) | ((to_push->RDLR & 0xFF00) >> 8);
|
||
|
if ((gas_interceptor > 328) && (gas_interceptor_prev <= 328)) {
|
||
|
controls_allowed = 0;
|
||
|
}
|
||
|
gas_interceptor_prev = gas_interceptor;
|
||
|
}
|
||
|
|
||
|
// exit controls on rising edge of gas press if no interceptor
|
||
|
if (!gas_interceptor_detected) {
|
||
|
if ((to_push->RIR>>21) == 0x17C) {
|
||
|
int gas = to_push->RDLR & 0xFF;
|
||
|
if (gas && !(gas_prev)) {
|
||
|
controls_allowed = 0;
|
||
|
}
|
||
|
gas_prev = gas;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// all commands: gas, brake and steering
|
||
|
// if controls_allowed and no pedals pressed
|
||
|
// allow all commands up to limit
|
||
|
// else
|
||
|
// block all commands that produce actuation
|
||
|
|
||
|
static int honda_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
||
|
|
||
|
// disallow actuator commands if gas or brake (with vehicle moving) are pressed
|
||
|
// and the the latching controls_allowed flag is True
|
||
|
int pedal_pressed = gas_prev || gas_interceptor_prev || (brake_prev && ego_speed);
|
||
|
int current_controls_allowed = controls_allowed && !(pedal_pressed);
|
||
|
|
||
|
// BRAKE: safety check
|
||
|
if ((to_send->RIR>>21) == 0x1FA) {
|
||
|
if (current_controls_allowed) {
|
||
|
if ((to_send->RDLR & 0xFFFFFF3F) != to_send->RDLR) return 0;
|
||
|
} else {
|
||
|
if ((to_send->RDLR & 0xFFFF0000) != to_send->RDLR) return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// STEER: safety check
|
||
|
if ((to_send->RIR>>21) == 0xE4 || (to_send->RIR>>21) == 0x194) {
|
||
|
if (current_controls_allowed) {
|
||
|
// all messages are fine here
|
||
|
} else {
|
||
|
if ((to_send->RDLR & 0xFFFF0000) != to_send->RDLR) return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// GAS: safety check
|
||
|
if ((to_send->RIR>>21) == 0x200) {
|
||
|
if (current_controls_allowed) {
|
||
|
// all messages are fine here
|
||
|
} else {
|
||
|
if ((to_send->RDLR & 0xFFFF0000) != to_send->RDLR) return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 1 allows the message through
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static int honda_tx_lin_hook(int lin_num, uint8_t *data, int len) {
|
||
|
// TODO: add safety if using LIN
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
static void honda_init() {
|
||
|
controls_allowed = 0;
|
||
|
}
|
||
|
|
||
|
const safety_hooks honda_hooks = {
|
||
|
.init = honda_init,
|
||
|
.rx = honda_rx_hook,
|
||
|
.tx = honda_tx_hook,
|
||
|
.tx_lin = honda_tx_lin_hook,
|
||
|
};
|
||
|
|