diff --git a/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp b/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp index a27b11a790..0427cdcefc 100644 --- a/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp +++ b/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_PRESENT) +#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_API_PRESENT) #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif @@ -57,7 +57,6 @@ ESP8266::ESP8266(PinName tx, PinName rx, bool debug, PinName rts, PinName cts) _closed(false), _error(false), _busy(false), - _reset_check(_rmutex), _reset_done(false), _conn_status(NSAPI_STATUS_DISCONNECTED) { @@ -272,14 +271,15 @@ bool ESP8266::reset(void) continue; } - _rmutex.lock(); - while ((rtos::Kernel::get_ms_count() - start_time < ESP8266_BOOTTIME) && !_reset_done) { + while (!_reset_done) { _process_oob(ESP8266_RECV_TIMEOUT, true); // UART mutex claimed -> need to check for OOBs ourselves - _reset_check.wait_for(100); // Arbitrary relatively short delay + if (_reset_done || (rtos::Kernel::get_ms_count() - start_time >= ESP8266_BOOTTIME)) { + break; + } + rtos::ThisThread::sleep_for(100); } done = _reset_done; - _rmutex.unlock(); if (done) { break; } @@ -1040,11 +1040,7 @@ void ESP8266::_oob_watchdog_reset() void ESP8266::_oob_ready() { - - _rmutex.lock(); _reset_done = true; - _reset_check.notify_all(); - _rmutex.unlock(); for (int i = 0; i < SOCKET_COUNT; i++) { _sock_i[i].open = false; diff --git a/components/wifi/esp8266-driver/ESP8266/ESP8266.h b/components/wifi/esp8266-driver/ESP8266/ESP8266.h index a849a2d9b7..a1c476f80e 100644 --- a/components/wifi/esp8266-driver/ESP8266/ESP8266.h +++ b/components/wifi/esp8266-driver/ESP8266/ESP8266.h @@ -17,7 +17,7 @@ #ifndef ESP8266_H #define ESP8266_H -#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_PRESENT) +#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_API_PRESENT) #include #include "drivers/UARTSerial.h" @@ -27,8 +27,8 @@ #include "platform/ATCmdParser.h" #include "platform/Callback.h" #include "platform/mbed_error.h" -#include "rtos/ConditionVariable.h" #include "rtos/Mutex.h" +#include "rtos/ThisThread.h" // Various timeouts for different ESP8266 operations #ifndef ESP8266_CONNECT_TIMEOUT @@ -428,7 +428,6 @@ private: PinName _serial_rts; PinName _serial_cts; rtos::Mutex _smutex; // Protect serial port access - rtos::Mutex _rmutex; // Reset protection // AT Command Parser mbed::ATCmdParser _parser; @@ -479,7 +478,6 @@ private: bool _closed; bool _error; bool _busy; - rtos::ConditionVariable _reset_check; bool _reset_done; // Modem's address info diff --git a/components/wifi/esp8266-driver/ESP8266Interface.cpp b/components/wifi/esp8266-driver/ESP8266Interface.cpp index 44a5ff4d72..27c209d552 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.cpp +++ b/components/wifi/esp8266-driver/ESP8266Interface.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_PRESENT) +#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_API_PRESENT) #include #include @@ -64,7 +64,9 @@ ESP8266Interface::ESP8266Interface() _pwr_pin(MBED_CONF_ESP8266_PWR), _ap_sec(NSAPI_SECURITY_UNKNOWN), _if_blocking(true), +#if MBED_CONF_RTOS_PRESENT _if_connected(_cmutex), +#endif _initialized(false), _connect_retval(NSAPI_ERROR_OK), _disconnect_retval(NSAPI_ERROR_OK), @@ -104,7 +106,9 @@ ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug, PinName r _pwr_pin(pwr), _ap_sec(NSAPI_SECURITY_UNKNOWN), _if_blocking(true), +#if MBED_CONF_RTOS_PRESENT _if_connected(_cmutex), +#endif _initialized(false), _connect_retval(NSAPI_ERROR_OK), _disconnect_retval(NSAPI_ERROR_OK), @@ -267,7 +271,9 @@ void ESP8266Interface::_connect_async() _esp.uart_enable_input(false); _software_conn_stat = IFACE_STATUS_DISCONNECTED; } +#if MBED_CONF_RTOS_PRESENT _if_connected.notify_all(); +#endif } else { // Postpone to give other stuff time to run _connect_event_id = _global_event_queue->call_in(ESP8266_INTERFACE_CONNECT_INTERVAL_MS, @@ -329,10 +335,12 @@ int ESP8266Interface::connect() "connect(): unable to add event to queue. Increase \"events.shared-eventsize\"\n"); } +#if MBED_CONF_RTOS_PRESENT while (_if_blocking && (_conn_status_to_error() != NSAPI_ERROR_IS_CONNECTED) && (_connect_retval == NSAPI_ERROR_NO_CONNECTION)) { _if_connected.wait(); } +#endif _cmutex.unlock(); @@ -418,7 +426,9 @@ void ESP8266Interface::_disconnect_async() _power_off(); _software_conn_stat = IFACE_STATUS_DISCONNECTED; +#if MBED_CONF_RTOS_PRESENT _if_connected.notify_all(); +#endif } else { // Postpone to give other stuff time to run @@ -479,11 +489,13 @@ int ESP8266Interface::disconnect() "disconnect(): unable to add event to queue. Increase \"events.shared-eventsize\"\n"); } +#if MBED_CONF_RTOS_PRESENT while (_if_blocking && (_conn_status_to_error() != NSAPI_ERROR_NO_CONNECTION) && (_disconnect_retval != NSAPI_ERROR_OK)) { _if_connected.wait(); } +#endif _cmutex.unlock(); if (!_if_blocking) { diff --git a/components/wifi/esp8266-driver/ESP8266Interface.h b/components/wifi/esp8266-driver/ESP8266Interface.h index 133b77a4ac..ae7facae7f 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.h +++ b/components/wifi/esp8266-driver/ESP8266Interface.h @@ -17,7 +17,7 @@ #ifndef ESP8266_INTERFACE_H #define ESP8266_INTERFACE_H -#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_PRESENT) +#if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_API_PRESENT) #include "drivers/DigitalOut.h" #include "drivers/Timer.h" #include "ESP8266/ESP8266.h" @@ -30,7 +30,9 @@ #include "features/netsocket/WiFiAccessPoint.h" #include "features/netsocket/WiFiInterface.h" #include "platform/Callback.h" +#if MBED_CONF_RTOS_PRESENT #include "rtos/ConditionVariable.h" +#endif #include "rtos/Mutex.h" #define ESP8266_SOCKET_COUNT 5 @@ -452,7 +454,9 @@ private: struct _channel_info _ch_info; bool _if_blocking; // NetworkInterface, blocking or not +#if MBED_CONF_RTOS_PRESENT rtos::ConditionVariable _if_connected; +#endif // connect status reporting nsapi_error_t _conn_status_to_error();