Source code for selfdrive.car.tesla.teslacan

import crcmod

from openpilot.common.conversions import Conversions as CV
from openpilot.selfdrive.car.tesla.values import CANBUS, CarControllerParams


[docs] 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)
[docs] @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
[docs] 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)
[docs] 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)
[docs] 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