ReactESP 2.0.0
Asynchronous programming for the ESP microcontrollers
ReactESP.h
Go to the documentation of this file.
1#ifndef REACTESP_H_
2#define REACTESP_H_
3
4#include <Arduino.h>
5
6#include <forward_list>
7#include <functional>
8#include <queue>
9
10namespace reactesp {
11
12typedef std::function<void()> react_callback;
13typedef void (*isr_react_callback)(void*);
14
15// forward declarations
16
17class ReactESP;
18
19// ESP32 doesn't have the micros64 function defined
20#ifdef ESP32
21uint64_t ICACHE_RAM_ATTR micros64();
22#endif
23
27class Reaction {
28 protected:
30
31 public:
38 // FIXME: why do these have to be defined?
39 virtual void add() = 0;
40 virtual void remove() = 0;
41 virtual void tick() = 0;
42};
43
47class TimedReaction : public Reaction {
48 protected:
49 const uint64_t interval;
51 bool enabled;
52
53 public:
61 : Reaction(callback), interval((uint64_t)1000 * (uint64_t)interval) {
62 last_trigger_time = micros64();
63 enabled = true;
64 }
73 last_trigger_time = micros64();
74 enabled = true;
75 }
76
77 virtual ~TimedReaction() {}
78 bool operator<(const TimedReaction& other);
79 void add();
80 void remove();
81 uint32_t getTriggerTime() { return (last_trigger_time + interval) / 1000; }
83 bool isEnabled() { return enabled; }
84 virtual void tick() = 0;
85};
86
88 bool operator()(TimedReaction* a, TimedReaction* b) { return *b < *a; }
89};
90
95 public:
102 DelayReaction(const uint32_t delay, const react_callback callback);
109 DelayReaction(const uint64_t delay, const react_callback callback);
110 virtual ~DelayReaction() {}
111 void tick();
112};
113
118 public:
135 void tick();
136};
137
141class UntimedReaction : public Reaction {
142 public:
144 virtual ~UntimedReaction() {}
145 virtual void add();
146 virtual void remove();
147 virtual void tick() = 0;
148};
149
155 private:
156 Stream& stream;
157
158 public:
166 : UntimedReaction(callback), stream(stream) {}
167 void tick();
168};
169
174 public:
181 void tick();
182};
183
187class ISRReaction : public Reaction {
188 private:
189 const uint8_t pin_number;
190 const int mode;
191#ifdef ESP32
192 // set to true once gpio_install_isr_service is called
193 static bool isr_service_installed;
194 static void isr(void* arg);
195#endif
196
197 public:
206 ISRReaction(uint8_t pin_number, int mode, const react_callback callback)
208 pin_number(pin_number),
209 mode(mode) {
210#ifdef ESP32
211 gpio_int_type_t intr_type;
212 switch (mode) {
213 case RISING:
214 intr_type = GPIO_INTR_POSEDGE;
215 break;
216 case FALLING:
217 intr_type = GPIO_INTR_NEGEDGE;
218 break;
219 case CHANGE:
220 intr_type = GPIO_INTR_ANYEDGE;
221 break;
222 default:
223 intr_type = GPIO_INTR_DISABLE;
224 break;
225 }
226 // configure the IO pin
227 gpio_set_intr_type((gpio_num_t)pin_number, intr_type);
228
229 if (!isr_service_installed) {
230 gpio_install_isr_service(ESP_INTR_FLAG_LOWMED);
231 isr_service_installed = true;
232 }
233#endif
234 }
235 virtual ~ISRReaction() {}
236 void add();
237 void remove();
238 void tick() {}
239};
240
242// ReactESP main class implementation
243
247class ReactESP {
248 friend class Reaction;
249 friend class TimedReaction;
250 friend class RepeatReaction;
251 friend class UntimedReaction;
252 friend class ISRReaction;
253
254 public:
258 ReactESP() { app = this; }
259 void tick(void);
260
262 static ReactESP* app;
263
271 DelayReaction* onDelay(const uint32_t t, const react_callback cb);
279 DelayReaction* onDelayMicros(const uint64_t t, const react_callback cb);
287 RepeatReaction* onRepeat(const uint32_t t, const react_callback cb);
295 RepeatReaction* onRepeatMicros(const uint64_t t, const react_callback cb);
303 StreamReaction* onAvailable(Stream& stream, const react_callback cb);
314 ISRReaction* onInterrupt(const uint8_t pin_number, int mode,
315 const react_callback cb);
323
324 private:
325 std::priority_queue<TimedReaction*, std::vector<TimedReaction*>,
327 timed_queue;
328 std::forward_list<UntimedReaction*> untimed_list;
329 std::forward_list<ISRReaction*> isr_reaction_list;
330 std::forward_list<ISRReaction*> isr_pending_list;
331 void tickTimed();
332 void tickUntimed();
333 void tickISR();
334 void add(Reaction* re);
335};
336
337} // namespace reactesp
338
339#endif
Reaction that is triggered after a certain time delay.
Definition: ReactESP.h:94
DelayReaction(const uint32_t delay, const react_callback callback)
Construct a new Delay Reaction object.
Definition: ReactESP.cpp:36
virtual ~DelayReaction()
Definition: ReactESP.h:110
Reaction that is triggered on an input pin change.
Definition: ReactESP.h:187
virtual ~ISRReaction()
Definition: ReactESP.h:235
ISRReaction(uint8_t pin_number, int mode, const react_callback callback)
Construct a new ISRReaction object.
Definition: ReactESP.h:206
Main class of a ReactESP program.
Definition: ReactESP.h:247
StreamReaction * onAvailable(Stream &stream, const react_callback cb)
Create a new StreamReaction.
Definition: ReactESP.cpp:171
DelayReaction * onDelayMicros(const uint64_t t, const react_callback cb)
Create a new DelayReaction.
Definition: ReactESP.cpp:151
DelayReaction * onDelay(const uint32_t t, const react_callback cb)
Create a new DelayReaction.
Definition: ReactESP.cpp:145
void tick(void)
Definition: ReactESP.cpp:140
static ReactESP * app
Static singleton reference to the instantiated ReactESP object.
Definition: ReactESP.h:262
RepeatReaction * onRepeat(const uint32_t t, const react_callback cb)
Create a new RepeatReaction.
Definition: ReactESP.cpp:158
ReactESP()
Construct a new ReactESP object.
Definition: ReactESP.h:258
RepeatReaction * onRepeatMicros(const uint64_t t, const react_callback cb)
Create a new RepeatReaction.
Definition: ReactESP.cpp:164
TickReaction * onTick(const react_callback cb)
Create a new TickReaction.
Definition: ReactESP.cpp:184
ISRReaction * onInterrupt(const uint8_t pin_number, int mode, const react_callback cb)
Create a new ISRReaction (interrupt reaction)
Definition: ReactESP.cpp:177
Reactions are code to be called when a given condition is fulfilled.
Definition: ReactESP.h:27
virtual void add()=0
const react_callback callback
Definition: ReactESP.h:29
virtual void remove()=0
Reaction(react_callback callback)
Construct a new Reaction object.
Definition: ReactESP.h:37
virtual void tick()=0
Reaction that is triggered repeatedly.
Definition: ReactESP.h:117
RepeatReaction(const uint32_t interval, const react_callback callback)
Construct a new Repeat Reaction object.
Definition: ReactESP.h:125
RepeatReaction(const uint64_t interval, const react_callback callback)
Construct a new Repeat Reaction object.
Definition: ReactESP.h:133
Reaction that is triggered when there is input available at the given Arduino Stream.
Definition: ReactESP.h:154
StreamReaction(Stream &stream, const react_callback callback)
Construct a new Stream Reaction object.
Definition: ReactESP.h:165
Reaction that is triggered unconditionally at each execution loop.
Definition: ReactESP.h:173
TickReaction(const react_callback callback)
Construct a new Tick Reaction object.
Definition: ReactESP.h:180
TimedReactions are called based on elapsing of time.
Definition: ReactESP.h:47
virtual ~TimedReaction()
Definition: ReactESP.h:77
TimedReaction(const uint32_t interval, const react_callback callback)
Construct a new Timed Reaction object.
Definition: ReactESP.h:60
bool operator<(const TimedReaction &other)
Return the current time since the device restart in microseconds.
Definition: ReactESP.cpp:23
virtual void tick()=0
uint32_t getTriggerTime()
Definition: ReactESP.h:81
TimedReaction(const uint64_t interval, const react_callback callback)
Construct a new Timed Reaction object.
Definition: ReactESP.h:71
uint64_t getTriggerTimeMicros()
Definition: ReactESP.h:82
const uint64_t interval
Definition: ReactESP.h:49
uint64_t last_trigger_time
Definition: ReactESP.h:50
Reactions that are triggered based on something else than time.
Definition: ReactESP.h:141
virtual void remove()
Definition: ReactESP.cpp:65
virtual void add()
Definition: ReactESP.cpp:63
virtual ~UntimedReaction()
Definition: ReactESP.h:144
virtual void tick()=0
UntimedReaction(const react_callback callback)
Definition: ReactESP.h:143
std::function< void()> react_callback
Definition: ReactESP.h:12
void(* isr_react_callback)(void *)
Definition: ReactESP.h:13
bool operator()(TimedReaction *a, TimedReaction *b)
Definition: ReactESP.h:88