Is there any way to do this? Using boost::msm?
I know for fact that you can implement transition actions using the library,
I've searched a lot around the internet and I didn't find my answer.
So basically let's say I want to do this:
http://boost.2283326.n4.nabble.com/file/t371323/boost_msm_1.png
boost_msm_1.png
http://boost.2283326.n4.nabble.com/file/t371323/boost_msm_1.png
diagram1.cpp http://boost.2283326.n4.nabble.com/file/t371323/diagram1.cpp
#include
#include
#include <iostream>
using namespace boost::msm::front::euml;
namespace msm = boost::msm;
namespace fsm
{
BOOST_MSM_EUML_EVENT(trigger);
BOOST_MSM_EUML_ACTION(transition_action)
{
template
void operator()(EVT const &, FSM &fsm, SourceState &, TargetState &)
{
std::cout << "-v- transition_action -v-" << std::endl;
return;
}
};
BOOST_MSM_EUML_ACTION(guard)
{
template
bool operator()(EVT const& evt,FSM&,SourceState& ,TargetState&)
{
std::cout << "[guard]" << std::endl;
return true;
}
};
BOOST_MSM_EUML_ACTION(entry_action)
{
template
void operator()(Event const &, FSM &, STATE &)
{
std::cout << "==>entry_action" << std::endl;
return;
}
};
BOOST_MSM_EUML_ACTION(exit_action)
{
template
void operator()(Event const &, FSM &, STATE &)
{
std::cout << "<==exit_action" << std::endl;
return;
}
};
BOOST_MSM_EUML_STATE((entry_action,exit_action), State1);
// BOOST_MSM_EUML_STATE((entry_action,exit_action), State2);
// define the transition table
BOOST_MSM_EUML_TRANSITION_TABLE((
State1 == State1 + trigger[guard] / transition_action
// State1 == State2 + trigger[guard] / transition_action
),
transition_table)
// BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table, State1), fsm)
// create a state machine "on the fly"
BOOST_MSM_EUML_DECLARE_STATE_MACHINE((transition_table,
init_ << State1,
no_action,
no_action,
attributes_ << no_attributes_,
configure_ << no_configure_,
no_action
),
my_fsm)
typedef msm::back::state_machine fsm_t;
} //namespace fsm
int main(int argc, char const *argv[])
{
fsm::fsm_t example_fsm;
example_fsm.start();
example_fsm.process_event(fsm::trigger);
example_fsm.process_event(fsm::trigger);
return 0;
}
// OUTPUT
// ==>entry_action
// [guard]
// <==exit_action
// -v- transition_action -v-
// ==>entry_action
// [guard]
// <==exit_action
// -v- transition_action -v-
// ==>entry_action
But I want the machine to DO an action ONCE the Entry_action has completed
and BEFORE the states exits. This is sort of a token or mark, like it's used
in petri nets and GRAFCETS, basically. I want to add this
boost_msm_2.png
http://boost.2283326.n4.nabble.com/file/t371323/boost_msm_2.png
http://boost.2283326.n4.nabble.com/file/t371323/boost_msm_2.png
And the output for should be something like
/ OUTPUT
// ==>entry_action
// -DO ACTION-
// [guard]
// <==exit_action
// -v- transition_action -v-
// ==>entry_action
// -DO ACTION-
// [guard]
// <==exit_action
// -v- transition_action -v-
// ==>entry_action
Thanks!
--
Sent from: http://boost.2283326.n4.nabble.com/Boost-Users-f2553780.html