diff --git a/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp b/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp index b1f62338ef1..58c772ae6c3 100644 --- a/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp +++ b/components/wifi/esp8266-driver/ESP8266/ESP8266.cpp @@ -1275,4 +1275,9 @@ bool ESP8266::set_country_code_policy(bool track_ap, const char *country_code, i return done; } +int ESP8266::uart_enable_input(bool enabled) +{ + return _serial.enable_input(enabled); +} + #endif diff --git a/components/wifi/esp8266-driver/ESP8266/ESP8266.h b/components/wifi/esp8266-driver/ESP8266/ESP8266.h index 56aa7d99228..a849a2d9b79 100644 --- a/components/wifi/esp8266-driver/ESP8266/ESP8266.h +++ b/components/wifi/esp8266-driver/ESP8266/ESP8266.h @@ -405,6 +405,14 @@ class ESP8266 { static const int8_t WIFIMODE_STATION_SOFTAP = 3; static const int8_t SOCKET_COUNT = 5; + /** + * Enables or disables uart input and deep sleep + * + * @param lock if TRUE, uart input is enabled and deep sleep is locked + * if FALSE, uart input is disabled and deep sleep is unlocked + */ + int uart_enable_input(bool lock); + private: // FW version struct fw_sdk_version _sdk_v; diff --git a/components/wifi/esp8266-driver/ESP8266Interface.cpp b/components/wifi/esp8266-driver/ESP8266Interface.cpp index d4218ebf50f..f398029e823 100644 --- a/components/wifi/esp8266-driver/ESP8266Interface.cpp +++ b/components/wifi/esp8266-driver/ESP8266Interface.cpp @@ -89,6 +89,7 @@ ESP8266Interface::ESP8266Interface() _sock_i[i].open = false; _sock_i[i].sport = 0; } + _esp.uart_enable_input(false); } #endif @@ -125,6 +126,7 @@ ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug, PinName r _sock_i[i].open = false; _sock_i[i].sport = 0; } + _esp.uart_enable_input(false); } ESP8266Interface::~ESP8266Interface() @@ -224,6 +226,7 @@ void ESP8266Interface::_connect_async() nsapi_error_t status = _init(); if (status != NSAPI_ERROR_OK) { _connect_retval = status; + _esp.uart_enable_input(false); _software_conn_stat = IFACE_STATUS_DISCONNECTED; //_conn_stat_cb will be called from refresh_conn_state_cb return; @@ -231,6 +234,7 @@ void ESP8266Interface::_connect_async() if (!_esp.dhcp(true, 1)) { _connect_retval = NSAPI_ERROR_DHCP_FAILURE; + _esp.uart_enable_input(false); _software_conn_stat = IFACE_STATUS_DISCONNECTED; //_conn_stat_cb will be called from refresh_conn_state_cb return; @@ -253,6 +257,7 @@ void ESP8266Interface::_connect_async() _connect_retval = NSAPI_ERROR_CONNECTION_TIMEOUT; } if (_connect_retval != NSAPI_ERROR_OK) { + _esp.uart_enable_input(false); _software_conn_stat = IFACE_STATUS_DISCONNECTED; } _if_connected.notify_all(); @@ -304,6 +309,7 @@ int ESP8266Interface::connect() _cmutex.lock(); } _software_conn_stat = IFACE_STATUS_CONNECTING; + _esp.uart_enable_input(true); _connect_retval = NSAPI_ERROR_NO_CONNECTION; MBED_ASSERT(!_connect_event_id); _conn_timer.stop(); @@ -404,6 +410,7 @@ void ESP8266Interface::_disconnect_async() } _power_off(); + _software_conn_stat = IFACE_STATUS_DISCONNECTED; _if_connected.notify_all(); } else { @@ -418,8 +425,8 @@ void ESP8266Interface::_disconnect_async() } } _cmutex.unlock(); - _software_conn_stat = IFACE_STATUS_DISCONNECTED; + _esp.uart_enable_input(false); if (_disconnect_event_id == 0) { if (_conn_stat_cb) { _conn_stat_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _conn_stat); @@ -481,17 +488,31 @@ int ESP8266Interface::disconnect() const char *ESP8266Interface::get_ip_address() { + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(true); + } + const char *ip_buff = _esp.ip_addr(); if (!ip_buff || strcmp(ip_buff, "0.0.0.0") == 0) { - return NULL; + ip_buff = NULL; + } + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(false); } - return ip_buff; } const char *ESP8266Interface::get_mac_address() { - return _esp.mac_addr(); + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(true); + } + const char *ret = _esp.mac_addr(); + + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(false); + } + return ret; } const char *ESP8266Interface::get_gateway() @@ -506,7 +527,17 @@ const char *ESP8266Interface::get_netmask() int8_t ESP8266Interface::get_rssi() { - return _esp.rssi(); + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(true); + } + + int8_t ret = _esp.rssi(); + + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(false); + } + + return ret; } int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count) @@ -523,13 +554,25 @@ int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count, scan_mode mode, return NSAPI_ERROR_PARAMETER; } + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(true); + } + nsapi_error_t status = _init(); if (status != NSAPI_ERROR_OK) { return status; + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(false); + } } - return _esp.scan(res, count, (mode == SCANMODE_ACTIVE ? ESP8266::SCANMODE_ACTIVE : ESP8266::SCANMODE_PASSIVE), - t_max, t_min); + int ret = _esp.scan(res, count, (mode == SCANMODE_ACTIVE ? ESP8266::SCANMODE_ACTIVE : ESP8266::SCANMODE_PASSIVE), + t_max, t_min); + + if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) { + _esp.uart_enable_input(false); + } + return ret; } bool ESP8266Interface::_get_firmware_ok() @@ -555,6 +598,7 @@ nsapi_error_t ESP8266Interface::_init(void) if (!_initialized) { _pwr_pin.power_off(); _pwr_pin.power_on(); + if (_reset() != NSAPI_ERROR_OK) { return NSAPI_ERROR_DEVICE_ERROR; }