# pragma once
# include "opendbc/safety/safety_declarations.h"
// CAN msgs we care about
# define MAZDA_LKAS 0x243U
# define MAZDA_LKAS_HUD 0x440U
# define MAZDA_CRZ_CTRL 0x21cU
# define MAZDA_CRZ_BTNS 0x09dU
# define MAZDA_STEER_TORQUE 0x240U
# define MAZDA_ENGINE_DATA 0x202U
# define MAZDA_PEDALS 0x165U
// CAN bus numbers
# define MAZDA_MAIN 0
# define MAZDA_CAM 2
// track msgs coming from OP so that we know what CAM msgs to drop and what to forward
static void mazda_rx_hook ( const CANPacket_t * msg ) {
if ( ( int ) msg - > bus = = MAZDA_MAIN ) {
if ( msg - > addr = = MAZDA_ENGINE_DATA ) {
// sample speed: scale by 0.01 to get kph
int speed = ( msg - > data [ 2 ] < < 8 ) | msg - > data [ 3 ] ;
vehicle_moving = speed > 10 ; // moving when speed > 0.1 kph
}
if ( msg - > addr = = MAZDA_STEER_TORQUE ) {
int torque_driver_new = msg - > data [ 0 ] - 127U ;
// update array of samples
update_sample ( & torque_driver , torque_driver_new ) ;
}
// enter controls on rising edge of ACC, exit controls on ACC off
if ( msg - > addr = = MAZDA_CRZ_CTRL ) {
bool cruise_engaged = msg - > data [ 0 ] & 0x8U ;
pcm_cruise_check ( cruise_engaged ) ;
}
if ( msg - > addr = = MAZDA_ENGINE_DATA ) {
gas_pressed = ( msg - > data [ 4 ] | | ( msg - > data [ 5 ] & 0xF0U ) ) ;
}
if ( msg - > addr = = MAZDA_PEDALS ) {
brake_pressed = ( msg - > data [ 0 ] & 0x10U ) ;
}
}
}
static bool mazda_tx_hook ( const CANPacket_t * msg ) {
const TorqueSteeringLimits MAZDA_STEERING_LIMITS = {
. max_torque = 800 ,
. max_rate_up = 10 ,
. max_rate_down = 25 ,
. max_rt_delta = 300 ,
. driver_torque_multiplier = 1 ,
. driver_torque_allowance = 15 ,
. type = TorqueDriverLimited ,
} ;
bool tx = true ;
// Check if msg is sent on the main BUS
if ( msg - > bus = = ( unsigned char ) MAZDA_MAIN ) {
// steer cmd checks
if ( msg - > addr = = MAZDA_LKAS ) {
int desired_torque = ( ( ( msg - > data [ 0 ] & 0x0FU ) < < 8 ) | msg - > data [ 1 ] ) - 2048U ;
if ( steer_torque_cmd_checks ( desired_torque , - 1 , MAZDA_STEERING_LIMITS ) ) {
tx = false ;
}
}
// cruise buttons check
if ( msg - > addr = = MAZDA_CRZ_BTNS ) {
// allow resume spamming while controls allowed, but
// only allow cancel while controls not allowed
bool cancel_cmd = ( msg - > data [ 0 ] = = 0x1U ) ;
if ( ! controls_allowed & & ! cancel_cmd ) {
tx = false ;
}
}
}
return tx ;
}
static safety_config mazda_init ( uint16_t param ) {
static const CanMsg MAZDA_TX_MSGS [ ] = { { MAZDA_LKAS , 0 , 8 , . check_relay = true } , { MAZDA_CRZ_BTNS , 0 , 8 , . check_relay = false } , { MAZDA_LKAS_HUD , 0 , 8 , . check_relay = true } } ;
static RxCheck mazda_rx_checks [ ] = {
{ . msg = { { MAZDA_CRZ_CTRL , 0 , 8 , 50U , . ignore_checksum = true , . ignore_counter = true , . ignore_quality_flag = true } , { 0 } , { 0 } } } ,
{ . msg = { { MAZDA_CRZ_BTNS , 0 , 8 , 10U , . ignore_checksum = true , . ignore_counter = true , . ignore_quality_flag = true } , { 0 } , { 0 } } } ,
{ . msg = { { MAZDA_STEER_TORQUE , 0 , 8 , 83U , . ignore_checksum = true , . ignore_counter = true , . ignore_quality_flag = true } , { 0 } , { 0 } } } ,
{ . msg = { { MAZDA_ENGINE_DATA , 0 , 8 , 100U , . ignore_checksum = true , . ignore_counter = true , . ignore_quality_flag = true } , { 0 } , { 0 } } } ,
{ . msg = { { MAZDA_PEDALS , 0 , 8 , 50U , . ignore_checksum = true , . ignore_counter = true , . ignore_quality_flag = true } , { 0 } , { 0 } } } ,
} ;
UNUSED ( param ) ;
return BUILD_SAFETY_CFG ( mazda_rx_checks , MAZDA_TX_MSGS ) ;
}
const safety_hooks mazda_hooks = {
. init = mazda_init ,
. rx = mazda_rx_hook ,
. tx = mazda_tx_hook ,
} ;