9 Ağustos 2017 Çarşamba

msm state_machine_def Sınıfı

Giriş
Ş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.
template <class FSM,class Event>
void exception_caught (Event const&,FSM&,std::exception& e) {
  std::cout << e.what() << std::endl;
}
transition_table alanı
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.
// 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
// 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