ReactESP 2.0.0
Asynchronous programming for the ESP microcontrollers
main.cpp
Go to the documentation of this file.
1#include <Arduino.h>
2#include <ReactESP.h>
3
4using namespace reactesp;
5
6#define LED_PIN 2
7#define OUT_PIN 14 // D5
8#define INPUT_PIN1 12 // D6
9#define INPUT_PIN2 13 // D7
10
11
12#define NUM_TIMERS 20
13
16
18
19void reporter() {
20 Serial.printf("Timer ticks: ");
21 for (int i=0; i<NUM_TIMERS; i++) {
22 Serial.printf("%d ", timer_ticks[i]);
23 timer_ticks[i] = 0;
24 }
25 Serial.printf("\n");
26 Serial.printf("Free mem: %d\n", system_get_free_heap_size());
27 Serial.printf("Ticks per second: %d\n", tick_counter);
28 tick_counter = 0;
29}
30
32 // create twenty timers
33
34 for (int i=0; i<NUM_TIMERS; i++) {
35 timer_ticks[i] = 0;
36 int delay = (i+1)*(i+1);
37 app.onRepeat(delay, [i]() {
38 timer_ticks[i]++;
39 });
40 }
41
42 // create one more timer to report the counted ticks
43
44 app.onRepeat(1000, reporter);
45}
46
48 static ISRReaction* ire2 = nullptr;
49 static int out_pin_state = 0;
50
51
52 // change OUT_PIN state every 900 ms
53 pinMode(OUT_PIN, OUTPUT);
54 app.onRepeat(900, [] () {
55 out_pin_state = !out_pin_state;
56 digitalWrite(OUT_PIN, out_pin_state);
57 });
58
59 auto reporter = [] (int pin) {
60 Serial.printf("Pin %d changed state.\n", pin);
61 };
62
63 // create an interrupt that always reports if PIN1 is rising
64 app.onInterrupt(INPUT_PIN1, RISING, std::bind(reporter, INPUT_PIN1));
65
66 // every 9s, toggle reporting PIN2 falling edge
67 app.onRepeat(9000, [&app, &reporter]() {
68 if (ire2==nullptr) {
69 ire2 = app.onInterrupt(INPUT_PIN2, FALLING, std::bind(reporter, INPUT_PIN2));
70 } else {
71 ire2->remove();
72 ire2 = nullptr;
73 }
74 });
75
76}
77
79 // if something is received on the serial port, turn the led off for one second
80 app.onAvailable(Serial, [&app] () {
81 static int reaction_counter = 0;
82
83 Serial.write(Serial.read());
84 digitalWrite(LED_PIN, HIGH);
85
86 reaction_counter++;
87
88 int current = reaction_counter;
89
90 app.onDelay(1000, [current] () {
91 if (reaction_counter==current) {
92 digitalWrite(LED_PIN, LOW);
93 }
94 });
95 });
96}
97
99 // increase the tick counter on every tick
100 app.onTick([]() {
101 tick_counter++;
102 });
103}
104
105void setup() {
106 Serial.begin(115200);
107 Serial.println("Starting");
108 pinMode(LED_PIN, OUTPUT);
109
114}
115
116void loop() {
117 app.tick();
118}
Reaction that is triggered on an input pin change.
Definition: ReactESP.h:187
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 * onDelay(const uint32_t t, const react_callback cb)
Create a new DelayReaction.
Definition: ReactESP.cpp:145
void tick(void)
Definition: ReactESP.cpp:140
RepeatReaction * onRepeat(const uint32_t t, const react_callback cb)
Create a new RepeatReaction.
Definition: ReactESP.cpp:158
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
#define NUM_TIMERS
Definition: main.cpp:12
#define INPUT_PIN2
Definition: main.cpp:9
#define OUT_PIN
Definition: main.cpp:7
void setup_tick(ReactESP &app)
Definition: main.cpp:98
void setup()
Definition: main.cpp:105
void reporter()
Definition: main.cpp:19
int tick_counter
Definition: main.cpp:14
void setup_timers(ReactESP &app)
Definition: main.cpp:31
int timer_ticks[NUM_TIMERS]
Definition: main.cpp:15
void setup_io_pins(ReactESP &app)
Definition: main.cpp:47
ReactESP app
Definition: main.cpp:17
void setup_serial(ReactESP &app)
Definition: main.cpp:78
#define LED_PIN
Definition: main.cpp:6
#define INPUT_PIN1
Definition: main.cpp:8
void loop()
Definition: main.cpp:116