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.
94 lines
2.9 KiB
94 lines
2.9 KiB
import crcmod
|
|
|
|
from common.conversions import Conversions as CV
|
|
from selfdrive.car.tesla.values import CANBUS, CarControllerParams
|
|
|
|
|
|
class TeslaCAN:
|
|
def __init__(self, packer, pt_packer):
|
|
self.packer = packer
|
|
self.pt_packer = pt_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, counter):
|
|
values = {
|
|
"DAS_steeringAngleRequest": -angle,
|
|
"DAS_steeringHapticRequest": 0,
|
|
"DAS_steeringControlType": 1 if enabled else 0,
|
|
"DAS_steeringControlCounter": counter,
|
|
}
|
|
|
|
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):
|
|
# We copy this whole message when spamming cancel
|
|
values = {s: msg_stw_actn_req[s] for s in [
|
|
"SpdCtrlLvr_Stat",
|
|
"VSL_Enbl_Rq",
|
|
"SpdCtrlLvrStat_Inv",
|
|
"DTR_Dist_Rq",
|
|
"TurnIndLvr_Stat",
|
|
"HiBmLvr_Stat",
|
|
"WprWashSw_Psd",
|
|
"WprWash_R_Sw_Posn_V2",
|
|
"StW_Lvr_Stat",
|
|
"StW_Cond_Flt",
|
|
"StW_Cond_Psd",
|
|
"HrnSw_Psd",
|
|
"StW_Sw00_Psd",
|
|
"StW_Sw01_Psd",
|
|
"StW_Sw02_Psd",
|
|
"StW_Sw03_Psd",
|
|
"StW_Sw04_Psd",
|
|
"StW_Sw05_Psd",
|
|
"StW_Sw06_Psd",
|
|
"StW_Sw07_Psd",
|
|
"StW_Sw08_Psd",
|
|
"StW_Sw09_Psd",
|
|
"StW_Sw10_Psd",
|
|
"StW_Sw11_Psd",
|
|
"StW_Sw12_Psd",
|
|
"StW_Sw13_Psd",
|
|
"StW_Sw14_Psd",
|
|
"StW_Sw15_Psd",
|
|
"WprSw6Posn",
|
|
"MC_STW_ACTN_RQ",
|
|
"CRC_STW_ACTN_RQ",
|
|
]}
|
|
|
|
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)
|
|
|
|
def create_longitudinal_commands(self, acc_state, speed, min_accel, max_accel, cnt):
|
|
messages = []
|
|
values = {
|
|
"DAS_setSpeed": speed * CV.MS_TO_KPH,
|
|
"DAS_accState": acc_state,
|
|
"DAS_aebEvent": 0,
|
|
"DAS_jerkMin": CarControllerParams.JERK_LIMIT_MIN,
|
|
"DAS_jerkMax": CarControllerParams.JERK_LIMIT_MAX,
|
|
"DAS_accelMin": min_accel,
|
|
"DAS_accelMax": max_accel,
|
|
"DAS_controlCounter": cnt,
|
|
"DAS_controlChecksum": 0,
|
|
}
|
|
|
|
for packer, bus in [(self.packer, CANBUS.chassis), (self.pt_packer, CANBUS.powertrain)]:
|
|
data = packer.make_can_msg("DAS_control", bus, values)[2]
|
|
values["DAS_controlChecksum"] = self.checksum(0x2b9, data[:7])
|
|
messages.append(packer.make_can_msg("DAS_control", bus, values))
|
|
return messages
|
|
|