diff --git a/opendbc_repo/opendbc/car/honda/hondacan.py b/opendbc_repo/opendbc/car/honda/hondacan.py index 34364c208..8b7da37f4 100644 --- a/opendbc_repo/opendbc/car/honda/hondacan.py +++ b/opendbc_repo/opendbc/car/honda/hondacan.py @@ -167,18 +167,19 @@ def create_acc_hud(packer, bus, CP, enabled, pcm_speed, pcm_accel, hud_control, def create_lkas_hud(packer, bus, CP, hud_control, lat_active, steering_available, reduced_steering, alert_steer_required, lkas_hud): commands = [] + lanes_visible = bool(hud_control.lanesVisible or lat_active) lkas_hud_values = { 'LKAS_READY': 1, 'LKAS_STATE_CHANGE': 1, 'STEERING_REQUIRED': alert_steer_required, - 'SOLID_LANES': hud_control.lanesVisible, + 'SOLID_LANES': lanes_visible, 'BEEP': 0, } if CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD): lkas_hud_values['LANE_LINES'] = 3 - lkas_hud_values['DASHED_LANES'] = hud_control.lanesVisible + lkas_hud_values['DASHED_LANES'] = lanes_visible # car likely needs to see LKAS_PROBLEM fall within a specific time frame, so forward from camera # TODO: needed for Bosch CAN FD? @@ -192,8 +193,8 @@ def create_lkas_hud(packer, bus, CP, hud_control, lat_active, steering_available # New HUD concept for selected Bosch cars, overwrites some of the above # TODO: make global across all Honda if feedback is favorable if CP.carFingerprint in HONDA_BOSCH_ALT_RADAR: - lkas_hud_values['DASHED_LANES'] = steering_available - lkas_hud_values['SOLID_LANES'] = lat_active + lkas_hud_values['DASHED_LANES'] = bool(steering_available or lanes_visible) + lkas_hud_values['SOLID_LANES'] = lanes_visible lkas_hud_values['LKAS_PROBLEM'] = lat_active and reduced_steering if CP.flags & HondaFlags.BOSCH_EXT_HUD and not CP.openpilotLongitudinalControl: diff --git a/opendbc_repo/opendbc/car/honda/tests/test_honda.py b/opendbc_repo/opendbc/car/honda/tests/test_honda.py index f3725713f..b8e005314 100644 --- a/opendbc_repo/opendbc/car/honda/tests/test_honda.py +++ b/opendbc_repo/opendbc/car/honda/tests/test_honda.py @@ -11,6 +11,7 @@ from opendbc.car.honda.carcontroller import ( get_honda_bosch_wind_brake_mps2, update_honda_bosch_live_learning, ) +from opendbc.car.honda.hondacan import create_lkas_hud from opendbc.car.honda.fingerprints import FW_VERSIONS from opendbc.car.honda.values import CAR, HONDA_BOSCH, HONDA_BOSCH_TJA_CONTROL, HondaFlags @@ -18,6 +19,19 @@ HONDA_FW_VERSION_RE = rb"[A-Z0-9]{5}-[A-Z0-9]{3}(-|,)[A-Z0-9]{4}(\x00){2}$" class TestHondaFingerprint: + def test_honda_lkas_hud_shows_lane_lines_when_lateral_only_is_active(self): + class FakePacker: + @staticmethod + def make_can_msg(name, bus, values): + return name, bus, values + + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC_BOSCH) + hud_control = SimpleNamespace(lanesVisible=False) + + cmds = create_lkas_hud(FakePacker(), 0, CP, hud_control, True, True, False, False, {}) + + assert cmds[0][2]["SOLID_LANES"] is True + def test_fw_version_format(self): # Asserts all FW versions follow an expected format for fw_by_ecu in FW_VERSIONS.values(): diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index 11122f504..a0cc4a2ae 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -47,23 +47,23 @@ UNWIND_D_DES_THRESHOLD = -1.0 UNWIND_LAT_ACCEL_NEAR_ZERO = 0.3 MIN_LATERAL_CONTROL_SPEED = 0.3 CIVIC_BOSCH_MODIFIED_B_FIXED_FRICTION_THRESHOLD = 0.30 -CIVIC_BOSCH_MODIFIED_B_LAT_ACCEL_FACTOR_MULT = 1.10 +CIVIC_BOSCH_MODIFIED_B_LAT_ACCEL_FACTOR_MULT = 1.20 CIVIC_BOSCH_MODIFIED_B_TRANSITION_SPEED = 12.0 CIVIC_BOSCH_MODIFIED_B_PHASE_SCALE = 0.10 CIVIC_BOSCH_MODIFIED_B_FF_ONSET = 0.18 CIVIC_BOSCH_MODIFIED_B_FF_ONSET_WIDTH = 0.07 CIVIC_BOSCH_MODIFIED_B_FF_CUTOFF = 1.00 CIVIC_BOSCH_MODIFIED_B_FF_CUTOFF_WIDTH = 0.30 -CIVIC_BOSCH_MODIFIED_B_FF_REDUCTION_LEFT = 0.10 -CIVIC_BOSCH_MODIFIED_B_FF_REDUCTION_RIGHT = 0.16 -CIVIC_BOSCH_MODIFIED_B_TURN_IN_BOOST_LEFT = 0.02 -CIVIC_BOSCH_MODIFIED_B_TURN_IN_BOOST_RIGHT = 0.04 -CIVIC_BOSCH_MODIFIED_B_UNWIND_TAPER_LEFT = 0.28 -CIVIC_BOSCH_MODIFIED_B_UNWIND_TAPER_RIGHT = 0.34 -CIVIC_BOSCH_MODIFIED_B_TURN_IN_FRICTION_BOOST_LEFT = 0.01 -CIVIC_BOSCH_MODIFIED_B_TURN_IN_FRICTION_BOOST_RIGHT = 0.02 -CIVIC_BOSCH_MODIFIED_B_UNWIND_FRICTION_REDUCTION_LEFT = 0.18 -CIVIC_BOSCH_MODIFIED_B_UNWIND_FRICTION_REDUCTION_RIGHT = 0.24 +CIVIC_BOSCH_MODIFIED_B_FF_REDUCTION_LEFT = 0.14 +CIVIC_BOSCH_MODIFIED_B_FF_REDUCTION_RIGHT = 0.24 +CIVIC_BOSCH_MODIFIED_B_TURN_IN_BOOST_LEFT = 0.04 +CIVIC_BOSCH_MODIFIED_B_TURN_IN_BOOST_RIGHT = 0.00 +CIVIC_BOSCH_MODIFIED_B_UNWIND_TAPER_LEFT = 0.40 +CIVIC_BOSCH_MODIFIED_B_UNWIND_TAPER_RIGHT = 0.60 +CIVIC_BOSCH_MODIFIED_B_TURN_IN_FRICTION_BOOST_LEFT = 0.02 +CIVIC_BOSCH_MODIFIED_B_TURN_IN_FRICTION_BOOST_RIGHT = 0.00 +CIVIC_BOSCH_MODIFIED_B_UNWIND_FRICTION_REDUCTION_LEFT = 0.26 +CIVIC_BOSCH_MODIFIED_B_UNWIND_FRICTION_REDUCTION_RIGHT = 0.40 BOLT_2022_2023_CARS = ( GM_CAR.CHEVROLET_BOLT_ACC_2022_2023, diff --git a/selfdrive/controls/tests/test_latcontrol.py b/selfdrive/controls/tests/test_latcontrol.py index 257613f1e..dd22d0082 100644 --- a/selfdrive/controls/tests/test_latcontrol.py +++ b/selfdrive/controls/tests/test_latcontrol.py @@ -429,7 +429,7 @@ class TestLatControl: CI = CarInterface(CP, custom.StarPilotCarParams.new_message()) controller = LatControlTorque(CP.as_reader(), CI, DT_CTRL) - assert controller.torque_params.latAccelFactor == pytest.approx(3.0 * 1.10) + assert controller.torque_params.latAccelFactor == pytest.approx(3.0 * 1.20) def test_modified_civic_b_torque_ff_scale_curve(self): steady_left = get_civic_bosch_modified_b_ff_scale(0.5, 0.0, 12.0) diff --git a/starpilot/controls/starpilot_card.py b/starpilot/controls/starpilot_card.py index 82ec99982..640967408 100644 --- a/starpilot/controls/starpilot_card.py +++ b/starpilot/controls/starpilot_card.py @@ -86,6 +86,8 @@ class StarPilotCard: for be in carState.buttonEvents: if be.type == ButtonType.lkas and be.pressed and starpilot_toggles.always_on_lateral_lkas: self.always_on_lateral_allowed = not self.always_on_lateral_allowed + if carState.cruiseState.enabled or self.pause_lateral: + self.pause_lateral = not self.always_on_lateral_allowed elif be.type == ButtonType.mainCruise and be.pressed: if starpilot_toggles.always_on_lateral_main: self.always_on_lateral_allowed = not self.always_on_lateral_allowed diff --git a/starpilot/controls/tests/test_starpilot_card.py b/starpilot/controls/tests/test_starpilot_card.py index 9bcb6d348..50d43a543 100644 --- a/starpilot/controls/tests/test_starpilot_card.py +++ b/starpilot/controls/tests/test_starpilot_card.py @@ -88,6 +88,35 @@ def test_honda_lkas_button_can_toggle_always_on_lateral(monkeypatch, tmp_path): ret = card.update(car_state, starpilot_car_state, sm, toggles) assert ret.alwaysOnLateralAllowed is True + assert ret.pauseLateral is False + + +def test_honda_lkas_button_pauses_lateral_when_cruise_is_active(monkeypatch, tmp_path): + monkeypatch.setattr(spc, "Params", FakeParams) + monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False) + monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path) + + card = spc.StarPilotCard( + SimpleNamespace(brand="honda"), + SimpleNamespace(alternativeExperience=spc.ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL), + ) + card.always_on_lateral_allowed = True + + car_state = make_car_state(available=True, enabled=True, button_events=[SimpleNamespace(type=spc.ButtonType.lkas, pressed=True)]) + starpilot_car_state = SimpleNamespace(distancePressed=False) + sm = make_sm() + sm["selfdriveState"].active = True + toggles = make_toggles(always_on_lateral_lkas=True, lkas_allowed_for_aol=True) + + ret = card.update(car_state, starpilot_car_state, sm, toggles) + + assert ret.alwaysOnLateralAllowed is False + assert ret.pauseLateral is True + + ret = card.update(car_state, starpilot_car_state, sm, toggles) + + assert ret.alwaysOnLateralAllowed is True + assert ret.pauseLateral is False def test_main_aol_still_follows_cruise_main_for_other_platforms(monkeypatch, tmp_path):