from selfdrive . car import make_can_msg
def create_steering_control ( packer , bus , apply_steer , idx , lkas_active ) :
values = {
" LKASteeringCmdActive " : lkas_active ,
" LKASteeringCmd " : apply_steer ,
" RollingCounter " : idx ,
" LKASteeringCmdChecksum " : 0x1000 - ( lkas_active << 11 ) - ( apply_steer & 0x7ff ) - idx
}
return packer . make_can_msg ( " ASCMLKASteeringCmd " , bus , values )
def create_adas_keepalive ( bus ) :
dat = b " \x00 \x00 \x00 \x00 \x00 \x00 \x00 "
return [ make_can_msg ( 0x409 , dat , bus ) , make_can_msg ( 0x40a , dat , bus ) ]
def create_gas_regen_command ( packer , bus , throttle , idx , acc_engaged , at_full_stop ) :
values = {
" GasRegenCmdActive " : acc_engaged ,
" RollingCounter " : idx ,
" GasRegenCmdActiveInv " : 1 - acc_engaged ,
" GasRegenCmd " : throttle ,
" GasRegenFullStopActive " : at_full_stop ,
" GasRegenAlwaysOne " : 1 ,
" GasRegenAlwaysOne2 " : 1 ,
" GasRegenAlwaysOne3 " : 1 ,
}
dat = packer . make_can_msg ( " ASCMGasRegenCmd " , bus , values ) [ 2 ]
values [ " GasRegenChecksum " ] = ( ( ( 0xff - dat [ 1 ] ) & 0xff ) << 16 ) | \
( ( ( 0xff - dat [ 2 ] ) & 0xff ) << 8 ) | \
( ( 0x100 - dat [ 3 ] - idx ) & 0xff )
return packer . make_can_msg ( " ASCMGasRegenCmd " , bus , values )
def create_friction_brake_command ( packer , bus , apply_brake , idx , near_stop , at_full_stop ) :
if apply_brake == 0 :
mode = 0x1
else :
mode = 0xa
if at_full_stop :
mode = 0xd
# TODO: this is to have GM bringing the car to complete stop,
# but currently it conflicts with OP controls, so turned off.
#elif near_stop:
# mode = 0xb
brake = ( 0x1000 - apply_brake ) & 0xfff
checksum = ( 0x10000 - ( mode << 12 ) - brake - idx ) & 0xffff
values = {
" RollingCounter " : idx ,
" FrictionBrakeMode " : mode ,
" FrictionBrakeChecksum " : checksum ,
" FrictionBrakeCmd " : - apply_brake
}
return packer . make_can_msg ( " EBCMFrictionBrakeCmd " , bus , values )
def create_acc_dashboard_command ( packer , bus , acc_engaged , target_speed_kph , lead_car_in_sight , fcw ) :
# Not a bit shift, dash can round up based on low 4 bits.
target_speed = int ( target_speed_kph * 16 ) & 0xfff
values = {
" ACCAlwaysOne " : 1 ,
" ACCResumeButton " : 0 ,
" ACCSpeedSetpoint " : target_speed ,
" ACCGapLevel " : 3 * acc_engaged , # 3 "far", 0 "inactive"
" ACCCmdActive " : acc_engaged ,
" ACCAlwaysOne2 " : 1 ,
" ACCLeadCar " : lead_car_in_sight ,
" FCWAlert " : 0x3 if fcw else 0
}
return packer . make_can_msg ( " ASCMActiveCruiseControlStatus " , bus , values )
def create_adas_time_status ( bus , tt , idx ) :
dat = [ ( tt >> 20 ) & 0xff , ( tt >> 12 ) & 0xff , ( tt >> 4 ) & 0xff ,
( ( tt & 0xf ) << 4 ) + ( idx << 2 ) ]
chksum = 0x1000 - dat [ 0 ] - dat [ 1 ] - dat [ 2 ] - dat [ 3 ]
chksum = chksum & 0xfff
dat + = [ 0x40 + ( chksum >> 8 ) , chksum & 0xff , 0x12 ]
return make_can_msg ( 0xa1 , bytes ( dat ) , bus )
def create_adas_steering_status ( bus , idx ) :
dat = [ idx << 6 , 0xf0 , 0x20 , 0 , 0 , 0 ]
chksum = 0x60 + sum ( dat )
dat + = [ chksum >> 8 , chksum & 0xff ]
return make_can_msg ( 0x306 , bytes ( dat ) , bus )
def create_adas_accelerometer_speed_status ( bus , speed_ms , idx ) :
spd = int ( speed_ms * 16 ) & 0xfff
accel = 0 & 0xfff
# 0 if in park/neutral, 0x10 if in reverse, 0x08 for D/L
#stick = 0x08
near_range_cutoff = 0x27
near_range_mode = 1 if spd < = near_range_cutoff else 0
far_range_mode = 1 - near_range_mode
dat = [ 0x08 , spd >> 4 , ( ( spd & 0xf ) << 4 ) | ( accel >> 8 ) , accel & 0xff , 0 ]
chksum = 0x62 + far_range_mode + ( idx << 2 ) + dat [ 0 ] + dat [ 1 ] + dat [ 2 ] + dat [ 3 ] + dat [ 4 ]
dat + = [ ( idx << 5 ) + ( far_range_mode << 4 ) + ( near_range_mode << 3 ) + ( chksum >> 8 ) , chksum & 0xff ]
return make_can_msg ( 0x308 , bytes ( dat ) , bus )
def create_adas_headlights_status ( packer , bus ) :
values = {
" Always42 " : 0x42 ,
" Always4 " : 0x4 ,
}
return packer . make_can_msg ( " ASCMHeadlight " , bus , values )
def create_lka_icon_command ( bus , active , critical , steer ) :
if active and steer == 1 :
if critical :
dat = b " \x50 \xc0 \x14 "
else :
dat = b " \x50 \x40 \x18 "
elif active :
if critical :
dat = b " \x40 \xc0 \x14 "
else :
dat = b " \x40 \x40 \x18 "
else :
dat = b " \x00 \x00 \x00 "
return make_can_msg ( 0x104c006c , dat , bus )