8
8
#include " esp_task.h"
9
9
#include " esp32-hal.h"
10
10
11
- /* *
12
- * @brief an object holds callback's definitions:
13
- * - callback id
14
- * - callback function pointers
15
- * - binded event id
16
- *
17
- */
18
- struct NetworkEventCbList_t {
19
- static network_event_handle_t current_id;
20
- network_event_handle_t id;
21
- NetworkEventCb cb;
22
- NetworkEventFuncCb fcb;
23
- NetworkEventSysCb scb;
24
- arduino_event_id_t event;
25
-
26
- NetworkEventCbList_t () : id(current_id++), cb(NULL ), fcb(NULL ), scb(NULL ), event(ARDUINO_EVENT_NONE) {}
27
- };
28
- // define initial id's value
29
- network_event_handle_t NetworkEventCbList_t::current_id = 1 ;
30
-
31
- // arduino dont like std::vectors move static here
32
- static std::vector<NetworkEventCbList_t> cbEventList;
33
11
34
12
static void _network_event_task (void *arg) {
35
13
for (;;) {
@@ -142,22 +120,6 @@ void NetworkEvents::checkForEvent() {
142
120
free (event);
143
121
}
144
122
145
- uint32_t NetworkEvents::findEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
146
- uint32_t i;
147
-
148
- if (!cbEvent) {
149
- return cbEventList.size ();
150
- }
151
-
152
- for (i = 0 ; i < cbEventList.size (); i++) {
153
- NetworkEventCbList_t entry = cbEventList[i];
154
- if (entry.cb == cbEvent && entry.event == event) {
155
- break ;
156
- }
157
- }
158
- return i;
159
- }
160
-
161
123
template <typename T, typename ... U> static size_t getStdFunctionAddress (std::function<T(U...)> f) {
162
124
typedef T (fnType)(U...);
163
125
fnType **fnPointer = f.template target <fnType *>();
@@ -167,209 +129,86 @@ template<typename T, typename... U> static size_t getStdFunctionAddress(std::fun
167
129
return (size_t )fnPointer;
168
130
}
169
131
170
- uint32_t NetworkEvents::findEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
171
- uint32_t i;
172
-
173
- if (!cbEvent) {
174
- return cbEventList.size ();
175
- }
176
-
177
- for (i = 0 ; i < cbEventList.size (); i++) {
178
- NetworkEventCbList_t entry = cbEventList[i];
179
- if (getStdFunctionAddress (entry.fcb ) == getStdFunctionAddress (cbEvent) && entry.event == event) {
180
- break ;
181
- }
182
- }
183
- return i;
184
- }
185
-
186
- uint32_t NetworkEvents::findEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
187
- uint32_t i;
188
-
189
- if (!cbEvent) {
190
- return cbEventList.size ();
191
- }
192
-
193
- for (i = 0 ; i < cbEventList.size (); i++) {
194
- NetworkEventCbList_t entry = cbEventList[i];
195
- if (entry.scb == cbEvent && entry.event == event) {
196
- break ;
197
- }
198
- }
199
- return i;
200
- }
201
-
202
132
network_event_handle_t NetworkEvents::onEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
203
133
if (!cbEvent) {
204
134
return 0 ;
205
135
}
206
136
207
- if (findEvent (cbEvent, event) < cbEventList.size ()) {
208
- log_w (" Attempt to add duplicate event handler!" );
209
- return 0 ;
210
- }
211
-
212
- NetworkEventCbList_t newEventHandler;
213
- newEventHandler.cb = cbEvent;
214
- newEventHandler.fcb = NULL ;
215
- newEventHandler.scb = NULL ;
216
- newEventHandler.event = event;
217
- cbEventList.push_back (newEventHandler);
218
- return newEventHandler.id ;
137
+ cbEventList.emplace_back (++_current_id, cbEvent, nullptr , nullptr , event);
138
+ return cbEventList.back ().id ;
219
139
}
220
140
221
141
network_event_handle_t NetworkEvents::onEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
222
142
if (!cbEvent) {
223
143
return 0 ;
224
144
}
225
145
226
- if (findEvent (cbEvent, event) < cbEventList.size ()) {
227
- log_w (" Attempt to add duplicate event handler!" );
228
- return 0 ;
229
- }
230
-
231
- NetworkEventCbList_t newEventHandler;
232
- newEventHandler.cb = NULL ;
233
- newEventHandler.fcb = cbEvent;
234
- newEventHandler.scb = NULL ;
235
- newEventHandler.event = event;
236
- cbEventList.push_back (newEventHandler);
237
- return newEventHandler.id ;
146
+ cbEventList.emplace_back (++_current_id, nullptr , cbEvent, nullptr , event);
147
+ return cbEventList.back ().id ;
238
148
}
239
149
240
150
network_event_handle_t NetworkEvents::onEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
241
151
if (!cbEvent) {
242
152
return 0 ;
243
153
}
244
154
245
- if (findEvent (cbEvent, event) < cbEventList.size ()) {
246
- log_w (" Attempt to add duplicate event handler!" );
247
- return 0 ;
248
- }
249
-
250
- NetworkEventCbList_t newEventHandler;
251
- newEventHandler.cb = NULL ;
252
- newEventHandler.fcb = NULL ;
253
- newEventHandler.scb = cbEvent;
254
- newEventHandler.event = event;
255
- cbEventList.push_back (newEventHandler);
256
- return newEventHandler.id ;
155
+ cbEventList.emplace_back (++_current_id, nullptr , nullptr , cbEvent, event);
156
+ return cbEventList.back ().id ;
257
157
}
258
158
259
159
network_event_handle_t NetworkEvents::onSysEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
260
160
if (!cbEvent) {
261
161
return 0 ;
262
162
}
263
163
264
- if (findEvent (cbEvent, event) < cbEventList.size ()) {
265
- log_w (" Attempt to add duplicate event handler!" );
266
- return 0 ;
267
- }
268
-
269
- NetworkEventCbList_t newEventHandler;
270
- newEventHandler.cb = cbEvent;
271
- newEventHandler.fcb = NULL ;
272
- newEventHandler.scb = NULL ;
273
- newEventHandler.event = event;
274
- cbEventList.insert (cbEventList.begin (), newEventHandler);
275
- return newEventHandler.id ;
164
+ cbEventList.emplace (cbEventList.begin (), ++_current_id, cbEvent, nullptr , nullptr , event);
165
+ return cbEventList.front ().id ;
276
166
}
277
167
278
168
network_event_handle_t NetworkEvents::onSysEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
279
169
if (!cbEvent) {
280
170
return 0 ;
281
171
}
282
172
283
- if (findEvent (cbEvent, event) < cbEventList.size ()) {
284
- log_w (" Attempt to add duplicate event handler!" );
285
- return 0 ;
286
- }
287
-
288
- NetworkEventCbList_t newEventHandler;
289
- newEventHandler.cb = NULL ;
290
- newEventHandler.fcb = cbEvent;
291
- newEventHandler.scb = NULL ;
292
- newEventHandler.event = event;
293
- cbEventList.insert (cbEventList.begin (), newEventHandler);
294
- return newEventHandler.id ;
173
+ cbEventList.emplace (cbEventList.begin (), ++_current_id, nullptr , cbEvent, nullptr , event);
174
+ return cbEventList.front ().id ;
295
175
}
296
176
297
177
network_event_handle_t NetworkEvents::onSysEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
298
178
if (!cbEvent) {
299
179
return 0 ;
300
180
}
301
181
302
- if (findEvent (cbEvent, event) < cbEventList.size ()) {
303
- log_w (" Attempt to add duplicate event handler!" );
304
- return 0 ;
305
- }
306
-
307
- NetworkEventCbList_t newEventHandler;
308
- newEventHandler.cb = NULL ;
309
- newEventHandler.fcb = NULL ;
310
- newEventHandler.scb = cbEvent;
311
- newEventHandler.event = event;
312
- cbEventList.insert (cbEventList.begin (), newEventHandler);
313
- return newEventHandler.id ;
182
+ cbEventList.emplace (cbEventList.begin (), ++_current_id, nullptr , nullptr , cbEvent, event);
183
+ return cbEventList.front ().id ;
314
184
}
315
185
316
186
void NetworkEvents::removeEvent (NetworkEventCb cbEvent, arduino_event_id_t event) {
317
- uint32_t i;
318
-
319
187
if (!cbEvent) {
320
188
return ;
321
189
}
322
190
323
- i = findEvent (cbEvent, event);
324
- if (i >= cbEventList.size ()) {
325
- log_w (" Event handler not found!" );
326
- return ;
327
- }
328
-
329
- cbEventList.erase (cbEventList.begin () + i);
191
+ cbEventList.erase (std::remove_if (cbEventList.begin (), cbEventList.end (), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), cbEventList.end ());
330
192
}
331
193
332
194
void NetworkEvents::removeEvent (NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
333
- uint32_t i;
334
-
335
195
if (!cbEvent) {
336
196
return ;
337
197
}
338
198
339
- i = findEvent (cbEvent, event);
340
- if (i >= cbEventList.size ()) {
341
- log_w (" Event handler not found!" );
342
- return ;
343
- }
344
-
345
- cbEventList.erase (cbEventList.begin () + i);
199
+ cbEventList.erase (std::remove_if (cbEventList.begin (), cbEventList.end (), [cbEvent, event](const NetworkEventCbList_t& e) { return getStdFunctionAddress (e.fcb ) == getStdFunctionAddress (cbEvent) && e.event == event; }), cbEventList.end ());
346
200
}
347
201
348
202
void NetworkEvents::removeEvent (NetworkEventSysCb cbEvent, arduino_event_id_t event) {
349
- uint32_t i;
350
-
351
203
if (!cbEvent) {
352
204
return ;
353
205
}
354
206
355
- i = findEvent (cbEvent, event);
356
- if (i >= cbEventList.size ()) {
357
- log_w (" Event handler not found!" );
358
- return ;
359
- }
360
-
361
- cbEventList.erase (cbEventList.begin () + i);
207
+ cbEventList.erase (std::remove_if (cbEventList.begin (), cbEventList.end (), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), cbEventList.end ());
362
208
}
363
209
364
210
void NetworkEvents::removeEvent (network_event_handle_t id) {
365
- for (uint32_t i = 0 ; i < cbEventList.size (); i++) {
366
- NetworkEventCbList_t entry = cbEventList[i];
367
- if (entry.id == id) {
368
- cbEventList.erase (cbEventList.begin () + i);
369
- return ;
370
- }
371
- }
372
- log_w (" Event handler not found!" );
211
+ cbEventList.erase (std::remove_if (cbEventList.begin (), cbEventList.end (), [id](const NetworkEventCbList_t& e) { return e.id == id; }), cbEventList.end ());
373
212
}
374
213
375
214
int NetworkEvents::setStatusBits (int bits) {
0 commit comments