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.
46 lines
1.4 KiB
46 lines
1.4 KiB
static void elm327_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {}
|
|
|
|
static int elm327_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
|
//All ELM traffic must appear on CAN0
|
|
if(((to_send->RDTR >> 4) & 0xf) != 0) return 0;
|
|
//All ISO 15765-4 messages must be 8 bytes long
|
|
if((to_send->RDTR & 0xf) != 8) return 0;
|
|
|
|
if(to_send->RIR & 4){
|
|
uint32_t addr = to_send->RIR >> 3;
|
|
//Check valid 29 bit send addresses for ISO 15765-4
|
|
if(!(addr == 0x18DB33F1 || (addr & 0x1FFF00FF) == 0x18DA00F1)) return 0;
|
|
} else {
|
|
uint32_t addr = to_send->RIR >> 21;
|
|
//Check valid 11 bit send addresses for ISO 15765-4
|
|
if(!(addr == 0x7DF || (addr & 0x7F8) == 0x7E0)) return 0;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static int elm327_tx_lin_hook(int lin_num, uint8_t *data, int len) {
|
|
if(lin_num != 0) return false; //Only operate on LIN 0, aka serial 2
|
|
if(len < 5 || len > 11) return false; //Valid KWP size
|
|
if(!((data[0] & 0xF8) == 0xC0 && (data[0] & 0x07) > 0 &&
|
|
data[1] == 0x33 && data[2] == 0xF1)) return false; //Bad msg
|
|
return true;
|
|
}
|
|
|
|
static void elm327_init(int16_t param) {
|
|
controls_allowed = 1;
|
|
}
|
|
|
|
static int elm327_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|
return -1;
|
|
}
|
|
|
|
const safety_hooks elm327_hooks = {
|
|
.init = elm327_init,
|
|
.rx = elm327_rx_hook,
|
|
.tx = elm327_tx_hook,
|
|
.tx_lin = elm327_tx_lin_hook,
|
|
.ignition = default_ign_hook,
|
|
.fwd = elm327_fwd_hook,
|
|
.relay = nooutput_relay_hook,
|
|
};
|
|
|