ReactESP 1.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
10typedef std::function<void()> react_callback;
11typedef void (*isr_react_callback)(void*);
12
13// forward declarations
14
15class ReactESP;
16
17// ESP32 doesn't have the micros64 function defined
18#ifdef ESP32
19uint64_t ICACHE_RAM_ATTR micros64();
20#endif
21
25class Reaction {
26 protected:
28
29 public:
36 // FIXME: why do these have to be defined?
37 virtual void add() = 0;
38 virtual void remove() = 0;
39 virtual void tick() = 0;
40};
41
45class TimedReaction : public Reaction {
46 protected:
47 const uint64_t interval;
49 bool enabled;
50
51 public:
59 : Reaction(callback), interval((uint64_t)1000 * (uint64_t)interval) {
60 last_trigger_time = micros64();
61 enabled = true;
62 }
71 last_trigger_time = micros64();
72 enabled = true;
73 }
74
75 virtual ~TimedReaction() {}
76 bool operator<(const TimedReaction& other);
77 void add();
78 void remove();
79 uint32_t getTriggerTime() { return (last_trigger_time + interval) / 1000; }
81 bool isEnabled() { return enabled; }
82 virtual void tick() = 0;
83};
84
86 bool operator()(TimedReaction* a, TimedReaction* b) { return *b < *a; }
87};
88
93 public:
100 DelayReaction(const uint32_t delay, const react_callback callback);
107 DelayReaction(const uint64_t delay, const react_callback callback);
108 virtual ~DelayReaction() {}
109 void tick();
110};
111
116 public:
133 void tick();
134};
135
139class UntimedReaction : public Reaction {
140 public:
142 virtual ~UntimedReaction() {}
143 virtual void add();
144 virtual void remove();
145 virtual void tick() = 0;
146};
147
153 private:
154 Stream& stream;
155
156 public:
164 : UntimedReaction(callback), stream(stream) {}
165 void tick();
166};
167
172 public:
179 void tick();
180};
181
185class ISRReaction : public Reaction {
186 private:
187 const uint8_t pin_number;
188 const int mode;
189#ifdef ESP32
190 // set to true once gpio_install_isr_service is called
191 static bool isr_service_installed;
192 static void isr(void* arg);
193#endif
194
195 public:
204 ISRReaction(uint8_t pin_number, int mode, const react_callback callback)
206 pin_number(pin_number),
207 mode(mode) {
208#ifdef ESP32
209 gpio_int_type_t intr_type;
210 switch (mode) {
211 case RISING:
212 intr_type = GPIO_INTR_POSEDGE;
213 break;
214 case FALLING:
215 intr_type = GPIO_INTR_NEGEDGE;
216 break;
217 case CHANGE:
218 intr_type = GPIO_INTR_ANYEDGE;
219 break;
220 default:
221 intr_type = GPIO_INTR_DISABLE;
222 break;
223 }
224 // configure the IO pin
225 gpio_set_intr_type((gpio_num_t)pin_number, intr_type);
226
227 if (!isr_service_installed) {
228 gpio_install_isr_service(ESP_INTR_FLAG_LOWMED);
229 isr_service_installed = true;
230 }
231#endif
232 }
233 virtual ~ISRReaction() {}
234 void add();
235 void remove();
236 void tick() {}
237};
238
240// ReactESP main class implementation
241
245class ReactESP {
246 friend class Reaction;
247 friend class TimedReaction;
248 friend class RepeatReaction;
249 friend class UntimedReaction;
250 friend class ISRReaction;
251
252 public:
260 ReactESP(const react_callback cb) : _setup(cb) { app = this; }
261 void setup(void) { _setup(); }
262 void tick(void);
263
265 static ReactESP* app;
266
274 DelayReaction* onDelay(const uint32_t t, const react_callback cb);
282 DelayReaction* onDelayMicros(const uint64_t t, const react_callback cb);
290 RepeatReaction* onRepeat(const uint32_t t, const react_callback cb);
298 RepeatReaction* onRepeatMicros(const uint64_t t, const react_callback cb);
306 StreamReaction* onAvailable(Stream& stream, const react_callback cb);
317 ISRReaction* onInterrupt(const uint8_t pin_number, int mode,
318 const react_callback cb);
326
327 private:
328 const react_callback _setup;
329 std::priority_queue<TimedReaction*, std::vector<TimedReaction*>,
331 timed_queue;
332 std::forward_list<UntimedReaction*> untimed_list;
333 std::forward_list<ISRReaction*> isr_reaction_list;
334 std::forward_list<ISRReaction*> isr_pending_list;
335 void tickTimed();
336 void tickUntimed();
337 void tickISR();
338 void add(Reaction* re);
339};
340
341#endif
void(* isr_react_callback)(void *)
Definition: ReactESP.h:11
std::function< void()> react_callback
Definition: ReactESP.h:10
Reaction that is triggered after a certain time delay.
Definition: ReactESP.h:92
virtual ~DelayReaction()
Definition: ReactESP.h:108
DelayReaction(const uint32_t delay, const react_callback callback)
Construct a new Delay Reaction object.
Definition: ReactESP.cpp:34
void tick()
Definition: ReactESP.cpp:44
Reaction that is triggered on an input pin change.
Definition: ReactESP.h:185
void remove()
Definition: ReactESP.cpp:94
ISRReaction(uint8_t pin_number, int mode, const react_callback callback)
Construct a new ISRReaction object.
Definition: ReactESP.h:204
void tick()
Definition: ReactESP.h:236
void add()
Definition: ReactESP.cpp:85
virtual ~ISRReaction()
Definition: ReactESP.h:233
Main class of a ReactESP program.
Definition: ReactESP.h:245
ISRReaction * onInterrupt(const uint8_t pin_number, int mode, const react_callback cb)
Create a new ISRReaction (interrupt reaction)
Definition: ReactESP.cpp:182
static ReactESP * app
Static singleton reference to the instantiated ReactESP object.
Definition: ReactESP.h:265
RepeatReaction * onRepeatMicros(const uint64_t t, const react_callback cb)
Create a new RepeatReaction.
Definition: ReactESP.cpp:169
ReactESP(const react_callback cb)
Construct a new ReactESP object.
Definition: ReactESP.h:260
TickReaction * onTick(const react_callback cb)
Create a new TickReaction.
Definition: ReactESP.cpp:189
StreamReaction * onAvailable(Stream &stream, const react_callback cb)
Create a new StreamReaction.
Definition: ReactESP.cpp:176
void setup(void)
Definition: ReactESP.h:261
DelayReaction * onDelay(const uint32_t t, const react_callback cb)
Create a new DelayReaction.
Definition: ReactESP.cpp:150
DelayReaction * onDelayMicros(const uint64_t t, const react_callback cb)
Create a new DelayReaction.
Definition: ReactESP.cpp:156
RepeatReaction * onRepeat(const uint32_t t, const react_callback cb)
Create a new RepeatReaction.
Definition: ReactESP.cpp:163
void tick(void)
Definition: ReactESP.cpp:145
Reactions are code to be called when a given condition is fulfilled.
Definition: ReactESP.h:25
const react_callback callback
Definition: ReactESP.h:27
virtual void tick()=0
virtual void add()=0
Reaction(react_callback callback)
Construct a new Reaction object.
Definition: ReactESP.h:35
virtual void remove()=0
Reaction that is triggered repeatedly.
Definition: ReactESP.h:115
RepeatReaction(const uint64_t interval, const react_callback callback)
Construct a new Repeat Reaction object.
Definition: ReactESP.h:131
RepeatReaction(const uint32_t interval, const react_callback callback)
Construct a new Repeat Reaction object.
Definition: ReactESP.h:123
Reaction that is triggered when there is input available at the given Arduino Stream.
Definition: ReactESP.h:152
StreamReaction(Stream &stream, const react_callback callback)
Construct a new Stream Reaction object.
Definition: ReactESP.h:163
Reaction that is triggered unconditionally at each execution loop.
Definition: ReactESP.h:171
TickReaction(const react_callback callback)
Construct a new Tick Reaction object.
Definition: ReactESP.h:178
void tick()
Definition: ReactESP.cpp:74
TimedReactions are called based on elapsing of time.
Definition: ReactESP.h:45
void add()
Definition: ReactESP.cpp:26
virtual ~TimedReaction()
Definition: ReactESP.h:75
uint64_t last_trigger_time
Definition: ReactESP.h:48
bool operator<(const TimedReaction &other)
Return the current time since the device restart in microseconds.
Definition: ReactESP.cpp:21
TimedReaction(const uint64_t interval, const react_callback callback)
Construct a new Timed Reaction object.
Definition: ReactESP.h:69
uint64_t getTriggerTimeMicros()
Definition: ReactESP.h:80
virtual void tick()=0
uint32_t getTriggerTime()
Definition: ReactESP.h:79
void remove()
Definition: ReactESP.cpp:28
const uint64_t interval
Definition: ReactESP.h:47
bool enabled
Definition: ReactESP.h:49
TimedReaction(const uint32_t interval, const react_callback callback)
Construct a new Timed Reaction object.
Definition: ReactESP.h:58
bool isEnabled()
Definition: ReactESP.h:81
Reactions that are triggered based on something else than time.
Definition: ReactESP.h:139
UntimedReaction(const react_callback callback)
Definition: ReactESP.h:141
virtual void remove()
Definition: ReactESP.cpp:63
virtual void tick()=0
virtual void add()
Definition: ReactESP.cpp:61
virtual ~UntimedReaction()
Definition: ReactESP.h:142
void ICACHE_RAM_ATTR isr()
Definition: main.cpp:18
bool operator()(TimedReaction *a, TimedReaction *b)
Definition: ReactESP.h:86