ReactESP 3.3.1
Asynchronous programming for the ESP microcontrollers
Loading...
Searching...
No Matches
events.cpp
Go to the documentation of this file.
1#include "events.h"
2
3#include <freertos/semphr.h>
4
5#include "event_loop.h"
6
7namespace reactesp {
8
9// Event classes define the behaviour of each particular
10// Event
11
12bool TimedEvent::operator<(const TimedEvent& other) const {
13 return (this->last_trigger_time + this->interval) <
14 (other.last_trigger_time + other.interval);
15}
16
17void TimedEvent::add(EventLoop* event_loop) {
18 xSemaphoreTakeRecursive(event_loop->timed_queue_mutex_, portMAX_DELAY);
19 event_loop->timed_events_.insert(this);
20 xSemaphoreGiveRecursive(event_loop->timed_queue_mutex_);
21}
22
23void TimedEvent::remove(EventLoop* event_loop) {
24 xSemaphoreTakeRecursive(event_loop->timed_queue_mutex_, portMAX_DELAY);
25 auto it = event_loop->timed_events_.find(this);
26 if (it != event_loop->timed_events_.end()) {
27 // Event is in the container — erase and delete immediately.
28 event_loop->timed_events_.erase(it);
29 xSemaphoreGiveRecursive(event_loop->timed_queue_mutex_);
30 delete this;
31 } else {
32 // Event is currently being ticked (popped from the container but
33 // not yet re-inserted). Signal tick() to delete it instead of
34 // re-inserting.
35 this->enabled = false;
36 xSemaphoreGiveRecursive(event_loop->timed_queue_mutex_);
37 }
38}
39
44
49
50void DelayEvent::tick(EventLoop* event_loop) {
52 this->callback();
53 // Mark as done — tickTimed() will drop the node and delete this event.
54 this->enabled = false;
55}
56
57void RepeatEvent::tick(EventLoop* event_loop) {
58 auto now = micros64();
59 this->last_trigger_time = this->last_trigger_time + this->interval;
60 if (this->last_trigger_time + this->interval < now) {
61 // we're lagging more than one full interval; reset the time
62 this->last_trigger_time = now;
63 }
64 this->callback();
65 // If the callback called remove(), enabled is now false.
66 // tickTimed() checks isEnabled() and handles reinsertion or
67 // deletion accordingly.
68}
69
70void UntimedEvent::add(EventLoop* event_loop) {
71 xSemaphoreTakeRecursive(event_loop->untimed_list_mutex_, portMAX_DELAY);
72 event_loop->untimed_list.push_back(this);
73 xSemaphoreGiveRecursive(event_loop->untimed_list_mutex_);
74}
75
77 event_loop->remove(this);
78}
79
80void StreamEvent::tick(EventLoop* event_loop) {
81 if (0 != stream.available()) {
82 this->callback();
83 }
84}
85
86void TickEvent::tick(EventLoop* event_loop) { this->callback(); }
87
88#ifdef ESP32
89bool ISREvent::isr_service_installed = false;
90
91void ISREvent::isr(void* this_ptr) {
92 auto* this_ = static_cast<ISREvent*>(this_ptr);
93 this_->callback();
94}
95#endif
96
97void ISREvent::add(EventLoop* event_loop) {
98 xSemaphoreTakeRecursive(event_loop->isr_event_list_mutex_, portMAX_DELAY);
99#ifdef ESP32
100 gpio_isr_handler_add((gpio_num_t)pin_number, ISREvent::isr, (void*)this);
101#elif defined(ESP8266)
102 attachInterrupt(digitalPinToInterrupt(pin_number), callback, mode);
103#endif
104 event_loop->isr_event_list.push_back(this);
105 xSemaphoreGiveRecursive(event_loop->isr_event_list_mutex_);
106}
107
108void ISREvent::remove(EventLoop* event_loop) {
109 event_loop->remove(this);
110}
111
112} // namespace reactesp
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
Asynchronous event loop supporting timed (repeating and non-repeating), interrupt and stream events.
Definition event_loop.h:15
void remove(TimedEvent *event)
SemaphoreHandle_t untimed_list_mutex_
Definition event_loop.h:151
std::vector< UntimedEvent * > untimed_list
Definition event_loop.h:144
SemaphoreHandle_t timed_queue_mutex_
Definition event_loop.h:150
TimedEventSet timed_events_
Definition event_loop.h:140
SemaphoreHandle_t isr_event_list_mutex_
Definition event_loop.h:152
std::vector< ISREvent * > isr_event_list
Definition event_loop.h:147
Event that is triggered on an input pin change.
Definition events.h:254
void remove(EventLoop *event_loop) override
Definition events.cpp:108
void add(EventLoop *event_loop) override
Definition events.cpp:97
void tick(EventLoop *event_loop) override
Definition events.cpp:57
void tick(EventLoop *event_loop) override
Definition events.cpp:80
void tick(EventLoop *event_loop) override
Definition events.cpp:86
const uint64_t interval
Definition events.h:79
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
TimedEvent(uint32_t interval, react_callback callback)
Construct a new Timed Event object.
Definition events.h:90
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