From 5a163ac26f53ed247672ac7c2065a55aed64ea66 Mon Sep 17 00:00:00 2001
From: Emil Muratov <gpm@hotplug.ru>
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<NetworkEventCbList_t> 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<void(arduino_event_id_t event, arduino_event_info_t info)> 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<void(arduino_event_id_t event, arduino_event_info_t info)>;
+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 <gpm@hotplug.ru>
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<NetworkEventCbList_t> 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<typename T, typename... U> static size_t getStdFunctionAddress(std::function<T(U...)> f) {
   typedef T(fnType)(U...);
   fnType **fnPointer = f.template target<fnType *>();
@@ -167,55 +129,13 @@ template<typename T, typename... U> 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<NetworkEventCbList_t> cbEventList;
+
 };

From c8a0c490a28982433fd1b419a5117f49a80d57fd Mon Sep 17 00:00:00 2001
From: Emil Muratov <gpm@hotplug.ru>
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<NetworkEvents*>(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<typename T, typename... U> static size_t getStdFunctionAddress(std::function<T(U...)> 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<NetworkEventCbList_t> 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 <gpm@hotplug.ru>
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<void(arduino_event_id_t event, arduino_
 using NetworkEventSysCb = void(*)(arduino_event_t *event);
 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
+ * callback are called in the context of a dedicated task consuming the queue
+ * 
+ */
 class NetworkEvents {
 public:
   NetworkEvents();
   ~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 
+   */
   network_event_handle_t onEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
+
+  /**
+   * @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 
+   */
   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 
+   */
   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
+   */
   void removeEvent(NetworkEventCb 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")));
+
+  /**
+   * @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")));
+
+  /**
+   * @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
+   */
   void removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
+
+  /**
+   * @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);
 
-  const char *eventName(arduino_event_id_t 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
+   */
+  static const char *eventName(arduino_event_id_t id);
 
-  bool postEvent(arduino_event_t *event);
+  /**
+   * @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 
+   * @return true if event was queued susccessfuly
+   * @return false on memrory allocation error or queue is full
+   */
+  bool postEvent(const arduino_event_t *event);
 
-  int getStatusBits();
+  int getStatusBits() const;
   int waitStatusBits(int bits, uint32_t timeout_ms);
   int setStatusBits(int bits);
   int clearStatusBits(int bits);
@@ -158,8 +241,11 @@ class NetworkEvents {
 
 protected:
   bool initNetworkEvents();
+  // same as onEvent() but places newly added handler at the begining 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
   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
   network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
 
 private:
@@ -189,10 +275,10 @@ class NetworkEvents {
   TaskHandle_t _arduino_event_task_handle;
 
   // registred events callbacks containter
-  std::vector<NetworkEventCbList_t> cbEventList;
+  std::vector<NetworkEventCbList_t> _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 <gpm@hotplug.ru>
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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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 <mutex>
+#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<NetworkEventCbList_t> _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<NetworkEvents*>(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<NetworkEvents *>(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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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 <mutex>
-#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<void(arduino_event_id_t event, arduino_event_info_t info)>;
-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<NetworkEventCbList_t> _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<NetworkEventCbList_t> _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