REPOSITORY
via/alice-sdv-demo Private
A-SW 코드-배포 파이프라인 검증용 ALICE SDV 예제
https://git.agrithing.ai/via/alice-sdv-demo.git 26a84fb ci: add Python static and dynamic analysis
5cf6f47 ci: add Python static and dynamic analysis
66b95ca chore: synchronize ALICE SDV pipeline sample
e5ffbdf chore: synchronize ALICE SDV pipeline sample
5492626 chore: synchronize ALICE SDV pipeline sample
3dacbfe chore: synchronize ALICE SDV pipeline sample
b3ffe5d chore: synchronize ALICE SDV pipeline sample
ab90e6f tune: harden simulator deployment policy
3703ddb test: validate package and deployment fixtures
7b2437e feat: define local simulator deployment target
8e49864 feat: add deployable package manifest
3e29341 chore: synchronize ALICE SDV pipeline sample
6feeead feat: add ALICE SDV pipeline sample
2 items · main
·/ edge/state_machine.py
python · 1.5 KB · 3d5dd86 Download
from __future__ import annotationsfrom dataclasses import dataclassfrom enum import Enumclass State(str, Enum): IDLE = "IDLE" ENTER = "ENTER" PATROL = "PATROL" RETURN = "RETURN" FAULT = "FAULT"class Event(str, Enum): START_PATROL = "START_PATROL" ENTERED_ROUTE = "ENTERED_ROUTE" PATROL_COMPLETED = "PATROL_COMPLETED" RETURNED_HOME = "RETURNED_HOME" ABORT = "ABORT" SAFETY_TIMEOUT = "SAFETY_TIMEOUT" RESET = "RESET"TRANSITIONS: dict[tuple[State, Event], State] = { (State.IDLE, Event.START_PATROL): State.ENTER, (State.ENTER, Event.ENTERED_ROUTE): State.PATROL, (State.ENTER, Event.ABORT): State.RETURN, (State.PATROL, Event.PATROL_COMPLETED): State.RETURN, (State.PATROL, Event.ABORT): State.RETURN, (State.RETURN, Event.RETURNED_HOME): State.IDLE, (State.ENTER, Event.SAFETY_TIMEOUT): State.FAULT, (State.PATROL, Event.SAFETY_TIMEOUT): State.FAULT, (State.RETURN, Event.SAFETY_TIMEOUT): State.FAULT, (State.FAULT, Event.RESET): State.IDLE,}class InvalidTransition(ValueError): """Raised when an event is not allowed from the current state."""@dataclass(frozen=True)class PatrolStateMachine: state: State = State.IDLE def dispatch(self, event: Event) -> "PatrolStateMachine": next_state = TRANSITIONS.get((self.state, event)) if next_state is None: raise InvalidTransition(f"{event} is not allowed from {self.state}") return PatrolStateMachine(next_state)