Elma
An event loop manager for embedded systems
 All Classes Files Functions Enumerations
manager.cc
1 #include <stdexcept>
2 #include <iostream>
3 #include "elma.h"
4 
5 namespace elma {
6 
12  Process& process,
13  high_resolution_clock::duration period) {
14 
15  process._period = period;
16  _processes.push_back(&process);
17  process._manager_ptr = this;
18 
19  return *this;
20 
21  }
22 
27  _channels[channel.name()] = &channel;
28  return *this;
29  }
30 
33  Channel& Manager::channel(string name) {
34  if ( _channels.find(name) != _channels.end() ) {
35  return *(_channels[name]);
36  } else {
37  throw Exception("Tried to access an unregistered or non-existant channel.");
38  }
39  }
40 
51  Manager& Manager::watch(std::string event_name, std::function<void(Event&)> handler) {
52  event_handlers[event_name].push_back(handler);
53  return *this;
54  }
55 
68  Manager& Manager::emit(const Event& event) {
69  Event e = event; // make a copy so we can change propagation
70  if ( event_handlers.find(event.name()) != event_handlers.end() ) {
71  for ( auto handler : event_handlers[event.name()] ) {
72  if ( e.propagate() ) {
73  handler(e);
74  }
75  }
76  }
77  return *this;
78  }
79 
83  Manager& Manager::all(std::function< void(Process&) > f) {
84  for(auto process_ptr : _processes) {
85  f(*process_ptr);
86  }
87  return *this;
88  }
89 
93  return all([](Process& p) { p._init();});
94  }
95 
99  return all([this](Process& p) { p._start(_elapsed) ;});
100  }
101 
105  return all([](Process& p) { p._stop(); });
106  }
107 
111  _client.process_responses();
112  return all([this](Process& p) {
113  if ( _elapsed > p.last_update() + p.period() ) {
114  p._update(_elapsed);
115  }
116  });
117  }
118 
122  Manager& Manager::run(high_resolution_clock::duration runtime) {
123 
124  _start_time = high_resolution_clock::now();
125  _elapsed = high_resolution_clock::duration::zero();
126  start();
127 
128  while ( _elapsed < runtime ) {
129  update();
130  _elapsed = high_resolution_clock::now() - _start_time;
131  }
132 
133  stop();
134 
135  return *this;
136 
137  }
138 
139 }
The Process Manager class.
Definition: manager.h:26
Manager & schedule(Process &process, high_resolution_clock::duration period)
Definition: manager.cc:11
bool propagate() const
Definition: event.h:45
Manager & run(high_resolution_clock::duration)
Definition: manager.cc:122
Channel & channel(string)
Definition: manager.cc:33
Manager & watch(string event_name, std::function< void(Event &)> handler)
Definition: manager.cc:51
Events that can be emitted, watched, and responded to with event handlers.
Definition: event.h:23
Manager & add_channel(Channel &)
Definition: manager.cc:26
Manager & init()
Definition: manager.cc:92
high_resolution_clock::duration last_update()
Definition: process.h:93
high_resolution_clock::duration period()
Definition: process.h:80
Manager & update()
Definition: manager.cc:110
std::string name() const
Definition: event.h:41
Manager & start()
Definition: manager.cc:98
An exception class for Elma.
Definition: exceptions.h:13
Manager & all(std::function< void(Process &)> f)
Definition: manager.cc:83
A channel for sending double values to and from Process objects.
Definition: channel.h:21
Manager & emit(const Event &event)
Definition: manager.cc:68
Manager & stop()
Definition: manager.cc:104
Definition: manager.h:11
An abstract base class for processes.
Definition: process.h:24
string name()
Definition: channel.h:53
Client & process_responses()
Definition: client.cc:38