@ -4,18 +4,19 @@ from common.conversions import Conversions as CV
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 opendbc . can . can_define import CANDefine
from selfdrive . car . volkswagen . values import DBC_FILES , CANBUS , NetworkLocation , TransmissionType , GearShifter , BUTTON_STATES , CarControllerParams
from selfdrive . car . volkswagen . values import DBC_FILES , CANBUS , NetworkLocation , TransmissionType , GearShifter , \
CarControllerParams , MQB_BUTTONS
class CarState ( CarStateBase ) :
class CarState ( CarStateBase ) :
def __init__ ( self , CP ) :
def __init__ ( self , CP ) :
super ( ) . __init__ ( CP )
super ( ) . __init__ ( CP )
self . button_states = { button . event_type : False for button in MQB_BUTTONS }
can_define = CANDefine ( DBC_FILES . mqb )
can_define = CANDefine ( DBC_FILES . mqb )
if CP . transmissionType == TransmissionType . automatic :
if CP . transmissionType == TransmissionType . automatic :
self . shifter_values = can_define . dv [ " Getriebe_11 " ] [ " GE_Fahrstufe " ]
self . shifter_values = can_define . dv [ " Getriebe_11 " ] [ " GE_Fahrstufe " ]
elif CP . transmissionType == TransmissionType . direct :
elif CP . transmissionType == TransmissionType . direct :
self . shifter_values = can_define . dv [ " EV_Gearshift " ] [ " GearPosition " ]
self . shifter_values = can_define . dv [ " EV_Gearshift " ] [ " GearPosition " ]
self . hca_status_values = can_define . dv [ " LH_EPS_03 " ] [ " EPS_HCA_Status " ]
self . hca_status_values = can_define . dv [ " LH_EPS_03 " ] [ " EPS_HCA_Status " ]
self . buttonStates = BUTTON_STATES . copy ( )
def update ( self , pt_cp , cam_cp , ext_cp , trans_type ) :
def update ( self , pt_cp , cam_cp , ext_cp , trans_type ) :
ret = car . CarState . new_message ( )
ret = car . CarState . new_message ( )
@ -114,26 +115,20 @@ class CarState(CarStateBase):
if ret . cruiseState . speed > 90 :
if ret . cruiseState . speed > 90 :
ret . cruiseState . speed = 0
ret . cruiseState . speed = 0
# Update control button states for turn signals and ACC controls.
# Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough
self . buttonStates [ " accelCruise " ] = bool ( pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Tip_Hoch " ] )
self . buttonStates [ " decelCruise " ] = bool ( pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Tip_Runter " ] )
self . buttonStates [ " cancel " ] = bool ( pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Abbrechen " ] )
self . buttonStates [ " setCruise " ] = bool ( pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Tip_Setzen " ] )
self . buttonStates [ " resumeCruise " ] = bool ( pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Tip_Wiederaufnahme " ] )
self . buttonStates [ " gapAdjustCruise " ] = bool ( pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Verstellung_Zeitluecke " ] )
ret . leftBlinker = bool ( pt_cp . vl [ " Blinkmodi_02 " ] [ " Comfort_Signal_Left " ] )
ret . leftBlinker = bool ( pt_cp . vl [ " Blinkmodi_02 " ] [ " Comfort_Signal_Left " ] )
ret . rightBlinker = bool ( pt_cp . vl [ " Blinkmodi_02 " ] [ " Comfort_Signal_Right " ] )
ret . rightBlinker = bool ( pt_cp . vl [ " Blinkmodi_02 " ] [ " Comfort_Signal_Right " ] )
self . gra_stock_values = pt_cp . vl [ " GRA_ACC_01 " ]
# Read ACC hardware button type configuration info that has to pass thru
buttonEvents = [ ]
# to the radar. Ends up being different for steering wheel buttons vs
for button in MQB_BUTTONS :
# third stalk type controls.
state = pt_cp . vl [ button . can_addr ] [ button . can_msg ] in button . values
self . graHauptschalter = pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Hauptschalter " ]
if self . button_states [ button . event_type ] != state :
self . graTypHauptschalter = pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Typ_Hauptschalter " ]
event = car . CarState . ButtonEvent . new_message ( )
self . graButtonTypeInfo = pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_ButtonTypeInfo " ]
event . type = button . event_type
self . graTipStufe2 = pt_cp . vl [ " GRA_ACC_01 " ] [ " GRA_Tip_Stufe_2 " ]
event . pressed = state
# Pick up the GRA_ACC_01 CAN message counter so we can sync to it for
buttonEvents . append ( event )
# later cruise-control button spamming.
self . button_states [ button . event_type ] = state
self . graMsgBusCounter = pt_cp . vl [ " GRA_ACC_01 " ] [ " COUNTER " ]
ret . buttonEvents = buttonEvents
# Additional safety checks performed in CarInterface.
# Additional safety checks performed in CarInterface.
ret . espDisabled = pt_cp . vl [ " ESP_21 " ] [ " ESP_Tastung_passiv " ] != 0
ret . espDisabled = pt_cp . vl [ " ESP_21 " ] [ " ESP_Tastung_passiv " ] != 0
@ -181,6 +176,7 @@ class CarState(CarStateBase):
( " GRA_Tip_Wiederaufnahme " , " GRA_ACC_01 " ) , # ACC button, resume
( " GRA_Tip_Wiederaufnahme " , " GRA_ACC_01 " ) , # ACC button, resume
( " GRA_Verstellung_Zeitluecke " , " GRA_ACC_01 " ) , # ACC button, time gap adj
( " GRA_Verstellung_Zeitluecke " , " GRA_ACC_01 " ) , # ACC button, time gap adj
( " GRA_Typ_Hauptschalter " , " GRA_ACC_01 " ) , # ACC main button type
( " GRA_Typ_Hauptschalter " , " GRA_ACC_01 " ) , # ACC main button type
( " GRA_Codierung " , " GRA_ACC_01 " ) , # ACC button configuration/coding
( " GRA_Tip_Stufe_2 " , " GRA_ACC_01 " ) , # unknown related to stalk type
( " GRA_Tip_Stufe_2 " , " GRA_ACC_01 " ) , # unknown related to stalk type
( " GRA_ButtonTypeInfo " , " GRA_ACC_01 " ) , # unknown related to stalk type
( " GRA_ButtonTypeInfo " , " GRA_ACC_01 " ) , # unknown related to stalk type
( " COUNTER " , " GRA_ACC_01 " ) , # GRA_ACC_01 CAN message counter
( " COUNTER " , " GRA_ACC_01 " ) , # GRA_ACC_01 CAN message counter