@ -3,12 +3,23 @@ from cereal import car
from selfdrive . car . hyundai . values import DBC , STEER_THRESHOLD , FEATURES , EV_CAR , HYBRID_CAR
from selfdrive . car . hyundai . values import DBC , STEER_THRESHOLD , FEATURES , EV_CAR , HYBRID_CAR
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 opendbc . can . can_define import CANDefine
from selfdrive . config import Conversions as CV
from selfdrive . config import Conversions as CV
GearShifter = car . CarState . GearShifter
class CarState ( CarStateBase ) :
class CarState ( CarStateBase ) :
def __init__ ( self , CP ) :
super ( ) . __init__ ( CP )
can_define = CANDefine ( DBC [ CP . carFingerprint ] [ " pt " ] )
if self . CP . carFingerprint in FEATURES [ " use_cluster_gears " ] :
self . shifter_values = can_define . dv [ " CLU15 " ] [ " CF_Clu_Gear " ]
elif self . CP . carFingerprint in FEATURES [ " use_tcu_gears " ] :
self . shifter_values = can_define . dv [ " TCU12 " ] [ " CUR_GR " ]
else : # preferred and elect gear methods use same definition
self . shifter_values = can_define . dv [ " LVR12 " ] [ " CF_Lvr_Gear " ]
def update ( self , cp , cp_cam ) :
def update ( self , cp , cp_cam ) :
ret = car . CarState . new_message ( )
ret = car . CarState . new_message ( )
@ -66,57 +77,18 @@ class CarState(CarStateBase):
ret . gas = cp . vl [ " EMS12 " ] [ " PV_AV_CAN " ] / 100.
ret . gas = cp . vl [ " EMS12 " ] [ " PV_AV_CAN " ] / 100.
ret . gasPressed = bool ( cp . vl [ " EMS16 " ] [ " CF_Ems_AclAct " ] )
ret . gasPressed = bool ( cp . vl [ " EMS16 " ] [ " CF_Ems_AclAct " ] )
# TODO: refactor gear parsing in function
# Gear Selection via Cluster - For those Kia/Hyundai which are not fully discovered, we can use the Cluster Indicator for Gear Selection,
# Gear Selection via Cluster - For those Kia/Hyundai which are not fully discovered, we can use the Cluster Indicator for Gear Selection,
# as this seems to be standard over all cars, but is not the preferred method.
# as this seems to be standard over all cars, but is not the preferred method.
if self . CP . carFingerprint in FEATURES [ " use_cluster_gears " ] :
if self . CP . carFingerprint in FEATURES [ " use_cluster_gears " ] :
if cp . vl [ " CLU15 " ] [ " CF_Clu_InhibitD " ] == 1 :
gear = cp . vl [ " CLU15 " ] [ " CF_Clu_Gear " ]
ret . gearShifter = GearShifter . drive
elif cp . vl [ " CLU15 " ] [ " CF_Clu_InhibitN " ] == 1 :
ret . gearShifter = GearShifter . neutral
elif cp . vl [ " CLU15 " ] [ " CF_Clu_InhibitP " ] == 1 :
ret . gearShifter = GearShifter . park
elif cp . vl [ " CLU15 " ] [ " CF_Clu_InhibitR " ] == 1 :
ret . gearShifter = GearShifter . reverse
else :
ret . gearShifter = GearShifter . unknown
# Gear Selecton via TCU12
elif self . CP . carFingerprint in FEATURES [ " use_tcu_gears " ] :
elif self . CP . carFingerprint in FEATURES [ " use_tcu_gears " ] :
gear = cp . vl [ " TCU12 " ] [ " CUR_GR " ]
gear = cp . vl [ " TCU12 " ] [ " CUR_GR " ]
if gear == 0 :
ret . gearShifter = GearShifter . park
elif gear == 14 :
ret . gearShifter = GearShifter . reverse
elif gear > 0 and gear < 9 : # unaware of anything over 8 currently
ret . gearShifter = GearShifter . drive
else :
ret . gearShifter = GearShifter . unknown
# Gear Selecton - This is only compatible with optima hybrid 2017
elif self . CP . carFingerprint in FEATURES [ " use_elect_gears " ] :
elif self . CP . carFingerprint in FEATURES [ " use_elect_gears " ] :
gear = cp . vl [ " ELECT_GEAR " ] [ " Elect_Gear_Shifter " ]
gear = cp . vl [ " ELECT_GEAR " ] [ " Elect_Gear_Shifter " ]
if gear in ( 5 , 8 ) : # 5: D, 8: sport mode
ret . gearShifter = GearShifter . drive
elif gear == 6 :
ret . gearShifter = GearShifter . neutral
elif gear == 0 :
ret . gearShifter = GearShifter . park
elif gear == 7 :
ret . gearShifter = GearShifter . reverse
else :
ret . gearShifter = GearShifter . unknown
# Gear Selecton - This is not compatible with all Kia/Hyundai's, But is the best way for those it is compatible with
else :
else :
gear = cp . vl [ " LVR12 " ] [ " CF_Lvr_Gear " ]
gear = cp . vl [ " LVR12 " ] [ " CF_Lvr_Gear " ]
if gear in ( 5 , 8 ) : # 5: D, 8: sport mode
ret . gearShifter = GearShifter . drive
ret . gearShifter = self . parse_gear_shifter ( self . shifter_values . get ( gear ) )
elif gear == 6 :
ret . gearShifter = GearShifter . neutral
elif gear == 0 :
ret . gearShifter = GearShifter . park
elif gear == 7 :
ret . gearShifter = GearShifter . reverse
else :
ret . gearShifter = GearShifter . unknown
if self . CP . carFingerprint in FEATURES [ " use_fca " ] :
if self . CP . carFingerprint in FEATURES [ " use_fca " ] :
ret . stockAeb = cp . vl [ " FCA11 " ] [ " FCA_CmdAct " ] != 0
ret . stockAeb = cp . vl [ " FCA11 " ] [ " FCA_CmdAct " ] != 0
@ -255,10 +227,7 @@ class CarState(CarStateBase):
if CP . carFingerprint in FEATURES [ " use_cluster_gears " ] :
if CP . carFingerprint in FEATURES [ " use_cluster_gears " ] :
signals + = [
signals + = [
( " CF_Clu_InhibitD " , " CLU15 " , 0 ) ,
( " CF_Clu_Gear " , " CLU15 " , 0 ) ,
( " CF_Clu_InhibitP " , " CLU15 " , 0 ) ,
( " CF_Clu_InhibitN " , " CLU15 " , 0 ) ,
( " CF_Clu_InhibitR " , " CLU15 " , 0 ) ,
]
]
checks + = [
checks + = [
( " CLU15 " , 5 )
( " CLU15 " , 5 )