From 5a163ac26f53ed247672ac7c2065a55aed64ea66 Mon Sep 17 00:00:00 2001 From: Emil Muratov Date: Tue, 24 Sep 2024 12:02:10 +0900 Subject: [PATCH 1/7] lib Network: add cpp syntax to structs --- libraries/Network/src/NetworkEvents.cpp | 16 ++++++++++++---- libraries/Network/src/NetworkEvents.h | 18 +++++++++++------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index bb02282e9b3..1e40578e227 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -8,7 +8,14 @@ #include "esp_task.h" #include "esp32-hal.h" -typedef struct NetworkEventCbList { +/** + * @brief an object holds callback's definitions: + * - callback id + * - callback function pointers + * - binded event id + * + */ +struct NetworkEventCbList_t { static network_event_handle_t current_id; network_event_handle_t id; NetworkEventCb cb; @@ -16,9 +23,10 @@ typedef struct NetworkEventCbList { NetworkEventSysCb scb; arduino_event_id_t event; - NetworkEventCbList() : id(current_id++), cb(NULL), fcb(NULL), scb(NULL), event(ARDUINO_EVENT_NONE) {} -} NetworkEventCbList_t; -network_event_handle_t NetworkEventCbList::current_id = 1; + NetworkEventCbList_t() : id(current_id++), cb(NULL), fcb(NULL), scb(NULL), event(ARDUINO_EVENT_NONE) {} +}; +// define initial id's value +network_event_handle_t NetworkEventCbList_t::current_id = 1; // arduino dont like std::vectors move static here static std::vector cbEventList; diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index ac324d19841..2075c9aeaa9 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -110,16 +110,20 @@ typedef union { #endif } arduino_event_info_t; -typedef struct { +/** + * @brief struct combines arduino event id and event's data object + * + */ +struct arduino_event_t { arduino_event_id_t event_id; arduino_event_info_t event_info; -} arduino_event_t; - -typedef void (*NetworkEventCb)(arduino_event_id_t event); -typedef std::function NetworkEventFuncCb; -typedef void (*NetworkEventSysCb)(arduino_event_t *event); +}; -typedef size_t network_event_handle_t; +// type aliases +using NetworkEventCb = void(*)(arduino_event_id_t event); +using NetworkEventFuncCb = std::function; +using NetworkEventSysCb = void(*)(arduino_event_t *event); +using network_event_handle_t = size_t; class NetworkEvents { public: From 98287ac868c581bed50d7151121eca3e367b8308 Mon Sep 17 00:00:00 2001 From: Emil Muratov Date: Wed, 25 Sep 2024 00:55:35 +0900 Subject: [PATCH 2/7] [Network] deprecate NetworkEvents::removeEvent() for std::function callbacks removing event callback via std::function pointer does not work as expected for lambdas (issue #10365) here mark NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX) as deprecated in favor of removing by callback's id for NetworkEvents::onEvent remove checking for dublicate event handler, this does not work for lambdas too remove NetworkEvents::find methods as unnecessary move cbEventList container inside the class declare NetworkEventCbList_t as a cpp struct with constructor, allows using std::vector.emplace() when adding new items to container optimize NetworkEvents::remove() calls to use erase-remove idiom for std::vector --- libraries/Network/src/NetworkEvents.cpp | 193 ++---------------------- libraries/Network/src/NetworkEvents.h | 30 +++- 2 files changed, 42 insertions(+), 181 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index 1e40578e227..939337c21ba 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -8,28 +8,6 @@ #include "esp_task.h" #include "esp32-hal.h" -/** - * @brief an object holds callback's definitions: - * - callback id - * - callback function pointers - * - binded event id - * - */ -struct NetworkEventCbList_t { - static network_event_handle_t current_id; - network_event_handle_t id; - NetworkEventCb cb; - NetworkEventFuncCb fcb; - NetworkEventSysCb scb; - arduino_event_id_t event; - - NetworkEventCbList_t() : id(current_id++), cb(NULL), fcb(NULL), scb(NULL), event(ARDUINO_EVENT_NONE) {} -}; -// define initial id's value -network_event_handle_t NetworkEventCbList_t::current_id = 1; - -// arduino dont like std::vectors move static here -static std::vector cbEventList; static void _network_event_task(void *arg) { for (;;) { @@ -142,22 +120,6 @@ void NetworkEvents::checkForEvent() { free(event); } -uint32_t NetworkEvents::findEvent(NetworkEventCb cbEvent, arduino_event_id_t event) { - uint32_t i; - - if (!cbEvent) { - return cbEventList.size(); - } - - for (i = 0; i < cbEventList.size(); i++) { - NetworkEventCbList_t entry = cbEventList[i]; - if (entry.cb == cbEvent && entry.event == event) { - break; - } - } - return i; -} - template static size_t getStdFunctionAddress(std::function f) { typedef T(fnType)(U...); fnType **fnPointer = f.template target(); @@ -167,55 +129,13 @@ template static size_t getStdFunctionAddress(std::fun return (size_t)fnPointer; } -uint32_t NetworkEvents::findEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { - uint32_t i; - - if (!cbEvent) { - return cbEventList.size(); - } - - for (i = 0; i < cbEventList.size(); i++) { - NetworkEventCbList_t entry = cbEventList[i]; - if (getStdFunctionAddress(entry.fcb) == getStdFunctionAddress(cbEvent) && entry.event == event) { - break; - } - } - return i; -} - -uint32_t NetworkEvents::findEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { - uint32_t i; - - if (!cbEvent) { - return cbEventList.size(); - } - - for (i = 0; i < cbEventList.size(); i++) { - NetworkEventCbList_t entry = cbEventList[i]; - if (entry.scb == cbEvent && entry.event == event) { - break; - } - } - return i; -} - network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_event_id_t event) { if (!cbEvent) { return 0; } - if (findEvent(cbEvent, event) < cbEventList.size()) { - log_w("Attempt to add duplicate event handler!"); - return 0; - } - - NetworkEventCbList_t newEventHandler; - newEventHandler.cb = cbEvent; - newEventHandler.fcb = NULL; - newEventHandler.scb = NULL; - newEventHandler.event = event; - cbEventList.push_back(newEventHandler); - return newEventHandler.id; + cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event); + return cbEventList.back().id; } network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { @@ -223,18 +143,8 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin return 0; } - if (findEvent(cbEvent, event) < cbEventList.size()) { - log_w("Attempt to add duplicate event handler!"); - return 0; - } - - NetworkEventCbList_t newEventHandler; - newEventHandler.cb = NULL; - newEventHandler.fcb = cbEvent; - newEventHandler.scb = NULL; - newEventHandler.event = event; - cbEventList.push_back(newEventHandler); - return newEventHandler.id; + cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event); + return cbEventList.back().id; } network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { @@ -242,18 +152,8 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino return 0; } - if (findEvent(cbEvent, event) < cbEventList.size()) { - log_w("Attempt to add duplicate event handler!"); - return 0; - } - - NetworkEventCbList_t newEventHandler; - newEventHandler.cb = NULL; - newEventHandler.fcb = NULL; - newEventHandler.scb = cbEvent; - newEventHandler.event = event; - cbEventList.push_back(newEventHandler); - return newEventHandler.id; + cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event); + return cbEventList.back().id; } network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event) { @@ -261,18 +161,8 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino return 0; } - if (findEvent(cbEvent, event) < cbEventList.size()) { - log_w("Attempt to add duplicate event handler!"); - return 0; - } - - NetworkEventCbList_t newEventHandler; - newEventHandler.cb = cbEvent; - newEventHandler.fcb = NULL; - newEventHandler.scb = NULL; - newEventHandler.event = event; - cbEventList.insert(cbEventList.begin(), newEventHandler); - return newEventHandler.id; + cbEventList.emplace(cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event); + return cbEventList.front().id; } network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { @@ -280,18 +170,8 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard return 0; } - if (findEvent(cbEvent, event) < cbEventList.size()) { - log_w("Attempt to add duplicate event handler!"); - return 0; - } - - NetworkEventCbList_t newEventHandler; - newEventHandler.cb = NULL; - newEventHandler.fcb = cbEvent; - newEventHandler.scb = NULL; - newEventHandler.event = event; - cbEventList.insert(cbEventList.begin(), newEventHandler); - return newEventHandler.id; + cbEventList.emplace(cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event); + return cbEventList.front().id; } network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { @@ -299,77 +179,36 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu return 0; } - if (findEvent(cbEvent, event) < cbEventList.size()) { - log_w("Attempt to add duplicate event handler!"); - return 0; - } - - NetworkEventCbList_t newEventHandler; - newEventHandler.cb = NULL; - newEventHandler.fcb = NULL; - newEventHandler.scb = cbEvent; - newEventHandler.event = event; - cbEventList.insert(cbEventList.begin(), newEventHandler); - return newEventHandler.id; + cbEventList.emplace(cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event); + return cbEventList.front().id; } void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event) { - uint32_t i; - if (!cbEvent) { return; } - i = findEvent(cbEvent, event); - if (i >= cbEventList.size()) { - log_w("Event handler not found!"); - return; - } - - cbEventList.erase(cbEventList.begin() + i); + cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), cbEventList.end()); } void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { - uint32_t i; - if (!cbEvent) { return; } - i = findEvent(cbEvent, event); - if (i >= cbEventList.size()) { - log_w("Event handler not found!"); - return; - } - - cbEventList.erase(cbEventList.begin() + i); + 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()); } void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { - uint32_t i; - if (!cbEvent) { return; } - i = findEvent(cbEvent, event); - if (i >= cbEventList.size()) { - log_w("Event handler not found!"); - return; - } - - cbEventList.erase(cbEventList.begin() + i); + cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), cbEventList.end()); } void NetworkEvents::removeEvent(network_event_handle_t id) { - for (uint32_t i = 0; i < cbEventList.size(); i++) { - NetworkEventCbList_t entry = cbEventList[i]; - if (entry.id == id) { - cbEventList.erase(cbEventList.begin() + i); - return; - } - } - log_w("Event handler not found!"); + cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), cbEventList.end()); } int NetworkEvents::setStatusBits(int bits) { diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index 2075c9aeaa9..5be44ae01de 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -134,7 +134,7 @@ class NetworkEvents { network_event_handle_t onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); network_event_handle_t onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); void removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); - void removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); + 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"))); void removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); void removeEvent(network_event_handle_t event_handle); @@ -159,15 +159,37 @@ class NetworkEvents { protected: bool initNetworkEvents(); - uint32_t findEvent(NetworkEventCb cbEvent, arduino_event_id_t event); - uint32_t findEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event); - uint32_t findEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event); network_event_handle_t onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); network_event_handle_t onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); private: + /** + * @brief an object holds callback's definitions: + * - callback id + * - callback function pointers + * - binded event id + * + */ + struct NetworkEventCbList_t { + network_event_handle_t id; + NetworkEventCb cb; + NetworkEventFuncCb fcb; + NetworkEventSysCb scb; + arduino_event_id_t event; + + explicit NetworkEventCbList_t(network_event_handle_t id, NetworkEventCb cb = nullptr, NetworkEventFuncCb fcb = nullptr, NetworkEventSysCb scb = nullptr, arduino_event_id_t event = ARDUINO_EVENT_MAX) : + id(id), cb(cb), fcb(fcb), scb(scb), event(event) {} + }; + + // define initial id's value + network_event_handle_t _current_id{0}; + EventGroupHandle_t _arduino_event_group; QueueHandle_t _arduino_event_queue; TaskHandle_t _arduino_event_task_handle; + + // registred events callbacks containter + std::vector cbEventList; + }; From c8a0c490a28982433fd1b419a5117f49a80d57fd Mon Sep 17 00:00:00 2001 From: Emil Muratov Date: Wed, 25 Sep 2024 11:53:10 +0900 Subject: [PATCH 3/7] [Network] hide event task under private member of NetworkEvents class prevent checkForEvent loop to be callable from outside the task's thread --- libraries/Network/src/NetworkEvents.cpp | 71 +++++++++++++++---------- libraries/Network/src/NetworkEvents.h | 7 ++- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index 939337c21ba..4521ef59e43 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -9,13 +9,6 @@ #include "esp32-hal.h" -static void _network_event_task(void *arg) { - for (;;) { - ((NetworkEvents *)arg)->checkForEvent(); - } - vTaskDelete(NULL); -} - NetworkEvents::NetworkEvents() : _arduino_event_group(NULL), _arduino_event_queue(NULL), _arduino_event_task_handle(NULL) {} NetworkEvents::~NetworkEvents() { @@ -64,7 +57,13 @@ bool NetworkEvents::initNetworkEvents() { } if (!_arduino_event_task_handle) { - xTaskCreateUniversal(_network_event_task, "arduino_events", 4096, this, ESP_TASKD_EVENT_PRIO - 1, &_arduino_event_task_handle, ARDUINO_EVENT_RUNNING_CORE); + xTaskCreateUniversal( [](void* self){ static_cast(self)->_checkForEvent(); }, + "arduino_events", // label + 4096, // event task's stack size + this, + ESP_TASKD_EVENT_PRIO - 1, + &_arduino_event_task_handle, + ARDUINO_EVENT_RUNNING_CORE); if (!_arduino_event_task_handle) { log_e("Network Event Task Start Failed!"); return false; @@ -91,33 +90,49 @@ bool NetworkEvents::postEvent(arduino_event_t *data) { return true; } -void NetworkEvents::checkForEvent() { - arduino_event_t *event = NULL; +void NetworkEvents::_checkForEvent() { + // this task can't run without the queue if (_arduino_event_queue == NULL) { + _arduino_event_task_handle = NULL; + vTaskDelete(NULL); return; } - if (xQueueReceive(_arduino_event_queue, &event, portMAX_DELAY) != pdTRUE) { - return; - } - if (event == NULL) { - return; - } - log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id)); - for (uint32_t i = 0; i < cbEventList.size(); i++) { - NetworkEventCbList_t entry = cbEventList[i]; - if (entry.cb || entry.fcb || entry.scb) { - if (entry.event == (arduino_event_id_t)event->event_id || entry.event == ARDUINO_EVENT_MAX) { - if (entry.cb) { - entry.cb((arduino_event_id_t)event->event_id); - } else if (entry.fcb) { - entry.fcb((arduino_event_id_t)event->event_id, (arduino_event_info_t)event->event_info); - } else { - entry.scb(event); + + for (;;) { + arduino_event_t *event = NULL; + // wait for an event on a queue + if (xQueueReceive(_arduino_event_queue, &event, portMAX_DELAY) != pdTRUE) { + continue; + } + if (event == NULL) { + continue; + } + log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id)); + + // iterate over registered callbacks + for (auto &i : cbEventList){ + if (i.cb || i.fcb || i.scb) { + if (i.event == (arduino_event_id_t)event->event_id || i.event == ARDUINO_EVENT_MAX) { + if (i.cb) { + i.cb((arduino_event_id_t)event->event_id); + continue; + } + + if (i.fcb) { + i.fcb((arduino_event_id_t)event->event_id, (arduino_event_info_t)event->event_info); + continue; + } + + i.scb(event); } } } + + // release the event object's memory + free(event); } - free(event); + + vTaskDelete(NULL); } template static size_t getStdFunctionAddress(std::function f) { diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index 5be44ae01de..ce449e88cc7 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -140,7 +140,6 @@ class NetworkEvents { const char *eventName(arduino_event_id_t id); - void checkForEvent(); bool postEvent(arduino_event_t *event); int getStatusBits(); @@ -192,4 +191,10 @@ class NetworkEvents { // registred events callbacks containter std::vector cbEventList; + /** + * @brief task that picks events from a event queue and calls registered callbacks + * + */ + void _checkForEvent(); + }; From 06bf619b4f8f48bb1053d11f2a4521fba6939dc3 Mon Sep 17 00:00:00 2001 From: Emil Muratov Date: Wed, 25 Sep 2024 18:18:00 +0900 Subject: [PATCH 4/7] 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 --- libraries/Network/src/NetworkEvents.cpp | 48 +++++----- libraries/Network/src/NetworkEvents.h | 120 ++++++++++++++++++++---- 2 files changed, 128 insertions(+), 40 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index 4521ef59e43..bd091487493 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -8,7 +8,6 @@ #include "esp_task.h" #include "esp32-hal.h" - NetworkEvents::NetworkEvents() : _arduino_event_group(NULL), _arduino_event_queue(NULL), _arduino_event_task_handle(NULL) {} NetworkEvents::~NetworkEvents() { @@ -22,8 +21,9 @@ NetworkEvents::~NetworkEvents() { } if (_arduino_event_queue != NULL) { arduino_event_t *event = NULL; + // consume queue while (xQueueReceive(_arduino_event_queue, &event, 0) == pdTRUE) { - free(event); + delete event; } vQueueDelete(_arduino_event_queue); _arduino_event_queue = NULL; @@ -73,18 +73,20 @@ bool NetworkEvents::initNetworkEvents() { return true; } -bool NetworkEvents::postEvent(arduino_event_t *data) { +bool NetworkEvents::postEvent(const arduino_event_t *data) { if (data == NULL || _arduino_event_queue == NULL) { return false; } - arduino_event_t *event = (arduino_event_t *)malloc(sizeof(arduino_event_t)); + arduino_event_t *event = new arduino_event_t(); if (event == NULL) { log_e("Arduino Event Malloc Failed!"); return false; } + memcpy(event, data, sizeof(arduino_event_t)); if (xQueueSend(_arduino_event_queue, &event, portMAX_DELAY) != pdPASS) { log_e("Arduino Event Send Failed!"); + delete event; // release mem on error return false; } return true; @@ -110,7 +112,7 @@ void NetworkEvents::_checkForEvent() { log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id)); // iterate over registered callbacks - for (auto &i : cbEventList){ + for (auto &i : _cbEventList){ if (i.cb || i.fcb || i.scb) { if (i.event == (arduino_event_id_t)event->event_id || i.event == ARDUINO_EVENT_MAX) { if (i.cb) { @@ -129,7 +131,7 @@ void NetworkEvents::_checkForEvent() { } // release the event object's memory - free(event); + delete event; } vTaskDelete(NULL); @@ -149,8 +151,8 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev return 0; } - cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event); - return cbEventList.back().id; + _cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event); + return _cbEventList.back().id; } network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { @@ -158,8 +160,8 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin return 0; } - cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event); - return cbEventList.back().id; + _cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event); + return _cbEventList.back().id; } network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { @@ -167,8 +169,8 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino return 0; } - cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event); - return cbEventList.back().id; + _cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event); + return _cbEventList.back().id; } network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event) { @@ -176,8 +178,8 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino return 0; } - cbEventList.emplace(cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event); - return cbEventList.front().id; + _cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event); + return _cbEventList.front().id; } network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { @@ -185,8 +187,8 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard return 0; } - cbEventList.emplace(cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event); - return cbEventList.front().id; + _cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event); + return _cbEventList.front().id; } network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { @@ -194,8 +196,8 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu return 0; } - cbEventList.emplace(cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event); - return cbEventList.front().id; + _cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event); + return _cbEventList.front().id; } void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event) { @@ -203,7 +205,7 @@ void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event return; } - cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), cbEventList.end()); + _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), _cbEventList.end()); } void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { @@ -211,7 +213,7 @@ void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t e return; } - 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()); + _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()); } void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { @@ -219,11 +221,11 @@ void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t ev return; } - cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), cbEventList.end()); + _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), _cbEventList.end()); } void NetworkEvents::removeEvent(network_event_handle_t id) { - cbEventList.erase(std::remove_if(cbEventList.begin(), cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), cbEventList.end()); + _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), _cbEventList.end()); } int NetworkEvents::setStatusBits(int bits) { @@ -242,7 +244,7 @@ int NetworkEvents::clearStatusBits(int bits) { return xEventGroupClearBits(_arduino_event_group, bits); } -int NetworkEvents::getStatusBits() { +int NetworkEvents::getStatusBits() const { if (!_arduino_event_group) { return _initial_bits; } diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index ce449e88cc7..8bcc1acb7cd 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -24,8 +24,8 @@ #endif #if SOC_WIFI_SUPPORTED -static const int WIFI_SCANNING_BIT = BIT0; -static const int WIFI_SCAN_DONE_BIT = BIT1; +constexpr int WIFI_SCANNING_BIT = BIT0; +constexpr int WIFI_SCAN_DONE_BIT = BIT1; #endif #define NET_HAS_IP6_GLOBAL_BIT 0 @@ -33,7 +33,7 @@ static const int WIFI_SCAN_DONE_BIT = BIT1; ESP_EVENT_DECLARE_BASE(ARDUINO_EVENTS); typedef enum { - ARDUINO_EVENT_NONE, + ARDUINO_EVENT_NONE = 0, ARDUINO_EVENT_ETH_START, ARDUINO_EVENT_ETH_STOP, ARDUINO_EVENT_ETH_CONNECTED, @@ -42,10 +42,11 @@ typedef enum { ARDUINO_EVENT_ETH_LOST_IP, ARDUINO_EVENT_ETH_GOT_IP6, #if SOC_WIFI_SUPPORTED - ARDUINO_EVENT_WIFI_OFF, + ARDUINO_EVENT_WIFI_OFF = 100, ARDUINO_EVENT_WIFI_READY, ARDUINO_EVENT_WIFI_SCAN_DONE, - ARDUINO_EVENT_WIFI_STA_START, + ARDUINO_EVENT_WIFI_FTM_REPORT, + ARDUINO_EVENT_WIFI_STA_START = 110, ARDUINO_EVENT_WIFI_STA_STOP, ARDUINO_EVENT_WIFI_STA_CONNECTED, ARDUINO_EVENT_WIFI_STA_DISCONNECTED, @@ -53,24 +54,23 @@ typedef enum { ARDUINO_EVENT_WIFI_STA_GOT_IP, ARDUINO_EVENT_WIFI_STA_GOT_IP6, ARDUINO_EVENT_WIFI_STA_LOST_IP, - ARDUINO_EVENT_WIFI_AP_START, + ARDUINO_EVENT_WIFI_AP_START = 130, ARDUINO_EVENT_WIFI_AP_STOP, ARDUINO_EVENT_WIFI_AP_STACONNECTED, ARDUINO_EVENT_WIFI_AP_STADISCONNECTED, ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED, ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED, ARDUINO_EVENT_WIFI_AP_GOT_IP6, - ARDUINO_EVENT_WIFI_FTM_REPORT, - ARDUINO_EVENT_WPS_ER_SUCCESS, + ARDUINO_EVENT_WPS_ER_SUCCESS = 140, ARDUINO_EVENT_WPS_ER_FAILED, ARDUINO_EVENT_WPS_ER_TIMEOUT, ARDUINO_EVENT_WPS_ER_PIN, ARDUINO_EVENT_WPS_ER_PBC_OVERLAP, - ARDUINO_EVENT_SC_SCAN_DONE, + ARDUINO_EVENT_SC_SCAN_DONE = 150, ARDUINO_EVENT_SC_FOUND_CHANNEL, ARDUINO_EVENT_SC_GOT_SSID_PSWD, ARDUINO_EVENT_SC_SEND_ACK_DONE, - ARDUINO_EVENT_PROV_INIT, + ARDUINO_EVENT_PROV_INIT = 160, ARDUINO_EVENT_PROV_DEINIT, ARDUINO_EVENT_PROV_START, ARDUINO_EVENT_PROV_END, @@ -78,7 +78,7 @@ typedef enum { ARDUINO_EVENT_PROV_CRED_FAIL, ARDUINO_EVENT_PROV_CRED_SUCCESS, #endif - ARDUINO_EVENT_PPP_START, + ARDUINO_EVENT_PPP_START = 200, ARDUINO_EVENT_PPP_STOP, ARDUINO_EVENT_PPP_CONNECTED, ARDUINO_EVENT_PPP_DISCONNECTED, @@ -125,24 +125,107 @@ using NetworkEventFuncCb = std::function cbEventList; + std::vector _cbEventList; /** - * @brief task that picks events from a event queue and calls registered callbacks + * @brief task function that picks events from an event queue and calls registered callbacks * */ void _checkForEvent(); From 1a2d988a99130232bf13d1f2563cfbda713b356b Mon Sep 17 00:00:00 2001 From: Emil Muratov Date: Thu, 26 Sep 2024 01:01:04 +0900 Subject: [PATCH 5/7] refactor(NetworkEvents) add (optional) mutex lock for container operations provide thread safety for dual core SoCs since std::mutex brings additional componetns of libstdc++ lib it impacts resulting image size significantly (around 50k) Might be enabled on-demand if thread-safety is required --- libraries/Network/src/NetworkEvents.cpp | 48 +++++++++++++++++++++++++ libraries/Network/src/NetworkEvents.h | 8 +++++ 2 files changed, 56 insertions(+) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index bd091487493..ceb7c5c29e1 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -111,6 +111,10 @@ void NetworkEvents::_checkForEvent() { } log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id)); +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::unique_lock lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + // iterate over registered callbacks for (auto &i : _cbEventList){ if (i.cb || i.fcb || i.scb) { @@ -130,6 +134,10 @@ void NetworkEvents::_checkForEvent() { } } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + lock.unlock(); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + // release the event object's memory delete event; } @@ -151,6 +159,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev return 0; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event); return _cbEventList.back().id; } @@ -160,6 +172,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin return 0; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event); return _cbEventList.back().id; } @@ -169,6 +185,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino return 0; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event); return _cbEventList.back().id; } @@ -178,6 +198,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino return 0; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event); return _cbEventList.front().id; } @@ -187,6 +211,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard return 0; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event); return _cbEventList.front().id; } @@ -196,6 +224,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu return 0; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event); return _cbEventList.front().id; } @@ -205,6 +237,10 @@ void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event return; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), _cbEventList.end()); } @@ -213,6 +249,10 @@ void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t e return; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _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()); } @@ -221,10 +261,18 @@ void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t ev return; } +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), _cbEventList.end()); } void NetworkEvents::removeEvent(network_event_handle_t id) { +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + std::lock_guard lock(_mtx); +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), _cbEventList.end()); } diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index 8bcc1acb7cd..dd03a3bcefc 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -16,6 +16,9 @@ #include "freertos/queue.h" #include "freertos/semphr.h" #include "freertos/event_groups.h" +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#include +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 #if SOC_WIFI_SUPPORTED #include "esp_wifi_types.h" @@ -277,6 +280,11 @@ class NetworkEvents { // registred events callbacks containter std::vector _cbEventList; +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + // containter access mutex + std::mutex _mtx; +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 + /** * @brief task function that picks events from an event queue and calls registered callbacks * From adf0016f282127450ae726959426c4eb44d05af4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:08:34 +0000 Subject: [PATCH 6/7] ci(pre-commit): Apply automatic fixes --- libraries/Network/src/NetworkEvents.cpp | 107 ++++++++++++++++-------- libraries/Network/src/NetworkEvents.h | 61 +++++++------- 2 files changed, 102 insertions(+), 66 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index ceb7c5c29e1..5a7e7c49afa 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -57,13 +57,14 @@ bool NetworkEvents::initNetworkEvents() { } if (!_arduino_event_task_handle) { - xTaskCreateUniversal( [](void* self){ static_cast(self)->_checkForEvent(); }, - "arduino_events", // label - 4096, // event task's stack size - this, - ESP_TASKD_EVENT_PRIO - 1, - &_arduino_event_task_handle, - ARDUINO_EVENT_RUNNING_CORE); + xTaskCreateUniversal( + [](void *self) { + static_cast(self)->_checkForEvent(); + }, + "arduino_events", // label + 4096, // event task's stack size + this, ESP_TASKD_EVENT_PRIO - 1, &_arduino_event_task_handle, ARDUINO_EVENT_RUNNING_CORE + ); if (!_arduino_event_task_handle) { log_e("Network Event Task Start Failed!"); return false; @@ -86,7 +87,7 @@ bool NetworkEvents::postEvent(const arduino_event_t *data) { memcpy(event, data, sizeof(arduino_event_t)); if (xQueueSend(_arduino_event_queue, &event, portMAX_DELAY) != pdPASS) { log_e("Arduino Event Send Failed!"); - delete event; // release mem on error + delete event; // release mem on error return false; } return true; @@ -111,12 +112,12 @@ void NetworkEvents::_checkForEvent() { } log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id)); -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::unique_lock lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 // iterate over registered callbacks - for (auto &i : _cbEventList){ + for (auto &i : _cbEventList) { if (i.cb || i.fcb || i.scb) { if (i.event == (arduino_event_id_t)event->event_id || i.event == ARDUINO_EVENT_MAX) { if (i.cb) { @@ -134,9 +135,9 @@ void NetworkEvents::_checkForEvent() { } } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 lock.unlock(); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 // release the event object's memory delete event; @@ -159,9 +160,9 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev return 0; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 _cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event); return _cbEventList.back().id; @@ -172,9 +173,9 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin return 0; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 _cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event); return _cbEventList.back().id; @@ -185,9 +186,9 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino return 0; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 _cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event); return _cbEventList.back().id; @@ -198,9 +199,9 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino return 0; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 _cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event); return _cbEventList.front().id; @@ -211,9 +212,9 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard return 0; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 _cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event); return _cbEventList.front().id; @@ -224,9 +225,9 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu return 0; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 _cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event); return _cbEventList.front().id; @@ -237,11 +238,19 @@ void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event return; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 - _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), _cbEventList.end()); + _cbEventList.erase( + std::remove_if( + _cbEventList.begin(), _cbEventList.end(), + [cbEvent, event](const NetworkEventCbList_t &e) { + return e.cb == cbEvent && e.event == event; + } + ), + _cbEventList.end() + ); } void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) { @@ -249,11 +258,19 @@ void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t e return; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 - _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()); + _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() + ); } void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) { @@ -261,19 +278,35 @@ void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t ev return; } -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 - _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), _cbEventList.end()); + _cbEventList.erase( + std::remove_if( + _cbEventList.begin(), _cbEventList.end(), + [cbEvent, event](const NetworkEventCbList_t &e) { + return e.scb == cbEvent && e.event == event; + } + ), + _cbEventList.end() + ); } void NetworkEvents::removeEvent(network_event_handle_t id) { -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 std::lock_guard lock(_mtx); -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 - _cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), _cbEventList.end()); + _cbEventList.erase( + std::remove_if( + _cbEventList.begin(), _cbEventList.end(), + [id](const NetworkEventCbList_t &e) { + return e.id == id; + } + ), + _cbEventList.end() + ); } int NetworkEvents::setStatusBits(int bits) { diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index dd03a3bcefc..fbd4d3c09cc 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -16,9 +16,9 @@ #include "freertos/queue.h" #include "freertos/semphr.h" #include "freertos/event_groups.h" -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 #include -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 #if SOC_WIFI_SUPPORTED #include "esp_wifi_types.h" @@ -115,7 +115,7 @@ typedef union { /** * @brief struct combines arduino event id and event's data object - * + * */ struct arduino_event_t { arduino_event_id_t event_id; @@ -123,9 +123,9 @@ struct arduino_event_t { }; // type aliases -using NetworkEventCb = void(*)(arduino_event_id_t event); +using NetworkEventCb = void (*)(arduino_event_id_t event); using NetworkEventFuncCb = std::function; -using NetworkEventSysCb = void(*)(arduino_event_t *event); +using NetworkEventSysCb = void (*)(arduino_event_t *event); using network_event_handle_t = size_t; /** @@ -133,7 +133,7 @@ using network_event_handle_t = size_t; * it registers user callback functions for event handling, * maintans the queue of events and propagates the event amoung subscribed callbacks * callback are called in the context of a dedicated task consuming the queue - * + * */ class NetworkEvents { public: @@ -143,10 +143,10 @@ class NetworkEvents { /** * @brief register callback function to be executed on arduino event(s) * @note if same handler is registered twice or more than same handler would be called twice or more times - * + * * @param cbEvent static callback function * @param event event to process, any event by default - * @return network_event_handle_t + * @return network_event_handle_t */ network_event_handle_t onEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); @@ -154,29 +154,29 @@ class NetworkEvents { * @brief register functional callback to be executed on arduino event(s) * also used for lambda callbacks * @note if same handler is registered twice or more than same handler would be called twice or more times - * + * * @param cbEvent static callback function * @param event event to process, any event by default - * @return network_event_handle_t + * @return network_event_handle_t */ network_event_handle_t onEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); /** * @brief register static system callback to be executed on arduino event(s) * callback function would be supplied with a pointer to arduino_event_t structure as an argument - * + * * @note if same handler is registered twice or more than same handler would be called twice or more times - * + * * @param cbEvent static callback function * @param event event to process, any event by default - * @return network_event_handle_t + * @return network_event_handle_t */ network_event_handle_t onEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); /** * @brief unregister static function callback * @note a better way to unregister callbacks is to save/unregister via network_event_handle_t - * + * * @param cbEvent static callback function * @param event event to process, any event by default */ @@ -186,16 +186,17 @@ class NetworkEvents { * @brief unregister functional callback * @note a better way to unregister callbacks is to save/unregister via network_event_handle_t * @note this does not work for lambda's! Do unregister via network_event_handle_t - * + * * @param cbEvent functional callback * @param event event to process, any event by default */ - 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"))); + 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"))); /** * @brief unregister static system function callback * @note a better way to unregister callbacks is to save/unregister via network_event_handle_t - * + * * @param cbEvent static callback function * @param event event to process, any event by default */ @@ -203,15 +204,15 @@ class NetworkEvents { /** * @brief unregister event callback via handler - * + * * @param cbEvent static callback function * @param event event to process, any event by default */ void removeEvent(network_event_handle_t event_handle); /** - * @brief get a human-readable name of an event by it's id - * + * @brief get a human-readable name of an event by it's id + * * @param id event id code * @return const char* event name string */ @@ -221,8 +222,8 @@ class NetworkEvents { * @brief post an event to the queue * and propagade and event to subscribed handlers * @note posting an event will trigger context switch from a lower priority task - * - * @param event a pointer to arduino_event_t struct + * + * @param event a pointer to arduino_event_t struct * @return true if event was queued susccessfuly * @return false on memrory allocation error or queue is full */ @@ -257,7 +258,7 @@ class NetworkEvents { * - callback id * - callback function pointers * - binded event id - * + * */ struct NetworkEventCbList_t { network_event_handle_t id; @@ -266,8 +267,11 @@ class NetworkEvents { NetworkEventSysCb scb; arduino_event_id_t event; - explicit NetworkEventCbList_t(network_event_handle_t id, NetworkEventCb cb = nullptr, NetworkEventFuncCb fcb = nullptr, NetworkEventSysCb scb = nullptr, arduino_event_id_t event = ARDUINO_EVENT_MAX) : - id(id), cb(cb), fcb(fcb), scb(scb), event(event) {} + explicit NetworkEventCbList_t( + network_event_handle_t id, NetworkEventCb cb = nullptr, NetworkEventFuncCb fcb = nullptr, NetworkEventSysCb scb = nullptr, + arduino_event_id_t event = ARDUINO_EVENT_MAX + ) + : id(id), cb(cb), fcb(fcb), scb(scb), event(event) {} }; // define initial id's value @@ -280,15 +284,14 @@ class NetworkEvents { // registred events callbacks containter std::vector _cbEventList; -#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 // containter access mutex std::mutex _mtx; -#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 +#endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 /** * @brief task function that picks events from an event queue and calls registered callbacks - * + * */ void _checkForEvent(); - }; From ab1d55ddb026cfa449502913aed9b38444d0fcf0 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Thu, 24 Oct 2024 08:29:15 -0300 Subject: [PATCH 7/7] fix(spelling): Fix spelling mistakes --- libraries/Network/src/NetworkEvents.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index fbd4d3c09cc..e134d6816a2 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -131,7 +131,7 @@ using network_event_handle_t = size_t; /** * @brief Class that provides network events callback handling * it registers user callback functions for event handling, - * maintans the queue of events and propagates the event amoung subscribed callbacks + * maintains the queue of events and propagates the event among subscribed callbacks * callback are called in the context of a dedicated task consuming the queue * */ @@ -245,11 +245,11 @@ class NetworkEvents { protected: bool initNetworkEvents(); - // same as onEvent() but places newly added handler at the begining of registered events list + // same as onEvent() but places newly added handler at the beginning of registered events list network_event_handle_t onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); - // same as onEvent() but places newly added handler at the begining of registered events list + // same as onEvent() but places newly added handler at the beginning of registered events list network_event_handle_t onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); - // same as onEvent() but places newly added handler at the begining of registered events list + // same as onEvent() but places newly added handler at the beginning of registered events list network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX); private: @@ -281,11 +281,11 @@ class NetworkEvents { QueueHandle_t _arduino_event_queue; TaskHandle_t _arduino_event_task_handle; - // registred events callbacks containter + // registered events callbacks container std::vector _cbEventList; #if defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1 - // containter access mutex + // container access mutex std::mutex _mtx; #endif // defined NETWORK_EVENTS_MUTEX && SOC_CPU_CORES_NUM > 1