Giriş
Şu satırı dahil ederiz.
Bu sınıfı içinde state'ler tutulur. Start State, Event, Next State, Action, Guard tanımlanır. Guard geçişin yapılıp yapılamayacağını belirtir. Guard tanımlamak için şöyle yaparız.
Şöyle yaparız.
Şu satırı dahil ederiz.
#include <boost/msm/front/state_machine_def.hpp>
Şu satırı dahil ederiz.namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
Tanımlama
Şöyle yaparız.// ----- State machine
struct Sm : msmf::state_machine_def<Sm> {
...
};
Başlangıç state belirtilir. Şöyle yaparız.struct Sm_:msmf::state_machine_def<Sm_>
{
// States
struct State1:msmf::state<> {
...
};
struct State2:msmf::state<> {
...
};
// Set initial state
typedef State1 initial_state;
// Guards
struct Guard1 {
template <class Event, class Fsm, class Source, class Target>
bool operator()(Event const&, Fsm& fsm, Source& src, Target&) const {
...
bool transitionAllowed = ...;
return transitionAllowed;
}
};
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
// source and target is the same
msmf::Row < State1, Event1, State1, msmf::none, Guard1 >,
// source and target is different
msmf::Row < State1, Event2, State2, msmf::none, Guard1 >
> {};
...
};
exception_caught metodu
Şöyle yaparız.
Şöyle yaparız.
template <class FSM,class Event>
void exception_caught (Event const&,FSM&,std::exception& e) {
std::cout << e.what() << std::endl;
}
transition_table alanı
// Guards
struct Guard1 {
template <class Event, class Fsm, class Source, class Target>
bool operator()(Event const&, Fsm& fsm, Source& src, Target&) const {
...
bool transitionAllowed = ...
return transitionAllowed;
}
};
İki state arasında geçiş olup olmadığını anlamak için şöyle yaparız.bool transition = !std::is_same<Source, Target>::value;
Fsm sınıfı içindeki bir şeye erişmek için şöyle yaparız.bool transitionAllowed = fsm.y;
src state içindeki bir şeye erişmek için şöyle yaparız.bool transitionAllowed = src.z;
ÖrnekŞöyle yaparız.
// Set initial state
typedef mpl::vector<A, B> initial_state;
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
msmf::Row < A, After2, A, Action, msmf::none >,
msmf::Row < B, After5, B, Action, msmf::none >
> {};
Örnek
Şöyle yaparız
Şöyle yaparız
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
// source and target is the same
msmf::Row < State1, Event1, State1, msmf::none, Guard1 >,
// source and target is different
msmf::Row < State1, Event2, State2, msmf::none, Guard1 >
> {};
Hiç yorum yok:
Yorum Gönder