ReactESP 3.3.1
Asynchronous programming for the ESP microcontrollers
Loading...
Searching...
No Matches
events.h
Go to the documentation of this file.
1#ifndef REACTESP_SRC_EVENTS_H_
2#define REACTESP_SRC_EVENTS_H_
3
4#include <Arduino.h>
5
6#include <functional>
7#include <memory>
8#include <set>
9
10namespace reactesp {
11
12using react_callback = std::function<void()>;
13using isr_react_callback = void (*)(void*);
14
22inline uint64_t ICACHE_RAM_ATTR micros64() { return esp_timer_get_time(); }
23
24// forward declarations
25
26class EventLoop;
27
35 virtual ~EventInterface() = default;
36
37 virtual void add(EventLoop* event_loop) = 0;
38 virtual void remove(EventLoop* event_loop) = 0;
39 virtual void tick(EventLoop* event_loop) = 0;
40
41 virtual void add(std::shared_ptr<EventLoop> event_loop) {
42 add(event_loop.get());
43 }
44 virtual void remove(std::shared_ptr<EventLoop> event_loop) {
45 remove(event_loop.get());
46 }
47 virtual void tick(std::shared_ptr<EventLoop> event_loop) {
48 tick(event_loop.get());
49 }
50};
51
55class Event : public EventInterface {
56 protected:
58
59 public:
66
67 // Disabling copy and move semantics
68 Event(const Event&) = delete;
69 Event(Event&&) = delete;
70 Event& operator=(const Event&) = delete;
71 Event& operator=(Event&&) = delete;
72};
73
77class TimedEvent : public Event {
78 protected:
79 const uint64_t interval;
81 bool enabled;
82
83 public:
91 : Event(callback),
92 interval((uint64_t)1000 * (uint64_t)interval),
94 enabled(true) {}
95
106
107 bool operator<(const TimedEvent& other) const;
108 virtual void add(EventLoop* event_loop) override;
109 virtual void remove(EventLoop* event_loop) override;
110
114
115 uint32_t getTriggerTime() const {
116 return (last_trigger_time + interval) / 1000;
117 }
118 uint64_t getTriggerTimeMicros() const {
119 return (last_trigger_time + interval);
120 }
121
129 bool isEnabled() const { return enabled; }
130};
131
144 bool operator()(const TimedEvent* a, const TimedEvent* b) const {
145 const uint64_t ta = a->getTriggerTimeMicros();
146 const uint64_t tb = b->getTriggerTimeMicros();
147 if (ta != tb) return ta < tb;
148 return std::less<const TimedEvent*>{}(a, b);
149 }
150};
151
155class DelayEvent : public TimedEvent {
156 public:
163 DelayEvent(uint32_t delay, react_callback callback);
170 DelayEvent(uint64_t delay, react_callback callback);
171
172 void tick(EventLoop* event_loop) override;
173};
174
178class RepeatEvent : public TimedEvent {
179 public:
188
196
197 void tick(EventLoop* event_loop) override;
198};
199
203class UntimedEvent : public Event {
204 public:
206
207 void add(EventLoop* event_loop) override;
208 void remove(EventLoop* event_loop) override;
209
213};
214
219class StreamEvent : public UntimedEvent {
220 private:
221 Stream& stream;
222
223 public:
231 : UntimedEvent(callback), stream(stream) {}
232
233 void tick(EventLoop* event_loop) override;
234};
235
239class TickEvent : public UntimedEvent {
240 public:
247
248 void tick(EventLoop* event_loop) override;
249};
250
254class ISREvent : public Event {
255 private:
256 const uint8_t pin_number;
257 const int mode;
258#ifdef ESP32
259 // set to true once gpio_install_isr_service is called
260 static bool isr_service_installed;
261 static void isr(void* this_ptr);
262#endif
263
264 public:
273 ISREvent(uint8_t pin_number, int mode, react_callback callback)
274 : Event(callback), pin_number(pin_number), mode(mode) {
275#ifdef ESP32
276 gpio_int_type_t intr_type;
277 switch (mode) {
278 case RISING:
279 intr_type = GPIO_INTR_POSEDGE;
280 break;
281 case FALLING:
282 intr_type = GPIO_INTR_NEGEDGE;
283 break;
284 case CHANGE:
285 intr_type = GPIO_INTR_ANYEDGE;
286 break;
287 default:
288 intr_type = GPIO_INTR_DISABLE;
289 break;
290 }
291 // configure the IO pin
292 gpio_set_intr_type((gpio_num_t)pin_number, intr_type);
293
294 if (!isr_service_installed) {
295 isr_service_installed = true;
296 gpio_install_isr_service(ESP_INTR_FLAG_LOWMED);
297 }
298#endif
299 }
300
301 void add(EventLoop* event_loop) override;
302 void remove(EventLoop* event_loop) override;
303 void tick(EventLoop* event_loop) override {}
304};
305
306} // namespace reactesp
307
308#endif // REACTESP_SRC_EVENTS_H_
DelayEvent(uint32_t delay, react_callback callback)
Construct a new Delay Event object.
Definition events.cpp:40
void tick(EventLoop *event_loop) override
Definition events.cpp:50
const react_callback callback
Definition events.h:57
Event & operator=(Event &&)=delete
Event & operator=(const Event &)=delete
Event(react_callback callback)
Construct a new Event object.
Definition events.h:65
Event(Event &&)=delete
Event(const Event &)=delete
Asynchronous event loop supporting timed (repeating and non-repeating), interrupt and stream events.
Definition event_loop.h:15
void remove(EventLoop *event_loop) override
Definition events.cpp:108
void tick(EventLoop *event_loop) override
Definition events.h:303
ISREvent(uint8_t pin_number, int mode, react_callback callback)
Construct a new ISREvent object.
Definition events.h:273
void add(EventLoop *event_loop) override
Definition events.cpp:97
RepeatEvent(uint32_t interval, react_callback callback)
Construct a new Repeat Event object.
Definition events.h:186
void tick(EventLoop *event_loop) override
Definition events.cpp:57
RepeatEvent(uint64_t interval, react_callback callback)
Construct a new Repeat Event object.
Definition events.h:194
StreamEvent(Stream &stream, react_callback callback)
Construct a new Stream Event object.
Definition events.h:230
void tick(EventLoop *event_loop) override
Definition events.cpp:80
TickEvent(react_callback callback)
Construct a new Tick Event object.
Definition events.h:246
void tick(EventLoop *event_loop) override
Definition events.cpp:86
TimedEvents are called based on elapsing of time.
Definition events.h:77
const uint64_t interval
Definition events.h:79
uint64_t getTriggerTimeMicros() const
Definition events.h:118
TimedEvent(uint64_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:101
bool isEnabled() const
Check if the event is still active.
Definition events.h:129
virtual void add(EventLoop *event_loop) override
Definition events.cpp:17
virtual void remove(EventLoop *event_loop) override
Definition events.cpp:23
bool operator<(const TimedEvent &other) const
Definition events.cpp:12
uint64_t last_trigger_time
Definition events.h:80
uint32_t getTriggerTime() const
Definition events.h:115
TimedEvent(uint32_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:90
UntimedEvent(react_callback callback)
Definition events.h:205
void add(EventLoop *event_loop) override
Definition events.cpp:70
void remove(EventLoop *event_loop) override
Definition events.cpp:76
std::function< void()> react_callback
Definition events.h:12
uint64_t ICACHE_RAM_ATTR micros64()
Return the current time since the device restart in microseconds.
Definition events.h:22
void(*)(void *) isr_react_callback
Definition events.h:13
EventInterface defines the interface for all events.
Definition events.h:31
virtual ~EventInterface()=default
Default virtual destructor.
virtual void add(EventLoop *event_loop)=0
virtual void remove(std::shared_ptr< EventLoop > event_loop)
Definition events.h:44
virtual void tick(EventLoop *event_loop)=0
virtual void remove(EventLoop *event_loop)=0
virtual void tick(std::shared_ptr< EventLoop > event_loop)
Definition events.h:47
virtual void add(std::shared_ptr< EventLoop > event_loop)
Definition events.h:41
Strict total ordering for TimedEvent pointers.
Definition events.h:143
bool operator()(const TimedEvent *a, const TimedEvent *b) const
Definition events.h:144