2013-05-27 1 views
2

В учебнике для повышения :: msm есть пример, показывающий, как мы можем проверить текущее состояние.Идентификаторы состояния в boost :: msm

// Transition table for player 
    struct transition_table : mpl::vector< 
     //  Start  Event   Next  Action    Guard 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Stopped , play  , Playing , &p::start_playback       >, 
     a_row < Stopped , open_close , Open , &p::open_drawer       >, 
     a_row < Stopped , stop  , Stopped , &p::stopped_again       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Open , open_close , Empty , &p::close_drawer       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Empty , open_close , Open , &p::open_drawer       >, 
     a_row < Empty , cd_detected , Stopped , &p::store_cd_info       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Playing , stop  , Stopped , &p::stop_playback       >, 
     a_row < Playing , pause  , Paused , &p::pause_playback       >, 
     a_row < Playing , open_close , Open , &p::stop_and_open       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < Paused , end_pause , Playing , &p::resume_playback      >, 
     a_row < Paused , stop  , Stopped , &p::stop_playback       >, 
     a_row < Paused , open_close , Open , &p::stop_and_open       >, 
     // +---------+-------------+---------+---------------------+----------------------+ 
     a_row < AllOk , error_found ,ErrorMode, &p::report_error       >, 
     a_row <ErrorMode,end_error ,AllOk , &p::report_end_error      > 
     // +---------+-------------+---------+---------------------+----------------------+ 
    > {}; 

    // Replaces the default no-transition response. 
    template <class FSM,class Event> 
    void no_transition(Event const& e, FSM&,int state) 
    { 
     std::cout << "no transition from state " << state 
      << " on event " << typeid(e).name() << std::endl; 
    } 
}; 
// Pick a back-end 
typedef msm::back::state_machine<player_> player; 

// 
// Testing utilities. 
// 
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused","AllOk","ErrorMode" }; 

void pstate(player const& p) 
{ 
    // we have now several active states, which we show 
    for (unsigned int i=0;i<player::nr_regions::value;++i) 
    { 
     std::cout << " -> " << state_names[p.current_state()[i]] << std::endl; 
    } 
} 

Автор использует массив state_names. Но я не нашел объяснения, как определить порядок состояний. Конечно, я могу догадаться, что это порядок состояний в столбце «Старт» таблицы переходов. Но как насчет случаев, когда некоторые штаты не находятся в столбце «Старт»?

ответ

1

Это объясняется в документации MSM (Глава 6. Внутренние, Идентификаторы сгенерированных состояний). Порядок - это то, что можно было бы ожидать - соответствующий порядок состояний источников в таблице перехода, за которым следует соответствующий порядок целевых состояний.