状態マシンクラス [詳細]
#include <StateMachine.h>
Public メソッド | |
StateMachine (int num_of_state) | |
コンストラクタ | |
virtual | ~StateMachine () |
void | setNOP (Callback call_back) |
NOP関数を登録する. | |
void | setListener (Listener *listener) |
Listener オブジェクトを登録する. | |
bool | setEntryAction (State state, Callback call_back) |
Entry action 関数を登録する. | |
bool | setPreDoAction (State state, Callback call_back) |
PreDo action 関数を登録する. | |
bool | setDoAction (State state, Callback call_back) |
Do action 関数を登録する. | |
bool | setPostDoAction (State state, Callback call_back) |
PostDo action 関数を登録する. | |
bool | setExitAction (State state, Callback call_back) |
Exit action 関数を登録する. | |
bool | setTransitionAction (Callback call_back) |
State transition action 関数を登録する. | |
void | setStartState (States states) |
初期状態をセットする | |
States | getStates () |
状態を取得する | |
State | getState () |
現在の状態を取得する | |
bool | isIn (State state) |
現在状態を確認 | |
void | goTo (State state) |
状態を遷移 | |
void | worker () |
駆動関数 | |
Protected メソッド | |
void | setNullFunc (Callback *s, Callback nullfunc) |
NOP関数を設定. | |
Protected 変数 | |
int | m_num |
状態数 | |
Listener * | m_listener |
コールバック関数用リスナー | |
Callback * | m_entry |
Entry action 用コールバック関数. | |
Callback * | m_predo |
PreDo action 用コールバック関数. | |
Callback * | m_do |
Do action 用コールバック関数. | |
Callback * | m_postdo |
PostDo action 用コールバック関数. | |
Callback * | m_exit |
Exit action 用コールバック関数. | |
Callback | m_transit |
State transition action 用コールバック関数. | |
States | m_states |
現在の状態情報 | |
bool | m_selftrans |
Mutex | m_mutex |
状態マシンクラス
StateMachine クラスは状態マシンを実現するクラスである。
例: ActiveObjectは状態マシンを持つアクティブオブジェクトであるとする。 状態は3状態 INACTIVE, ACTIVE, ERROR があり、各状態でのEntryやExit動作を 定義したいとすると、以下のように実現される。
class ActiveObject { public: enum MyState { INACTIVE, ACTIVE, ERROR }; typedef States<MyState> MyStates;
ActiveObject() : m_sm(3) { m_sm.setNOP(&ActiveObject::nullAction); m_sm.setListener(this);
m_sm.setExitAction(INACTIVE, &ActiveObject::inactiveExit); : m_sm.setPostDoAction(ERROR, &ActiveObject::errorPostDo); m_sm.setTransitionAction(&ActiveObject:transition); };
bool nullAction(MyStates st) {}; bool inactiveExit(MyStates st) {}; : bool errorPostDo(MyStates st) {}; bool transition(MyStates st) {};
private: StateMachine<MyState, bool, ActiveObject> m_sm; };
状態を持たせたいクラスは以下の条件を満たすように実装しなければならない。
このクラスは、一つの状態に対して、
5つのアクションが定義することができる。 Transition action はあらゆる状態間遷移で呼び出されるアクションで、 その振る舞いはユーザが定義しなければならない。
このクラスは以下のようなタイミングで各アクションが実行される。
状態が変更され(A->B)状態が遷移する場合
(A:Exit)->|(状態更新:A->B)->(B:Entry)->(B:PreDo)->(B:Do)->(B:PostDo)
状態が変更されず、B状態を維持する場合 (|はステップの区切りを表す)
(B(n-1):PostDo)->|(B(n):PreDo)->(B(n):Do)->(B(n):PostDo)->|(B(n+1):PreDo)
PreDo, Do, PostDo が繰り返し実行される。
State | 状態の型 | |
Listener | アクション用リスナーオブジェクト | |
States | 状態ホルダー | |
Callback | アクション用コールバック関数 |
RTC_Utils::StateMachine< State, Listener, States, Callback >::StateMachine | ( | int | num_of_state | ) | [inline] |
コンストラクタ
コンストラクタ
num_of_state | ステートマシン中の状態数 |
virtual RTC_Utils::StateMachine< State, Listener, States, Callback >::~StateMachine | ( | ) | [inline, virtual] |
State RTC_Utils::StateMachine< State, Listener, States, Callback >::getState | ( | ) | [inline] |
現在の状態を取得する
現在の状態を取得する。
States RTC_Utils::StateMachine< State, Listener, States, Callback >::getStates | ( | ) | [inline] |
状態を取得する
状態情報を取得する。 現在の状態、1つ前の状態、遷移予定の状態を取得することができる。
void RTC_Utils::StateMachine< State, Listener, States, Callback >::goTo | ( | State | state | ) | [inline] |
状態を遷移
指定した状態に状態を遷移する。 本関数は次状態を強制的にセットする関数である。 このため、遷移の可否は、ユーザが現在状態を取得し判断するロジックを 実装しなければならない。 遷移先が現在の状態と同じ場合には、自己遷移フラグをセットする。
state | 遷移先状態 |
参照元 RTC::PeriodicExecutionContext::DFP< OpenRTM::DataFlowComponent_var >::on_activated(), RTC::PeriodicExecutionContext::DFP< OpenRTM::DataFlowComponent_var >::on_execute(), RTC::PeriodicExecutionContext::DFP< OpenRTM::DataFlowComponent_var >::on_reset(), と RTC::PeriodicExecutionContext::DFP< OpenRTM::DataFlowComponent_var >::on_state_update().
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::isIn | ( | State | state | ) | [inline] |
現在状態を確認
現在の状態が、引数で指定した状態と一致するか確認する。
state | 確認対象状態 |
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setDoAction | ( | State | state, | |
Callback | call_back | |||
) | [inline] |
Do action 関数を登録する.
各状態内で実行される Do action 用コールバック関数を登録する。
state | 登録対象状態 | |
call_back | Do action 用コールバック関数 |
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setEntryAction | ( | State | state, | |
Callback | call_back | |||
) | [inline] |
Entry action 関数を登録する.
各状態に入った際に実行される Entry action 用コールバック関数を登録する。
state | 登録対象状態 | |
call_back | Entry action 用コールバック関数 |
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setExitAction | ( | State | state, | |
Callback | call_back | |||
) | [inline] |
Exit action 関数を登録する.
各状態内で実行される Exit action 用コールバック関数を登録する。
state | 登録対象状態 | |
call_back | Exit action 用コールバック関数 |
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setListener | ( | Listener * | listener | ) | [inline] |
Listener オブジェクトを登録する.
各種アクション実行時に呼び出される Listener オブジェクトを登録する。
listener | Listener オブジェクト |
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setNOP | ( | Callback | call_back | ) | [inline] |
NOP関数を登録する.
NOP関数(何もしない関数)を登録する。
call_back | コールバック関数 |
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setNullFunc | ( | Callback * | s, | |
Callback | nullfunc | |||
) | [inline, protected] |
NOP関数を設定.
NOP関数(何もしない関数)を登録する。
s | コールバック関数設定先 | |
nullfunc | コールバック関数(NOP関数) |
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setPostDoAction | ( | State | state, | |
Callback | call_back | |||
) | [inline] |
PostDo action 関数を登録する.
各状態内で実行される PostDo action 用コールバック関数を登録する。
state | 登録対象状態 | |
call_back | PostDo action 用コールバック関数 |
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setPreDoAction | ( | State | state, | |
Callback | call_back | |||
) | [inline] |
PreDo action 関数を登録する.
各状態内で実行される PreDo action 用コールバック関数を登録する。
state | 登録対象状態 | |
call_back | PreDo action 用コールバック関数 |
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setStartState | ( | States | states | ) | [inline] |
初期状態をセットする
ステートマシンの初期状態を設定する。
states | 初期状態 |
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setTransitionAction | ( | Callback | call_back | ) | [inline] |
State transition action 関数を登録する.
状態遷移時に実行される State transition action 用コールバック関数を 登録する。
call_back | State transition 用コールバック関数 |
void RTC_Utils::StateMachine< State, Listener, States, Callback >::worker | ( | ) | [inline] |
駆動関数
ステートマシンの駆動関数。 実際の状態遷移および状態遷移発生時の各アクションの呼びだしを実行する。
Callback* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_do [protected] |
Do action 用コールバック関数.
Callback* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_entry [protected] |
Entry action 用コールバック関数.
Callback* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_exit [protected] |
Exit action 用コールバック関数.
Listener* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_listener [protected] |
コールバック関数用リスナー
Mutex RTC_Utils::StateMachine< State, Listener, States, Callback >::m_mutex [protected] |
int RTC_Utils::StateMachine< State, Listener, States, Callback >::m_num [protected] |
状態数
Callback* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_postdo [protected] |
PostDo action 用コールバック関数.
Callback* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_predo [protected] |
PreDo action 用コールバック関数.
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::m_selftrans [protected] |
States RTC_Utils::StateMachine< State, Listener, States, Callback >::m_states [protected] |
現在の状態情報
Callback RTC_Utils::StateMachine< State, Listener, States, Callback >::m_transit [protected] |
State transition action 用コールバック関数.