19 #ifndef RTC_STATEMACHINE_H
20 #define RTC_STATEMACHINE_H
54 template <
class State>
258 template <
class State,
261 class Callback = void (Listener::*)(
const States& states)
286 : m_num(num_of_state),
287 m_entry (new Callback[m_num]),
288 m_predo (new Callback[m_num]),
289 m_do (new Callback[m_num]),
290 m_postdo(new Callback[m_num]),
291 m_exit (new Callback[m_num])
293 setNullFunc(m_entry, NULL);
294 setNullFunc(m_do, NULL);
295 setNullFunc(m_exit, NULL);
296 setNullFunc(m_predo, NULL);
297 setNullFunc(m_postdo, NULL);
329 void setNOP(Callback call_back)
331 setNullFunc(m_entry, call_back);
332 setNullFunc(m_do, call_back);
333 setNullFunc(m_exit, call_back);
334 setNullFunc(m_predo, call_back);
335 setNullFunc(m_postdo, call_back);
336 m_transit = call_back;
356 void setListener(Listener* listener)
358 m_listener = listener;
385 bool setEntryAction(State state, Callback call_back)
387 m_entry[state] = call_back;
414 bool setPreDoAction(State state, Callback call_back)
416 m_predo[state] = call_back;
443 bool setDoAction(State state, Callback call_back)
445 m_do[state] = call_back;
472 bool setPostDoAction(State state, Callback call_back)
474 m_postdo[state] = call_back;
501 bool setExitAction(State state, Callback call_back)
503 m_exit[state] = call_back;
530 bool setTransitionAction(Callback call_back)
532 m_transit = call_back;
553 void setStartState(States states)
555 m_states.curr = states.curr;
556 m_states.prev = states.prev;
557 m_states.next = states.next;
582 Guard guard(m_mutex);
605 Guard guard(m_mutex);
606 return m_states.curr;
630 bool isIn(State state)
632 Guard guard(m_mutex);
633 return m_states.curr == state ?
true :
false;
662 void goTo(State state)
664 Guard guard(m_mutex);
665 m_states.next = state;
666 if (m_states.curr == state)
695 if (state.curr == state.next)
698 if (m_predo[state.curr] != NULL)
699 (m_listener->*m_predo [state.curr])(state);
701 if (need_trans())
return;
704 if (m_do[state.curr] != NULL)
705 (m_listener->*m_do [state.curr])(state);
707 if (need_trans())
return;
710 if (m_postdo[state.curr] != NULL)
711 (m_listener->*m_postdo[state.curr])(state);
715 if (m_exit[state.curr] != NULL)
716 (m_listener->*m_exit[state.curr])(state);
720 if (state.curr != state.next)
722 state.curr = state.next;
723 if(m_entry[state.curr] != NULL)
724 (m_listener->*m_entry[state.curr])(state);
725 update_curr(state.curr);
750 void setNullFunc(Callback* s, Callback nullfunc)
752 for (
int i = 0; i < m_num; ++i) s[i] = nullfunc;
839 inline void sync(States& st)
841 Guard guard(m_mutex);
845 inline bool need_trans()
847 Guard guard(m_mutex);
848 return (m_states.curr != m_states.next);
851 inline void update_curr(
const State curr)
853 Guard guard(m_mutex);
854 m_states.curr = curr;
859 #endif // RTC_STATEMACHINE_H