Merge pull request #11514 from dmaziec1/UART_deep_sleep_enable

ESP8266 unlocks deep sleep when disconnected
pull/11590/head
Anna Bridge 2019-09-27 16:50:22 +01:00 committed by GitHub
commit 372a3f19c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 8 deletions

View File

@ -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

View File

@ -405,6 +405,14 @@ public:
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;

View File

@ -91,6 +91,7 @@ ESP8266Interface::ESP8266Interface()
_sock_i[i].open = false;
_sock_i[i].sport = 0;
}
_esp.uart_enable_input(false);
}
#endif
@ -127,6 +128,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()
@ -226,6 +228,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;
@ -233,6 +236,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;
@ -255,6 +259,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();
@ -306,6 +311,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();
@ -406,6 +412,7 @@ void ESP8266Interface::_disconnect_async()
}
_power_off();
_software_conn_stat = IFACE_STATUS_DISCONNECTED;
_if_connected.notify_all();
} else {
@ -420,8 +427,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);
@ -483,17 +490,31 @@ int ESP8266Interface::disconnect()
const char *ESP8266Interface::get_ip_address()
{
const char *ip_buff = _esp.ip_addr();
if (!ip_buff || strcmp(ip_buff, "0.0.0.0") == 0) {
return NULL;
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) {
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()
@ -514,7 +535,17 @@ char *ESP8266Interface::get_interface_name(char *interface_name)
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)
@ -531,13 +562,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()
@ -563,6 +606,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;
}