OpenRTM-aist  1.2.1
公開メンバ関数 | 限定公開メンバ関数 | 限定公開変数類 | 全メンバ一覧
RTC_Utils::StateMachine< State, Listener, States, Callback > クラステンプレート

状態マシンクラス [詳解]

#include <StateMachine.h>

RTC_Utils::StateMachine< State, Listener, States, Callback > 連携図
Collaboration graph
[凡例]

公開メンバ関数

 StateMachine (int num_of_state)
 コンストラクタ [詳解]
 
virtual ~StateMachine ()
 
 StateMachine (const StateMachine &other)
 
StateMachineoperator= (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
 状態数 [詳解]
 
Listenerm_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
 
Mutex m_mutex
 

詳解

template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
class RTC_Utils::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(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; 
}; 

状態を持たせたいクラスは以下の条件を満たすように実装しなければならない。

  1. enum で状態を定義
  2. StateMachine のテンプレート引数は、
    <状態の型(MyState), リスナーオブジェクト, 状態ホルダー,コールバック関数>
  3. StateMachine のコンストラクタ引数は状態の数
  4. 以下のアクション関数を(Return function_name(States)) の関数として設定
    1. 何もしない関数を必ず定義し、setNOP で与えなければならない
    2. 各状態毎に, set(Entry|PreDo|Do|PostDo|Exit)Action でアクションを設定
    3. 状態遷移時のアクションを setTransitionAction() で設定。
  5. 遷移時のアクションは、与えられた現在状態、次状態、前状態を元に、 ユーザが実装しなければならない。
  6. 状態の変更は goTo() で、状態のチェックは isIn(state) で行う。
  7. goTo()は次状態を強制的にセットする関数であり、遷移の可否は、 ユーザが現在状態を取得し判断するロジックを実装しなければならない。

このクラスは、一つの状態に対して、

5つのアクションが定義することができる。 Transition action はあらゆる状態間遷移で呼び出されるアクションで、 その振る舞いはユーザが定義しなければならない。

このクラスは以下のようなタイミングで各アクションが実行される。

引数
State状態の型
Listenerアクション用リスナーオブジェクト
States状態ホルダー
Callbackアクション用コールバック関数
から
0.4.0

構築子と解体子

template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
RTC_Utils::StateMachine< State, Listener, States, Callback >::StateMachine ( int  num_of_state)
inline

コンストラクタ

コンストラクタ

引数
num_of_stateステートマシン中の状態数
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
virtual RTC_Utils::StateMachine< State, Listener, States, Callback >::~StateMachine ( )
inlinevirtual
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
RTC_Utils::StateMachine< State, Listener, States, Callback >::StateMachine ( const StateMachine< State, Listener, States, Callback > &  other)
inline

関数詳解

template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
State RTC_Utils::StateMachine< State, Listener, States, Callback >::getState ( )
inline

現在の状態を取得する

現在の状態を取得する。

戻り値
現在の状態
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
States RTC_Utils::StateMachine< State, Listener, States, Callback >::getStates ( )
inline

状態を取得する

状態情報を取得する。 現在の状態、1つ前の状態、遷移予定の状態を取得することができる。

戻り値
状態情報
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::goTo ( State  state)
inline

状態を遷移

指定した状態に状態を遷移する。 本関数は次状態を強制的にセットする関数である。 このため、遷移の可否は、ユーザが現在状態を取得し判断するロジックを 実装しなければならない。 遷移先が現在の状態と同じ場合には、自己遷移フラグをセットする。

引数
state遷移先状態
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::isIn ( State  state)
inline

現在状態を確認

現在の状態が、引数で指定した状態と一致するか確認する。

引数
state確認対象状態
戻り値
状態確認結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
StateMachine& RTC_Utils::StateMachine< State, Listener, States, Callback >::operator= ( const StateMachine< State, Listener, States, Callback > &  other)
inline
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setDoAction ( State  state,
Callback  call_back 
)
inline

Do action 関数を登録する

各状態内で実行される Do action 用コールバック関数を登録する。

引数
state登録対象状態
call_backDo action 用コールバック関数
戻り値
アクション実行結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setEntryAction ( State  state,
Callback  call_back 
)
inline

Entry action 関数を登録する

各状態に入った際に実行される Entry action 用コールバック関数を登録する。

引数
state登録対象状態
call_backEntry action 用コールバック関数
戻り値
アクション実行結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setExitAction ( State  state,
Callback  call_back 
)
inline

Exit action 関数を登録する

各状態内で実行される Exit action 用コールバック関数を登録する。

引数
state登録対象状態
call_backExit action 用コールバック関数
戻り値
アクション実行結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setListener ( Listener listener)
inline

Listener オブジェクトを登録する

各種アクション実行時に呼び出される Listener オブジェクトを登録する。

引数
listenerListener オブジェクト
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setNOP ( Callback  call_back)
inline

NOP関数を登録する

NOP関数(何もしない関数)を登録する。

引数
call_backコールバック関数
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setNullFunc ( std::vector< Callback > &  s,
Callback  nullfunc 
)
inlineprotected

NOP関数を設定

NOP関数(何もしない関数)を登録する。

引数
sコールバック関数設定先
nullfuncコールバック関数(NOP関数)
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setPostDoAction ( State  state,
Callback  call_back 
)
inline

PostDo action 関数を登録する

各状態内で実行される PostDo action 用コールバック関数を登録する。

引数
state登録対象状態
call_backPostDo action 用コールバック関数
戻り値
アクション実行結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setPreDoAction ( State  state,
Callback  call_back 
)
inline

PreDo action 関数を登録する

各状態内で実行される PreDo action 用コールバック関数を登録する。

引数
state登録対象状態
call_backPreDo action 用コールバック関数
戻り値
アクション実行結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::setStartState ( States  states)
inline

初期状態をセットする

ステートマシンの初期状態を設定する。

引数
states初期状態
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
bool RTC_Utils::StateMachine< State, Listener, States, Callback >::setTransitionAction ( Callback  call_back)
inline

State transition action 関数を登録する

状態遷移時に実行される State transition action 用コールバック関数を 登録する。

引数
call_backState transition 用コールバック関数
戻り値
アクション実行結果
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::swap ( StateMachine< State, Listener, States, Callback > &  other)
inline
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::worker ( )
inline

駆動関数

ステートマシンの駆動関数。 実際の状態遷移および状態遷移発生時の各アクションの呼びだしを実行する。

template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::worker_do ( )
inline
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::worker_post ( )
inline
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
void RTC_Utils::StateMachine< State, Listener, States, Callback >::worker_pre ( )
inline

メンバ詳解

template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
std::vector<Callback> RTC_Utils::StateMachine< State, Listener, States, Callback >::m_do
protected
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
std::vector<Callback> RTC_Utils::StateMachine< State, Listener, States, Callback >::m_entry
protected
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
std::vector<Callback> RTC_Utils::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* RTC_Utils::StateMachine< State, Listener, States, Callback >::m_listener
protected
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
Mutex RTC_Utils::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 RTC_Utils::StateMachine< State, Listener, States, Callback >::m_num
protected
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
std::vector<Callback> RTC_Utils::StateMachine< State, Listener, States, Callback >::m_postdo
protected
template<class State, class Listener, class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
std::vector<Callback> RTC_Utils::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 RTC_Utils::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 RTC_Utils::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 RTC_Utils::StateMachine< State, Listener, States, Callback >::m_transit
protected

State transition action 用コールバック関数

参照元 RTC_Utils::StateMachine< ExecContextState, RTC_impl::RTObjectStateMachine >::swap().


このクラス詳解は次のファイルから抽出されました: