#!/usr/bin/env python3
import cereal . messaging as messaging
from opendbc . can . packer import CANPacker
from selfdrive . boardd . boardd_api_impl import can_list_to_can_capnp # pylint: disable=no-name-in-module,import-error
from selfdrive . car . honda . values import FINGERPRINTS , CAR
from selfdrive . car import crc8_pedal
import math
from selfdrive . test . longitudinal_maneuvers . plant import get_car_can_parser
cp = get_car_can_parser ( )
packer = CANPacker ( " honda_civic_touring_2016_can_generated " )
rpacker = CANPacker ( " acura_ilx_2016_nidec " )
SR = 7.5
def angle_to_sangle ( angle ) :
return - math . degrees ( angle ) * SR
def can_function ( pm , speed , angle , idx , cruise_button = 0 , is_engaged = False ) :
msg = [ ]
msg . append ( packer . make_can_msg ( " ENGINE_DATA " , 0 , { " XMISSION_SPEED " : speed } , idx ) )
msg . append ( packer . make_can_msg ( " WHEEL_SPEEDS " , 0 ,
{ " WHEEL_SPEED_FL " : speed ,
" WHEEL_SPEED_FR " : speed ,
" WHEEL_SPEED_RL " : speed ,
" WHEEL_SPEED_RR " : speed } , - 1 ) )
msg . append ( packer . make_can_msg ( " SCM_BUTTONS " , 0 , { " CRUISE_BUTTONS " : cruise_button } , idx ) )
values = { " COUNTER_PEDAL " : idx & 0xF }
checksum = crc8_pedal ( packer . make_can_msg ( " GAS_SENSOR " , 0 , { " COUNTER_PEDAL " : idx & 0xF } , - 1 ) [ 2 ] [ : - 1 ] )
values [ " CHECKSUM_PEDAL " ] = checksum
msg . append ( packer . make_can_msg ( " GAS_SENSOR " , 0 , values , - 1 ) )
msg . append ( packer . make_can_msg ( " GEARBOX " , 0 , { " GEAR " : 4 , " GEAR_SHIFTER " : 8 } , idx ) )
msg . append ( packer . make_can_msg ( " GAS_PEDAL_2 " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " SEATBELT_STATUS " , 0 , { " SEATBELT_DRIVER_LATCHED " : 1 } , idx ) )
msg . append ( packer . make_can_msg ( " STEER_STATUS " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " STEERING_SENSORS " , 0 , { " STEER_ANGLE " : angle_to_sangle ( angle ) } , idx ) )
msg . append ( packer . make_can_msg ( " POWERTRAIN_DATA " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " VSA_STATUS " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " STANDSTILL " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " STEER_MOTOR_TORQUE " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " EPB_STATUS " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " DOORS_STATUS " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " CRUISE_PARAMS " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " CRUISE " , 0 , { } , idx ) )
msg . append ( packer . make_can_msg ( " SCM_FEEDBACK " , 0 , { " MAIN_ON " : 1 } , idx ) )
msg . append ( packer . make_can_msg ( " POWERTRAIN_DATA " , 0 , { " ACC_STATUS " : int ( is_engaged ) } , idx ) )
#print(msg)
# cam bus
msg . append ( packer . make_can_msg ( " STEERING_CONTROL " , 2 , { } , idx ) )
msg . append ( packer . make_can_msg ( " ACC_HUD " , 2 , { } , idx ) )
msg . append ( packer . make_can_msg ( " BRAKE_COMMAND " , 2 , { } , idx ) )
# radar
if idx % 5 == 0 :
msg . append ( rpacker . make_can_msg ( " RADAR_DIAGNOSTIC " , 1 , { " RADAR_STATE " : 0x79 } , - 1 ) )
for i in range ( 16 ) :
msg . append ( rpacker . make_can_msg ( " TRACK_ %d " % i , 1 , { " LONG_DIST " : 255.5 } , - 1 ) )
# fill in the rest for fingerprint
done = set ( [ x [ 0 ] for x in msg ] )
for k , v in FINGERPRINTS [ CAR . CIVIC ] [ 0 ] . items ( ) :
if k not in done and k not in [ 0xE4 , 0x194 ] :
msg . append ( [ k , 0 , b ' \x00 ' * v , 0 ] )
pm . send ( ' can ' , can_list_to_can_capnp ( msg ) )
def sendcan_function ( sendcan ) :
sc = messaging . drain_sock_raw ( sendcan )
cp . update_strings ( sc , sendcan = True )
if cp . vl [ 0x1fa ] [ ' COMPUTER_BRAKE_REQUEST ' ] :
brake = cp . vl [ 0x1fa ] [ ' COMPUTER_BRAKE ' ] * 0.003906248
else :
brake = 0.0
if cp . vl [ 0x200 ] [ ' GAS_COMMAND ' ] > 0 :
gas = cp . vl [ 0x200 ] [ ' GAS_COMMAND ' ] / 256.0
else :
gas = 0.0
if cp . vl [ 0xe4 ] [ ' STEER_TORQUE_REQUEST ' ] :
steer_torque = cp . vl [ 0xe4 ] [ ' STEER_TORQUE ' ] * 1.0 / 0x1000
else :
steer_torque = 0.0
return ( gas , brake , steer_torque )