refactor state machine

This commit is contained in:
Jason Wen
2025-05-29 22:32:09 -04:00
parent a389fa81c2
commit b082daeb79
3 changed files with 89 additions and 3 deletions
+6 -3
View File
@@ -128,9 +128,9 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
enum SpeedLimitControlState {
inactive @0; # No speed limit set or not enabled by parameter.
tempInactive @1; # User wants to ignore speed limit until it changes.
adapting @2; # Reducing speed to match new speed limit.
active @3; # Cruising at speed limit.
preActive @4;
preActive @2;
adapting @3; # Reducing speed to match new speed limit.
active @4; # Cruising at speed limit.
}
}
@@ -175,6 +175,9 @@ struct OnroadEventSP @0xda96579883444c35 {
speedLimitActive @18;
speedLimitConfirmed @19;
speedLimitValueChange @20;
speedLimitInactive @21;
speedLimitTempInactive @22;
speedLimitAdapting @23;
}
}
@@ -0,0 +1,71 @@
"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
from cereal import custom
from openpilot.sunnypilot.selfdrive.selfdrived.events import EventsSP
EventNameSP = custom.OnroadEventSP.EventName
State = custom.LongitudinalPlanSP.SpeedLimitControlState
ACTIVE_STATES = (State.active, State.adapting)
ENABLED_STATES = (State.preActive, State.tempInactive, *ACTIVE_STATES)
class StateMachine:
def __init__(self):
self.state = State.off
def update(self, events_sp: EventsSP) -> tuple[bool, bool]:
# TEMP INACTIVE, ADAPTING, ACTIVE, PRE ACTIVE
if self.state != State.inactive:
if events_sp.has(EventNameSP.speedLimitInactive):
self.state = State.inactive
elif events_sp.has(EventNameSP.speedLimitTempInactive):
self.state = State.tempInactive
else:
# ACTIVE
if self.state == State.active:
if events_sp.has(EventNameSP.speedLimitTempInactive):
self.state = State.tempInactive
elif events_sp.has(EventNameSP.speedLimitPreActive):
self.state = State.preActive
elif events_sp.has(EventNameSP.speedLimitAdapting):
self.state = State.adapting
# PRE ACTIVE
elif self.state == State.preActive:
if events_sp.has(EventNameSP.speedLimitInactive):
self.state = State.inactive
elif events_sp.has(EventNameSP.speedLimitActive):
self.state = State.active
# ADAPTING
elif self.state == State.adapting:
if events_sp.has(EventNameSP.speedLimitActive):
self.state = State.active
# TEMP INACTIVE
elif self.state == State.tempInactive:
if events_sp.has(EventNameSP.speedLimitPreActive):
self.state = State.preActive
elif events_sp.has(EventNameSP.speedLimitInactive):
self.state = State.inactive
# INACTIVE
elif self.state == State.inactive:
if events_sp.has(EventNameSP.speedLimitPreActive):
self.state = State.preActive
elif events_sp.has(EventNameSP.speedLimitAdapting):
self.state = State.adapting
elif events_sp.has(EventNameSP.speedLimitActive):
self.state = State.active
enabled = self.state in ENABLED_STATES
active = self.state in ACTIVE_STATES
return enabled, active
+12
View File
@@ -175,4 +175,16 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
ET.WARNING: speed_limit_adjust_alert,
},
EventNameSP.speedLimitInactive: {
ET.WARNING: EngagementAlert(AudibleAlert.none),
},
EventNameSP.speedLimitTempInactive: {
ET.WARNING: EngagementAlert(AudibleAlert.none),
},
EventNameSP.speedLimitAdapting: {
ET.WARNING: EngagementAlert(AudibleAlert.none),
},
}