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.
58 lines
2.0 KiB
58 lines
2.0 KiB
2 months ago
|
from opendbc.car.common.conversions import Conversions as CV
|
||
|
from opendbc.car.interfaces import V_CRUISE_MAX
|
||
|
from opendbc.car.tesla.values import CANBUS, CarControllerParams
|
||
|
|
||
|
|
||
|
class TeslaCAN:
|
||
|
def __init__(self, packer):
|
||
|
self.packer = packer
|
||
|
|
||
|
@staticmethod
|
||
|
def checksum(msg_id, dat):
|
||
|
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.party, values)[1]
|
||
|
values["DAS_steeringControlChecksum"] = self.checksum(0x488, data[:3])
|
||
|
return self.packer.make_can_msg("DAS_steeringControl", CANBUS.party, values)
|
||
|
|
||
|
def create_longitudinal_command(self, acc_state, accel, cntr, v_ego, active):
|
||
|
set_speed = max(v_ego * CV.MS_TO_KPH, 0)
|
||
|
if active:
|
||
|
# TODO: this causes jerking after gas override when above set speed
|
||
|
set_speed = 0 if accel < 0 else V_CRUISE_MAX
|
||
|
|
||
|
values = {
|
||
|
"DAS_setSpeed": set_speed,
|
||
|
"DAS_accState": acc_state,
|
||
|
"DAS_aebEvent": 0,
|
||
|
"DAS_jerkMin": CarControllerParams.JERK_LIMIT_MIN,
|
||
|
"DAS_jerkMax": CarControllerParams.JERK_LIMIT_MAX,
|
||
|
"DAS_accelMin": accel,
|
||
|
"DAS_accelMax": max(accel, 0),
|
||
|
"DAS_controlCounter": cntr,
|
||
|
"DAS_controlChecksum": 0,
|
||
|
}
|
||
|
data = self.packer.make_can_msg("DAS_control", CANBUS.party, values)[1]
|
||
|
values["DAS_controlChecksum"] = self.checksum(0x2b9, data[:7])
|
||
|
return self.packer.make_can_msg("DAS_control", CANBUS.party, values)
|
||
|
|
||
|
def create_steering_allowed(self, counter):
|
||
|
values = {
|
||
|
"APS_eacAllow": 1,
|
||
|
"APS_eacMonitorCounter": counter,
|
||
|
}
|
||
|
|
||
|
data = self.packer.make_can_msg("APS_eacMonitor", CANBUS.party, values)[1]
|
||
|
values["APS_eacMonitorChecksum"] = self.checksum(0x27d, data[:2])
|
||
|
return self.packer.make_can_msg("APS_eacMonitor", CANBUS.party, values)
|