Skip to content

Commit 06bf619

Browse files
committed
refactor(NetworkEvents) code polishing and comments
- rename NetworkEvents::cbEventList as private member NetworkEvents_cbEventList - NetworkEvents::getStatusBits() add const qualifier - turn statics into constexpr - add indexes to enum::arduino_event_id_t to make events indexing consistent for SOCs with/without WiFi also leave some index gaps to minimize renumbering on adding new events - add doxygen help to NetworkEvents:: methods - declare NetworkEvents::eventName() as static, that could be used without creating class scope - potential mem leak in postEvent
1 parent c8a0c49 commit 06bf619

File tree

2 files changed

+128
-40
lines changed

2 files changed

+128
-40
lines changed

libraries/Network/src/NetworkEvents.cpp

+25-23
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include "esp_task.h"
99
#include "esp32-hal.h"
1010

11-
1211
NetworkEvents::NetworkEvents() : _arduino_event_group(NULL), _arduino_event_queue(NULL), _arduino_event_task_handle(NULL) {}
1312

1413
NetworkEvents::~NetworkEvents() {
@@ -22,8 +21,9 @@ NetworkEvents::~NetworkEvents() {
2221
}
2322
if (_arduino_event_queue != NULL) {
2423
arduino_event_t *event = NULL;
24+
// consume queue
2525
while (xQueueReceive(_arduino_event_queue, &event, 0) == pdTRUE) {
26-
free(event);
26+
delete event;
2727
}
2828
vQueueDelete(_arduino_event_queue);
2929
_arduino_event_queue = NULL;
@@ -73,18 +73,20 @@ bool NetworkEvents::initNetworkEvents() {
7373
return true;
7474
}
7575

76-
bool NetworkEvents::postEvent(arduino_event_t *data) {
76+
bool NetworkEvents::postEvent(const arduino_event_t *data) {
7777
if (data == NULL || _arduino_event_queue == NULL) {
7878
return false;
7979
}
80-
arduino_event_t *event = (arduino_event_t *)malloc(sizeof(arduino_event_t));
80+
arduino_event_t *event = new arduino_event_t();
8181
if (event == NULL) {
8282
log_e("Arduino Event Malloc Failed!");
8383
return false;
8484
}
85+
8586
memcpy(event, data, sizeof(arduino_event_t));
8687
if (xQueueSend(_arduino_event_queue, &event, portMAX_DELAY) != pdPASS) {
8788
log_e("Arduino Event Send Failed!");
89+
delete event; // release mem on error
8890
return false;
8991
}
9092
return true;
@@ -110,7 +112,7 @@ void NetworkEvents::_checkForEvent() {
110112
log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id));
111113

112114
// iterate over registered callbacks
113-
for (auto &i : cbEventList){
115+
for (auto &i : _cbEventList){
114116
if (i.cb || i.fcb || i.scb) {
115117
if (i.event == (arduino_event_id_t)event->event_id || i.event == ARDUINO_EVENT_MAX) {
116118
if (i.cb) {
@@ -129,7 +131,7 @@ void NetworkEvents::_checkForEvent() {
129131
}
130132

131133
// release the event object's memory
132-
free(event);
134+
delete event;
133135
}
134136

135137
vTaskDelete(NULL);
@@ -149,81 +151,81 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev
149151
return 0;
150152
}
151153

152-
cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event);
153-
return cbEventList.back().id;
154+
_cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event);
155+
return _cbEventList.back().id;
154156
}
155157

156158
network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
157159
if (!cbEvent) {
158160
return 0;
159161
}
160162

161-
cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event);
162-
return cbEventList.back().id;
163+
_cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event);
164+
return _cbEventList.back().id;
163165
}
164166

165167
network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
166168
if (!cbEvent) {
167169
return 0;
168170
}
169171

170-
cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event);
171-
return cbEventList.back().id;
172+
_cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event);
173+
return _cbEventList.back().id;
172174
}
173175

174176
network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
175177
if (!cbEvent) {
176178
return 0;
177179
}
178180

179-
cbEventList.emplace(cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event);
180-
return cbEventList.front().id;
181+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event);
182+
return _cbEventList.front().id;
181183
}
182184

183185
network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
184186
if (!cbEvent) {
185187
return 0;
186188
}
187189

188-
cbEventList.emplace(cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event);
189-
return cbEventList.front().id;
190+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event);
191+
return _cbEventList.front().id;
190192
}
191193

192194
network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
193195
if (!cbEvent) {
194196
return 0;
195197
}
196198

197-
cbEventList.emplace(cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event);
198-
return cbEventList.front().id;
199+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event);
200+
return _cbEventList.front().id;
199201
}
200202

201203
void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
202204
if (!cbEvent) {
203205
return;
204206
}
205207

206-
cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), cbEventList.end());
208+
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), _cbEventList.end());
207209
}
208210

209211
void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
210212
if (!cbEvent) {
211213
return;
212214
}
213215

214-
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());
216+
_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());
215217
}
216218

217219
void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
218220
if (!cbEvent) {
219221
return;
220222
}
221223

222-
cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), cbEventList.end());
224+
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), _cbEventList.end());
223225
}
224226

225227
void NetworkEvents::removeEvent(network_event_handle_t id) {
226-
cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), cbEventList.end());
228+
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), _cbEventList.end());
227229
}
228230

229231
int NetworkEvents::setStatusBits(int bits) {
@@ -242,7 +244,7 @@ int NetworkEvents::clearStatusBits(int bits) {
242244
return xEventGroupClearBits(_arduino_event_group, bits);
243245
}
244246

245-
int NetworkEvents::getStatusBits() {
247+
int NetworkEvents::getStatusBits() const {
246248
if (!_arduino_event_group) {
247249
return _initial_bits;
248250
}

libraries/Network/src/NetworkEvents.h

+103-17
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@
2424
#endif
2525

2626
#if SOC_WIFI_SUPPORTED
27-
static const int WIFI_SCANNING_BIT = BIT0;
28-
static const int WIFI_SCAN_DONE_BIT = BIT1;
27+
constexpr int WIFI_SCANNING_BIT = BIT0;
28+
constexpr int WIFI_SCAN_DONE_BIT = BIT1;
2929
#endif
3030

3131
#define NET_HAS_IP6_GLOBAL_BIT 0
3232

3333
ESP_EVENT_DECLARE_BASE(ARDUINO_EVENTS);
3434

3535
typedef enum {
36-
ARDUINO_EVENT_NONE,
36+
ARDUINO_EVENT_NONE = 0,
3737
ARDUINO_EVENT_ETH_START,
3838
ARDUINO_EVENT_ETH_STOP,
3939
ARDUINO_EVENT_ETH_CONNECTED,
@@ -42,43 +42,43 @@ typedef enum {
4242
ARDUINO_EVENT_ETH_LOST_IP,
4343
ARDUINO_EVENT_ETH_GOT_IP6,
4444
#if SOC_WIFI_SUPPORTED
45-
ARDUINO_EVENT_WIFI_OFF,
45+
ARDUINO_EVENT_WIFI_OFF = 100,
4646
ARDUINO_EVENT_WIFI_READY,
4747
ARDUINO_EVENT_WIFI_SCAN_DONE,
48-
ARDUINO_EVENT_WIFI_STA_START,
48+
ARDUINO_EVENT_WIFI_FTM_REPORT,
49+
ARDUINO_EVENT_WIFI_STA_START = 110,
4950
ARDUINO_EVENT_WIFI_STA_STOP,
5051
ARDUINO_EVENT_WIFI_STA_CONNECTED,
5152
ARDUINO_EVENT_WIFI_STA_DISCONNECTED,
5253
ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE,
5354
ARDUINO_EVENT_WIFI_STA_GOT_IP,
5455
ARDUINO_EVENT_WIFI_STA_GOT_IP6,
5556
ARDUINO_EVENT_WIFI_STA_LOST_IP,
56-
ARDUINO_EVENT_WIFI_AP_START,
57+
ARDUINO_EVENT_WIFI_AP_START = 130,
5758
ARDUINO_EVENT_WIFI_AP_STOP,
5859
ARDUINO_EVENT_WIFI_AP_STACONNECTED,
5960
ARDUINO_EVENT_WIFI_AP_STADISCONNECTED,
6061
ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED,
6162
ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED,
6263
ARDUINO_EVENT_WIFI_AP_GOT_IP6,
63-
ARDUINO_EVENT_WIFI_FTM_REPORT,
64-
ARDUINO_EVENT_WPS_ER_SUCCESS,
64+
ARDUINO_EVENT_WPS_ER_SUCCESS = 140,
6565
ARDUINO_EVENT_WPS_ER_FAILED,
6666
ARDUINO_EVENT_WPS_ER_TIMEOUT,
6767
ARDUINO_EVENT_WPS_ER_PIN,
6868
ARDUINO_EVENT_WPS_ER_PBC_OVERLAP,
69-
ARDUINO_EVENT_SC_SCAN_DONE,
69+
ARDUINO_EVENT_SC_SCAN_DONE = 150,
7070
ARDUINO_EVENT_SC_FOUND_CHANNEL,
7171
ARDUINO_EVENT_SC_GOT_SSID_PSWD,
7272
ARDUINO_EVENT_SC_SEND_ACK_DONE,
73-
ARDUINO_EVENT_PROV_INIT,
73+
ARDUINO_EVENT_PROV_INIT = 160,
7474
ARDUINO_EVENT_PROV_DEINIT,
7575
ARDUINO_EVENT_PROV_START,
7676
ARDUINO_EVENT_PROV_END,
7777
ARDUINO_EVENT_PROV_CRED_RECV,
7878
ARDUINO_EVENT_PROV_CRED_FAIL,
7979
ARDUINO_EVENT_PROV_CRED_SUCCESS,
8080
#endif
81-
ARDUINO_EVENT_PPP_START,
81+
ARDUINO_EVENT_PPP_START = 200,
8282
ARDUINO_EVENT_PPP_STOP,
8383
ARDUINO_EVENT_PPP_CONNECTED,
8484
ARDUINO_EVENT_PPP_DISCONNECTED,
@@ -125,24 +125,107 @@ using NetworkEventFuncCb = std::function<void(arduino_event_id_t event, arduino_
125125
using NetworkEventSysCb = void(*)(arduino_event_t *event);
126126
using network_event_handle_t = size_t;
127127

128+
/**
129+
* @brief Class that provides network events callback handling
130+
* it registers user callback functions for event handling,
131+
* maintans the queue of events and propagates the event amoung subscribed callbacks
132+
* callback are called in the context of a dedicated task consuming the queue
133+
*
134+
*/
128135
class NetworkEvents {
129136
public:
130137
NetworkEvents();
131138
~NetworkEvents();
132139

140+
/**
141+
* @brief register callback function to be executed on arduino event(s)
142+
* @note if same handler is registered twice or more than same handler would be called twice or more times
143+
*
144+
* @param cbEvent static callback function
145+
* @param event event to process, any event by default
146+
* @return network_event_handle_t
147+
*/
133148
network_event_handle_t onEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
149+
150+
/**
151+
* @brief register functional callback to be executed on arduino event(s)
152+
* also used for lambda callbacks
153+
* @note if same handler is registered twice or more than same handler would be called twice or more times
154+
*
155+
* @param cbEvent static callback function
156+
* @param event event to process, any event by default
157+
* @return network_event_handle_t
158+
*/
134159
network_event_handle_t onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
160+
161+
/**
162+
* @brief register static system callback to be executed on arduino event(s)
163+
* callback function would be supplied with a pointer to arduino_event_t structure as an argument
164+
*
165+
* @note if same handler is registered twice or more than same handler would be called twice or more times
166+
*
167+
* @param cbEvent static callback function
168+
* @param event event to process, any event by default
169+
* @return network_event_handle_t
170+
*/
135171
network_event_handle_t onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
172+
173+
/**
174+
* @brief unregister static function callback
175+
* @note a better way to unregister callbacks is to save/unregister via network_event_handle_t
176+
*
177+
* @param cbEvent static callback function
178+
* @param event event to process, any event by default
179+
*/
136180
void removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
137-
void removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX) __attribute__((deprecated("removing functional callbacks via pointer is deprecated, use removeEvent(network_event_handle_t event_handle) instead")));
181+
182+
/**
183+
* @brief unregister functional callback
184+
* @note a better way to unregister callbacks is to save/unregister via network_event_handle_t
185+
* @note this does not work for lambda's! Do unregister via network_event_handle_t
186+
*
187+
* @param cbEvent functional callback
188+
* @param event event to process, any event by default
189+
*/
190+
void removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX) __attribute__((deprecated("removing functional callbacks via pointer is deprecated, use removeEvent(network_event_handle_t) instead")));
191+
192+
/**
193+
* @brief unregister static system function callback
194+
* @note a better way to unregister callbacks is to save/unregister via network_event_handle_t
195+
*
196+
* @param cbEvent static callback function
197+
* @param event event to process, any event by default
198+
*/
138199
void removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
200+
201+
/**
202+
* @brief unregister event callback via handler
203+
*
204+
* @param cbEvent static callback function
205+
* @param event event to process, any event by default
206+
*/
139207
void removeEvent(network_event_handle_t event_handle);
140208

141-
const char *eventName(arduino_event_id_t id);
209+
/**
210+
* @brief get a human-readable name of an event by it's id
211+
*
212+
* @param id event id code
213+
* @return const char* event name string
214+
*/
215+
static const char *eventName(arduino_event_id_t id);
142216

143-
bool postEvent(arduino_event_t *event);
217+
/**
218+
* @brief post an event to the queue
219+
* and propagade and event to subscribed handlers
220+
* @note posting an event will trigger context switch from a lower priority task
221+
*
222+
* @param event a pointer to arduino_event_t struct
223+
* @return true if event was queued susccessfuly
224+
* @return false on memrory allocation error or queue is full
225+
*/
226+
bool postEvent(const arduino_event_t *event);
144227

145-
int getStatusBits();
228+
int getStatusBits() const;
146229
int waitStatusBits(int bits, uint32_t timeout_ms);
147230
int setStatusBits(int bits);
148231
int clearStatusBits(int bits);
@@ -158,8 +241,11 @@ class NetworkEvents {
158241

159242
protected:
160243
bool initNetworkEvents();
244+
// same as onEvent() but places newly added handler at the begining of registered events list
161245
network_event_handle_t onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
246+
// same as onEvent() but places newly added handler at the begining of registered events list
162247
network_event_handle_t onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
248+
// same as onEvent() but places newly added handler at the begining of registered events list
163249
network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
164250

165251
private:
@@ -189,10 +275,10 @@ class NetworkEvents {
189275
TaskHandle_t _arduino_event_task_handle;
190276

191277
// registred events callbacks containter
192-
std::vector<NetworkEventCbList_t> cbEventList;
278+
std::vector<NetworkEventCbList_t> _cbEventList;
193279

194280
/**
195-
* @brief task that picks events from a event queue and calls registered callbacks
281+
* @brief task function that picks events from an event queue and calls registered callbacks
196282
*
197283
*/
198284
void _checkForEvent();

0 commit comments

Comments
 (0)