From f382fc9d77a868fae7e6f467c994406a83e33367 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 2 Dec 2019 16:07:36 +0100 Subject: [PATCH 1/3] Refactoring to PolledTimeout or optimistic_yield on the grounds that these are not wait loops on slow input. --- cores/esp8266/HardwareSerial.cpp | 1 - cores/esp8266/debug.cpp | 2 +- libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp | 2 +- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 5 ++-- .../ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp | 30 +++++++++---------- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index 26383dd43..4f09d26f4 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -146,7 +146,6 @@ unsigned long HardwareSerial::detectBaudrate(time_t timeoutMillis) if ((detectedBaudrate = testBaudrate())) { break; } - yield(); delay(100); } return detectedBaudrate; diff --git a/cores/esp8266/debug.cpp b/cores/esp8266/debug.cpp index f26316f0f..06af1e424 100644 --- a/cores/esp8266/debug.cpp +++ b/cores/esp8266/debug.cpp @@ -54,7 +54,7 @@ void hexdump(const void *mem, uint32_t len, uint8_t cols) } src += linesize; len -= linesize; - yield(); + optimistic_yield(10000); } os_printf("\n"); } diff --git a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp index e03ab072e..7f1ddc534 100644 --- a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp +++ b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp @@ -281,7 +281,7 @@ uint8_t ESP8266AVRISP::write_flash_pages(int length) { int x = 0; int page = addr_page(here); while (x < length) { - yield(); + optimistic_yield(10000); if (page != addr_page(here)) { commit(page); page = addr_page(here); diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index 38f197c91..e141a1045 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -431,10 +431,9 @@ int8_t ESP8266WiFiSTAClass::waitForConnectResult(unsigned long timeoutLength) { if((wifi_get_opmode() & 1) == 0) { return WL_DISCONNECTED; } - using esp8266::polledTimeout::oneShot; - oneShot timeout(timeoutLength); // number of milliseconds to wait before returning timeout error + using oneShotYieldMs = esp8266::polledTimeout::timeoutTemplate; + oneShotYieldMs timeout(timeoutLength); // number of milliseconds to wait before returning timeout error while(!timeout) { - yield(); if(status() != WL_DISCONNECTED) { return status(); } diff --git a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp index 5775fa300..9a00b4585 100644 --- a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp +++ b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp @@ -150,7 +150,7 @@ IPAddress ESP8266WiFiMesh::getStaticIP() void ESP8266WiFiMesh::disableStaticIP() { WiFi.config(0u,0u,0u); - yield(); + optimistic_yield(10000); staticIPActivated = false; } @@ -185,9 +185,9 @@ void ESP8266WiFiMesh::deactivateAP() void ESP8266WiFiMesh::restartAP() { deactivateAP(); - yield(); + optimistic_yield(10000); activateAP(); - yield(); + optimistic_yield(10000); } ESP8266WiFiMesh * ESP8266WiFiMesh::getAPController() @@ -331,9 +331,9 @@ bool ESP8266WiFiMesh::latestTransmissionSuccessful() void ESP8266WiFiMesh::fullStop(WiFiClient &currClient) { currClient.stop(); - yield(); + optimistic_yield(10000); WiFi.disconnect(); - yield(); + optimistic_yield(10000); } /** @@ -375,7 +375,7 @@ transmission_status_t ESP8266WiFiMesh::exchangeInfo(WiFiClient &currClient) verboseModePrint("Transmitting"); // Not storing strings in flash (via F()) to avoid performance impacts when using the string. currClient.print(getMessage() + '\r'); - yield(); + optimistic_yield(10000); if (!waitForClientTransmission(currClient, _stationModeTimeoutMs)) { @@ -390,7 +390,7 @@ transmission_status_t ESP8266WiFiMesh::exchangeInfo(WiFiClient &currClient) } String response = currClient.readStringUntil('\r'); - yield(); + optimistic_yield(10000); currClient.flush(); /* Pass data to user callback */ @@ -443,7 +443,7 @@ transmission_status_t ESP8266WiFiMesh::attemptDataTransferKernel() } currClient.stop(); - yield(); + optimistic_yield(10000); return transmissionOutcome; } @@ -476,7 +476,7 @@ transmission_status_t ESP8266WiFiMesh::connectToNode(const String &targetSSID, i WiFiMode_t storedWiFiMode = WiFi.getMode(); WiFi.mode(WIFI_OFF); WiFi.mode(storedWiFiMode); - yield(); + optimistic_yield(10000); #else // Disable static IP so that we can connect to other servers via DHCP (DHCP is slower but required for connecting to more than one server, it seems (possible bug?)). @@ -500,7 +500,7 @@ transmission_status_t ESP8266WiFiMesh::connectToNode(const String &targetSSID, i { verboseModePrint(F("... "), false); WiFi.disconnect(); - yield(); + optimistic_yield(10000); initiateConnectionToAP(targetSSID, targetChannel, targetBSSID); attemptNumber++; } @@ -527,7 +527,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding if(initialDisconnect) { WiFi.disconnect(); - yield(); + optimistic_yield(10000); } latestTransmissionOutcomes.clear(); @@ -565,7 +565,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding for(NetworkInfo ¤tNetwork : connectionQueue) { WiFi.disconnect(); - yield(); + optimistic_yield(10000); String currentSSID; int currentWiFiChannel = NETWORK_INFO_DEFAULT_INT; @@ -614,7 +614,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding if(concludingDisconnect) { WiFi.disconnect(); - yield(); + optimistic_yield(10000); } } @@ -658,7 +658,7 @@ void ESP8266WiFiMesh::acceptRequest() /* Read in request and pass it to the supplied requestHandler */ String request = _client.readStringUntil('\r'); - yield(); + optimistic_yield(10000); _client.flush(); String response = _requestHandler(request, *this); @@ -669,7 +669,7 @@ void ESP8266WiFiMesh::acceptRequest() verboseModePrint("Responding"); // Not storing strings in flash (via F()) to avoid performance impacts when using the string. _client.print(response + '\r'); _client.flush(); - yield(); + optimistic_yield(10000); } } } From 95b06cee0b6d9c6e193d3cb2fceefd8406294207 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 23 Feb 2020 10:25:13 +0100 Subject: [PATCH 2/3] Explain function of special PolledTimeout to the code reader --- libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index e141a1045..6255c4be8 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -431,6 +431,7 @@ int8_t ESP8266WiFiSTAClass::waitForConnectResult(unsigned long timeoutLength) { if((wifi_get_opmode() & 1) == 0) { return WL_DISCONNECTED; } + // if probing doesn't trip, this yields using oneShotYieldMs = esp8266::polledTimeout::timeoutTemplate; oneShotYieldMs timeout(timeoutLength); // number of milliseconds to wait before returning timeout error while(!timeout) { From 7571c729f599bac9159c0261d7b62e731f16516d Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 8 Mar 2020 19:18:49 +0100 Subject: [PATCH 3/3] Revert change after review comments. --- libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp | 2 +- .../ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp index 7f1ddc534..e03ab072e 100644 --- a/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp +++ b/libraries/ESP8266AVRISP/src/ESP8266AVRISP.cpp @@ -281,7 +281,7 @@ uint8_t ESP8266AVRISP::write_flash_pages(int length) { int x = 0; int page = addr_page(here); while (x < length) { - optimistic_yield(10000); + yield(); if (page != addr_page(here)) { commit(page); page = addr_page(here); diff --git a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp index 9a00b4585..5775fa300 100644 --- a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp +++ b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp @@ -150,7 +150,7 @@ IPAddress ESP8266WiFiMesh::getStaticIP() void ESP8266WiFiMesh::disableStaticIP() { WiFi.config(0u,0u,0u); - optimistic_yield(10000); + yield(); staticIPActivated = false; } @@ -185,9 +185,9 @@ void ESP8266WiFiMesh::deactivateAP() void ESP8266WiFiMesh::restartAP() { deactivateAP(); - optimistic_yield(10000); + yield(); activateAP(); - optimistic_yield(10000); + yield(); } ESP8266WiFiMesh * ESP8266WiFiMesh::getAPController() @@ -331,9 +331,9 @@ bool ESP8266WiFiMesh::latestTransmissionSuccessful() void ESP8266WiFiMesh::fullStop(WiFiClient &currClient) { currClient.stop(); - optimistic_yield(10000); + yield(); WiFi.disconnect(); - optimistic_yield(10000); + yield(); } /** @@ -375,7 +375,7 @@ transmission_status_t ESP8266WiFiMesh::exchangeInfo(WiFiClient &currClient) verboseModePrint("Transmitting"); // Not storing strings in flash (via F()) to avoid performance impacts when using the string. currClient.print(getMessage() + '\r'); - optimistic_yield(10000); + yield(); if (!waitForClientTransmission(currClient, _stationModeTimeoutMs)) { @@ -390,7 +390,7 @@ transmission_status_t ESP8266WiFiMesh::exchangeInfo(WiFiClient &currClient) } String response = currClient.readStringUntil('\r'); - optimistic_yield(10000); + yield(); currClient.flush(); /* Pass data to user callback */ @@ -443,7 +443,7 @@ transmission_status_t ESP8266WiFiMesh::attemptDataTransferKernel() } currClient.stop(); - optimistic_yield(10000); + yield(); return transmissionOutcome; } @@ -476,7 +476,7 @@ transmission_status_t ESP8266WiFiMesh::connectToNode(const String &targetSSID, i WiFiMode_t storedWiFiMode = WiFi.getMode(); WiFi.mode(WIFI_OFF); WiFi.mode(storedWiFiMode); - optimistic_yield(10000); + yield(); #else // Disable static IP so that we can connect to other servers via DHCP (DHCP is slower but required for connecting to more than one server, it seems (possible bug?)). @@ -500,7 +500,7 @@ transmission_status_t ESP8266WiFiMesh::connectToNode(const String &targetSSID, i { verboseModePrint(F("... "), false); WiFi.disconnect(); - optimistic_yield(10000); + yield(); initiateConnectionToAP(targetSSID, targetChannel, targetBSSID); attemptNumber++; } @@ -527,7 +527,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding if(initialDisconnect) { WiFi.disconnect(); - optimistic_yield(10000); + yield(); } latestTransmissionOutcomes.clear(); @@ -565,7 +565,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding for(NetworkInfo ¤tNetwork : connectionQueue) { WiFi.disconnect(); - optimistic_yield(10000); + yield(); String currentSSID; int currentWiFiChannel = NETWORK_INFO_DEFAULT_INT; @@ -614,7 +614,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding if(concludingDisconnect) { WiFi.disconnect(); - optimistic_yield(10000); + yield(); } } @@ -658,7 +658,7 @@ void ESP8266WiFiMesh::acceptRequest() /* Read in request and pass it to the supplied requestHandler */ String request = _client.readStringUntil('\r'); - optimistic_yield(10000); + yield(); _client.flush(); String response = _requestHandler(request, *this); @@ -669,7 +669,7 @@ void ESP8266WiFiMesh::acceptRequest() verboseModePrint("Responding"); // Not storing strings in flash (via F()) to avoid performance impacts when using the string. _client.print(response + '\r'); _client.flush(); - optimistic_yield(10000); + yield(); } } }