emc_system
engine.h
Go to the documentation of this file.
1 #ifndef EMC_SYSTEM_SYSTEM_H_
2 #define EMC_SYSTEM_SYSTEM_H_
3 
4 #include "emc/data.h"
5 #include "emc/io.h"
6 
7 #include <map>
8 #include <iostream>
9 
10 namespace emc
11 {
12 #pragma GCC diagnostic push
13 #pragma GCC diagnostic ignored "-Wunused-variable"
14 static const char* no_event = 0;
15 #pragma GCC diagnostic pop
16 
17 typedef void (*state_function)(FSMInterface&, IO& io, void* user_data);
18 
19 class Communication;
20 
21 class Engine
22 {
23 
24 public:
25 
26  Engine();
27 
28  ~Engine();
29 
30  void setInitialState(const char* state)
31  {
32  state_ = getState(state);
33  if (state_ < 0)
34  addError("While setting initial state: Unknown state: '" + std::string(state) + "'");
35  }
36 
37  void registerState(const char* state, state_function func)
38  {
39  int s_id = addState(state);
40  if (s_id < 0)
41  return;
42 
43  StateDetail& s = state_details[s_id];
44  s.func = func;
45  }
46 
47  void registerTransition(const char* state1, const char* event, const char* state2)
48  {
49  int s1 = getState(state1);
50  int s2 = getState(state2);
51  int e = getOrAddEvent(event);
52 
53  if (s1 < 0 || s2 < 0)
54  {
55  std::string err = "While adding transition '" + std::string(state1) + "' -> '" + eventToString(e)
56  + "' -> '" + std::string(state2) + "':\n\n";
57 
58  if (s1 < 0)
59  err += " Unknown state: '" + std::string(state1) + "'\n";
60  if (s2 < 0)
61  err += " Unknown state: '" + std::string(state2) + "'\n";
62 
63  addError(err);
64  return;
65  }
66 
67  StateDetail& s1_data = state_details[s1];
68  s1_data.transitions[e] = s2;
69  }
70 
71  void run();
72 
73  void setLoopFrequency(double freq) { loop_freq_ = freq; }
74 
75  void setUserData(void* user_data) { user_data_ = user_data; }
76 
77 private:
78 
79  IO* io_;
80 
81  int state_;
82 
83  struct StateDetail
84  {
85  StateDetail() : func(0) {}
86 
90  };
91 
93 
95 
97 
99 
100  void* user_data_;
101 
102  double loop_freq_;
103 
104  int addState(const char* state)
105  {
106  if (state_to_int.find(state) != state_to_int.end())
107  {
108  addError("State '" + std::string(state) + "' already added.");
109  return -1;
110  }
111 
112  int s_id = state_details.size();
113  state_to_int[state] = s_id;
114  state_details.push_back(StateDetail());
115  StateDetail& s = state_details[s_id];
116  s.name = state;
117 
118  return s_id;
119  }
120 
121  int getState(const char* state)
122  {
124  if (it != state_to_int.end())
125  return it->second;
126  return -1;
127  }
128 
129  const std::string& stateToString(int state_id)
130  {
131  return state_details[state_id].name;
132  }
133 
134  int getEvent(const char* event)
135  {
137  if (it != event_to_int.end())
138  return it->second;
139  return -1;
140  }
141 
142  int getOrAddEvent(const char* event)
143  {
144  // Special case: the 'null' event
145  if (!event)
146  return 0;
147 
149  if (it != event_to_int.end())
150  return it->second;
151 
152  int e_id = event_to_int.size();
153  event_to_int[event] = e_id;
154  events.push_back(event);
155 
156  return e_id;
157  }
158 
159  const std::string& eventToString(int event_id)
160  {
161  return events[event_id];
162  }
163 
165 
166  void addError(const std::string& err)
167  {
168  std::cout << "[EMC SYSTEM] ERROR: " << err << std::endl;
169  has_error_ = true;
170  }
171 
172 };
173 
174 } // end namespace emc
175 
176 #endif
emc::Engine::loop_freq_
double loop_freq_
Definition: engine.h:102
emc::Engine::state_
int state_
Definition: engine.h:81
emc::Engine::getEvent
int getEvent(const char *event)
Definition: engine.h:134
std::string
emc::Engine::StateDetail::name
std::string name
Definition: engine.h:87
emc::Engine::addError
void addError(const std::string &err)
Definition: engine.h:166
emc::FSMInterface
Definition: data.h:35
emc::Engine::has_error_
bool has_error_
Definition: engine.h:164
emc::state_function
void(* state_function)(FSMInterface &, IO &io, void *user_data)
Definition: engine.h:17
emc::Engine::getOrAddEvent
int getOrAddEvent(const char *event)
Definition: engine.h:142
emc::Engine::events
std::vector< std::string > events
Definition: engine.h:96
std::vector< std::string >
std::map::find
T find(T... args)
std::map::size
T size(T... args)
emc::Engine::registerState
void registerState(const char *state, state_function func)
Definition: engine.h:37
emc::Engine::stateToString
const std::string & stateToString(int state_id)
Definition: engine.h:129
iostream
emc::Engine::setUserData
void setUserData(void *user_data)
Definition: engine.h:75
emc::Engine::event_to_int
std::map< std::string, int > event_to_int
Definition: engine.h:92
std::vector::push_back
T push_back(T... args)
std::cout
emc::Engine::setLoopFrequency
void setLoopFrequency(double freq)
Definition: engine.h:73
emc::Engine::Engine
Engine()
Definition: engine.cpp:12
emc::Engine::state_to_int
std::map< std::string, int > state_to_int
Definition: engine.h:94
emc::Engine::user_data_
void * user_data_
Definition: engine.h:100
emc::Engine::StateDetail
Definition: engine.h:83
emc::Engine::run
void run()
Definition: engine.cpp:29
emc::IO
Definition: io.h:18
map
emc::Engine::StateDetail::StateDetail
StateDetail()
Definition: engine.h:85
emc::Engine::StateDetail::transitions
std::map< int, int > transitions
Definition: engine.h:88
emc::Communication
Definition: communication.h:28
std::endl
T endl(T... args)
emc::Engine::setInitialState
void setInitialState(const char *state)
Definition: engine.h:30
emc::Engine::~Engine
~Engine()
Definition: engine.cpp:21
data.h
io.h
emc::Engine::getState
int getState(const char *state)
Definition: engine.h:121
emc::no_event
static const char * no_event
Definition: engine.h:14
emc::Engine::state_details
std::vector< StateDetail > state_details
Definition: engine.h:98
emc::Engine::eventToString
const std::string & eventToString(int event_id)
Definition: engine.h:159
emc
Definition: bumper.h:4
std::map::end
T end(T... args)
emc::Engine::addState
int addState(const char *state)
Definition: engine.h:104
emc::Engine::StateDetail::func
state_function func
Definition: engine.h:89
emc::Engine
Definition: engine.h:21
emc::Engine::io_
IO * io_
Definition: engine.h:79
emc::Engine::registerTransition
void registerTransition(const char *state1, const char *event, const char *state2)
Definition: engine.h:47