美文网首页
boost msm

boost msm

作者: zxlele_c763 | 来源:发表于2021-05-30 17:04 被阅读0次

    sub-msm process events

    sub-msm can become state in master msm

    • set sub msm as a state

    master MSM define example

     using initial_state = boost::mpl::vector<Init, Working>;
    
     struct transition_table : mpl::vector<
                //        Start         Event        Next          Action           Guard 
                msmf::Row<Init,         Event1,      SubSm1,         PerformEvent1Action,         ExecutionInformation>,
                msmf::Row<SubSm1,       Abort,       End,            PerformAbortAction,          ExecutionInformation>,
                msmf::Row<Working,      Abort,       msmf::none,     PerformSetWaitFlag,          ExecutionInformation>
                //msmf::Row<State1,       Timeout,     msmf::none,     PerformEvent1Action,       ExecutionInformation>
            >{};
    
    

    sub- MSM define

     using initial_state = boost::mpl::vector<Init, Working>;
    
    struct transition_table : mpl::vector<
                //        Start        Event        Next          Action           Guard
                
                msmf::Row<Working,      Abort,       msmf::none,     msmf::none,             ExecutionInformation>,
                msmf::Row<Working,      Abort,       msmf::none,     PerformSetWaitFlag,     ExecutionNeedWait>,
                msmf::Row<Init,         Abort,       State1,         PerformAbortAction,     ExecutionInformation>,
                msmf::Row<State1,       Timeout,     msmf::none,     PerformEvent1Action,    ExecutionInformation>
            >{};
    
    

    input Test codes:

    void MsmTest::subMsmEventsTest()
    {
        
        MasterMsm::Sm1 sm1;
        sm1.process_event(Event1{});
        struct Abort abort;
        abort.isNgApMsgBack = true;
        sm1.process_event(abort);
    
        return; 
    }
    
    
    • common codes:
    struct ExecutionInformation
    {
        template <class Event, class StateMachine, class SourceState, class TargetState>
        bool operator()(Event const& event, StateMachine&, SourceState& sourceState, TargetState& targetState)
        {
          
            std::cout<<"received message: "<< boost::core::demangle(typeid(event).name()) <<" ." <<std::endl;
            std::cout<<"sourceState is: "<< boost::core::demangle(typeid(sourceState).name()) <<" ." <<std::endl;
            std::cout<<"targetState is: "<<boost::core::demangle(typeid(targetState).name()) <<" ." <<std::endl;
    
            return true;
        }
    };
    
    struct PerformEvent1Action
    {
    
        template <class Event, class StateMachine, class SourceState, class TargetState>
        void operator()(const Event&, StateMachine&, SourceState&, TargetState&)
        {
            std::cout<<" PerformEvent1Action "<<std::endl;
        }
    };
    
    struct PerformAbortAction
    {
    
        template <class Event, class StateMachine, class SourceState, class TargetState>
        void operator()(const Event&, StateMachine&, SourceState&, TargetState&)
        {
            std::cout<<" PerformAbortAction "<<std::endl;
        }
    };
    
    

    test logs:

    ========subMsmEventsTest beging=======
    received message: Event1 .
    sourceState is: MasterMsm::Sm1_::Init .
    targetState is: boost::msm::back::state_machine<(anonymous namespace)::SubSm1_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_> .
     PerformEvent1Action
    sub msm :: Init::on_entry()
    sub msm ::Working::on_entry()
    received message: Abort .
    sourceState is: (anonymous namespace)::SubSm1_::Init .
    targetState is: (anonymous namespace)::SubSm1_::State1 .
     PerformAbortAction
    sub msm ::State1::on_entry()
    received message: Abort .
    sourceState is: (anonymous namespace)::SubSm1_::Working .
    targetState is: (anonymous namespace)::SubSm1_::Working .
    event isNgApMsgBack is true.
     PerformSetWaitFlag
    received message: Abort .
    sourceState is: MasterMsm::Sm1_::Working .
    targetState is: MasterMsm::Sm1_::Working .
     PerformSetWaitFlag
    MsmTest deconstruct.
    
    

    sub msm return to master msm

    method 1: exit_pseudo_state submsm exit .

    • C++ codes master msm(include defer process)
    typedef int activate_deferred_events;  //defer data type
    
    //using ActionSequence = boost::msm::front::ActionSequence_<boost::mpl::vector<Actions...>>;
    
     using E1F1Exit = SubMsmSubToMaster::SubSm::exit_pt<SubMsmSubToMaster::SubSm::ExitState>;
    
    using initial_state = boost::mpl::vector<Init, State2, Working>;
    
    
          struct transition_table : mpl::vector<
                //        Start            Event             Next              Action                        Guard
                                                            
                msmf::Row<Init,           Event1,            State1,           PerformEvent1Action,           ExecutionInformation>,
                msmf::Row<State1,         msmf::none,        SubMsmSubToMaster::SubSm, 
                                                                               PerformNoneEventAction,       ExecutionInformation>,
                msmf::Row<State2,         UeContextReleaseCommand,  msmf::none,        msmf::Defer,          ExecutionInformation>,
                msmf::Row<State2,         Timeout,                  msmf::none,        msmf::Defer,          ExecutionInformation>,
                
                //E1F1Exit
                msmf::Row<E1F1Exit,       msmf::none,       HoCompletion,     msmf::none,                    ExecutionInformation>,
                
                //complete:
                msmf::Row<HoCompletion,    UeContextReleaseCommand,           HoExit,            msmf::none,  ExecutionInformation>,
                msmf::Row<HoCompletion,    Timeout,                           HoExit,            msmf::none,  ExecutionInformation>,
    
                msmf::Row<Working,         Abort,            msmf::none,            msmf::none,               ExecutionInformation>      
            >{};
    
    
    
    
    • sub msm C++ codes(msmf::exit_pseudo_state)
            struct ExitState : msmf::exit_pseudo_state<msmf::none>
            {   
                // Entry action
                template <class Event,class Fsm>
                void on_entry(Event const&, Fsm&) {
                    std::cout << "SubSm::ExitState::on_entry()" << std::endl;
                }
                // Exit action
                template <class Event,class Fsm>
                void on_exit(Event const&, Fsm&) {
                    std::cout << "SubSm::ExitState::on_exit()" << std::endl;
                }
            };
      
    
       struct transition_table : mpl::vector<
                //        Start        Event        Next          Action                  Guard 
                //msmf::Row<Init,        Or_<Event1, Abort>,      State1,       msmf::none,             ExecutionInformation>,
                msmf::Row<Init,        Event1,      State1,       msmf::none,             ExecutionInformation>,
                msmf::Row<State1,      Abort,       ExitState,    PerformAbortAction,     ExecutionInformation>
                //msmf::Row<End,         Timeout,     msmf::none,   PerformEvent1Action,    ExecutionInformation>
            >{};
    
    
    • test codes
    void MsmTest::subMsmTransferToMasterMsmTest()
    {
        std::cout<<std::endl<<"=======subMsmTransferToMasterMsmTest beging======="<<std::endl;
        SubMsmTransferMasterMsm::Sm1 sm1;
        sm1.start();
    
        sm1.process_event(Event1{});
        sm1.process_event(UeContextReleaseCommand{});
        sm1.process_event(Timeout{});
        sm1.process_event(Event1{});
        sm1.process_event(Abort{});
    
        return; 
    }
    
    • test logs ::HoCompletion::on_entry()
    start.
    MsmTest construct.
    =======subMsmTransferToMasterMsmTest beging=======
    Init::on_entry()
    State2::on_entry()
    Working::on_entry()
    received message: Event1 .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::Init .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State1 .
     PerformEvent1Action
    State1::on_entry()
    received message: boost::msm::front::none .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State1 .
    targetState is: boost::msm::back::state_machine<SubMsmSubToMaster::Sm1_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_> .
    State1::on_exit()
     PerformNoneEventAction
    SubSm::Init::on_entry()
    received message: UeContextReleaseCommand .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    received message: Timeout .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    received message: Event1 .
    sourceState is: SubMsmSubToMaster::Sm1_::Init .
    targetState is: SubMsmSubToMaster::Sm1_::State1 .
    SubSm::State1::on_entry()
    received message: UeContextReleaseCommand .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    received message: Timeout .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    received message: Abort .
    sourceState is: SubMsmSubToMaster::Sm1_::State1 .
    targetState is: boost::msm::back::state_machine<SubMsmSubToMaster::Sm1_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_>::exit_pt<SubMsmSubToMaster::Sm1_::ExitState> .
    SubSm::State1::on_exit()
     PerformAbortAction
    SubSm::ExitState::on_entry()
    received message: Abort .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::Working .
    targetState is: SubMsmTransferMasterMsm::Sm1_::Working .
    received message: boost::msm::front::none .
    sourceState is: boost::msm::back::state_machine<SubMsmSubToMaster::Sm1_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_, boost::parameter::void_> .
    targetState is: SubMsmTransferMasterMsm::Sm1_::HoCompletion .
    SubSm::ExitState::on_exit()
    HoCompletion::on_entry()    // exit from sub msm to master msm
    received message: UeContextReleaseCommand .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::HoCompletion .
    targetState is: SubMsmTransferMasterMsm::Sm1_::HoExit .
    HoCompletion::on_exit()
    HoExit::on_entry()
    received message: UeContextReleaseCommand .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    received message: Timeout .
    sourceState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    targetState is: SubMsmTransferMasterMsm::Sm1_::State2 .
    MsmTest deconstruct.
    
    

    相关文章

      网友评论

          本文标题:boost msm

          本文链接:https://www.haomeiwen.com/subject/drjbsltx.html