From 53b82a17269d0f1501ecc9fbc482044ca3dcf764 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Thu, 29 Oct 2026 12:31:54 -0500 Subject: [PATCH] Put Cruise Intervals In Wheel Controls --- .../controllers/tests/test_cruise_action.py | 5 +++-- .../tests/test_offroad_configuration_pages.py | 17 ++++++++++------- .../starpilot/galaxy/tests/test_settings.py | 17 ++++++++++++----- .../starpilot/ui/feature_settings_owner.py | 4 ++-- .../ui/tests/test_cruise_interval_feature.py | 8 ++++---- .../tests/test_feature_settings_navigation.py | 2 +- .../starpilot/ui/tests/test_value_editors.py | 2 +- 7 files changed, 33 insertions(+), 22 deletions(-) diff --git a/openpilot/starpilot/controllers/tests/test_cruise_action.py b/openpilot/starpilot/controllers/tests/test_cruise_action.py index e2fcf5e778..4ee44d0dcc 100644 --- a/openpilot/starpilot/controllers/tests/test_cruise_action.py +++ b/openpilot/starpilot/controllers/tests/test_cruise_action.py @@ -152,12 +152,13 @@ class TestControllerCruise(unittest.TestCase): def test_actual_settings_capability_dependency_and_runtime_refresh(self): with tempfile.TemporaryDirectory() as directory: params=Params(directory) - vehicle=cp(True,'toyota') + vehicle=car.CarParams.new_message(pcmCruise=True, brand='toyota', carFingerprint='TEST', + openpilotLongitudinalControl=True) owner=FeatureSettingsOwner(params,lambda group:group in ('long', 'toyota_cruise'), vehicle_fingerprint=lambda:vehicle.carFingerprint, vehicle_params=lambda:vehicle) def rows(): - return {r.key:r for r in owner.snapshot(FeaturePage.PROFILES,parked=True,system_long=True, + return {r.key:r for r in owner.snapshot(FeaturePage.WHEEL,parked=True,system_long=True, lateral_context=False,metric=True).rows} self.assertNotIn('CustomCruise',rows()) self.assertNotIn('CustomCruiseLong',rows()) diff --git a/openpilot/starpilot/galaxy/tests/test_offroad_configuration_pages.py b/openpilot/starpilot/galaxy/tests/test_offroad_configuration_pages.py index 8dc7e77104..87f7004707 100644 --- a/openpilot/starpilot/galaxy/tests/test_offroad_configuration_pages.py +++ b/openpilot/starpilot/galaxy/tests/test_offroad_configuration_pages.py @@ -99,9 +99,9 @@ class TestOffroadConfigurationPages(unittest.TestCase): 'conditional/cem': ('Speed threshold', 'Speed with lead', 'Stop lights'), 'lane_change': ('Allow lane changes', 'Minimum lane-change speed', 'Automatic Lane Changes', 'Lane Change Speed'), 'slc': ('Speed Limit Controller', 'Automatic adoption'), - 'profiles': ('Short press', 'Hold', 'Force Stop', 'Selected Acceleration Profile', 'Selected Deceleration Profile'), + 'profiles': ('Force Stop', 'Selected Acceleration Profile', 'Selected Deceleration Profile'), 'torque': ('Steering Controller', 'Turn Assist', 'Lat Accel', 'Friction'), - 'wheel': ('Distance long press', 'MODE press', 'Star button'), + 'wheel': ('Short press', 'Hold', 'Distance long press', 'MODE press', 'Star button'), } for selection in (None, 'HYUNDAI_IONIQ_6'): self.params.put('VehicleSelection', json.loads(encode(selection)), block=True) @@ -153,11 +153,13 @@ class TestOffroadConfigurationPages(unittest.TestCase): selection = self.params.get('VehicleSelection') profiles = self.page('profiles') rows = {row['label']: row for row in profiles['rows']} - for label in ('Short press', 'Hold', 'Force Stop'): - self.assertTrue(rows[label]['available'], label) + self.assertTrue(rows['Force Stop']['available']) + self.assertNotIn('Short press', rows) + self.assertNotIn('Hold', rows) for label, key in (('Short press', 'CustomCruise'), ('Hold', 'CustomCruiseLong')): - current = self.page('profiles') + current = self.page('wheel') index = next(i for i, row in enumerate(current['rows']) if row['label'] == label) + self.assertTrue(current['rows'][index]['available'], label) before = float(current['rows'][index]['value']) intent = self.gateway.preview(current['view'], index, 1, 'session', b'generation') self.assertTrue(self.gateway.confirm(intent['intent'], 'session', b'generation')) @@ -184,8 +186,9 @@ class TestOffroadConfigurationPages(unittest.TestCase): def test_alpha_off_allows_saved_long_preferences_without_runtime_activation(self): self.params.put_bool('AlphaLongitudinalEnabled', False, block=True) - rows = {row['label']: row for row in self.page('profiles')['rows']} - for label in ('Short press', 'Hold', 'Force Stop'): + self.assertTrue(next(row for row in self.page('profiles')['rows'] if row['label'] == 'Force Stop')['available']) + rows = {row['label']: row for row in self.page('wheel')['rows']} + for label in ('Short press', 'Hold'): self.assertTrue(rows[label]['available'], label) self.assertFalse(self.context.sample().cp.openpilotLongitudinalControl) self.assertFalse(self.params.get_bool('AlphaLongitudinalEnabled')) diff --git a/openpilot/starpilot/galaxy/tests/test_settings.py b/openpilot/starpilot/galaxy/tests/test_settings.py index fe59aa0d98..cbb592651f 100644 --- a/openpilot/starpilot/galaxy/tests/test_settings.py +++ b/openpilot/starpilot/galaxy/tests/test_settings.py @@ -157,8 +157,10 @@ class SettingsGatewayTest(unittest.TestCase): self.params.put('CustomCruise', 2.0, block=True) self.params.put('CustomCruiseLong', 8.0, block=True) before = {key: read_saved(self.params, key, 128)[0] for key in ('CustomCruise', 'CustomCruiseLong')} + self.assertFalse(any(row['label'] in ('Short press', 'Hold', 'Swap Toyota Cruise Steps') + for row in self.page('profiles')['rows'])) for value, enabled in (('On', True), ('Off', False)): - page = self.page('profiles') + page = self.page('wheel') self.assertFalse(any(row['label'] in ('Short press', 'Hold') for row in page['rows'])) index = next(i for i, row in enumerate(page['rows']) if row['label'] == 'Swap Toyota Cruise Steps') self.assertTrue(page['rows'][index]['available']) @@ -170,7 +172,7 @@ class SettingsGatewayTest(unittest.TestCase): self.gateway.confirm(intent['intent'], self.session, self.generation) self.assertEqual({key: read_saved(self.params, key, 128)[0] for key in before}, before) self.context.value.cp.brand = 'honda' - self.assertFalse(any(row['label'] == 'Swap Toyota Cruise Steps' for row in self.page('profiles')['rows'])) + self.assertFalse(any(row['label'] == 'Swap Toyota Cruise Steps' for row in self.page('wheel')['rows'])) def test_row_revision_is_stable_only_for_same_source_vehicle_and_session(self): first, second = self.page("lane"), self.page("lane") @@ -192,8 +194,13 @@ class SettingsGatewayTest(unittest.TestCase): self.gateway.preview(changed_vehicle["revision"], 0, 1, self.session, self.generation) def test_direct_switch_and_slider_values_preserve_source_checks(self): - page = self.page("profiles") - page = self.page("profiles") + vehicle = ToyotaInterface.get_non_essential_params(ToyotaCar.TOYOTA_COROLLA_TSS2) + vehicle.pcmCruise = False + vehicle.openpilotLongitudinalControl = True + self.context.value = AuthorityContext(True, vehicle, vehicle.to_bytes()) + self.assertFalse(any(row['label'] in ('Short press', 'Hold', 'Swap Toyota Cruise Steps') + for row in self.page('profiles')['rows'])) + page = self.page("wheel") index = next(i for i, row in enumerate(page["rows"]) if row["label"] == "Short press") for invalid in (True, "nan", float("inf"), 0, 151, 2.5, "bogus"): with self.subTest(value=invalid), self.assertRaises(SettingsChanged): @@ -203,7 +210,7 @@ class SettingsGatewayTest(unittest.TestCase): self.assertEqual(self.params.get("CustomCruise"), 7.0) with self.assertRaises(SettingsChanged): self.gateway.preview(page["view"], index, 0, self.session, self.generation, value=9) - page = self.page("profiles") + page = self.page("wheel") intent = self.gateway.preview(page["view"], index, 0, self.session, self.generation, value=9) self.context.value = AuthorityContext(False, self.context.value.cp, self.context.value.cp_raw) self.assertTrue(self.gateway.confirm(intent["intent"], self.session, self.generation)) diff --git a/openpilot/starpilot/ui/feature_settings_owner.py b/openpilot/starpilot/ui/feature_settings_owner.py index 328f61ef98..b0522fe3a3 100644 --- a/openpilot/starpilot/ui/feature_settings_owner.py +++ b/openpilot/starpilot/ui/feature_settings_owner.py @@ -1054,6 +1054,8 @@ class FeatureSettingsOwner: repair_value="0" if not threshold_valid and unit_valid else "", default_value="0")) elif page == FeaturePage.WHEEL: title = "Wheel Controls" + if self.show_cruise_intervals or toyota_cruise_capability(self.vehicle_params()) is not None: + rows.extend(self._cruise_rows(configurable)) rows.extend(self.wheel.rows()) elif page == FeaturePage.SLC: system_long = (system_long if self.vehicle_params() is None else self.longitudinal_available()) and self.authority("slc") @@ -1130,8 +1132,6 @@ class FeatureSettingsOwner: rows.append(self._bool_row(PLANNER_SELECTION_KEY, "Use StarPilot Longitudinal Planner", self.authority("preferences"), reason="Off uses the upstream planner. Supported longitudinal control stays active. Changes apply on the next drive.")) allowed = configurable and system_long - if self.show_cruise_intervals or toyota_cruise_capability(self.vehicle_params()) is not None: - rows.extend(self._cruise_rows(configurable)) force_enabled, _, _ = self._value("ForceStops") rows.append(self._bool_row("ForceStops", "Force Stop", allowed or (force_enabled == "1" and self.authority("preferences")), diff --git a/openpilot/starpilot/ui/tests/test_cruise_interval_feature.py b/openpilot/starpilot/ui/tests/test_cruise_interval_feature.py index 0575c98014..1b7a8c5429 100644 --- a/openpilot/starpilot/ui/tests/test_cruise_interval_feature.py +++ b/openpilot/starpilot/ui/tests/test_cruise_interval_feature.py @@ -1,11 +1,11 @@ """Parked exact-source edits for host-only cruise intervals.""" from dataclasses import replace -from types import SimpleNamespace import tempfile import unittest from openpilot.common.params import Params +from opendbc.car.structs import car from openpilot.starpilot.galaxy.settings import AuthorityContext, SettingsChanged, SettingsGateway from openpilot.starpilot.longitudinal.cruise_intervals import CruiseIntervals, read_cruise_intervals from openpilot.starpilot.ui.feature_settings_owner import FeatureSettingsOwner @@ -25,7 +25,7 @@ class CruiseIntervalFeatureTests(unittest.TestCase): temp = tempfile.TemporaryDirectory() self.addCleanup(temp.cleanup) self.params = Params(temp.name) - self.cp = SimpleNamespace(carFingerprint="HYUNDAI_IONIQ_6", openpilotLongitudinalControl=True, + self.cp = car.CarParams.new_message(carFingerprint="HYUNDAI_IONIQ_6", openpilotLongitudinalControl=True, pcmCruise=False, notCar=False, passive=False, dashcamOnly=False) self.context = Context(self.cp) self.owner = FeatureSettingsOwner(self.params, lambda group: self.context.value.parked and group == "long", @@ -34,7 +34,7 @@ class CruiseIntervalFeatureTests(unittest.TestCase): self.gateway = SettingsGateway(self.params, self.context, clock=lambda: 100.0) def rows(self): - state = self.owner.snapshot(FeaturePage.PROFILES, parked=self.context.value.parked, system_long=True, + state = self.owner.snapshot(FeaturePage.WHEEL, parked=self.context.value.parked, system_long=True, lateral_context=False, metric=False) return {row.key: row for row in state.rows if row.key in ("QOLLongitudinal", "CustomCruise", "CustomCruiseLong")} @@ -47,7 +47,7 @@ class CruiseIntervalFeatureTests(unittest.TestCase): def test_galaxy_direct_intervals_without_retired_master(self): self.params.put("CustomCruise", 5.0, block=True) self.params.put("CustomCruiseLong", 1.0, block=True) - page = self.gateway.page("profiles", "session", b"generation") + page = self.gateway.page("wheel", "session", b"generation") rows = {row["label"]: (index, row) for index, row in enumerate(page["rows"])} self.assertNotIn("Custom cruise intervals", rows) self.assertTrue(rows["Short press"][1]["available"]) diff --git a/openpilot/starpilot/ui/tests/test_feature_settings_navigation.py b/openpilot/starpilot/ui/tests/test_feature_settings_navigation.py index 7fad87915a..a2f54c8725 100644 --- a/openpilot/starpilot/ui/tests/test_feature_settings_navigation.py +++ b/openpilot/starpilot/ui/tests/test_feature_settings_navigation.py @@ -126,7 +126,7 @@ class FeatureNavigationTests(unittest.TestCase): self.assertTrue(session._feature_authority('long')) self.assertTrue(session._feature_authority('toyota_cruise')) for expected in (True, False): - state = session.feature_owner.snapshot('profiles', parked=True, system_long=False, + state = session.feature_owner.snapshot('wheel', parked=True, system_long=False, lateral_context=False, metric=False) rows = {row.key: row for row in state.rows} self.assertNotIn('CustomCruise', rows) diff --git a/openpilot/starpilot/ui/tests/test_value_editors.py b/openpilot/starpilot/ui/tests/test_value_editors.py index 67e9f7b1f9..07ad2b2381 100644 --- a/openpilot/starpilot/ui/tests/test_value_editors.py +++ b/openpilot/starpilot/ui/tests/test_value_editors.py @@ -179,7 +179,7 @@ class ValueEditorTests(unittest.TestCase): def test_cruise_interval_editor_keeps_the_owners_required_confirmation(self): self.owner.show_cruise_intervals = True self.owner.vehicle_params().pcmCruise = False - self.session.feature_page = FeaturePage.PROFILES + self.session.feature_page = FeaturePage.WHEEL editor = self.open_feature("CustomCruise") dialogs = [] with patch("openpilot.system.ui.widgets.confirm_dialog.ConfirmDialog", side_effect=lambda *args, **kw: NS(callback=kw["callback"])), \