Skip to content

Commit 7e9dd6c

Browse files
committed
lib(NetworkEvents) refactor callback handlers
add a new functional callback type NetworkEventReceiver which accepts two argumnets: an event id and a pointer to optional struct with trailer data. Using this callback would allow to propagate event messages more efficiently. Mandatory allocation for arduino_event_info_t and arduino_event_t objects won't needed and simple events could be passed with only (int32_t)arduino_event_id_t wich fits nice to ESP event loop add NetworkEvents::postEvent() overload with optional arduino_event_info_t* struct use std::variant for various types of callback handlers, event picker depending on callback variant will provide an optimized calls avoiding extra copies when not needed.
1 parent 391634c commit 7e9dd6c

File tree

2 files changed

+105
-50
lines changed

2 files changed

+105
-50
lines changed

Diff for: libraries/Network/src/NetworkEvents.cpp

+61-34
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,18 @@ bool NetworkEvents::initNetworkEvents() {
5555
bool NetworkEvents::postEvent(const arduino_event_t *data, TickType_t timeout) {
5656
if (!data) return false;
5757
esp_err_t err = esp_event_post(ARDUINO_EVENTS, static_cast<int32_t>(data->event_id), &data->event_info, sizeof(data->event_info), timeout);
58-
if (err == pdTRUE)
58+
if (err == ESP_OK)
5959
return true;
6060

6161
log_e("Arduino Event Send Failed!");
6262
return false;
6363
}
6464

65-
bool NetworkEvents::postEvent(arduino_event_id_t event, TickType_t timeout){
66-
return esp_event_post(ARDUINO_EVENTS, static_cast<int32_t>(event), NULL, 0, timeout) == pdTRUE;
65+
bool NetworkEvents::postEvent(arduino_event_id_t event, const arduino_event_info_t *info, TickType_t timeout){
66+
if (info)
67+
return esp_event_post(ARDUINO_EVENTS, static_cast<int32_t>(event), info, sizeof(arduino_event_info_t), timeout) == pdTRUE;
68+
else
69+
return esp_event_post(ARDUINO_EVENTS, static_cast<int32_t>(event), NULL, 0, timeout) == pdTRUE;
6770
}
6871

6972

@@ -74,27 +77,27 @@ void NetworkEvents::_evt_picker(int32_t id, arduino_event_info_t *info){
7477

7578
// iterate over registered callbacks
7679
for (auto &i : _cbEventList) {
77-
if (i.event == static_cast<arduino_event_id_t>(id) || i.event == ARDUINO_EVENT_ANY) {
78-
if (i.cb) {
79-
i.cb(static_cast<arduino_event_id_t>(id));
80-
continue;
81-
}
82-
83-
if (i.fcb) {
84-
if (info)
85-
i.fcb(static_cast<arduino_event_id_t>(id), *info);
86-
else
87-
i.fcb(static_cast<arduino_event_id_t>(id), {});
88-
continue;
89-
}
90-
91-
if (i.scb){
92-
// system event callback needs a ptr to struct
93-
arduino_event_t event{static_cast<arduino_event_id_t>(id), {}};
94-
if (info)
95-
memcpy(&event.event_info, info, sizeof(arduino_event_info_t));
96-
i.scb(&event);
97-
}
80+
if (i.event == ARDUINO_EVENT_ANY || i.event == static_cast<arduino_event_id_t>(id)){
81+
82+
std::visit([id, info](auto&& arg){
83+
using T = std::decay_t<decltype(arg)>;
84+
if constexpr (std::is_same_v<T, NetworkEventReceiver>)
85+
arg(static_cast<arduino_event_id_t>(id), info);
86+
else if constexpr (std::is_same_v<T, NetworkEventCb>)
87+
arg(static_cast<arduino_event_id_t>(id));
88+
else if constexpr (std::is_same_v<T, NetworkEventFuncCb>)
89+
if (info)
90+
arg(static_cast<arduino_event_id_t>(id), *info);
91+
else
92+
arg(static_cast<arduino_event_id_t>(id), {});
93+
else if constexpr (std::is_same_v<T, NetworkEventSysCb>){
94+
// system event callback needs a ptr to struct
95+
arduino_event_t event{static_cast<arduino_event_id_t>(id), {}};
96+
if (info)
97+
memcpy(&event.event_info, info, sizeof(arduino_event_info_t));
98+
arg(&event);
99+
}
100+
}, i.cb_v);
98101
}
99102
}
100103
}
@@ -117,7 +120,7 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev
117120
std::lock_guard<std::mutex> lock(_mtx);
118121
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
119122

120-
_cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event);
123+
_cbEventList.emplace_back(++_current_id, cbEvent, event);
121124
return _cbEventList.back().id;
122125
}
123126

@@ -130,7 +133,7 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
130133
std::lock_guard<std::mutex> lock(_mtx);
131134
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
132135

133-
_cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event);
136+
_cbEventList.emplace_back(++_current_id, cbEvent, event);
134137
return _cbEventList.back().id;
135138
}
136139

@@ -143,7 +146,7 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
143146
std::lock_guard<std::mutex> lock(_mtx);
144147
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
145148

146-
_cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event);
149+
_cbEventList.emplace_back(++_current_id, cbEvent, event);
147150
return _cbEventList.back().id;
148151
}
149152

@@ -156,7 +159,7 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
156159
std::lock_guard<std::mutex> lock(_mtx);
157160
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
158161

159-
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event);
162+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, event);
160163
return _cbEventList.front().id;
161164
}
162165

@@ -169,7 +172,7 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
169172
std::lock_guard<std::mutex> lock(_mtx);
170173
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
171174

172-
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event);
175+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, event);
173176
return _cbEventList.front().id;
174177
}
175178

@@ -182,7 +185,20 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
182185
std::lock_guard<std::mutex> lock(_mtx);
183186
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
184187

185-
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event);
188+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, event);
189+
return _cbEventList.front().id;
190+
}
191+
192+
network_event_handle_t NetworkEvents::onSysEvent(NetworkEventReceiver cbEvent, arduino_event_id_t event){
193+
if (!cbEvent) {
194+
return 0;
195+
}
196+
197+
#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
198+
std::lock_guard<std::mutex> lock(_mtx);
199+
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
200+
201+
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, event);
186202
return _cbEventList.front().id;
187203
}
188204

@@ -199,7 +215,11 @@ void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event
199215
std::remove_if(
200216
_cbEventList.begin(), _cbEventList.end(),
201217
[cbEvent, event](const NetworkEventCbList_t &e) {
202-
return e.cb == cbEvent && e.event == event;
218+
return e.event == event && std::visit([cbEvent](auto&& arg) -> bool {
219+
if constexpr (std::is_same_v<NetworkEventCb, std::decay_t<decltype(arg)>>)
220+
return cbEvent == arg;
221+
else return false;
222+
}, e.cb_v);
203223
}
204224
),
205225
_cbEventList.end()
@@ -214,12 +234,15 @@ void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t e
214234
#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
215235
std::lock_guard<std::mutex> lock(_mtx);
216236
#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
217-
218237
_cbEventList.erase(
219238
std::remove_if(
220239
_cbEventList.begin(), _cbEventList.end(),
221240
[cbEvent, event](const NetworkEventCbList_t &e) {
222-
return getStdFunctionAddress(e.fcb) == getStdFunctionAddress(cbEvent) && e.event == event;
241+
return e.event == event && std::visit([cbEvent](auto&& arg) -> bool {
242+
if constexpr (std::is_same_v<NetworkEventFuncCb, std::decay_t<decltype(arg)>>)
243+
return getStdFunctionAddress(cbEvent) == getStdFunctionAddress(arg);
244+
else return false;
245+
}, e.cb_v);
223246
}
224247
),
225248
_cbEventList.end()
@@ -239,7 +262,11 @@ void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t ev
239262
std::remove_if(
240263
_cbEventList.begin(), _cbEventList.end(),
241264
[cbEvent, event](const NetworkEventCbList_t &e) {
242-
return e.scb == cbEvent && e.event == event;
265+
return e.event == event && std::visit([cbEvent](auto&& arg) -> bool {
266+
if constexpr (std::is_same_v<NetworkEventSysCb, std::decay_t<decltype(arg)>>)
267+
return cbEvent == arg;
268+
else return false;
269+
}, e.cb_v);
243270
}
244271
),
245272
_cbEventList.end()

Diff for: libraries/Network/src/NetworkEvents.h

+44-16
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "esp_eth_driver.h"
1515
#endif
1616
#include <functional>
17+
#include <variant>
1718
#include "freertos/FreeRTOS.h"
1819
#include "freertos/event_groups.h"
1920
#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1
@@ -134,10 +135,15 @@ struct arduino_event_t {
134135
};
135136

136137
// type aliases
138+
using network_event_handle_t = size_t;
139+
// static callback
137140
using NetworkEventCb = void (*)(arduino_event_id_t event);
141+
// Generic Arduno NetworkEvent Functional Callback for events propagated via ESP Event loop
142+
using NetworkEventReceiver = std::function<void(arduino_event_id_t event, const arduino_event_info_t *info)>;
143+
// deprecated ones
138144
using NetworkEventFuncCb = std::function<void(arduino_event_id_t event, arduino_event_info_t info)>;
139145
using NetworkEventSysCb = void (*)(arduino_event_t *event);
140-
using network_event_handle_t = size_t;
146+
141147

142148
/**
143149
* @brief Class that provides network events callback handling
@@ -151,6 +157,16 @@ class NetworkEvents {
151157
NetworkEvents(){};
152158
~NetworkEvents();
153159

160+
/**
161+
* @brief register callback function to be executed on arduino event(s)
162+
* @note if same handler is registered twice or more than same handler would be called twice or more times
163+
*
164+
* @param cbEvent functional callback
165+
* @param event event to process, any event by default
166+
* @return network_event_handle_t
167+
*/
168+
network_event_handle_t onEvent(NetworkEventReceiver cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
169+
154170
/**
155171
* @brief register callback function to be executed on arduino event(s)
156172
* @note if same handler is registered twice or more than same handler would be called twice or more times
@@ -166,22 +182,23 @@ class NetworkEvents {
166182
* also used for lambda callbacks
167183
* @note if same handler is registered twice or more than same handler would be called twice or more times
168184
*
169-
* @param cbEvent static callback function
185+
* @param cbEvent functional callback
170186
* @param event event to process, any event by default
171187
* @return network_event_handle_t
172188
*/
189+
[[deprecated( "NetworkEventFuncCb deprecated, pls, use NetworkEventReceiver instead" )]]
173190
network_event_handle_t onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
174191

175192
/**
176193
* @brief register static system callback to be executed on arduino event(s)
177194
* callback function would be supplied with a pointer to arduino_event_t structure as an argument
178-
*
179195
* @note if same handler is registered twice or more than same handler would be called twice or more times
180196
*
181197
* @param cbEvent static callback function
182198
* @param event event to process, any event by default
183199
* @return network_event_handle_t
184200
*/
201+
[[deprecated( "NetworkEventSysCb deprecated, pls, use NetworkEventReceiver instead" )]]
185202
network_event_handle_t onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
186203

187204
/**
@@ -201,8 +218,8 @@ class NetworkEvents {
201218
* @param cbEvent functional callback
202219
* @param event event to process, any event by default
203220
*/
204-
void removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY)
205-
__attribute__((deprecated("removing functional callbacks via pointer is deprecated, use removeEvent(network_event_handle_t) instead")));
221+
[[deprecated( "removing functional callbacks via pointer is deprecated, use removeEvent(network_event_handle_t) instead" )]]
222+
void removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
206223

207224
/**
208225
* @brief unregister static system function callback
@@ -228,14 +245,17 @@ class NetworkEvents {
228245
static const char *eventName(arduino_event_id_t id);
229246

230247
/**
231-
* @brief post an event to the queue
232-
* and propagade and event to subscribed handlers
248+
* @brief post an event to the queue and propagade it to subscribed handlers
233249
* @note posting an event will trigger context switch from a lower priority task
234250
*
235251
* @param event a pointer to arduino_event_t struct
252+
* @param info optional struct with side data related to event
236253
* @return true if event was queued susccessfuly
237-
* @return false on memrory allocation error or queue is full
254+
* @return false on memory allocation error or queue is full
238255
*/
256+
bool postEvent(arduino_event_id_t event, const arduino_event_info_t *info = nullptr, TickType_t timeout = portMAX_DELAY);
257+
258+
[[deprecated( "posting arduino_event_t is deprecated, pls, use postEvent(arduino_event_id_t event, const arduino_event_info_t *info) instead" )]]
239259
bool postEvent(const arduino_event_t *event, TickType_t timeout = portMAX_DELAY);
240260

241261
int getStatusBits() const;
@@ -257,8 +277,12 @@ class NetworkEvents {
257277
// same as onEvent() but places newly added handler at the beginning of registered events list
258278
network_event_handle_t onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
259279
// same as onEvent() but places newly added handler at the beginning of registered events list
280+
network_event_handle_t onSysEvent(NetworkEventReceiver cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
281+
// same as onEvent() but places newly added handler at the beginning of registered events list
282+
[[deprecated( "NetworkEventFuncCb deprecated, pls, use NetworkEventReceiver instead" )]]
260283
network_event_handle_t onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
261284
// same as onEvent() but places newly added handler at the beginning of registered events list
285+
[[deprecated( "NetworkEventSysCb deprecated, pls, use NetworkEventReceiver instead" )]]
262286
network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_ANY);
263287

264288
private:
@@ -271,16 +295,20 @@ class NetworkEvents {
271295
*/
272296
struct NetworkEventCbList_t {
273297
network_event_handle_t id;
274-
NetworkEventCb cb;
275-
NetworkEventFuncCb fcb;
276-
NetworkEventSysCb scb;
298+
std::variant<NetworkEventCb, NetworkEventReceiver, NetworkEventFuncCb, NetworkEventSysCb>cb_v;
277299
arduino_event_id_t event;
278300

279-
explicit NetworkEventCbList_t(
280-
network_event_handle_t id, NetworkEventCb cb = nullptr, NetworkEventFuncCb fcb = nullptr, NetworkEventSysCb scb = nullptr,
281-
arduino_event_id_t event = ARDUINO_EVENT_ANY
282-
)
283-
: id(id), cb(cb), fcb(fcb), scb(scb), event(event) {}
301+
explicit NetworkEventCbList_t(network_event_handle_t id, NetworkEventCb callback, arduino_event_id_t event = ARDUINO_EVENT_ANY )
302+
: id(id), cb_v(callback), event(event) {}
303+
304+
explicit NetworkEventCbList_t(network_event_handle_t id, NetworkEventReceiver callback, arduino_event_id_t event = ARDUINO_EVENT_ANY )
305+
: id(id), cb_v(callback), event(event) {}
306+
307+
explicit NetworkEventCbList_t(network_event_handle_t id, NetworkEventFuncCb callback, arduino_event_id_t event = ARDUINO_EVENT_ANY )
308+
: id(id), cb_v(callback), event(event) {}
309+
310+
explicit NetworkEventCbList_t(network_event_handle_t id, NetworkEventSysCb callback, arduino_event_id_t event = ARDUINO_EVENT_ANY )
311+
: id(id), cb_v(callback), event(event) {}
284312
};
285313

286314
// define initial id's value

0 commit comments

Comments
 (0)