from opendbc . car import structs
from opendbc . car . crc import CRC8J1850
from opendbc . car . chrysler . values import RAM_CARS
GearShifter = structs . CarState . GearShifter
VisualAlert = structs . CarControl . HUDControl . VisualAlert
def create_lkas_hud ( packer , CP , lkas_active , hud_alert , hud_count , car_model , auto_high_beam ) :
# LKAS_HUD - Controls what lane-keeping icon is displayed
# == Color ==
# 0 hidden?
# 1 white
# 2 green
# 3 ldw
# == Lines ==
# 03 white Lines
# 04 grey lines
# 09 left lane close
# 0A right lane close
# 0B left Lane very close
# 0C right Lane very close
# 0D left cross cross
# 0E right lane cross
# == Alerts ==
# 7 Normal
# 6 lane departure place hands on wheel
color = 2 if lkas_active else 1
lines = 3 if lkas_active else 0
alerts = 7 if lkas_active else 0
if hud_count < ( 1 * 4 ) : # first 3 seconds, 4Hz
alerts = 1
if hud_alert in ( VisualAlert . ldw , VisualAlert . steerRequired ) :
color = 4
lines = 0
alerts = 6
values = {
" LKAS_ICON_COLOR " : color ,
" CAR_MODEL " : car_model ,
" LKAS_LANE_LINES " : lines ,
" LKAS_ALERTS " : alerts ,
}
if CP . carFingerprint in RAM_CARS :
values [ ' AUTO_HIGH_BEAM_ON ' ] = auto_high_beam
return packer . make_can_msg ( " DAS_6 " , 0 , values )
def create_lkas_command ( packer , CP , apply_torque , lkas_control_bit ) :
# LKAS_COMMAND Lane-keeping signal to turn the wheel
enabled_val = 2 if CP . carFingerprint in RAM_CARS else 1
values = {
" STEERING_TORQUE " : apply_torque ,
" LKAS_CONTROL_BIT " : enabled_val if lkas_control_bit else 0 ,
}
return packer . make_can_msg ( " LKAS_COMMAND " , 0 , values )
def create_cruise_buttons ( packer , frame , bus , cancel = False , resume = False ) :
values = {
" ACC_Cancel " : cancel ,
" ACC_Resume " : resume ,
" COUNTER " : frame % 0x10 ,
}
return packer . make_can_msg ( " CRUISE_BUTTONS " , bus , values )
def chrysler_checksum ( address : int , sig , d : bytearray ) - > int :
checksum = 0xFF
for j in range ( len ( d ) - 1 ) :
curr = d [ j ]
shift = 0x80
for _ in range ( 8 ) :
bit_sum = curr & shift
temp_chk = checksum & 0x80
if bit_sum :
bit_sum = 0x1C
if temp_chk :
bit_sum = 1
checksum = ( checksum << 1 ) & 0xFF
temp_chk = checksum | 1
bit_sum ^ = temp_chk
else :
if temp_chk :
bit_sum = 0x1D
checksum = ( checksum << 1 ) & 0xFF
bit_sum ^ = checksum
checksum = bit_sum & 0xFF
shift >> = 1
return ( ~ checksum ) & 0xFF
def fca_giorgio_checksum ( address : int , sig , d : bytearray ) - > int :
crc = 0
for i in range ( len ( d ) - 1 ) :
crc ^ = d [ i ]
crc = CRC8J1850 [ crc ]
if address == 0xDE :
return crc ^ 0x10
elif address == 0x106 :
return crc ^ 0xF6
elif address == 0x122 :
return crc ^ 0xF1
else :
return crc ^ 0x0A