19 #ifndef RTC_STATEMACHINE_H 20 #define RTC_STATEMACHINE_H 55 template <
class State>
259 template <
class State,
262 class Callback = void (Listener::*)(
const States& states)
287 : m_num(num_of_state),
289 m_entry(m_num, (Callback)NULL),
290 m_predo(m_num, (Callback)NULL),
291 m_do(m_num, (Callback)NULL),
292 m_postdo(m_num, (Callback)NULL),
293 m_exit(m_num, (Callback)NULL),
303 : m_num(other.m_num),
304 m_listener(other.m_listener),
305 m_entry (other.m_entry),
306 m_predo (other.m_predo),
308 m_postdo(other.m_postdo),
309 m_exit (other.m_exit),
310 m_transit(other.m_transit),
311 m_states(other.m_states),
312 m_selftrans(other.m_selftrans)
325 std::swap(m_num, other.
m_num);
327 std::swap(m_entry, other.
m_entry);
328 std::swap(m_predo, other.
m_predo);
329 std::swap(m_do, other.
m_do);
330 std::swap(m_postdo, other.
m_postdo);
331 std::swap(m_exit, other.
m_exit);
333 std::swap(m_states, other.
m_states);
355 setNullFunc(m_entry, call_back);
356 setNullFunc(m_do, call_back);
357 setNullFunc(m_exit, call_back);
358 setNullFunc(m_predo, call_back);
359 setNullFunc(m_postdo, call_back);
360 m_transit = call_back;
382 assert(listener != NULL);
383 m_listener = listener;
414 m_entry.at(state) = call_back;
451 m_predo.at(state) = call_back;
488 m_do.at(state) = call_back;
525 m_postdo.at(state) = call_back;
562 m_exit.at(state) = call_back;
597 m_transit = call_back;
620 m_states.curr = states.curr;
621 m_states.prev = states.prev;
622 m_states.next = states.next;
647 Guard guard(m_mutex);
670 Guard guard(m_mutex);
671 return m_states.curr;
697 Guard guard(m_mutex);
698 return m_states.curr == state ?
true :
false;
729 Guard guard(m_mutex);
730 m_states.next = state;
731 if (m_states.curr == state)
760 if (state.curr == state.next)
763 if (m_predo[state.curr] != NULL)
764 (m_listener->*m_predo [state.curr])(state);
766 if (need_trans())
return;
769 if (m_do[state.curr] != NULL)
770 (m_listener->*m_do [state.curr])(state);
772 if (need_trans())
return;
775 if (m_postdo[state.curr] != NULL)
776 (m_listener->*m_postdo[state.curr])(state);
780 if (m_exit[state.curr] != NULL)
781 (m_listener->*m_exit[state.curr])(state);
785 if (state.curr != state.next)
787 state.curr = state.next;
788 if(m_entry[state.curr] != NULL)
789 (m_listener->*m_entry[state.curr])(state);
790 update_curr(state.curr);
806 if (state.curr == state.next)
808 if (m_predo[state.curr] != NULL)
810 (m_listener->*m_predo[state.curr])(state);
816 if (m_exit[state.curr] != NULL)
818 (m_listener->*m_exit[state.curr])(state);
821 if (state.curr != state.next)
823 state.curr = state.next;
824 if(m_entry[state.curr] != NULL)
826 (m_listener->*m_entry[state.curr])(state);
828 update_curr(state.curr);
836 if (m_do[state.curr] != NULL)
838 (m_listener->*m_do[state.curr])(state);
846 if (m_postdo[state.curr] != NULL)
848 (m_listener->*m_postdo[state.curr])(state);
876 for (
size_t i(0); i < m_num; ++i)
878 s.push_back(nullfunc);
966 inline void sync(States& st)
968 Guard guard(m_mutex);
972 inline bool need_trans()
974 Guard guard(m_mutex);
975 return (m_states.curr != m_states.next);
978 inline void update_curr(
const State
curr)
980 Guard guard(m_mutex);
981 m_states.curr =
curr;
986 #endif // RTC_STATEMACHINE_H virtual ~StateMachine()
Definition: StateMachine.h:298
bool setDoAction(State state, Callback call_back)
Do action 関数を登録する
Definition: StateMachine.h:484
bool setExitAction(State state, Callback call_back)
Exit action 関数を登録する
Definition: StateMachine.h:558
Mutex クラス
Definition: Mutex.h:40
bool setPostDoAction(State state, Callback call_back)
PostDo action 関数を登録する
Definition: StateMachine.h:521
void swap(StateMachine &other)
Definition: StateMachine.h:323
States getStates()
状態を取得する
Definition: StateMachine.h:645
std::vector< Callback > m_predo
PreDo action 用コールバック関数
Definition: StateMachine.h:916
StateMachine(const StateMachine &other)
Definition: StateMachine.h:302
void worker_pre()
Definition: StateMachine.h:802
std::vector< Callback > m_do
Do action 用コールバック関数
Definition: StateMachine.h:925
States m_states
現在の状態情報
Definition: StateMachine.h:961
int m_num
状態数
Definition: StateMachine.h:889
std::vector< Callback > m_postdo
PostDo action 用コールバック関数
Definition: StateMachine.h:934
Mutex m_mutex
Definition: StateMachine.h:963
coil::Guard< coil::Mutex > Guard
Definition: LocalServiceAdmin.h:36
void worker()
駆動関数
Definition: StateMachine.h:754
bool setEntryAction(State state, Callback call_back)
Entry action 関数を登録する
Definition: StateMachine.h:410
bool setTransitionAction(Callback call_back)
State transition action 関数を登録する
Definition: StateMachine.h:595
状態マシンクラス
Definition: StateMachine.h:264
void goTo(State state)
状態を遷移
Definition: StateMachine.h:727
std::vector< Callback > m_exit
Exit action 用コールバック関数
Definition: StateMachine.h:943
bool isIn(State state)
現在状態を確認
Definition: StateMachine.h:695
void setNOP(Callback call_back)
NOP関数を登録する
Definition: StateMachine.h:353
State prev
Definition: StateMachine.h:59
Listener * m_listener
コールバック関数用リスナー
Definition: StateMachine.h:898
状態保持用クラス
Definition: StateMachine.h:56
void setNullFunc(std::vector< Callback > &s, Callback nullfunc)
NOP関数を設定
Definition: StateMachine.h:872
bool setPreDoAction(State state, Callback call_back)
PreDo action 関数を登録する
Definition: StateMachine.h:447
void setStartState(States states)
初期状態をセットする
Definition: StateMachine.h:618
State curr
Definition: StateMachine.h:58
bool m_selftrans
Definition: StateMachine.h:962
StateMachine & operator=(const StateMachine &other)
Definition: StateMachine.h:316
void worker_do()
Definition: StateMachine.h:832
Guard テンプレートクラス
Definition: Guard.h:41
State next
Definition: StateMachine.h:60
void setListener(Listener *listener)
Listener オブジェクトを登録する
Definition: StateMachine.h:380
Callback m_transit
State transition action 用コールバック関数
Definition: StateMachine.h:952
StateMachine(int num_of_state)
コンストラクタ
Definition: StateMachine.h:286
State getState()
現在の状態を取得する
Definition: StateMachine.h:668
std::vector< Callback > m_entry
Entry action 用コールバック関数
Definition: StateMachine.h:907
void worker_post()
Definition: StateMachine.h:842