ReactESP 3.1.0
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
18 xSemaphoreTakeRecursive(event_loop->timed_queue_mutex_, portMAX_DELAY);
19 event_loop->timed_queue.push(this);
20 xSemaphoreGiveRecursive(event_loop->timed_queue_mutex_);
21}
22
24 this->enabled = false;
25 // the object will be deleted when it's popped out of the
26 // timer queue
27}
28
29DelayEvent::DelayEvent(uint32_t delay, react_callback callback)
30 : TimedEvent(delay, callback) {
32}
33
34DelayEvent::DelayEvent(uint64_t delay, react_callback callback)
35 : TimedEvent(delay, callback) {
37}
38
41 this->callback();
42 delete this;
43}
44
46 xSemaphoreTakeRecursive(event_loop->timed_queue_mutex_, portMAX_DELAY);
47 auto now = micros64();
48 this->last_trigger_time = this->last_trigger_time + this->interval;
49 if (this->last_trigger_time + this->interval < now) {
50 // we're lagging more than one full interval; reset the time
51 this->last_trigger_time = now;
52 }
53 this->callback();
54 event_loop->timed_queue.push(this);
55 xSemaphoreGiveRecursive(event_loop->timed_queue_mutex_);
56}
57
59 xSemaphoreTakeRecursive(event_loop->untimed_list_mutex_, portMAX_DELAY);
60 event_loop->untimed_list.push_back(this);
61 xSemaphoreGiveRecursive(event_loop->untimed_list_mutex_);
62}
63
65 event_loop->remove(this);
66}
67
69 if (0 != stream.available()) {
70 this->callback();
71 }
72}
73
75
76#ifdef ESP32
77bool ISREvent::isr_service_installed = false;
78
79void ISREvent::isr(void* this_ptr) {
80 auto* this_ = static_cast<ISREvent*>(this_ptr);
81 this_->callback();
82}
83#endif
84
86 xSemaphoreTakeRecursive(event_loop->isr_event_list_mutex_, portMAX_DELAY);
87#ifdef ESP32
88 gpio_isr_handler_add((gpio_num_t)pin_number, ISREvent::isr, (void*)this);
89#elif defined(ESP8266)
90 attachInterrupt(digitalPinToInterrupt(pin_number), callback, mode);
91#endif
92 event_loop->isr_event_list.push_back(this);
93 xSemaphoreGiveRecursive(event_loop->isr_event_list_mutex_);
94}
95
97 event_loop->remove(this);
98}
99
100} // namespace reactesp
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
const react_callback callback
Definition events.h:45
Asynchronous event loop supporting timed (repeating and non-repeating), interrupt and stream events.
Definition event_loop.h:14
std::priority_queue< TimedEvent *, std::vector< TimedEvent * >, TriggerTimeCompare > timed_queue
Definition event_loop.h:135
Event that is triggered on an input pin change.
Definition events.h:209
void remove(EventLoop *event_loop) override
Definition events.cpp:96
void add(EventLoop *event_loop) override
Definition events.cpp:85
void tick(EventLoop *event_loop) override
Definition events.cpp:45
void tick(EventLoop *event_loop) override
Definition events.cpp:68
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
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
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