# CAN controls for MQB platform Volkswagen, Audi, Skoda and SEAT.
# PQ35/PQ46/NMS, and any future MLB, to come later.
def create_mqb_steering_control ( packer , bus , apply_steer , idx , lkas_enabled ) :
values = {
" SET_ME_0X3 " : 0x3 ,
" Assist_Torque " : abs ( apply_steer ) ,
" Assist_Requested " : lkas_enabled ,
" Assist_VZ " : 1 if apply_steer < 0 else 0 ,
" HCA_Available " : 1 ,
" HCA_Standby " : not lkas_enabled ,
" HCA_Active " : lkas_enabled ,
" SET_ME_0XFE " : 0xFE ,
" SET_ME_0X07 " : 0x07 ,
}
return packer . make_can_msg ( " HCA_01 " , bus , values , idx )
def create_mqb_hud_control ( packer , bus , enabled , steering_pressed , hud_alert , left_lane_visible , right_lane_visible ,
ldw_stock_values , left_lane_depart , right_lane_depart ) :
# Lane color reference:
# 0 (LKAS disabled) - off
# 1 (LKAS enabled, no lane detected) - dark gray
# 2 (LKAS enabled, lane detected) - light gray on VW, green or white on Audi depending on year or virtual cockpit. On a color MFD on a 2015 A3 TDI it is white, virtual cockpit on a 2018 A3 e-Tron its green.
# 3 (LKAS enabled, lane departure detected) - white on VW, red on Audi
values = ldw_stock_values . copy ( )
values . update ( {
" LDW_Status_LED_gelb " : 1 if enabled and steering_pressed else 0 ,
" LDW_Status_LED_gruen " : 1 if enabled and not steering_pressed else 0 ,
" LDW_Lernmodus_links " : 3 if left_lane_depart else 1 + left_lane_visible ,
" LDW_Lernmodus_rechts " : 3 if right_lane_depart else 1 + right_lane_visible ,
" LDW_Texte " : hud_alert ,
} )
return packer . make_can_msg ( " LDW_02 " , bus , values )
def create_mqb_acc_buttons_control ( packer , bus , buttonStatesToSend , CS , idx ) :
values = {
" GRA_Hauptschalter " : CS . graHauptschalter ,
" GRA_Abbrechen " : buttonStatesToSend [ " cancel " ] ,
" GRA_Tip_Setzen " : buttonStatesToSend [ " setCruise " ] ,
" GRA_Tip_Hoch " : buttonStatesToSend [ " accelCruise " ] ,
" GRA_Tip_Runter " : buttonStatesToSend [ " decelCruise " ] ,
" GRA_Tip_Wiederaufnahme " : buttonStatesToSend [ " resumeCruise " ] ,
" GRA_Verstellung_Zeitluecke " : 3 if buttonStatesToSend [ " gapAdjustCruise " ] else 0 ,
" GRA_Typ_Hauptschalter " : CS . graTypHauptschalter ,
" GRA_Codierung " : 2 ,
" GRA_Tip_Stufe_2 " : CS . graTipStufe2 ,
" GRA_ButtonTypeInfo " : CS . graButtonTypeInfo
}
return packer . make_can_msg ( " GRA_ACC_01 " , bus , values , idx )