Boost logo

Boost Users :

Subject: [Boost-users] Boost::MSM do_actions while in state
From: IgnacioVizzo (ignaciovizzo_at_[hidden])
Date: 2018-06-29 19:25:48


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 <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/euml/euml.hpp>
#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 <class FSM, class EVT, class SourceState, class
TargetState>
        void operator()(EVT const &, FSM &fsm, SourceState &, TargetState &)
        {
            std::cout << "-v- transition_action -v-" << std::endl;
            return;
        }
    };

    BOOST_MSM_EUML_ACTION(guard)
    {
        template <class FSM,class EVT,class SourceState,class TargetState>
        bool operator()(EVT const& evt,FSM&,SourceState& ,TargetState&)
        {
            std::cout << "[guard]" << std::endl;
            return true;
        }
    };

    BOOST_MSM_EUML_ACTION(entry_action)
    {
        template <class Event, class FSM, class STATE>
        void operator()(Event const &, FSM &, STATE &)
        {
            std::cout << "==>entry_action" << std::endl;
            return;
        }
    };

    BOOST_MSM_EUML_ACTION(exit_action)
    {
        template <class Event, class FSM, class STATE>
        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<my_fsm> 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

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net