boost msm submachine current_state 用于访问子状态
boost msm submachine current_state for accessing sub state
知道如何使用 boost msm 1_60 获得 submachine 的 current_state(s) 吗?考虑以下代码,描述了一个外部状态机,它允许在两个不同的交通信号灯之间进行选择(例如,标准的红色、黄色、绿色一个和另一个具有交替的两个黄色灯):
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]
returns 仅 1(因为这是外部状态机 BigMom 的状态...)...
感谢帮助!
我同时想通了,解决方法很简单。只是,使用仿函数前端,添加一个动作(行中的第 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;
}
};
如果您有几台 "master" 机器 运行 并且需要知道哪一台称为 submachineAction,您可以定义,例如,带有附加标识符的基本前端 class (string, int, you name it) 并从 class 派生子机器。然后,在这个线程之后,您可以设置标识符,可以通过上面仿函数中的 p_rFSM 访问: How to Pass data to the current boost meta state machine(MSM) substate
希望这有时能对其他人有所帮助。
知道如何使用 boost msm 1_60 获得 submachine 的 current_state(s) 吗?考虑以下代码,描述了一个外部状态机,它允许在两个不同的交通信号灯之间进行选择(例如,标准的红色、黄色、绿色一个和另一个具有交替的两个黄色灯):
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>;
现在,我可以通过
跳入 RYGSMBackend oSM. oSM.process_event(evSelectCommonRYG());
但是如何获取RYG子机的当前状态呢?
oSM.current_state()[0]
returns 仅 1(因为这是外部状态机 BigMom 的状态...)...
感谢帮助!
我同时想通了,解决方法很简单。只是,使用仿函数前端,添加一个动作(行中的第 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;
}
};
如果您有几台 "master" 机器 运行 并且需要知道哪一台称为 submachineAction,您可以定义,例如,带有附加标识符的基本前端 class (string, int, you name it) 并从 class 派生子机器。然后,在这个线程之后,您可以设置标识符,可以通过上面仿函数中的 p_rFSM 访问: How to Pass data to the current boost meta state machine(MSM) substate
希望这有时能对其他人有所帮助。