@ -132,26 +132,29 @@ def apply_std_steer_angle_limits(apply_angle, apply_angle_last, v_ego, LIMITS):
return clip ( apply_angle , apply_angle_last - angle_rate_lim , apply_angle_last + angle_rate_lim )
return clip ( apply_angle , apply_angle_last - angle_rate_lim , apply_angle_last + angle_rate_lim )
def common_fault_avoidance ( measured_value : float , max_value : float , request : int , current_reques t_frames: int = 0 ,
def common_fault_avoidance ( measured_value : float , max_value : float , request : bool , above_limi t_frames: int ,
max_request_frames : int = 1 , cut_request _frames : int = 1 ) :
max_above_limit_frames : int , max_mismatching _frames: int = 1 ) :
"""
"""
Several cars have the ability to work around their EPS limits by cutting the
Several cars have the ability to work around their EPS limits by cutting the
request bit of their LKAS message after a certain number of frames above the limit .
request bit of their LKAS message after a certain number of frames above the limit .
"""
"""
# Count up to max_request_frames, at which point we need to cut the request for cut_reques t_frames to avoid a fault
# Count up to max_above_limit_frames, at which point we need to cut the request for above_limi t_frames to avoid a fault
if request and abs ( measured_value ) > = max_value :
if request and abs ( measured_value ) > = max_value :
current_reques t_frames + = 1
above_limi t_frames + = 1
else :
else :
current_request_frames = 0
above_limit_frames = 0
# Once we cut the request bit, count additionally to max_mismatching_frames before setting the request bit high again.
# Some brands do not respect our workaround without multiple messages on the bus, for example
if above_limit_frames > max_above_limit_frames :
request = False
if above_limit_frames > = max_above_limit_frames + max_mismatching_frames :
above_limit_frames = 0
if current_request_frames > max_request_frames :
return above_limit_frames , request
request = 0
if current_request_frames > = max_request_frames + cut_request_frames :
current_request_frames = 0
return current_request_frames , request
def crc8_pedal ( data ) :
def crc8_pedal ( data ) :
crc = 0xFF # standard init value
crc = 0xFF # standard init value