ReactESP 3.2.0
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
9namespace reactesp {
10
11using react_callback = std::function<void()>;
12using isr_react_callback = void (*)(void*);
13
21inline uint64_t ICACHE_RAM_ATTR micros64() { return esp_timer_get_time(); }
22
23// forward declarations
24
25class EventLoop;
26
34 virtual ~EventInterface() = default;
35
36 virtual void add(EventLoop* event_loop) = 0;
37 virtual void remove(EventLoop* event_loop) = 0;
38 virtual void tick(EventLoop* event_loop) = 0;
39
40 virtual void add(std::shared_ptr<EventLoop> event_loop) {
41 add(event_loop.get());
42 }
43 virtual void remove(std::shared_ptr<EventLoop> event_loop) {
44 remove(event_loop.get());
45 }
46 virtual void tick(std::shared_ptr<EventLoop> event_loop) {
47 tick(event_loop.get());
48 }
49};
50
54class Event : public EventInterface {
55 protected:
57
58 public:
65
66 // Disabling copy and move semantics
67 Event(const Event&) = delete;
68 Event(Event&&) = delete;
69 Event& operator=(const Event&) = delete;
70 Event& operator=(Event&&) = delete;
71};
72
76class TimedEvent : public Event {
77 protected:
78 const uint64_t interval;
80 bool enabled;
81
82 public:
90 : Event(callback),
91 interval((uint64_t)1000 * (uint64_t)interval),
93 enabled(true) {}
105
106 bool operator<(const TimedEvent& other) const;
107 virtual void add(EventLoop* event_loop) override;
108 virtual void remove(EventLoop* event_loop) override;
109
113
114 uint32_t getTriggerTime() const {
115 return (last_trigger_time + interval) / 1000;
116 }
117 uint64_t getTriggerTimeMicros() const {
118 return (last_trigger_time + interval);
119 }
120 bool isEnabled() const { return enabled; }
121};
122
124 bool operator()(TimedEvent* a, TimedEvent* b) { return *b < *a; }
125};
126
130class DelayEvent : public TimedEvent {
131 public:
138 DelayEvent(uint32_t delay, react_callback callback);
145 DelayEvent(uint64_t delay, react_callback callback);
146
147 void tick(EventLoop* event_loop) override;
148};
149
174
178class UntimedEvent : public Event {
179 public:
181
182 void add(EventLoop* event_loop) override;
183 void remove(EventLoop* event_loop) override;
184
188};
189
194class StreamEvent : public UntimedEvent {
195 private:
196 Stream& stream;
197
198 public:
206 : UntimedEvent(callback), stream(stream) {}
207
208 void tick(EventLoop* event_loop) override;
209};
210
214class TickEvent : public UntimedEvent {
215 public:
222
223 void tick(EventLoop* event_loop) override;
224};
225
229class ISREvent : public Event {
230 private:
231 const uint8_t pin_number;
232 const int mode;
233#ifdef ESP32
234 // set to true once gpio_install_isr_service is called
235 static bool isr_service_installed;
236 static void isr(void* this_ptr);
237#endif
238
239 public:
248 ISREvent(uint8_t pin_number, int mode, react_callback callback)
249 : Event(callback), pin_number(pin_number), mode(mode) {
250#ifdef ESP32
251 gpio_int_type_t intr_type;
252 switch (mode) {
253 case RISING:
254 intr_type = GPIO_INTR_POSEDGE;
255 break;
256 case FALLING:
257 intr_type = GPIO_INTR_NEGEDGE;
258 break;
259 case CHANGE:
260 intr_type = GPIO_INTR_ANYEDGE;
261 break;
262 default:
263 intr_type = GPIO_INTR_DISABLE;
264 break;
265 }
266 // configure the IO pin
267 gpio_set_intr_type((gpio_num_t)pin_number, intr_type);
268
269 if (!isr_service_installed) {
270 isr_service_installed = true;
271 gpio_install_isr_service(ESP_INTR_FLAG_LOWMED);
272 }
273#endif
274 }
275
276 void add(EventLoop* event_loop) override;
277 void remove(EventLoop* event_loop) override;
278 void tick(EventLoop* event_loop) override {}
279};
280
281} // namespace reactesp
282
283#endif // REACTESP_SRC_EVENTS_H_
Event that is triggered after a certain time delay.
Definition events.h:130
DelayEvent(uint32_t delay, react_callback callback)
Construct a new Delay Event object.
Definition events.cpp:29
void tick(EventLoop *event_loop) override
Definition events.cpp:39
Events are code to be called when a given condition is fulfilled.
Definition events.h:54
const react_callback callback
Definition events.h:56
Event & operator=(Event &&)=delete
Event & operator=(const Event &)=delete
Event(react_callback callback)
Construct a new Event object.
Definition events.h:64
Event(Event &&)=delete
Event(const Event &)=delete
Asynchronous event loop supporting timed (repeating and non-repeating), interrupt and stream events.
Definition event_loop.h:14
Event that is triggered on an input pin change.
Definition events.h:229
void remove(EventLoop *event_loop) override
Definition events.cpp:96
void tick(EventLoop *event_loop) override
Definition events.h:278
ISREvent(uint8_t pin_number, int mode, react_callback callback)
Construct a new ISREvent object.
Definition events.h:248
void add(EventLoop *event_loop) override
Definition events.cpp:85
Event that is triggered repeatedly.
Definition events.h:153
RepeatEvent(uint32_t interval, react_callback callback)
Construct a new Repeat Event object.
Definition events.h:161
void tick(EventLoop *event_loop) override
Definition events.cpp:45
RepeatEvent(uint64_t interval, react_callback callback)
Construct a new Repeat Event object.
Definition events.h:169
Event that is triggered when there is input available at the given Arduino Stream.
Definition events.h:194
StreamEvent(Stream &stream, react_callback callback)
Construct a new Stream Event object.
Definition events.h:205
void tick(EventLoop *event_loop) override
Definition events.cpp:68
Event that is triggered unconditionally at each execution loop.
Definition events.h:214
TickEvent(react_callback callback)
Construct a new Tick Event object.
Definition events.h:221
void tick(EventLoop *event_loop) override
Definition events.cpp:74
TimedEvents are called based on elapsing of time.
Definition events.h:76
const uint64_t interval
Definition events.h:78
uint64_t getTriggerTimeMicros() const
Definition events.h:117
TimedEvent(uint64_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:100
bool isEnabled() const
Definition events.h:120
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:79
uint32_t getTriggerTime() const
Definition events.h:114
TimedEvent(uint32_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:89
Events that are triggered based on something else than time.
Definition events.h:178
UntimedEvent(react_callback callback)
Definition events.h:180
void add(EventLoop *event_loop) override
Definition events.cpp:58
void remove(EventLoop *event_loop) override
Definition events.cpp:64
EventLoop event_loop
Definition main.cpp:19
std::function< void()> react_callback
Definition events.h:11
uint64_t ICACHE_RAM_ATTR micros64()
Return the current time since the device restart in microseconds.
Definition events.h:21
void(*)(void *) isr_react_callback
Definition events.h:12
EventInterface defines the interface for all events.
Definition events.h:30
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:43
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:46
virtual void add(std::shared_ptr< EventLoop > event_loop)
Definition events.h:40
bool operator()(TimedEvent *a, TimedEvent *b)
Definition events.h:124