diff --git a/selfdrive/car/cruise.py b/selfdrive/car/cruise.py index b12081f9a9..589bd36f43 100644 --- a/selfdrive/car/cruise.py +++ b/selfdrive/car/cruise.py @@ -44,10 +44,15 @@ class VCruiseHelper: def _get_short_press_delta(self, is_metric, starpilot_toggles: SimpleNamespace) -> float: base_delta = 1. if is_metric else IMPERIAL_INCREMENT - return base_delta * starpilot_toggles.cruise_increase + return base_delta * self._get_cruise_delta_interval(starpilot_toggles.cruise_increase) + + @staticmethod + def _get_cruise_delta_interval(interval: float | None) -> float: + return interval if isinstance(interval, (int, float)) and interval > 0 else 1.0 def _normalize_initialized_v_cruise(self, v_cruise_kph: float, starpilot_toggles: SimpleNamespace) -> float: - if starpilot_toggles.cruise_increase % 5 != 0: + cruise_increase = self._get_cruise_delta_interval(starpilot_toggles.cruise_increase) + if cruise_increase % 5 != 0: return v_cruise_kph v_cruise_delta = self._get_short_press_delta(starpilot_toggles.is_metric, starpilot_toggles) @@ -119,7 +124,8 @@ class VCruiseHelper: if not self.button_change_states[button_type]["enabled"]: return - v_cruise_delta_interval = starpilot_toggles.cruise_increase_long if long_press else starpilot_toggles.cruise_increase + delta_interval = starpilot_toggles.cruise_increase_long if long_press else starpilot_toggles.cruise_increase + v_cruise_delta_interval = self._get_cruise_delta_interval(delta_interval) v_cruise_delta = v_cruise_delta * v_cruise_delta_interval if v_cruise_delta_interval % 5 == 0 and self.v_cruise_kph % v_cruise_delta != 0: # partial interval self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta diff --git a/selfdrive/car/tests/test_cruise_speed.py b/selfdrive/car/tests/test_cruise_speed.py index a71273a0d8..c6a3b78ba1 100644 --- a/selfdrive/car/tests/test_cruise_speed.py +++ b/selfdrive/car/tests/test_cruise_speed.py @@ -232,3 +232,31 @@ class TestVCruiseHelper: ) assert self.v_cruise_helper.v_cruise_kph == initial_v_cruise_kph + + def test_missing_custom_cruise_toggles_fall_back_to_single_step(self): + self.enable(V_CRUISE_INITIAL * CV.KPH_TO_MS, False) + initial_v_cruise_kph = self.v_cruise_helper.v_cruise_kph + self.starpilot_toggles.cruise_increase = None + self.starpilot_toggles.cruise_increase_long = None + + pressed_cs = car.CarState(cruiseState={"available": True}) + pressed_cs.buttonEvents = [ButtonEvent(type=ButtonType.accelCruise, pressed=True)] + self.v_cruise_helper.update_v_cruise( + pressed_cs, + enabled=True, + is_metric=False, + speed_limit_changed=False, + starpilot_toggles=self.starpilot_toggles, + ) + + released_cs = car.CarState(cruiseState={"available": True}) + released_cs.buttonEvents = [ButtonEvent(type=ButtonType.accelCruise, pressed=False)] + self.v_cruise_helper.update_v_cruise( + released_cs, + enabled=True, + is_metric=False, + speed_limit_changed=False, + starpilot_toggles=self.starpilot_toggles, + ) + + assert self.v_cruise_helper.v_cruise_kph == pytest.approx(initial_v_cruise_kph + IMPERIAL_INCREMENT)