OpenRTM-aist 2.0.2
読み取り中…
検索中…
一致する文字列を見つけられません
RTC_Utils::StateMachine< State, Listener, States, Callback > クラステンプレート

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

#include <StateMachine.h>

RTC_Utils::StateMachine< State, Listener, States, Callback > 連携図

公開メンバ関数

 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
 
std::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 };
  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;
};

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

  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()は次状態を強制的にセットする関数であり、遷移の可否は、 ユーザが現在状態を取得し判断するロジックを実装しなければならない。

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

  • 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 が実行され、以降は前項と同じ動作をする。
引数
State状態の型
Listenerアクション用リスナーオブジェクト
States状態ホルダー
Callbackアクション用コールバック関数
から
0.4.0

構築子と解体子

◆ StateMachine() [1/2]

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)
inlineexplicit

コンストラクタ

コンストラクタ

引数
num_of_stateステートマシン中の状態数

◆ ~StateMachine()

template<class T , class U , class V , class W >
RTC_Utils::StateMachine< T, U, V, W >::~StateMachine ( )
virtualdefault

◆ StateMachine() [2/2]

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

関数詳解

◆ getState()

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

現在の状態を取得する

現在の状態を取得する。

戻り値
現在の状態

◆ getStates()

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つ前の状態、遷移予定の状態を取得することができる。

戻り値
状態情報

◆ goTo()

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遷移先状態

◆ isIn()

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確認対象状態
戻り値
状態確認結果

◆ operator=()

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

◆ setDoAction()

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 用コールバック関数
戻り値
アクション実行結果

◆ setEntryAction()

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 用コールバック関数
戻り値
アクション実行結果

◆ setExitAction()

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 用コールバック関数
戻り値
アクション実行結果

◆ setListener()

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 オブジェクト

◆ setNOP()

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コールバック関数

◆ setNullFunc()

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関数)

◆ setPostDoAction()

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 用コールバック関数
戻り値
アクション実行結果

◆ setPreDoAction()

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 用コールバック関数
戻り値
アクション実行結果

◆ setStartState()

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初期状態

◆ setTransitionAction()

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 用コールバック関数
戻り値
アクション実行結果

◆ swap()

◆ worker()

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

駆動関数

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

◆ worker_do()

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

◆ worker_post()

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

◆ worker_pre()

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

メンバ詳解

◆ m_do

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

Do action 用コールバック関数

参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().

◆ m_entry

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

Entry action 用コールバック関数

参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().

◆ m_exit

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

Exit action 用コールバック関数

参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().

◆ m_listener

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

コールバック関数用リスナー

参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().

◆ m_mutex

template<class State , class Listener , class States = StateHolder<State>, class Callback = void (Listener::*)(const States& states)>
std::mutex RTC_Utils::StateMachine< State, Listener, States, Callback >::m_mutex
protected

◆ m_num

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

◆ m_postdo

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

PostDo action 用コールバック関数

参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().

◆ m_predo

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

PreDo action 用コールバック関数

参照元 RTC_Utils::StateMachine< State, Listener, States, Callback >::swap().

◆ m_selftrans

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

◆ m_states

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

◆ m_transit

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< State, Listener, States, Callback >::swap().


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