2016-07-28 4 views
0

どのように考えて、ブーストmsm 1_60を使用して、私はサブマシンのcurrent_state(s)を得ることができますか? (インスタンスのための2つの黄色のライト交互に標準の赤、黄、緑の及び他の)二つの異なる交通信号間択一を可能にする外側ステートマシン記述、次のコードを検討:ブーストmsmサブマシンcurrent_state

class SMBigMom : public msmf::state_machine_def<SMBigMom> 
{ 
public: 
SMBigMom() {}; 

using initial_state = SMSelectorState; 

class SMLightBase : public msmf::state_machine_def<SMLightBase> 
{ 
public: 
    SMLightBase() {}; 

    using initial_state = BaseState; 
    struct transition_table : mpl::vector<> {}; 
}; 
using SMBaseBackend = msm::back::state_machine<SMLightBase>; 

class SMCommonRYG : public SMLightBase 
{ 
public: 
    SMCommonRYG() = default; 
    ~SMCommonRYG() {}; 

    using initial_state = Red; // init state 

    struct transition_table : mpl::vector< 
     //   Start, Event, Target, Action, Guard 
     msmf::Row< Red, evNext, RedYellow, msmf::none, msmf::none >, 
     msmf::Row< RedYellow, evNext, Green, msmf::none, msmf::none >, 
     msmf::Row< Green, evNext, Yellow, msmf::none, msmf::none >, 
     msmf::Row< Yellow, evNext, Red, msmf::none, msmf::none > 
    > {}; 
}; 
using SMCommonRYGBackend = msm::back::state_machine<SMCommonRYG>; 

class SMYellowAlternate : public SMLightBase 
{ 
public: 
    SMYellowAlternate() = default; 
    ~SMYellowAlternate() {}; 

    using initial_state = Yellow; // init state 

    struct transition_table : mpl::vector< 
     //   Start, Event, Target, Action, Guard 
     msmf::Row< Yellow, evNext, Yellow2, msmf::none, msmf::none >, 
     msmf::Row< Yellow2, evNext, Yellow, msmf::none, msmf::none > 
    > {}; 
}; 
using SMYellowAlternateBackend = msm::back::state_machine<SMYellowAlternate>; 

struct transition_table : mpl::vector< 
    msmf::Row< SMSelectorState, evSelectCommonRYG, SMCommonRYGBackend, msmf::none, msmf::none >, 
    msmf::Row< SMSelectorState, evSelectYellowAlternate, SMYellowAlternateBackend, msmf::none, msmf::none > 
> {}; 

を}。今

using SMBackend = msm::back::state_machine<SMBigMom>; 

、私は

SMBackend oSM. oSM.process_event(evSelectCommonRYG()); 

経由RYGにスキップすることができます。しかし、どのように私は、RYGのサブマシンの現在の状態を得ることができますか?唯一

oSM.current_state()[0] 

1を返します(これは外側のステートマシンBigMom ...の状態であるとして)...助けを

ありがとう!

答えて

0

私はそれを理解しましたが、解決策はかなり簡単です。あなたが実行しているいくつかの「マスター」マシンを持っているとsubmachineActionと呼ばれている1知っておく必要がある場合は

struct submachineAction 
{ 
    toNext() {}; 
    ~toNext() {}; 
    template<class TFsm, class TEvent, class TStateIn, class TStateOut> 
    void operator() (const TEvent& p_rEV, const TFsm& p_rFSM, TStateIn& p_rStateIn, TStateOut& p_rStateOut) 
    { 
    std::cout << "Substate: " << p_rFSM.current_state()[0] << std::endl; 
    } 
}; 

:ただ、ファンクタフロントエンドを使用して、このように呼ばれているアクション(ROWで4列目)機能を追加たとえば、追加の識別子(文字列、int、あなたの名前)を持つ基本フロントエンドクラスを定義し、そのクラスからサブマシンを派生させることができます。次に、このスレッドに続いて、上記ファンクタのp_rFSMを介してアクセスできる識別子を設定することができます。How to Pass data to the current boost meta state machine(MSM) substate

これは他の誰かにいつでも役立ちます。

関連する問題