diff --git a/Fsm.cpp b/Fsm.cpp index 9b932ca..af2b115 100644 --- a/Fsm.cpp +++ b/Fsm.cpp @@ -78,7 +78,6 @@ void Fsm::add_timed_transition(State* state_from, State* state_to, m_num_timed_transitions++; } - Fsm::Transition Fsm::create_transition(State* state_from, State* state_to, int event, void (*on_transition)()) { @@ -108,6 +107,10 @@ void Fsm::trigger(int event) } } +State* Fsm::get_current_state() { + return m_current_state; +} + void Fsm::check_timed_transitions() { for (int i = 0; i < m_num_timed_transitions; ++i) @@ -131,6 +134,21 @@ void Fsm::check_timed_transitions() } } +void Fsm::reset_timed_transition(State* state_to) +{ + for (int i = 0; i < m_num_timed_transitions; ++i) + { + TimedTransition* transition = &m_timed_transitions[i]; + if (transition->transition.state_from == m_current_state) + { + if(state_to == NULL || (state_to != NULL && state_to == transition->transition.state_to) ) { + transition->start = millis(); + } + } + } +} + + void Fsm::run_machine() { // first run must exec first state "on_enter" diff --git a/Fsm.h b/Fsm.h index afbb3dd..a9b827c 100644 --- a/Fsm.h +++ b/Fsm.h @@ -45,11 +45,32 @@ class Fsm void add_timed_transition(State* state_from, State* state_to, unsigned long interval, void (*on_transition)()); + /** + * checks the timed transitions for the current state and if timeout occured + * trigger appropriate transition. Timed transitions are checked and triggered in the same order as added + */ void check_timed_transitions(); + /** + * looks for the current state's timed transitions to the target state and reset the timer + * @param state_to target state to reset the timed transition for. If NULL reset all current state timers + */ + void reset_timed_transition(State* state_to); + + /** + * trigger transition with the event + * @param event enum that defines the trigger + */ void trigger(int event); + void run_machine(); + /** + * returns current state (helpful if the same handler is used to drive many similar states) + * @return current state + */ + State* get_current_state(); + private: struct Transition {