Custom steering wheel button functions

This commit is contained in:
James
2025-12-01 12:00:00 -07:00
parent 461de7d0c0
commit 06df794db2
6 changed files with 94 additions and 3 deletions
+45 -1
View File
@@ -1,11 +1,12 @@
#!/usr/bin/env python3
from opendbc.safety import ALTERNATIVE_EXPERIENCE
from openpilot.common.params import Params
from openpilot.selfdrive.car.cruise import ButtonType
from openpilot.selfdrive.car.cruise import CRUISE_LONG_PRESS, ButtonType
from openpilot.selfdrive.selfdrived.events import ET
from openpilot.frogpilot.common.frogpilot_utilities import is_FrogsGoMoo
from openpilot.frogpilot.common.frogpilot_variables import NON_DRIVING_GEARS
from openpilot.frogpilot.controls.lib.conditional_experimental_mode import CEStatus
class FrogPilotCard:
def __init__(self, CP, FPCP):
@@ -17,10 +18,33 @@ class FrogPilotCard:
self.accel_pressed = False
self.always_on_lateral_allowed = False
self.decel_pressed = False
self.distancePressed_previously = False
self.gap_counter = 0
self.always_on_lateral_set = bool(FPCP.alternativeExperience & ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL)
self.frogs_go_moo = is_FrogsGoMoo()
self.long_press_threshold = CRUISE_LONG_PRESS * (1.5 if self.CP.brand == "gm" else 1)
self.very_long_press_threshold = CRUISE_LONG_PRESS * 5
def handle_button_event(self, key, sm, frogpilot_toggles):
if sm["carControl"].longActive and getattr(frogpilot_toggles, f"experimental_mode_via_{key}"):
self.handle_experimental_mode(sm, frogpilot_toggles)
def handle_experimental_mode(self, sm, frogpilot_toggles):
if frogpilot_toggles.conditional_experimental_mode:
if self.params_memory.get("CEStatus") in (CEStatus["USER_DISABLED"], CEStatus["USER_OVERRIDDEN"]):
override_value = CEStatus["OFF"]
elif sm["selfdriveState"].experimentalMode:
override_value = CEStatus["USER_DISABLED"]
else:
override_value = CEStatus["USER_OVERRIDDEN"]
self.params_memory.put("CEStatus", override_value)
else:
self.params.put_bool_nonblocking("ExperimentalMode", not sm["selfdriveState"].experimentalMode)
def update(self, carState, frogpilotCarState, sm, frogpilot_toggles):
if self.CP.brand == "hyundai":
for be in carState.buttonEvents:
@@ -44,8 +68,28 @@ class FrogPilotCard:
if sm.updated["frogpilotPlan"] or any(be.type == ButtonType.decelCruise for be in carState.buttonEvents):
self.decel_pressed = any(be.type == ButtonType.decelCruise for be in carState.buttonEvents)
if frogpilotCarState.distancePressed:
self.gap_counter += 1
elif not self.distancePressed_previously:
self.gap_counter = 0
self.distancePressed_previously = frogpilotCarState.distancePressed
if not frogpilotCarState.distancePressed and 1 <= self.gap_counter < self.long_press_threshold:
self.handle_button_event("distance", sm, frogpilot_toggles)
elif self.gap_counter == self.long_press_threshold:
self.handle_button_event("distance_long", sm, frogpilot_toggles)
elif self.gap_counter == self.very_long_press_threshold:
self.handle_button_event("distance_long", sm, frogpilot_toggles)
self.handle_button_event("distance_very_long", sm, frogpilot_toggles)
if any(be.pressed and be.type == ButtonType.lkas for be in carState.buttonEvents):
self.handle_button_event("lkas", sm, frogpilot_toggles)
frogpilotCarState.accelPressed = self.accel_pressed
frogpilotCarState.alwaysOnLateralEnabled = self.always_on_lateral_enabled
frogpilotCarState.decelPressed = self.decel_pressed
frogpilotCarState.distanceLongPressed = self.very_long_press_threshold > self.gap_counter >= self.long_press_threshold
frogpilotCarState.distanceVeryLongPressed = self.gap_counter >= self.very_long_press_threshold
return frogpilotCarState