クラス テンプレート StateMachine< State, Listener, States, Callback >
状態マシンクラス
[詳細]
#include <StateMachine.h>
すべてのメンバ一覧
説明
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
class StateMachine< State, Listener, States, Callback >
状態マシンクラス
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(NACTIVE, &ActiveObject::inactiveExit);
:
m_sm.setPostDoAction(ERROR, &ActiveObject::errorPostDo);
m_sm.setTransitionAction(&ActiveObject:tratransitionnsition);
};
bool nullAction(MyStates st) {};
bool inactiveExit(MyStates st) {};
:
bool errorPostDo(MyStates st) {};
bool transition(MyStates st) {};
private:
StateMachine<MyState, bool, ActiveObject> m_sm;
};
状態を持たせたいクラスは以下の条件を満たすように実装しなければならない。
-
enum で状態を定義
-
StateMachine のテンプレート引数は、
<状態の型(MyState), アクション関数の戻り値(bool), 当該オブジェクトの型>
-
StateMachine のコンストラクタ引数は状態の数
-
以下のアクション関数を(Return _function_name_(States)) の関数として設定
-
何もしない関数を必ず定義し、setNOP で与えなければならない
-
各状態毎に, set(Entry|PreDo|Do|PostDo|Exit)Action でアクションを設定
-
状態遷移時のアクションを setTransitionAction() で設定。
-
遷移時のアクションは、与えられた現在状態、次状態、前状態を元に、 ユーザが実装しなければならない。
-
状態の変更は goTo() で、状態のチェックは isIn(state) で行う。
-
goTo()は次状態を強制的にセットする関数であり、遷移の可否は、 ユーザが現在状態を取得し判断するロジックを実装しなければならない。
このクラスは、一つの状態に対して、
-
Entry action
-
PreDo action
-
Do action
-
PostDo action
-
Exit action
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 が繰り返し実行される。
-
自己遷移する場合
(B(n-1):PostDo)->(B(n-1):Exit)->|(B(n):Entry)->(B(n):PreDo)
一旦 Exit が呼ばれた後、Entry が実行され、以降は前項と同じ動作をする。
コンストラクタとデストラクタ
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
StateMachine< State, Listener, States, Callback >::StateMachine |
( |
int |
num_of_state |
) |
[inline] |
|
関数
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
State StateMachine< State, Listener, States, Callback >::getState |
( |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
States StateMachine< State, Listener, States, Callback >::getStates |
( |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
void StateMachine< State, Listener, States, Callback >::goTo |
( |
State |
state |
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::isIn |
( |
State |
state |
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::setDoAction |
( |
State |
state, |
|
|
Callback |
call_back |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::setEntryAction |
( |
State |
state, |
|
|
Callback |
call_back |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::setExitAction |
( |
State |
state, |
|
|
Callback |
call_back |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
void StateMachine< State, Listener, States, Callback >::setListener |
( |
Listener * |
listener |
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
void StateMachine< State, Listener, States, Callback >::setNOP |
( |
Callback |
call_back |
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
void StateMachine< State, Listener, States, Callback >::setNullFunc |
( |
Callback * |
s, |
|
|
Callback |
nullfunc |
|
) |
[inline, protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::setPostDoAction |
( |
State |
state, |
|
|
Callback |
call_back |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::setPreDoAction |
( |
State |
state, |
|
|
Callback |
call_back |
|
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
void StateMachine< State, Listener, States, Callback >::setStartState |
( |
States |
states |
) |
[inline] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::setTransitionAction |
( |
Callback |
call_back |
) |
[inline] |
|
|
State transition action 関数を登録する.
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
void StateMachine< State, Listener, States, Callback >::worker |
( |
|
) |
[inline] |
|
変数
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Callback* StateMachine< State, Listener, States, Callback >::m_do [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Callback* StateMachine< State, Listener, States, Callback >::m_entry [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Callback* StateMachine< State, Listener, States, Callback >::m_exit [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Listener* StateMachine< State, Listener, States, Callback >::m_listener [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
ACE_Thread_Mutex StateMachine< State, Listener, States, Callback >::m_mutex [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
int StateMachine< State, Listener, States, Callback >::m_num [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Callback* StateMachine< State, Listener, States, Callback >::m_postdo [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Callback* StateMachine< State, Listener, States, Callback >::m_predo [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
bool StateMachine< State, Listener, States, Callback >::m_selftrans [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
States StateMachine< State, Listener, States, Callback >::m_states [protected] |
|
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)> |
Callback StateMachine< State, Listener, States, Callback >::m_transit [protected] |
|
このクラスの説明は次のファイルから生成されました:
OpenRTMに対してFri Oct 5 05:14:59 2007に生成されました。
1.4.1