You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.4 KiB
42 lines
1.4 KiB
4 years ago
|
import copy
|
||
|
import crcmod
|
||
|
from opendbc.can.can_define import CANDefine
|
||
|
from selfdrive.car.tesla.values import CANBUS
|
||
|
|
||
|
|
||
|
class TeslaCAN:
|
||
|
def __init__(self, dbc_name, packer):
|
||
|
self.can_define = CANDefine(dbc_name)
|
||
|
self.packer = packer
|
||
|
self.crc = crcmod.mkCrcFun(0x11d, initCrc=0x00, rev=False, xorOut=0xff)
|
||
|
|
||
|
@staticmethod
|
||
|
def checksum(msg_id, dat):
|
||
|
# TODO: get message ID from name instead
|
||
|
ret = (msg_id & 0xFF) + ((msg_id >> 8) & 0xFF)
|
||
|
ret += sum(dat)
|
||
|
return ret & 0xFF
|
||
|
|
||
|
def create_steering_control(self, angle, enabled, frame):
|
||
|
values = {
|
||
|
"DAS_steeringAngleRequest": -angle,
|
||
|
"DAS_steeringHapticRequest": 0,
|
||
|
"DAS_steeringControlType": 1 if enabled else 0,
|
||
|
"DAS_steeringControlCounter": (frame % 16),
|
||
|
}
|
||
|
|
||
|
data = self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)[2]
|
||
|
values["DAS_steeringControlChecksum"] = self.checksum(0x488, data[:3])
|
||
|
return self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)
|
||
|
|
||
|
def create_action_request(self, msg_stw_actn_req, cancel, bus, counter):
|
||
|
values = copy.copy(msg_stw_actn_req)
|
||
|
|
||
|
if cancel:
|
||
|
values["SpdCtrlLvr_Stat"] = 1
|
||
|
values["MC_STW_ACTN_RQ"] = counter
|
||
|
|
||
|
data = self.packer.make_can_msg("STW_ACTN_RQ", bus, values)[2]
|
||
|
values["CRC_STW_ACTN_RQ"] = self.crc(data[:7])
|
||
|
return self.packer.make_can_msg("STW_ACTN_RQ", bus, values)
|