|
|
|
@ -1,4 +1,5 @@ |
|
|
|
|
from openpilot.common.conversions import Conversions as CV |
|
|
|
|
from openpilot.selfdrive.car import CanBusBase |
|
|
|
|
from openpilot.selfdrive.car.honda.values import HondaFlags, HONDA_BOSCH, HONDA_BOSCH_RADARLESS, CAR, CarControllerParams |
|
|
|
|
|
|
|
|
|
# CAN bus layout with relay |
|
|
|
@ -8,15 +9,34 @@ from openpilot.selfdrive.car.honda.values import HondaFlags, HONDA_BOSCH, HONDA_ |
|
|
|
|
# 3 = F-CAN A - OBDII port |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_pt_bus(car_fingerprint): |
|
|
|
|
return 1 if car_fingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) else 0 |
|
|
|
|
class CanBus(CanBusBase): |
|
|
|
|
def __init__(self, CP=None, fingerprint=None) -> None: |
|
|
|
|
# use fingerprint if specified |
|
|
|
|
super().__init__(CP if fingerprint is None else None, fingerprint) |
|
|
|
|
|
|
|
|
|
if CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS): |
|
|
|
|
self._pt, self._radar = self.offset + 1, self.offset |
|
|
|
|
else: |
|
|
|
|
self._pt, self._radar = self.offset, self.offset + 1 |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def pt(self) -> int: |
|
|
|
|
return self._pt |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def radar(self) -> int: |
|
|
|
|
return self._radar |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def camera(self) -> int: |
|
|
|
|
return self.offset + 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_lkas_cmd_bus(car_fingerprint, radar_disabled=False): |
|
|
|
|
def get_lkas_cmd_bus(CAN, car_fingerprint, radar_disabled=False): |
|
|
|
|
no_radar = car_fingerprint in HONDA_BOSCH_RADARLESS |
|
|
|
|
if radar_disabled or no_radar: |
|
|
|
|
# when radar is disabled, steering commands are sent directly to powertrain bus |
|
|
|
|
return get_pt_bus(car_fingerprint) |
|
|
|
|
return CAN.pt |
|
|
|
|
# normally steering commands are sent to radar, which forwards them to powertrain bus |
|
|
|
|
return 0 |
|
|
|
|
|
|
|
|
@ -26,7 +46,7 @@ def get_cruise_speed_conversion(car_fingerprint: str, is_metric: bool) -> float: |
|
|
|
|
return CV.MPH_TO_MS if car_fingerprint in HONDA_BOSCH_RADARLESS and not is_metric else CV.KPH_TO_MS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake): |
|
|
|
|
def create_brake_command(packer, CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake): |
|
|
|
|
# TODO: do we loose pressure if we keep pump off for long? |
|
|
|
|
brakelights = apply_brake > 0 |
|
|
|
|
brake_rq = apply_brake > 0 |
|
|
|
@ -47,13 +67,11 @@ def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_ |
|
|
|
|
"AEB_REQ_2": 0, |
|
|
|
|
"AEB_STATUS": 0, |
|
|
|
|
} |
|
|
|
|
bus = get_pt_bus(car_fingerprint) |
|
|
|
|
return packer.make_can_msg("BRAKE_COMMAND", bus, values) |
|
|
|
|
return packer.make_can_msg("BRAKE_COMMAND", CAN.pt, values) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_acc_commands(packer, enabled, active, accel, gas, stopping_counter, car_fingerprint): |
|
|
|
|
def create_acc_commands(packer, CAN, enabled, active, accel, gas, stopping_counter, car_fingerprint): |
|
|
|
|
commands = [] |
|
|
|
|
bus = get_pt_bus(car_fingerprint) |
|
|
|
|
min_gas_accel = CarControllerParams.BOSCH_GAS_LOOKUP_BP[0] |
|
|
|
|
|
|
|
|
|
control_on = 5 if enabled else 0 |
|
|
|
@ -90,37 +108,36 @@ def create_acc_commands(packer, enabled, active, accel, gas, stopping_counter, c |
|
|
|
|
"SET_TO_75": 0x75, |
|
|
|
|
"SET_TO_30": 0x30, |
|
|
|
|
} |
|
|
|
|
commands.append(packer.make_can_msg("ACC_CONTROL_ON", bus, acc_control_on_values)) |
|
|
|
|
commands.append(packer.make_can_msg("ACC_CONTROL_ON", CAN.pt, acc_control_on_values)) |
|
|
|
|
|
|
|
|
|
commands.append(packer.make_can_msg("ACC_CONTROL", bus, acc_control_values)) |
|
|
|
|
commands.append(packer.make_can_msg("ACC_CONTROL", CAN.pt, acc_control_values)) |
|
|
|
|
return commands |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_steering_control(packer, apply_steer, lkas_active, car_fingerprint, radar_disabled): |
|
|
|
|
def create_steering_control(packer, CAN, apply_steer, lkas_active, car_fingerprint, radar_disabled): |
|
|
|
|
values = { |
|
|
|
|
"STEER_TORQUE": apply_steer if lkas_active else 0, |
|
|
|
|
"STEER_TORQUE_REQUEST": lkas_active, |
|
|
|
|
} |
|
|
|
|
bus = get_lkas_cmd_bus(car_fingerprint, radar_disabled) |
|
|
|
|
bus = get_lkas_cmd_bus(CAN, car_fingerprint, radar_disabled) |
|
|
|
|
return packer.make_can_msg("STEERING_CONTROL", bus, values) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_bosch_supplemental_1(packer, car_fingerprint): |
|
|
|
|
def create_bosch_supplemental_1(packer, CAN, car_fingerprint): |
|
|
|
|
# non-active params |
|
|
|
|
values = { |
|
|
|
|
"SET_ME_X04": 0x04, |
|
|
|
|
"SET_ME_X80": 0x80, |
|
|
|
|
"SET_ME_X10": 0x10, |
|
|
|
|
} |
|
|
|
|
bus = get_lkas_cmd_bus(car_fingerprint) |
|
|
|
|
bus = get_lkas_cmd_bus(CAN, car_fingerprint) |
|
|
|
|
return packer.make_can_msg("BOSCH_SUPPLEMENTAL_1", bus, values) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, lkas_hud): |
|
|
|
|
def create_ui_commands(packer, CAN, CP, enabled, pcm_speed, hud, is_metric, acc_hud, lkas_hud): |
|
|
|
|
commands = [] |
|
|
|
|
bus_pt = get_pt_bus(CP.carFingerprint) |
|
|
|
|
radar_disabled = CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and CP.openpilotLongitudinalControl |
|
|
|
|
bus_lkas = get_lkas_cmd_bus(CP.carFingerprint, radar_disabled) |
|
|
|
|
bus_lkas = get_lkas_cmd_bus(CAN, CP.carFingerprint, radar_disabled) |
|
|
|
|
|
|
|
|
|
if CP.openpilotLongitudinalControl: |
|
|
|
|
acc_hud_values = { |
|
|
|
@ -144,7 +161,7 @@ def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, |
|
|
|
|
acc_hud_values['FCM_OFF_2'] = acc_hud['FCM_OFF_2'] |
|
|
|
|
acc_hud_values['FCM_PROBLEM'] = acc_hud['FCM_PROBLEM'] |
|
|
|
|
acc_hud_values['ICONS'] = acc_hud['ICONS'] |
|
|
|
|
commands.append(packer.make_can_msg("ACC_HUD", bus_pt, acc_hud_values)) |
|
|
|
|
commands.append(packer.make_can_msg("ACC_HUD", CAN.pt, acc_hud_values)) |
|
|
|
|
|
|
|
|
|
lkas_hud_values = { |
|
|
|
|
'SET_ME_X41': 0x41, |
|
|
|
@ -173,19 +190,19 @@ def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, |
|
|
|
|
'CMBS_OFF': 0x01, |
|
|
|
|
'SET_TO_1': 0x01, |
|
|
|
|
} |
|
|
|
|
commands.append(packer.make_can_msg('RADAR_HUD', bus_pt, radar_hud_values)) |
|
|
|
|
commands.append(packer.make_can_msg('RADAR_HUD', CAN.pt, radar_hud_values)) |
|
|
|
|
|
|
|
|
|
if CP.carFingerprint == CAR.CIVIC_BOSCH: |
|
|
|
|
commands.append(packer.make_can_msg("LEGACY_BRAKE_COMMAND", bus_pt, {})) |
|
|
|
|
commands.append(packer.make_can_msg("LEGACY_BRAKE_COMMAND", CAN.pt, {})) |
|
|
|
|
|
|
|
|
|
return commands |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def spam_buttons_command(packer, button_val, car_fingerprint): |
|
|
|
|
def spam_buttons_command(packer, CAN, button_val, car_fingerprint): |
|
|
|
|
values = { |
|
|
|
|
'CRUISE_BUTTONS': button_val, |
|
|
|
|
'CRUISE_SETTING': 0, |
|
|
|
|
} |
|
|
|
|
# send buttons to camera on radarless cars |
|
|
|
|
bus = 2 if car_fingerprint in HONDA_BOSCH_RADARLESS else get_pt_bus(car_fingerprint) |
|
|
|
|
bus = CAN.camera if car_fingerprint in HONDA_BOSCH_RADARLESS else CAN.pt |
|
|
|
|
return packer.make_can_msg("SCM_BUTTONS", bus, values) |
|
|
|
|