Государственные идентификаторы в boost :: 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, Но я не нашел объяснения, как определить порядок состояний. Конечно, я могу догадаться, что это порядок состояний в столбце «Пуск» таблицы переходов. Но как насчет случаев, когда некоторые состояния отсутствуют в столбце «Пуск»?

3

Решение

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector