teslacan.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import copy
  2. import crcmod
  3. from common.conversions import Conversions as CV
  4. from selfdrive.car.tesla.values import CANBUS, CarControllerParams
  5. class TeslaCAN:
  6. def __init__(self, packer, pt_packer):
  7. self.packer = packer
  8. self.pt_packer = pt_packer
  9. self.crc = crcmod.mkCrcFun(0x11d, initCrc=0x00, rev=False, xorOut=0xff)
  10. @staticmethod
  11. def checksum(msg_id, dat):
  12. # TODO: get message ID from name instead
  13. ret = (msg_id & 0xFF) + ((msg_id >> 8) & 0xFF)
  14. ret += sum(dat)
  15. return ret & 0xFF
  16. def create_steering_control(self, angle, enabled, frame):
  17. values = {
  18. "DAS_steeringAngleRequest": -angle,
  19. "DAS_steeringHapticRequest": 0,
  20. "DAS_steeringControlType": 1 if enabled else 0,
  21. "DAS_steeringControlCounter": (frame % 16),
  22. }
  23. data = self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)[2]
  24. values["DAS_steeringControlChecksum"] = self.checksum(0x488, data[:3])
  25. return self.packer.make_can_msg("DAS_steeringControl", CANBUS.chassis, values)
  26. def create_action_request(self, msg_stw_actn_req, cancel, bus, counter):
  27. values = copy.copy(msg_stw_actn_req)
  28. if cancel:
  29. values["SpdCtrlLvr_Stat"] = 1
  30. values["MC_STW_ACTN_RQ"] = counter
  31. data = self.packer.make_can_msg("STW_ACTN_RQ", bus, values)[2]
  32. values["CRC_STW_ACTN_RQ"] = self.crc(data[:7])
  33. return self.packer.make_can_msg("STW_ACTN_RQ", bus, values)
  34. def create_longitudinal_commands(self, acc_state, speed, min_accel, max_accel, cnt):
  35. messages = []
  36. values = {
  37. "DAS_setSpeed": speed * CV.MS_TO_KPH,
  38. "DAS_accState": acc_state,
  39. "DAS_aebEvent": 0,
  40. "DAS_jerkMin": CarControllerParams.JERK_LIMIT_MIN,
  41. "DAS_jerkMax": CarControllerParams.JERK_LIMIT_MAX,
  42. "DAS_accelMin": min_accel,
  43. "DAS_accelMax": max_accel,
  44. "DAS_controlCounter": cnt,
  45. "DAS_controlChecksum": 0,
  46. }
  47. for packer, bus in [(self.packer, CANBUS.chassis), (self.pt_packer, CANBUS.powertrain)]:
  48. data = packer.make_can_msg("DAS_control", bus, values)[2]
  49. values["DAS_controlChecksum"] = self.checksum(0x2b9, data[:7])
  50. messages.append(packer.make_can_msg("DAS_control", bus, values))
  51. return messages