forked from IQ.Lvbs/IQ.Pilot
IQ.Pilot Release Commit @ 0798119
This commit is contained in:
52
iqdbc_repo/iqdbc/safety/tests/libsafety/SConscript
Normal file
52
iqdbc_repo/iqdbc/safety/tests/libsafety/SConscript
Normal file
@@ -0,0 +1,52 @@
|
||||
import os
|
||||
import platform
|
||||
|
||||
system = platform.system()
|
||||
|
||||
env = Environment(
|
||||
CC='clang',
|
||||
CFLAGS=[
|
||||
'-Wall',
|
||||
"-Wextra",
|
||||
'-Werror',
|
||||
'-nostdlib',
|
||||
'-fno-builtin',
|
||||
'-std=gnu11',
|
||||
'-Wfatal-errors',
|
||||
'-Wno-pointer-to-int-cast',
|
||||
'-g',
|
||||
'-O0',
|
||||
'-fno-omit-frame-pointer',
|
||||
'-grecord-command-line',
|
||||
'-DALLOW_DEBUG',
|
||||
],
|
||||
LINKFLAGS=[] if system == "Darwin" else ['-fsanitize=undefined', '-fno-sanitize-recover=undefined'],
|
||||
CPPPATH=["#"],
|
||||
tools=["default", "compilation_db"],
|
||||
)
|
||||
|
||||
# short colored build output, if the top-level pretty tool is present (main-repo build)
|
||||
_pretty = Dir('#tools/scons/site_tools').File('pretty.py')
|
||||
if not _pretty.exists():
|
||||
_pretty = Dir('#site_scons/site_tools').File('pretty.py')
|
||||
if _pretty.exists():
|
||||
env.Tool('pretty', toolpath=[_pretty.dir.abspath])
|
||||
|
||||
# The Mull plugin injects mutations that are dormant unless run with mull-runner
|
||||
if system == "Darwin":
|
||||
mull_plugin = Dir('#').abspath + '/.mull/lib/mull-ir-frontend-18'
|
||||
else:
|
||||
mull_plugin = '/usr/lib/mull-ir-frontend-18'
|
||||
if os.path.exists(mull_plugin):
|
||||
# Only use mull plugin if it exists
|
||||
env['CC'] = 'clang-18'
|
||||
env.Append(CFLAGS=['-fprofile-arcs', '-ftest-coverage', f'-fpass-plugin={mull_plugin}'])
|
||||
env.Append(LINKFLAGS=['-fprofile-arcs', '-ftest-coverage'])
|
||||
if system == "Darwin":
|
||||
env.PrependENVPath('PATH', '/opt/homebrew/opt/llvm@18/bin')
|
||||
|
||||
safety = env.SharedObject("safety.os", "safety.c")
|
||||
libsafety = env.SharedLibrary("libsafety.so", [safety])
|
||||
|
||||
# GCC-style note file is generated by compiler, allow scons to clean it up
|
||||
env.SideEffect("safety.gcno", safety)
|
||||
0
iqdbc_repo/iqdbc/safety/tests/libsafety/__init__.py
Normal file
0
iqdbc_repo/iqdbc/safety/tests/libsafety/__init__.py
Normal file
12
iqdbc_repo/iqdbc/safety/tests/libsafety/fake_stm.h
Normal file
12
iqdbc_repo/iqdbc/safety/tests/libsafety/fake_stm.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define ALLOW_DEBUG
|
||||
|
||||
// TODO: time should just be passed into the hooks we expose
|
||||
uint32_t timer_cnt = 0;
|
||||
uint32_t microsecond_timer_get(void);
|
||||
uint32_t microsecond_timer_get(void) {
|
||||
return timer_cnt;
|
||||
}
|
||||
120
iqdbc_repo/iqdbc/safety/tests/libsafety/libsafety_py.py
Normal file
120
iqdbc_repo/iqdbc/safety/tests/libsafety/libsafety_py.py
Normal file
@@ -0,0 +1,120 @@
|
||||
import os
|
||||
from cffi import FFI
|
||||
|
||||
from iqdbc.safety import LEN_TO_DLC
|
||||
|
||||
libsafety_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
libsafety_fn = os.path.join(libsafety_dir, "libsafety.so")
|
||||
|
||||
ffi = FFI()
|
||||
|
||||
ffi.cdef("""
|
||||
typedef struct {
|
||||
unsigned char fd : 1;
|
||||
unsigned char bus : 3;
|
||||
unsigned char data_len_code : 4;
|
||||
unsigned char rejected : 1;
|
||||
unsigned char returned : 1;
|
||||
unsigned char extended : 1;
|
||||
unsigned int addr : 29;
|
||||
unsigned char checksum;
|
||||
unsigned char data[64];
|
||||
} CANPacket_t;
|
||||
""", packed=True)
|
||||
class CANPacket:
|
||||
pass
|
||||
|
||||
ffi.cdef("""
|
||||
bool safety_rx_hook(CANPacket_t *msg);
|
||||
bool safety_tx_hook(CANPacket_t *msg);
|
||||
int safety_fwd_hook(int bus_num, int addr);
|
||||
int set_safety_hooks(uint16_t mode, uint16_t param);
|
||||
|
||||
void set_controls_allowed(bool c);
|
||||
bool get_controls_allowed(void);
|
||||
void set_heartbeat_engaged(bool c);
|
||||
bool get_longitudinal_allowed(void);
|
||||
bool get_longitudinal_gas_allowed(void);
|
||||
bool get_longitudinal_brake_allowed(void);
|
||||
void set_alternative_experience(int mode);
|
||||
int get_alternative_experience(void);
|
||||
void set_relay_malfunction(bool c);
|
||||
bool get_relay_malfunction(void);
|
||||
bool get_gas_pressed_prev(void);
|
||||
void set_gas_pressed_prev(bool);
|
||||
bool get_brake_pressed_prev(void);
|
||||
bool get_regen_braking_prev(void);
|
||||
bool get_steering_disengage_prev(void);
|
||||
bool get_acc_main_on(void);
|
||||
float get_vehicle_speed_min(void);
|
||||
float get_vehicle_speed_max(void);
|
||||
int get_current_safety_mode(void);
|
||||
int get_current_safety_param(void);
|
||||
|
||||
void set_torque_meas(int min, int max);
|
||||
int get_torque_meas_min(void);
|
||||
int get_torque_meas_max(void);
|
||||
void set_torque_driver(int min, int max);
|
||||
int get_torque_driver_min(void);
|
||||
int get_torque_driver_max(void);
|
||||
void set_desired_torque_last(int t);
|
||||
void set_rt_torque_last(int t);
|
||||
void set_desired_angle_last(int t);
|
||||
int get_desired_angle_last();
|
||||
void set_angle_meas(int min, int max);
|
||||
int get_angle_meas_min(void);
|
||||
int get_angle_meas_max(void);
|
||||
|
||||
bool get_cruise_engaged_prev(void);
|
||||
void set_cruise_engaged_prev(bool engaged);
|
||||
bool get_vehicle_moving(void);
|
||||
void set_timer(uint32_t t);
|
||||
|
||||
void safety_tick_current_safety_config();
|
||||
bool safety_config_valid();
|
||||
|
||||
void init_tests(void);
|
||||
|
||||
void set_honda_fwd_brake(bool c);
|
||||
bool get_honda_fwd_brake(void);
|
||||
void set_honda_alt_brake_msg(bool c);
|
||||
void set_honda_bosch_long(bool c);
|
||||
int get_honda_hw(void);
|
||||
|
||||
bool get_lat_active(void);
|
||||
bool get_controls_allowed_lat(void);
|
||||
bool get_controls_requested_lat(void);
|
||||
void set_current_safety_param_iq(uint16_t param);
|
||||
uint16_t get_current_safety_param_iq(void);
|
||||
bool get_enable_aol(void);
|
||||
bool get_disengage_lateral_on_brake(void);
|
||||
bool get_pause_lateral_on_brake(void);
|
||||
void set_aol_button_press(int aol_button_press);
|
||||
void set_controls_allowed_lat(bool c);
|
||||
void set_controls_requested_lat(bool c);
|
||||
bool get_aol_acc_main(void);
|
||||
void set_acc_main_on(bool c);
|
||||
int get_aol_button_press(void);
|
||||
void aol_set_current_disengage_reason(int reason);
|
||||
int aol_get_current_disengage_reason(void);
|
||||
int get_temp_debug(void);
|
||||
uint32_t get_acc_main_on_mismatches(void);
|
||||
void set_aol_params(bool enable_aol, bool disengage_lateral_on_brake, bool pause_lateral_on_brake);
|
||||
void set_heartbeat_engaged_aol(bool c);
|
||||
void aol_heartbeat_engaged_check(void);
|
||||
void set_steering_disengage(bool c);
|
||||
int get_gas_interceptor_prev(void);
|
||||
""")
|
||||
|
||||
class LibSafety:
|
||||
pass
|
||||
libsafety: LibSafety = ffi.dlopen(libsafety_fn)
|
||||
|
||||
def make_CANPacket(addr: int, bus: int, dat):
|
||||
ret = ffi.new('CANPacket_t *')
|
||||
ret[0].extended = 1 if addr >= 0x800 else 0
|
||||
ret[0].addr = addr
|
||||
ret[0].data_len_code = LEN_TO_DLC[len(dat)]
|
||||
ret[0].bus = bus
|
||||
ret[0].data = bytes(dat)
|
||||
return ret
|
||||
315
iqdbc_repo/iqdbc/safety/tests/libsafety/safety.c
Normal file
315
iqdbc_repo/iqdbc/safety/tests/libsafety/safety.c
Normal file
@@ -0,0 +1,315 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// TODO: time should just be passed into the hooks we expose
|
||||
uint32_t timer_cnt = 0;
|
||||
uint32_t microsecond_timer_get(void);
|
||||
uint32_t microsecond_timer_get(void) {
|
||||
return timer_cnt;
|
||||
}
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "iqdbc/safety/can.h"
|
||||
|
||||
void can_send(CANPacket_t *to_push, uint8_t bus_number, bool skip_tx_hook) {
|
||||
(void)to_push; (void)bus_number; (void)skip_tx_hook;
|
||||
}
|
||||
|
||||
void can_set_checksum(CANPacket_t *packet) {
|
||||
(void)packet;
|
||||
}
|
||||
|
||||
#include "iqdbc/safety/safety.h"
|
||||
|
||||
void safety_tick_current_safety_config() {
|
||||
safety_tick(¤t_safety_config);
|
||||
}
|
||||
|
||||
bool safety_config_valid() {
|
||||
if (current_safety_config.rx_checks_len <= 0) {
|
||||
printf("missing RX checks\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < current_safety_config.rx_checks_len; i++) {
|
||||
const RxCheck addr = current_safety_config.rx_checks[i];
|
||||
bool valid = addr.status.msg_seen && !addr.status.lagging && addr.status.valid_checksum && (addr.status.wrong_counters < MAX_WRONG_COUNTERS) && addr.status.valid_quality_flag;
|
||||
if (!valid) {
|
||||
// printf("i %d seen %d lagging %d valid checksum %d wrong counters %d valid quality flag %d\n", i, addr.status.msg_seen, addr.status.lagging, addr.status.valid_checksum, addr.status.wrong_counters, addr.status.valid_quality_flag);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void set_controls_allowed(bool c){
|
||||
controls_allowed = c;
|
||||
}
|
||||
|
||||
void set_heartbeat_engaged(bool c){
|
||||
heartbeat_engaged = c;
|
||||
}
|
||||
|
||||
void set_alternative_experience(int mode){
|
||||
alternative_experience = mode;
|
||||
}
|
||||
|
||||
void set_relay_malfunction(bool c){
|
||||
relay_malfunction = c;
|
||||
}
|
||||
|
||||
bool get_controls_allowed(void){
|
||||
return controls_allowed;
|
||||
}
|
||||
|
||||
int get_alternative_experience(void){
|
||||
return alternative_experience;
|
||||
}
|
||||
|
||||
bool get_relay_malfunction(void){
|
||||
return relay_malfunction;
|
||||
}
|
||||
|
||||
bool get_gas_pressed_prev(void){
|
||||
return gas_pressed_prev;
|
||||
}
|
||||
|
||||
void set_gas_pressed_prev(bool c){
|
||||
gas_pressed_prev = c;
|
||||
}
|
||||
|
||||
bool get_brake_pressed_prev(void){
|
||||
return brake_pressed_prev;
|
||||
}
|
||||
|
||||
bool get_regen_braking_prev(void){
|
||||
return regen_braking_prev;
|
||||
}
|
||||
|
||||
bool get_steering_disengage_prev(void){
|
||||
return steering_disengage_prev;
|
||||
}
|
||||
|
||||
bool get_cruise_engaged_prev(void){
|
||||
return cruise_engaged_prev;
|
||||
}
|
||||
|
||||
void set_cruise_engaged_prev(bool engaged){
|
||||
cruise_engaged_prev = engaged;
|
||||
}
|
||||
|
||||
bool get_vehicle_moving(void){
|
||||
return vehicle_moving;
|
||||
}
|
||||
|
||||
bool get_acc_main_on(void){
|
||||
return acc_main_on;
|
||||
}
|
||||
|
||||
float get_vehicle_speed_min(void){
|
||||
return vehicle_speed.min / VEHICLE_SPEED_FACTOR;
|
||||
}
|
||||
|
||||
float get_vehicle_speed_max(void){
|
||||
return vehicle_speed.max / VEHICLE_SPEED_FACTOR;
|
||||
}
|
||||
|
||||
int get_current_safety_mode(void){
|
||||
return current_safety_mode;
|
||||
}
|
||||
|
||||
int get_current_safety_param(void){
|
||||
return current_safety_param;
|
||||
}
|
||||
|
||||
void set_timer(uint32_t t){
|
||||
timer_cnt = t;
|
||||
}
|
||||
|
||||
void set_torque_meas(int min, int max){
|
||||
torque_meas.min = min;
|
||||
torque_meas.max = max;
|
||||
}
|
||||
|
||||
int get_torque_meas_min(void){
|
||||
return torque_meas.min;
|
||||
}
|
||||
|
||||
int get_torque_meas_max(void){
|
||||
return torque_meas.max;
|
||||
}
|
||||
|
||||
void set_torque_driver(int min, int max){
|
||||
torque_driver.min = min;
|
||||
torque_driver.max = max;
|
||||
}
|
||||
|
||||
int get_torque_driver_min(void){
|
||||
return torque_driver.min;
|
||||
}
|
||||
|
||||
int get_torque_driver_max(void){
|
||||
return torque_driver.max;
|
||||
}
|
||||
|
||||
void set_rt_torque_last(int t){
|
||||
rt_torque_last = t;
|
||||
}
|
||||
|
||||
void set_desired_torque_last(int t){
|
||||
desired_torque_last = t;
|
||||
}
|
||||
|
||||
void set_desired_angle_last(int t){
|
||||
desired_angle_last = t;
|
||||
}
|
||||
|
||||
int get_desired_angle_last(void){
|
||||
return desired_angle_last;
|
||||
}
|
||||
|
||||
void set_angle_meas(int min, int max){
|
||||
angle_meas.min = min;
|
||||
angle_meas.max = max;
|
||||
}
|
||||
|
||||
int get_angle_meas_min(void){
|
||||
return angle_meas.min;
|
||||
}
|
||||
|
||||
int get_angle_meas_max(void){
|
||||
return angle_meas.max;
|
||||
}
|
||||
|
||||
|
||||
// ***** car specific helpers *****
|
||||
|
||||
void set_honda_alt_brake_msg(bool c){
|
||||
honda_alt_brake_msg = c;
|
||||
}
|
||||
|
||||
void set_honda_bosch_long(bool c){
|
||||
honda_bosch_long = c;
|
||||
}
|
||||
|
||||
int get_honda_hw(void) {
|
||||
return honda_hw;
|
||||
}
|
||||
|
||||
void set_honda_fwd_brake(bool c){
|
||||
honda_fwd_brake = c;
|
||||
}
|
||||
|
||||
bool get_honda_fwd_brake(void){
|
||||
return honda_fwd_brake;
|
||||
}
|
||||
|
||||
static AOLState *get_aol_state(void) {
|
||||
return &m_aol_state;
|
||||
}
|
||||
|
||||
bool get_lat_active(void){
|
||||
return is_lat_active();
|
||||
}
|
||||
|
||||
bool get_controls_allowed_lat(void){
|
||||
return aol_is_lateral_control_allowed_by_aol();
|
||||
}
|
||||
|
||||
bool get_controls_requested_lat(void){
|
||||
return get_aol_state()->controls_requested_lat;
|
||||
}
|
||||
|
||||
bool get_enable_aol(void){
|
||||
return get_aol_state()->system_enabled;
|
||||
}
|
||||
|
||||
bool get_disengage_lateral_on_brake(void){
|
||||
return get_aol_state()->disengage_lateral_on_brake;
|
||||
}
|
||||
|
||||
bool get_pause_lateral_on_brake(void){
|
||||
return get_aol_state()->pause_lateral_on_brake;
|
||||
}
|
||||
|
||||
void set_acc_main_on(bool c){
|
||||
acc_main_on = c;
|
||||
}
|
||||
|
||||
void set_current_safety_param_iq(uint16_t param){
|
||||
current_safety_param_iq = param;
|
||||
}
|
||||
|
||||
uint16_t get_current_safety_param_iq(void){
|
||||
return current_safety_param_iq;
|
||||
}
|
||||
|
||||
void set_aol_button_press(int c){
|
||||
aol_button_press = c;
|
||||
}
|
||||
|
||||
int get_aol_button_press(void){
|
||||
return aol_button_press;
|
||||
}
|
||||
|
||||
void set_controls_allowed_lat(bool c){
|
||||
m_aol_state.controls_allowed_lat = c;
|
||||
}
|
||||
|
||||
bool get_aol_acc_main(void){
|
||||
return m_aol_state.acc_main.current;
|
||||
}
|
||||
|
||||
int aol_get_current_disengage_reason(void) {
|
||||
return get_aol_state()->current_disengage.active_reason;
|
||||
}
|
||||
|
||||
void aol_set_current_disengage_reason(int reason) {
|
||||
m_aol_state.current_disengage.active_reason = reason;
|
||||
}
|
||||
|
||||
void set_controls_requested_lat(bool c){
|
||||
m_aol_state.controls_requested_lat = c;
|
||||
}
|
||||
|
||||
void set_aol_params(bool enable_aol, bool disengage_lateral_on_brake, bool pause_lateral_on_brake){
|
||||
alternative_experience = 0;
|
||||
if (enable_aol) {
|
||||
alternative_experience |= ALT_EXP_ENABLE_AOL;
|
||||
|
||||
if (disengage_lateral_on_brake) {
|
||||
alternative_experience |= ALT_EXP_AOL_DISENGAGE_LATERAL_ON_BRAKE;
|
||||
} else if (pause_lateral_on_brake) {
|
||||
alternative_experience |= ALT_EXP_AOL_PAUSE_LATERAL_ON_BRAKE;
|
||||
} else {
|
||||
}
|
||||
}
|
||||
|
||||
aol_set_alternative_experience(&alternative_experience);
|
||||
}
|
||||
|
||||
void set_heartbeat_engaged_aol(bool c){
|
||||
heartbeat_engaged_aol = c;
|
||||
}
|
||||
|
||||
void set_steering_disengage(bool c){
|
||||
steering_disengage = c;
|
||||
}
|
||||
|
||||
int get_gas_interceptor_prev(void){
|
||||
return gas_interceptor_prev;
|
||||
}
|
||||
|
||||
void init_tests(void){
|
||||
safety_mode_cnt = 2U; // avoid ignoring relay_malfunction logic
|
||||
alternative_experience = 0;
|
||||
current_safety_param_iq = 0;
|
||||
set_timer(0);
|
||||
ts_steer_req_mismatch_last = 0;
|
||||
valid_steer_req_count = 0;
|
||||
invalid_steer_req_count = 0;
|
||||
|
||||
// assumes summon on safety mode init to avoid a fault. get rid of that for testing
|
||||
tesla_summon = false;
|
||||
}
|
||||
Reference in New Issue
Block a user