Boost logo

Boost Users :

Subject: [Boost-users] Boost.MSM -> Ignore events that were not explicitly defined for a state
From: RaRi (degoah_at_[hidden])
Date: 2012-12-18 11:18:38


Hello list,

I'm experimenting a bit with *boost.msm* from the *boost 1.52* library.

Please consider the following small code snippted which generally defines
a state machine with the states *State1*, *State2* and *State3*, and
the events *Event1* (triggers the transition from State1 to State2) and
*Event2* (triggers the transition from State2 to State3):

#include <iostream>
#include <boost/msm/back/state_machine.hpp>

#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

namespace {
    namespace msm = boost::msm;
    namespace msmf = boost::msm::front;
    namespace mpl = boost::mpl;

    // ----- Events
        struct Event1 {};
        struct Event2 {};
    // ----- State machine
    struct Sm1_:msmf::state_machine_def<Sm1_>
    {
        // States
        struct Init:msmf::state<> {};
        struct State1:msmf::state<>
        {
            // Entry action
            template <class Event,class Fsm>
            void on_entry(Event const&, Fsm&) {
                std::cout << "State1::on_entry()" << std::endl;
            }
            // Exit action
            template <class Event,class Fsm>
            void on_exit(Event const&, Fsm&) {
                std::cout << "State1::on_exit()" << std::endl;
            }
        };

        struct State2:msmf::state<>
        {
            // Entry action
            template <class Event,class Fsm>
            void on_entry(Event const&, Fsm&) {
                std::cout << "State2::on_entry()" << std::endl;
            }
            // Exit action
            template <class Event,class Fsm>
            void on_exit(Event const&, Fsm&) {
                std::cout << "State2::on_exit()" << std::endl;
            }
        };

        struct State3:msmf::state<>
        {
            // Entry action
            template <class Event,class Fsm>
            void on_entry(Event const&, Fsm&) {
                std::cout << "State3::on_entry()" << std::endl;
            }
            // Exit action
            template <class Event,class Fsm>
            void on_exit(Event const&, Fsm&) {
                std::cout << "State3::on_exit()" << std::endl;
            }
        };

        // Set initial state
        typedef State1 initial_state;

        // Actions
        struct InitAction {
            template <class Event, class Fsm, class SourceState, class
TargetState>
            void operator()(Event const&, Fsm&, SourceState&, TargetState&)
const
            {
                std::cout << "InitAction()" << std::endl;
            }
        };
                struct transition_table:mpl::vector<
                    // Start Event Next Action
Guard
                    msmf::Row < State1, Event1, State2, msmf::none,
msmf::none >,
                    msmf::Row < State2, Event2, State3, msmf::none,
msmf::none >
> {};
    };

    // Pick a back-end
    typedef msm::back::state_machine<Sm1_> Sm1;

    void test()
    {
        Sm1 sm1;
        sm1.start();
        std::cout << "> Send Event2" << std::endl;
        sm1.process_event(Event2());
        std::cout << "> Send Event1" << std::endl;
        sm1.process_event(Event1());
    }
}

int main()
{
    test();
    return 0;
}

If I compile and execute the code above the software crashes due to the
fact, that *Event2* is received in the state *State1*.

My understanding of a state machine and boost.msm was, that all events which
are not defined for a particular state, will be just ignored and the state
receiving this unknown event (here *Event2*) will keept.

Is there a possibility in boost.msm ( maybe by adopting to the transition
table) to stay in the current state if an event was received which was not
assigned to this state?

Thank you in advance!

Best regards,

RaRi

--
View this message in context: http://boost.2283326.n4.nabble.com/Boost-MSM-Ignore-events-that-were-not-explicitly-defined-for-a-state-tp4640291.html
Sent from the Boost - Users mailing list archive at Nabble.com.

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