ReactESP 3.1.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
8namespace reactesp {
9
10using react_callback = std::function<void()>;
11using isr_react_callback = void (*)(void*);
12
20inline uint64_t ICACHE_RAM_ATTR micros64() { return esp_timer_get_time(); }
21
22// forward declarations
23
24class EventLoop;
25
33 virtual ~EventInterface() = default;
34
35 virtual void add(EventLoop* event_loop) = 0;
36 virtual void remove(EventLoop* event_loop) = 0;
37 virtual void tick(EventLoop* event_loop) = 0;
38};
39
43class Event : public EventInterface {
44 protected:
46
47 public:
54
55 // Disabling copy and move semantics
56 Event(const Event&) = delete;
57 Event(Event&&) = delete;
58 Event& operator=(const Event&) = delete;
59 Event& operator=(Event&&) = delete;
60};
61
65class TimedEvent : public Event {
66 protected:
67 const uint64_t interval;
69 bool enabled;
70
71 public:
79 : Event(callback),
80 interval((uint64_t)1000 * (uint64_t)interval),
82 enabled(true) {}
94
95 bool operator<(const TimedEvent& other) const;
96 void add(EventLoop* event_loop) override;
97 void remove(EventLoop* event_loop) override;
98 uint32_t getTriggerTime() const {
99 return (last_trigger_time + interval) / 1000;
100 }
101 uint64_t getTriggerTimeMicros() const {
102 return (last_trigger_time + interval);
103 }
104 bool isEnabled() const { return enabled; }
105};
106
108 bool operator()(TimedEvent* a, TimedEvent* b) { return *b < *a; }
109};
110
114class DelayEvent : public TimedEvent {
115 public:
122 DelayEvent(uint32_t delay, react_callback callback);
129 DelayEvent(uint64_t delay, react_callback callback);
130
131 void tick(EventLoop* event_loop) override;
132};
133
158
162class UntimedEvent : public Event {
163 public:
165
166 void add(EventLoop* event_loop) override;
167 void remove(EventLoop* event_loop) override;
168};
169
174class StreamEvent : public UntimedEvent {
175 private:
176 Stream& stream;
177
178 public:
186 : UntimedEvent(callback), stream(stream) {}
187
188 void tick(EventLoop* event_loop) override;
189};
190
194class TickEvent : public UntimedEvent {
195 public:
202
203 void tick(EventLoop* event_loop) override;
204};
205
209class ISREvent : public Event {
210 private:
211 const uint8_t pin_number;
212 const int mode;
213#ifdef ESP32
214 // set to true once gpio_install_isr_service is called
215 static bool isr_service_installed;
216 static void isr(void* this_ptr);
217#endif
218
219 public:
228 ISREvent(uint8_t pin_number, int mode, react_callback callback)
229 : Event(callback), pin_number(pin_number), mode(mode) {
230#ifdef ESP32
231 gpio_int_type_t intr_type;
232 switch (mode) {
233 case RISING:
234 intr_type = GPIO_INTR_POSEDGE;
235 break;
236 case FALLING:
237 intr_type = GPIO_INTR_NEGEDGE;
238 break;
239 case CHANGE:
240 intr_type = GPIO_INTR_ANYEDGE;
241 break;
242 default:
243 intr_type = GPIO_INTR_DISABLE;
244 break;
245 }
246 // configure the IO pin
247 gpio_set_intr_type((gpio_num_t)pin_number, intr_type);
248
249 if (!isr_service_installed) {
250 isr_service_installed = true;
251 gpio_install_isr_service(ESP_INTR_FLAG_LOWMED);
252 }
253#endif
254 }
255
256 void add(EventLoop* event_loop) override;
257 void remove(EventLoop* event_loop) override;
258 void tick(EventLoop* event_loop) override {}
259};
260
261} // namespace reactesp
262
263#endif // REACTESP_SRC_EVENTS_H_
Event that is triggered after a certain time delay.
Definition events.h:114
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:43
const react_callback callback
Definition events.h:45
Event & operator=(Event &&)=delete
Event & operator=(const Event &)=delete
Event(react_callback callback)
Construct a new Event object.
Definition events.h:53
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:209
void remove(EventLoop *event_loop) override
Definition events.cpp:96
void tick(EventLoop *event_loop) override
Definition events.h:258
ISREvent(uint8_t pin_number, int mode, react_callback callback)
Construct a new ISREvent object.
Definition events.h:228
void add(EventLoop *event_loop) override
Definition events.cpp:85
Event that is triggered repeatedly.
Definition events.h:137
RepeatEvent(uint32_t interval, react_callback callback)
Construct a new Repeat Event object.
Definition events.h:145
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:153
Event that is triggered when there is input available at the given Arduino Stream.
Definition events.h:174
StreamEvent(Stream &stream, react_callback callback)
Construct a new Stream Event object.
Definition events.h:185
void tick(EventLoop *event_loop) override
Definition events.cpp:68
Event that is triggered unconditionally at each execution loop.
Definition events.h:194
TickEvent(react_callback callback)
Construct a new Tick Event object.
Definition events.h:201
void tick(EventLoop *event_loop) override
Definition events.cpp:74
TimedEvents are called based on elapsing of time.
Definition events.h:65
const uint64_t interval
Definition events.h:67
uint64_t getTriggerTimeMicros() const
Definition events.h:101
TimedEvent(uint64_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:89
bool isEnabled() const
Definition events.h:104
void add(EventLoop *event_loop) override
Definition events.cpp:17
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:68
uint32_t getTriggerTime() const
Definition events.h:98
TimedEvent(uint32_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:78
Events that are triggered based on something else than time.
Definition events.h:162
UntimedEvent(react_callback callback)
Definition events.h:164
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:10
uint64_t ICACHE_RAM_ATTR micros64()
Return the current time since the device restart in microseconds.
Definition events.h:20
void(*)(void *) isr_react_callback
Definition events.h:11
EventInterface defines the interface for all events.
Definition events.h:29
virtual ~EventInterface()=default
Default virtual destructor.
virtual void add(EventLoop *event_loop)=0
virtual void tick(EventLoop *event_loop)=0
virtual void remove(EventLoop *event_loop)=0
bool operator()(TimedEvent *a, TimedEvent *b)
Definition events.h:108