From a9cf4b42cac0204ea9bad21525701c52db4b5301 Mon Sep 17 00:00:00 2001 From: ClockeNessMnstr Date: Wed, 4 Sep 2024 16:01:35 -0400 Subject: [PATCH 1/3] change(ESP_NOW_Serial): No teardown on retry limit After max retries is met once the ESP_NOW_Serial_Class performs "end()". This removes the peer from ESP_NOW. Further messages to and from ESP_NOW_Serial are not received or sent. Peer should stay in ESP_NOW to re-establish connection even with data loss. This change will "retry and drop" the data piece by piece instead of aborting the connection. --- libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp index e4220d45675..b0cbb5ed030 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp @@ -264,9 +264,10 @@ void ESP_NOW_Serial_Class::onSent(bool success) { //the data is lost in this case vRingbufferReturnItem(tx_ring_buf, queued_buff); queued_buff = NULL; - xSemaphoreGive(tx_sem); - end(); log_e(MACSTR " : RE-SEND_MAX[%u]", MAC2STR(addr()), resend_count); + //send next packet? + //log_d(MACSTR ": NEXT", MAC2STR(addr())); + checkForTxData(); } } } From d0ae1cda2e631a5f125002b0ac0bf6bcad0f70d7 Mon Sep 17 00:00:00 2001 From: Jan Prochazka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:03:11 +0200 Subject: [PATCH 2/3] feat(espnow): Add remove on fail parameter --- libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp | 10 ++++++++-- libraries/ESP_NOW/src/ESP32_NOW_Serial.h | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp index b0cbb5ed030..17740d1331a 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.cpp @@ -11,7 +11,7 @@ * */ -ESP_NOW_Serial_Class::ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk) +ESP_NOW_Serial_Class::ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk, bool remove_on_fail) : ESP_NOW_Peer(mac_addr, channel, iface, lmk) { tx_ring_buf = NULL; rx_queue = NULL; @@ -19,6 +19,7 @@ ESP_NOW_Serial_Class::ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t chan queued_size = 0; queued_buff = NULL; resend_count = 0; + _remove_on_fail = remove_on_fail; } ESP_NOW_Serial_Class::~ESP_NOW_Serial_Class() { @@ -265,7 +266,12 @@ void ESP_NOW_Serial_Class::onSent(bool success) { vRingbufferReturnItem(tx_ring_buf, queued_buff); queued_buff = NULL; log_e(MACSTR " : RE-SEND_MAX[%u]", MAC2STR(addr()), resend_count); - //send next packet? + //if we are not able to send the data and remove_on_fail is set, remove the peer + if (_remove_on_fail) { + xSemaphoreGive(tx_sem); + end(); + return; + } //log_d(MACSTR ": NEXT", MAC2STR(addr())); checkForTxData(); } diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.h b/libraries/ESP_NOW/src/ESP32_NOW_Serial.h index 42349f6c20b..1d481c7debe 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.h +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.h @@ -17,12 +17,13 @@ class ESP_NOW_Serial_Class : public Stream, public ESP_NOW_Peer { size_t queued_size; uint8_t *queued_buff; size_t resend_count; + bool _remove_on_fail; bool checkForTxData(); size_t tryToSend(); public: - ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL); + ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL, bool remove_on_fail = true); ~ESP_NOW_Serial_Class(); size_t setRxBufferSize(size_t); size_t setTxBufferSize(size_t); From 0ee66a8e6fc9bf87336bd9fb8f5aea9ca0ac2f61 Mon Sep 17 00:00:00 2001 From: Jan Prochazka <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:21:40 +0200 Subject: [PATCH 3/3] feat(espnow): By default keep the peer when sending fails --- libraries/ESP_NOW/src/ESP32_NOW_Serial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP_NOW/src/ESP32_NOW_Serial.h b/libraries/ESP_NOW/src/ESP32_NOW_Serial.h index 1d481c7debe..b1f41456320 100644 --- a/libraries/ESP_NOW/src/ESP32_NOW_Serial.h +++ b/libraries/ESP_NOW/src/ESP32_NOW_Serial.h @@ -23,7 +23,7 @@ class ESP_NOW_Serial_Class : public Stream, public ESP_NOW_Peer { size_t tryToSend(); public: - ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL, bool remove_on_fail = true); + ESP_NOW_Serial_Class(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface = WIFI_IF_AP, const uint8_t *lmk = NULL, bool remove_on_fail = false); ~ESP_NOW_Serial_Class(); size_t setRxBufferSize(size_t); size_t setTxBufferSize(size_t);