OpenRTM-aist 2.0.2
|
状態マシンクラス [詳解]
#include <StateMachine.h>
公開メンバ関数 | |
StateMachine (int num_of_state) | |
コンストラクタ | |
virtual | ~StateMachine () |
StateMachine (const StateMachine &other) | |
StateMachine & | operator= (const StateMachine &other) |
void | swap (StateMachine &other) |
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 () |
駆動関数 | |
void | worker_pre () |
void | worker_do () |
void | worker_post () |
限定公開メンバ関数 | |
void | setNullFunc (std::vector< Callback > &s, Callback nullfunc) |
NOP関数を設定 | |
限定公開変数類 | |
int | m_num |
状態数 | |
Listener * | m_listener |
コールバック関数用リスナー | |
std::vector< Callback > | m_entry |
Entry action 用コールバック関数 | |
std::vector< Callback > | m_predo |
PreDo action 用コールバック関数 | |
std::vector< Callback > | m_do |
Do action 用コールバック関数 | |
std::vector< Callback > | m_postdo |
PostDo action 用コールバック関数 | |
std::vector< Callback > | m_exit |
Exit action 用コールバック関数 | |
Callback | m_transit |
State transition action 用コールバック関数 | |
States | m_states |
現在の状態情報 | |
bool | m_selftrans |
std::mutex | m_mutex |
状態マシンクラス
StateMachine クラスは状態マシンを実現するクラスである。
例: ActiveObjectは状態マシンを持つアクティブオブジェクトであるとする。 状態は3状態 INACTIVE, ACTIVE, ERROR があり、各状態でのEntryやExit動作を 定義したいとすると、以下のように実現される。
class ActiveObject { public: enum MyState { INACTIVE, ACTIVE, ERROR }; using MyStates = States<MyState>; 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 | アクション用コールバック関数 |
|
inlineexplicit |
コンストラクタ
コンストラクタ
num_of_state | ステートマシン中の状態数 |
|
virtualdefault |
|
inline |
|
inline |
現在の状態を取得する
現在の状態を取得する。
|
inline |
状態を取得する
状態情報を取得する。 現在の状態、1つ前の状態、遷移予定の状態を取得することができる。
|
inline |
状態を遷移
指定した状態に状態を遷移する。 本関数は次状態を強制的にセットする関数である。 このため、遷移の可否は、ユーザが現在状態を取得し判断するロジックを 実装しなければならない。 遷移先が現在の状態と同じ場合には、自己遷移フラグをセットする。
state | 遷移先状態 |
|
inline |
現在状態を確認
現在の状態が、引数で指定した状態と一致するか確認する。
state | 確認対象状態 |
|
inline |
|
inline |
Do action 関数を登録する
各状態内で実行される Do action 用コールバック関数を登録する。
state | 登録対象状態 |
call_back | Do action 用コールバック関数 |
|
inline |
Entry action 関数を登録する
各状態に入った際に実行される Entry action 用コールバック関数を登録する。
state | 登録対象状態 |
call_back | Entry action 用コールバック関数 |
|
inline |
Exit action 関数を登録する
各状態内で実行される Exit action 用コールバック関数を登録する。
state | 登録対象状態 |
call_back | Exit action 用コールバック関数 |
|
inline |
|
inline |
NOP関数を登録する
NOP関数(何もしない関数)を登録する。
call_back | コールバック関数 |
|
inlineprotected |
NOP関数を設定
NOP関数(何もしない関数)を登録する。
s | コールバック関数設定先 |
nullfunc | コールバック関数(NOP関数) |
|
inline |
PostDo action 関数を登録する
各状態内で実行される PostDo action 用コールバック関数を登録する。
state | 登録対象状態 |
call_back | PostDo action 用コールバック関数 |
|
inline |
PreDo action 関数を登録する
各状態内で実行される PreDo action 用コールバック関数を登録する。
state | 登録対象状態 |
call_back | PreDo action 用コールバック関数 |
|
inline |
初期状態をセットする
ステートマシンの初期状態を設定する。
states | 初期状態 |
|
inline |
State transition action 関数を登録する
状態遷移時に実行される State transition action 用コールバック関数を 登録する。
call_back | State transition 用コールバック関数 |
|
inline |
参照先 RTC_Utils::StateMachine< State, Listener, States, Callback >::m_do, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_entry, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_exit, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_listener, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_num, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_postdo, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_predo, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_selftrans, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_states, RTC_Utils::StateMachine< State, Listener, States, Callback >::m_transit.
|
inline |
駆動関数
ステートマシンの駆動関数。 実際の状態遷移および状態遷移発生時の各アクションの呼びだしを実行する。
|
inline |
|
inline |
|
inline |
|
protected |
Do action 用コールバック関数
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().
|
protected |
Entry action 用コールバック関数
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().
|
protected |
Exit action 用コールバック関数
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().
|
protected |
コールバック関数用リスナー
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().
|
protected |
|
protected |
|
protected |
PostDo action 用コールバック関数
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().
|
protected |
PreDo action 用コールバック関数
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().
|
protected |
|
protected |
|
protected |
State transition action 用コールバック関数
参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().