From 73bacdd32c66016b2e1fe5f9eee9840363da867c Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 7 Jan 2015 01:57:41 +0300 Subject: [PATCH] Automatically call yield() in WiFiClient::available if called more than once --- .../esp8266/cores/esp8266/core_esp8266_main.cpp | 8 ++++++++ .../libraries/ESP8266WiFi/src/WiFiClient.cpp | 13 +++++++++++-- .../esp8266/libraries/ESP8266WiFi/src/WiFiClient.h | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/hardware/arduino/esp8266/cores/esp8266/core_esp8266_main.cpp b/hardware/arduino/esp8266/cores/esp8266/core_esp8266_main.cpp index d4f50e431..55d60fa60 100644 --- a/hardware/arduino/esp8266/cores/esp8266/core_esp8266_main.cpp +++ b/hardware/arduino/esp8266/cores/esp8266/core_esp8266_main.cpp @@ -49,6 +49,13 @@ extern void (*__init_array_end)(void); static cont_t g_cont; static os_event_t g_loop_queue[LOOP_QUEUE_SIZE]; +static uint32_t g_micros_at_task_start; + +extern "C" uint32_t esp_micros_at_task_start() +{ + return g_micros_at_task_start; +} + extern "C" void abort() { while(1){} @@ -86,6 +93,7 @@ static void loop_wrapper() static void loop_task(os_event_t *events) { + g_micros_at_task_start = system_get_time(); cont_run(&g_cont, &loop_wrapper); if (cont_check(&g_cont) != 0) { diff --git a/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.cpp b/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.cpp index 9ea2d7728..63acbccfd 100644 --- a/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -46,7 +46,8 @@ extern "C" static int g_localPort = MIN_LOCAL_PORT; ICACHE_FLASH_ATTR WiFiClient::WiFiClient() -: _client(0) +: _client(0) +, _lastPollTime(0) { } @@ -153,12 +154,20 @@ size_t ICACHE_FLASH_ATTR WiFiClient::write(const uint8_t *buf, size_t size) return _client->write(reinterpret_cast(buf), size); } +extern "C" uint32_t esp_micros_at_task_start(); + int ICACHE_FLASH_ATTR WiFiClient::available() { if (!_client) return 0; - return _client->getSize(); + if (_lastPollTime > esp_micros_at_task_start()) + yield(); + + _lastPollTime = micros(); + + int result = _client->getSize(); + return result; } int ICACHE_FLASH_ATTR WiFiClient::read() diff --git a/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.h b/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.h index ecc31f3bc..8994e710a 100644 --- a/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.h +++ b/hardware/arduino/esp8266/libraries/ESP8266WiFi/src/WiFiClient.h @@ -66,6 +66,8 @@ private: void _err(int8_t err); ClientContext* _client; + uint32_t _lastPollTime; + }; #endif