From c38a7a387324141629d399bd0fe11c32856fa649 Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Thu, 20 Jun 2019 12:43:18 +0500 Subject: [PATCH 1/8] delay() refactoring Refactoring delay to allow to run esp_schedule() and esp_yield() periodically (not only on delay ends). This will be helpfull in implementation of Ethernet dirver. --- cores/esp8266/core_esp8266_wiring.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring.cpp b/cores/esp8266/core_esp8266_wiring.cpp index 247a02bbda..296633a4d6 100644 --- a/cores/esp8266/core_esp8266_wiring.cpp +++ b/cores/esp8266/core_esp8266_wiring.cpp @@ -44,15 +44,17 @@ void delay_end(void* arg) { } void delay(unsigned long ms) { - if(ms) { - os_timer_setfn(&delay_timer, (os_timer_func_t*) &delay_end, 0); - os_timer_arm(&delay_timer, ms, ONCE); + if (ms) { + unsigned long delay_start = millis(); + while(millis() - delay_start < ms) { + os_timer_setfn(&delay_timer, (os_timer_func_t*) &delay_end, 0); + os_timer_arm(&delay_timer, 1, ONCE); + esp_yield(); + os_timer_disarm(&delay_timer); + } } else { esp_schedule(); - } - esp_yield(); - if(ms) { - os_timer_disarm(&delay_timer); + esp_yield(); } } From f5ea2155e91b05170849444b103102159b188987 Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Thu, 20 Jun 2019 15:37:59 +0500 Subject: [PATCH 2/8] Put back old-fasion delay() as interruptable_delay() --- cores/esp8266/core_esp8266_wiring.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cores/esp8266/core_esp8266_wiring.cpp b/cores/esp8266/core_esp8266_wiring.cpp index 296633a4d6..42efa802bd 100644 --- a/cores/esp8266/core_esp8266_wiring.cpp +++ b/cores/esp8266/core_esp8266_wiring.cpp @@ -43,6 +43,19 @@ void delay_end(void* arg) { esp_schedule(); } +void interruptible_delay(unsigned long ms) { + if(ms) { + os_timer_setfn(&delay_timer, (os_timer_func_t*) &delay_end, 0); + os_timer_arm(&delay_timer, ms, ONCE); + } else { + esp_schedule(); + } + esp_yield(); + if(ms) { + os_timer_disarm(&delay_timer); + } +} + void delay(unsigned long ms) { if (ms) { unsigned long delay_start = millis(); From 9a6f4a84724811f5d7fb2d8174672f25f1c45f20 Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Thu, 20 Jun 2019 16:27:22 +0500 Subject: [PATCH 3/8] Use interruptable_delay() as early delay exit suspected --- libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp | 2 +- libraries/ESP8266mDNS/src/LEAmDNS.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp index 80f55ad81a..687bf5857d 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp @@ -375,7 +375,7 @@ int MDNSResponder::queryService(char *service, char *proto) { #ifdef DEBUG_ESP_MDNS_TX DEBUG_ESP_PORT.println("Waiting for answers.."); #endif - delay(1000); + interruptable_delay(1000); _waitingForAnswers = false; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.cpp b/libraries/ESP8266mDNS/src/LEAmDNS.cpp index 7227784c83..2803c2d23b 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS.cpp @@ -640,7 +640,7 @@ uint32_t MDNSResponder::queryService(const char* p_pcService, if (_sendMDNSServiceQuery(*pServiceQuery)) { // Wait for answers to arrive DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService: Waiting %u ms for answers...\n"), p_u16Timeout);); - delay(p_u16Timeout); + interruptable_delay(p_u16Timeout); // All answers should have arrived by now -> stop adding new answers pServiceQuery->m_bAwaitingAnswers = false; From ea0e00ab55ad19a8999ed0cc107f931012a0e0bd Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Thu, 20 Jun 2019 16:44:26 +0500 Subject: [PATCH 4/8] Add interruptable_delay() definition --- cores/esp8266/Arduino.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 34e5fb8fce..c303a6b930 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -209,6 +209,7 @@ unsigned long millis(void); unsigned long micros(void); uint64_t micros64(void); void delay(unsigned long); +void interruptable_delay(unsigned long ms); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); From 0489c27f99e7b02a81bd16c9c1a1efa08ec52069 Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Fri, 21 Jun 2019 12:55:35 +0500 Subject: [PATCH 5/8] Fix function naming mistype --- cores/esp8266/core_esp8266_wiring.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_wiring.cpp b/cores/esp8266/core_esp8266_wiring.cpp index 42efa802bd..6e37fbbcec 100644 --- a/cores/esp8266/core_esp8266_wiring.cpp +++ b/cores/esp8266/core_esp8266_wiring.cpp @@ -43,7 +43,7 @@ void delay_end(void* arg) { esp_schedule(); } -void interruptible_delay(unsigned long ms) { +void interruptable_delay(unsigned long ms) { if(ms) { os_timer_setfn(&delay_timer, (os_timer_func_t*) &delay_end, 0); os_timer_arm(&delay_timer, ms, ONCE); From fea8dac02dceadb868f06fdcbd06fddf8ffdc36d Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Tue, 25 Jun 2019 14:58:16 +0500 Subject: [PATCH 6/8] Replace delay() to exec recurrent functions in hostByName delay() replaced with code simular to #6213 --- libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 31daf370a0..086e2ae6fc 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -565,7 +565,11 @@ int ESP8266WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResul aResult = IPAddress(&addr); } else if(err == ERR_INPROGRESS) { _dns_lookup_pending = true; - delay(timeout_ms); + // Following delay will be interrupted by dns found callback + for (decltype(timeout_ms) i = 0; _dns_lookup_pending && i < timeout_ms; i++) { + // let a chance to recurrent scheduled functions (ethernet) + delay(1); + } _dns_lookup_pending = false; // will return here when dns_found_callback fires if(aResult.isSet()) { @@ -597,6 +601,7 @@ void wifi_dns_found_callback(const char *name, CONST ip_addr_t *ipaddr, void *ca if(ipaddr) { (*reinterpret_cast(callback_arg)) = IPAddress(ipaddr); } + _dns_lookup_pending = false; esp_schedule(); // resume the hostByName function } From b06892d0d16c0ebcce96a077a6ec9cc8863aad7f Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Thu, 4 Jul 2019 12:02:32 +0500 Subject: [PATCH 7/8] Revert back to generic delay() in mDNS --- libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp | 2 +- libraries/ESP8266mDNS/src/LEAmDNS.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp index 687bf5857d..80f55ad81a 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp @@ -375,7 +375,7 @@ int MDNSResponder::queryService(char *service, char *proto) { #ifdef DEBUG_ESP_MDNS_TX DEBUG_ESP_PORT.println("Waiting for answers.."); #endif - interruptable_delay(1000); + delay(1000); _waitingForAnswers = false; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.cpp b/libraries/ESP8266mDNS/src/LEAmDNS.cpp index 2803c2d23b..7227784c83 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS.cpp @@ -640,7 +640,7 @@ uint32_t MDNSResponder::queryService(const char* p_pcService, if (_sendMDNSServiceQuery(*pServiceQuery)) { // Wait for answers to arrive DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService: Waiting %u ms for answers...\n"), p_u16Timeout);); - interruptable_delay(p_u16Timeout); + delay(p_u16Timeout); // All answers should have arrived by now -> stop adding new answers pServiceQuery->m_bAwaitingAnswers = false; From 5dfd78386290ae7b46dd2e75d18b523247b2b193 Mon Sep 17 00:00:00 2001 From: Alexander Emelianov Date: Fri, 12 Jul 2019 14:38:13 +0500 Subject: [PATCH 8/8] Rewrite to polledTimeout --- cores/esp8266/core_esp8266_wiring.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring.cpp b/cores/esp8266/core_esp8266_wiring.cpp index 6e37fbbcec..4df56b0e32 100644 --- a/cores/esp8266/core_esp8266_wiring.cpp +++ b/cores/esp8266/core_esp8266_wiring.cpp @@ -24,6 +24,7 @@ #include "osapi.h" #include "user_interface.h" #include "cont.h" +#include extern "C" { @@ -58,8 +59,9 @@ void interruptable_delay(unsigned long ms) { void delay(unsigned long ms) { if (ms) { - unsigned long delay_start = millis(); - while(millis() - delay_start < ms) { + using esp8266::polledTimeout::oneShotMs; + oneShotMs waitDone(ms); + while(!waitDone) { os_timer_setfn(&delay_timer, (os_timer_func_t*) &delay_end, 0); os_timer_arm(&delay_timer, 1, ONCE); esp_yield();