0

ブースト msm 1_60 を使用して、サブマシンの current_state を取得する方法はありますか? 次のコードを考えてみましょう。このコードは、2 つの異なる信号機 (たとえば、標準の赤、黄、緑の 1 つと、交互に 2 つの黄色の信号を持つ別のもの) の間で選択できる外側のステート マシンを記述しています。

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>;

これで、次の方法で RYG にスキップできます

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

しかし、RYG サブマシンの現在の状態を取得するにはどうすればよいでしょうか?

oSM.current_state()[0]

1 のみを返します (これは外部ステート マシン BigMom の状態であるため...)...

手伝ってくれてありがとう!

4

1 に答える 1

0

その間、私はそれを理解しました、解決策はかなり簡単です。ファンクタ フロント エンドを使用して、次のように呼び出されるアクション (ROW の 4 列目) 関数を追加します。

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

複数の「マスター」マシンが実行されていて、どのマシンが submachineAction を呼び出したかを知る必要がある場合は、たとえば、追加の識別子 (文字列、int、名前を付ける) を使用してベース フロント エンド クラスを定義し、そこからサブマシンを派生させることができます。クラス。次に、このスレッドに従って、上記のファンクターの p_rFSM を介してアクセスできる識別子を設定できます: How to Pass data to current boost meta state machine(MSM) substate

これがいつか他の誰かに役立つことを願っています。

于 2016-08-01T11:57:23.103 に答える