@ -1,3 +1,4 @@
from cereal import car
from opendbc . can . parser import CANParser
from opendbc . can . parser import CANParser
from common . numpy_fast import mean
from common . numpy_fast import mean
from selfdrive . config import Conversions as CV
from selfdrive . config import Conversions as CV
@ -34,28 +35,26 @@ def get_can_parser(CP):
class CarState ( CarStateBase ) :
class CarState ( CarStateBase ) :
def update ( self , cp ) :
def update ( self , cp ) :
# update prevs, update must run once per loop
ret = car . CarState . new_message ( )
self . prev_left_blinker_on = self . left_blinker_on
ret . wheelSpeeds . rr = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRr_W_Meas ' ] * WHEEL_RADIUS
self . prev_right_blinker_on = self . right_blinker_on
ret . wheelSpeeds . rl = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRl_W_Meas ' ] * WHEEL_RADIUS
ret . wheelSpeeds . fr = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlFr_W_Meas ' ] * WHEEL_RADIUS
# calc best v_ego estimate, by averaging two opposite corners
ret . wheelSpeeds . fl = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlFl_W_Meas ' ] * WHEEL_RADIUS
self . v_wheel_fl = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRr_W_Meas ' ] * WHEEL_RADIUS
ret . vEgoRaw = mean ( [ ret . wheelSpeeds . rr , ret . wheelSpeeds . rl , ret . wheelSpeeds . fr , ret . wheelSpeeds . fl ] )
self . v_wheel_fr = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlRl_W_Meas ' ] * WHEEL_RADIUS
ret . vEgo , ret . aEgo = self . update_speed_kf ( ret . vEgoRaw )
self . v_wheel_rl = cp . vl [ " WheelSpeed_CG1 " ] [ ' WhlFr_W_Meas ' ] * WHEEL_RADIUS
ret . standstill = not ret . vEgoRaw > 0.001
self . v_wheel_rr = cp . vl [ " WheelSpeed _CG1" ] [ ' WhlFl_W_Mea s' ] * WHEEL_RADIUS
ret . steeringAngle = cp . vl [ " Steering_Wheel_Data _CG1" ] [ ' SteWhlRelInit_An_Sn s' ]
self . v_ego_raw = mean ( [ self . v_wheel_fl , self . v_wheel_fr , self . v_wheel_rl , self . v_wheel_rr ] )
ret . steeringPressed = not cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaHandsOff_B_Actl ' ]
self . v_ego , self . a_ego = self . update_speed_kf ( self . v_ego_raw )
ret . cruiseState . speed = cp . vl [ " Cruise_Status " ] [ ' Set_Speed ' ] * CV . MPH_TO_MS
self . standstill = not self . v_ego_raw > 0.001
ret . cruiseState . enabled = not ( cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ] in [ 0 , 3 ] )
ret . cruiseState . available = cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ] != 0
self . angle_steer s = cp . vl [ " Steering_Wheel_Data_CG1 " ] [ ' SteWhlRelInit_An_Sns ' ]
ret . ga s = cp . vl [ " EngineData_14 " ] [ ' ApedPosScal_Pc_Actl ' ] / 100.
self . v_cruise_pcm = cp . vl [ " Cruise_Status " ] [ ' Set_Speed ' ] * CV . MPH_TO_MS
ret . gasPressed = ret . gas > 1e-6
self . pcm_acc_status = cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ]
ret . brakePressed = bool ( cp . vl [ " Cruise_Status " ] [ " Brake_Drv_Appl " ] )
self . main_on = cp . vl [ " Cruise_Status " ] [ ' Cruise_State ' ] != 0
ret . brakeLights = bool ( cp . vl [ " BCM_to_HS_Body " ] [ " Brake_Lights " ] )
self . lkas_state = cp . vl [ " Lane_Keep_Assist_Statu s" ] [ ' LaActAvail_D_Actl ' ]
ret . genericToggle = bool ( cp . vl [ " Steering_Button s" ] [ " Dist_Incr " ] )
# TODO: we also need raw driver torque, needed for Assisted Lane Change
# TODO: we also need raw driver torque, needed for Assisted Lane Change
self . steer_override = not cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaHandsOff_B _Actl ' ]
self . lkas_state = cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaActAvail_D _Actl ' ]
self . steer_error = cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaActDeny_B_Actl ' ]
self . steer_error = cp . vl [ " Lane_Keep_Assist_Status " ] [ ' LaActDeny_B_Actl ' ]
self . user_gas = cp . vl [ " EngineData_14 " ] [ ' ApedPosScal_Pc_Actl ' ]
self . brake_pressed = bool ( cp . vl [ " Cruise_Status " ] [ " Brake_Drv_Appl " ] )
return ret
self . brake_lights = bool ( cp . vl [ " BCM_to_HS_Body " ] [ " Brake_Lights " ] )
self . generic_toggle = bool ( cp . vl [ " Steering_Buttons " ] [ " Dist_Incr " ] )