@ -4,7 +4,7 @@ from opendbc.can.can_define import CANDefine
from selfdrive . car . interfaces import CarStateBase
from selfdrive . car . interfaces import CarStateBase
from opendbc . can . parser import CANParser
from opendbc . can . parser import CANParser
from selfdrive . config import Conversions as CV
from selfdrive . config import Conversions as CV
from selfdrive . car . toyota . values import CAR , DBC , STEER_THRESHOLD , TSS2_CAR , NO_DSU_CAR , NO_ STOP_TIMER_CAR
from selfdrive . car . toyota . values import CAR , DBC , STEER_THRESHOLD , TSS2_CAR , NO_STOP_TIMER_CAR
class CarState ( CarStateBase ) :
class CarState ( CarStateBase ) :
@ -12,8 +12,15 @@ class CarState(CarStateBase):
super ( ) . __init__ ( CP )
super ( ) . __init__ ( CP )
can_define = CANDefine ( DBC [ CP . carFingerprint ] [ ' pt ' ] )
can_define = CANDefine ( DBC [ CP . carFingerprint ] [ ' pt ' ] )
self . shifter_values = can_define . dv [ " GEAR_PACKET " ] [ ' GEAR ' ]
self . shifter_values = can_define . dv [ " GEAR_PACKET " ] [ ' GEAR ' ]
# All TSS2 car have the accurate sensor
self . accurate_steer_angle_seen = CP . carFingerprint in TSS2_CAR
# On NO_DSU cars but not TSS2 cars the cp.vl["STEER_TORQUE_SENSOR"]['STEER_ANGLE']
# is zeroed to where the steering angle is at start.
# Need to apply an offset as soon as the steering angle measurements are both received
self . needs_angle_offset = CP . carFingerprint not in TSS2_CAR
self . angle_offset = 0.
self . angle_offset = 0.
self . init_angle_offset = False
def update ( self , cp , cp_cam ) :
def update ( self , cp , cp_cam ) :
ret = car . CarState . new_message ( )
ret = car . CarState . new_message ( )
@ -40,18 +47,21 @@ class CarState(CarStateBase):
ret . standstill = ret . vEgoRaw < 0.001
ret . standstill = ret . vEgoRaw < 0.001
if self . CP . carFingerprint in TSS2_CAR :
# Some newer models have a more accurate angle measurement in the TORQUE_SENSOR message. Use if non-zero
ret . steeringAngle = cp . vl [ " STEER_TORQUE_SENSOR " ] [ ' STEER_ANGLE ' ]
if abs ( cp . vl [ " STEER_TORQUE_SENSOR " ] [ ' STEER_ANGLE ' ] ) > 1e-3 :
elif self . CP . carFingerprint in NO_DSU_CAR :
self . accurate_steer_angle_seen = True
# cp.vl["STEER_TORQUE_SENSOR"]['STEER_ANGLE'] is zeroed to where the steering angle is at start.
# need to apply an offset as soon as the steering angle measurements are both received
if self . accurate_steer_angle_seen :
ret . steeringAngle = cp . vl [ " STEER_TORQUE_SENSOR " ] [ ' STEER_ANGLE ' ] - self . angle_offset
ret . steeringAngle = cp . vl [ " STEER_TORQUE_SENSOR " ] [ ' STEER_ANGLE ' ] - self . angle_offset
angle_wheel = cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_ANGLE ' ] + cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_FRACTION ' ]
if abs ( angle_wheel ) > 1e-3 and abs ( ret . steeringAngle ) > 1e-3 and not self . init_angle_offset :
if self . needs_angle_offset :
self . init_angle_offset = True
angle_wheel = cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_ANGLE ' ] + cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_FRACTION ' ]
self . angle_offset = ret . steeringAngle - angle_wheel
if abs ( angle_wheel ) > 1e-3 and abs ( ret . steeringAngle ) > 1e-3 :
self . needs_angle_offset = False
self . angle_offset = ret . steeringAngle - angle_wheel
else :
else :
ret . steeringAngle = cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_ANGLE ' ] + cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_FRACTION ' ]
ret . steeringAngle = cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_ANGLE ' ] + cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_FRACTION ' ]
ret . steeringRate = cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_RATE ' ]
ret . steeringRate = cp . vl [ " STEER_ANGLE_SENSOR " ] [ ' STEER_RATE ' ]
can_gear = int ( cp . vl [ " GEAR_PACKET " ] [ ' GEAR ' ] )
can_gear = int ( cp . vl [ " GEAR_PACKET " ] [ ' GEAR ' ] )
ret . gearShifter = self . parse_gear_shifter ( self . shifter_values . get ( can_gear , None ) )
ret . gearShifter = self . parse_gear_shifter ( self . shifter_values . get ( can_gear , None ) )
@ -118,6 +128,7 @@ class CarState(CarStateBase):
( " CRUISE_STATE " , " PCM_CRUISE " , 0 ) ,
( " CRUISE_STATE " , " PCM_CRUISE " , 0 ) ,
( " STEER_TORQUE_DRIVER " , " STEER_TORQUE_SENSOR " , 0 ) ,
( " STEER_TORQUE_DRIVER " , " STEER_TORQUE_SENSOR " , 0 ) ,
( " STEER_TORQUE_EPS " , " STEER_TORQUE_SENSOR " , 0 ) ,
( " STEER_TORQUE_EPS " , " STEER_TORQUE_SENSOR " , 0 ) ,
( " STEER_ANGLE " , " STEER_TORQUE_SENSOR " , 0 ) ,
( " TURN_SIGNALS " , " STEERING_LEVERS " , 3 ) , # 3 is no blinkers
( " TURN_SIGNALS " , " STEERING_LEVERS " , 3 ) , # 3 is no blinkers
( " LKA_STATE " , " EPS_STATUS " , 0 ) ,
( " LKA_STATE " , " EPS_STATUS " , 0 ) ,
( " BRAKE_LIGHTS_ACC " , " ESP_CONTROL " , 0 ) ,
( " BRAKE_LIGHTS_ACC " , " ESP_CONTROL " , 0 ) ,
@ -144,8 +155,6 @@ class CarState(CarStateBase):
signals . append ( ( " LOW_SPEED_LOCKOUT " , " PCM_CRUISE_2 " , 0 ) )
signals . append ( ( " LOW_SPEED_LOCKOUT " , " PCM_CRUISE_2 " , 0 ) )
checks . append ( ( " PCM_CRUISE_2 " , 33 ) )
checks . append ( ( " PCM_CRUISE_2 " , 33 ) )
if CP . carFingerprint in NO_DSU_CAR :
signals + = [ ( " STEER_ANGLE " , " STEER_TORQUE_SENSOR " , 0 ) ]
if CP . carFingerprint == CAR . PRIUS :
if CP . carFingerprint == CAR . PRIUS :
signals + = [ ( " STATE " , " AUTOPARK_STATUS " , 0 ) ]
signals + = [ ( " STATE " , " AUTOPARK_STATUS " , 0 ) ]