-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCbufferTest.ino
More file actions
230 lines (201 loc) · 5.06 KB
/
CbufferTest.ino
File metadata and controls
230 lines (201 loc) · 5.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*
* Example of sbuffer class (derived from Stream)
*
* Autor: Guillermo Moncho
* xvedra@hotmail.com
*
* Mailing under cbuffer
* Idle -> Task2 -> Task3 -> Task4 -> Idle
*/
#include "sbuffer.h"
#include "esp_task_wdt.h"
#define USE_WDT
#define TWDT_TIMEOUT_S 3
#define TASK_RESET_PERIOD_S 2
TaskHandle_t Task2, Task3, Task4;
sbuffer ser1, ser2, ser3, ser4;
void loop2(void *parameter);
void loop3(void *parameter);
void loop4(void *parameter);
#define CHECK_ERROR_CODE(returned, expected) ({ \
if(returned != expected){ \
Serial.println("*** TWDT ERROR ***"); \
abort(); \
} \
})
void setup()
{
ser1.begin();
ser2.begin();
ser3.begin();
ser4.begin();
Serial.begin(115200);
Serial.printf("\n\ncbuffer Class example\n");
Serial.printf("by xvedra\n");
#ifdef USE_WDT
Serial.println("Enable WDT...");
CHECK_ERROR_CODE(esp_task_wdt_init(TWDT_TIMEOUT_S, false), ESP_OK);
#ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0
esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(0));
#endif
#ifndef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1
esp_task_wdt_add(xTaskGetIdleTaskHandleForCPU(1));
#endif
#else
Serial.println("Disable WDT...");
disableCore0WDT();
#endif
xTaskCreatePinnedToCore(
loop2,
"Task_2",
4096,
NULL,
1,
&Task2,
0);
xTaskCreatePinnedToCore(
loop3,
"Task_3",
4096,
NULL,
1,
&Task3,
0);
xTaskCreatePinnedToCore(
loop4,
"Task_4",
4096,
NULL,
1,
&Task4,
0);
Serial.printf("\n\nGo...\n");
delay(1000);
}
void loop()
{
char buf1[100];
int ctr=0;
int i = 0;
int sender, value;
static int dly = 100;
while(1)
{
if(dly) dly--;
else
{
dly = 100;
sprintf(buf1, "sender 1: %d#", ctr++); //seed
ser1.print(buf1);
Serial.printf("\nput> %s\n", buf1);
}
#if(0)
while(ser4.available()) Serial.print((char)ser4.read());
#else
if(ser4.available())
{
i = ser4.readBytesUntil('#', buf1, 20);
if(i > 0)
{
buf1[i] = '\0';
sscanf(buf1,"sender %d: %d", &sender, &value);
Serial.printf("Idle> \"%s\" rec %d bytes from %d: value:%d\n", buf1, i, sender, value);
}
}
#endif
delay(10);
}
}
void loop2(void *parameter){
char buf1[100];
int i = 0;
int sender, value;
#ifdef USE_WDT
//Subscribe this task to TWDT, then check if it is subscribed
CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);
#endif
for(;;)
{
#ifdef USE_WDT
//reset the watchdog:
CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK); //Comment this line to trigger a TWDT timeout
#endif
vTaskDelay(10);
if(ser1.available())
{
i = ser1.readBytesUntil('#', buf1, 20);
if(i > 0)
{
buf1[i] = '\0';
sscanf(buf1,"sender %d: %d", &sender, &value);
Serial.printf("Task2> \"%s\" rec %d bytes from %d: value:%d\n", buf1, i, sender, value);
//vTaskDelay(500);
sprintf(buf1, "sender 2: %d#", value+1);
ser2.print(buf1);
}
}
}
}
void loop3(void *parameter){
char buf1[100];
int i = 0;
int sender, value;
#ifdef USE_WDT
//Subscribe this task to TWDT, then check if it is subscribed
CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);
#endif
for(;;)
{
#ifdef USE_WDT
//reset the watchdog:
CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK); //Comment this line to trigger a TWDT timeout
#endif
vTaskDelay(10);
if(ser2.available())
{
i = ser2.readBytesUntil('#', buf1, 20);
if(i > 0)
{
buf1[i] = '\0';
sscanf(buf1,"sender %d: %d", &sender, &value);
Serial.printf("Task3> \"%s\" rec %d bytes from %d: value:%d\n", buf1, i, sender, value);
//vTaskDelay(500);
sprintf(buf1, "sender 3: %d#", value+1);
ser3.print(buf1);
}
}
}
}
void loop4(void *parameter){
char buf1[100];
int i = 0;
int sender, value;
#ifdef USE_WDT
//Subscribe this task to TWDT, then check if it is subscribed
CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);
#endif
for(;;)
{
#ifdef USE_WDT
//reset the watchdog:
CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK); //Comment this line to trigger a TWDT timeout
#endif
vTaskDelay(10);
if(ser3.available())
{
i = ser3.readBytesUntil('#', buf1, 20);
if(i > 0)
{
buf1[i] = '\0';
sscanf(buf1,"sender %d: %d", &sender, &value);
Serial.printf("Task4> \"%s\" rec %d bytes from %d: value:%d\n", buf1, i, sender, value);
//vTaskDelay(500);
sprintf(buf1, "sender 4: %d#", value+1);
ser4.print(buf1);
}
}
}
}