UART in deep sleep mode when it is disconnected

pull/11514/head
Dominika Maziec 2019-09-16 14:02:00 +02:00
parent f51bbe01c8
commit 1aa3b5d9d0
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; return done;
} }
int ESP8266::uart_enable_input(bool enabled)
{
return _serial.enable_input(enabled);
}
#endif #endif

View File

@ -405,6 +405,14 @@ public:
static const int8_t WIFIMODE_STATION_SOFTAP = 3; static const int8_t WIFIMODE_STATION_SOFTAP = 3;
static const int8_t SOCKET_COUNT = 5; 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: private:
// FW version // FW version
struct fw_sdk_version _sdk_v; struct fw_sdk_version _sdk_v;

View File

@ -89,6 +89,7 @@ ESP8266Interface::ESP8266Interface()
_sock_i[i].open = false; _sock_i[i].open = false;
_sock_i[i].sport = 0; _sock_i[i].sport = 0;
} }
_esp.uart_enable_input(false);
} }
#endif #endif
@ -125,6 +126,7 @@ ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug, PinName r
_sock_i[i].open = false; _sock_i[i].open = false;
_sock_i[i].sport = 0; _sock_i[i].sport = 0;
} }
_esp.uart_enable_input(false);
} }
ESP8266Interface::~ESP8266Interface() ESP8266Interface::~ESP8266Interface()
@ -224,6 +226,7 @@ void ESP8266Interface::_connect_async()
nsapi_error_t status = _init(); nsapi_error_t status = _init();
if (status != NSAPI_ERROR_OK) { if (status != NSAPI_ERROR_OK) {
_connect_retval = status; _connect_retval = status;
_esp.uart_enable_input(false);
_software_conn_stat = IFACE_STATUS_DISCONNECTED; _software_conn_stat = IFACE_STATUS_DISCONNECTED;
//_conn_stat_cb will be called from refresh_conn_state_cb //_conn_stat_cb will be called from refresh_conn_state_cb
return; return;
@ -231,6 +234,7 @@ void ESP8266Interface::_connect_async()
if (!_esp.dhcp(true, 1)) { if (!_esp.dhcp(true, 1)) {
_connect_retval = NSAPI_ERROR_DHCP_FAILURE; _connect_retval = NSAPI_ERROR_DHCP_FAILURE;
_esp.uart_enable_input(false);
_software_conn_stat = IFACE_STATUS_DISCONNECTED; _software_conn_stat = IFACE_STATUS_DISCONNECTED;
//_conn_stat_cb will be called from refresh_conn_state_cb //_conn_stat_cb will be called from refresh_conn_state_cb
return; return;
@ -253,6 +257,7 @@ void ESP8266Interface::_connect_async()
_connect_retval = NSAPI_ERROR_CONNECTION_TIMEOUT; _connect_retval = NSAPI_ERROR_CONNECTION_TIMEOUT;
} }
if (_connect_retval != NSAPI_ERROR_OK) { if (_connect_retval != NSAPI_ERROR_OK) {
_esp.uart_enable_input(false);
_software_conn_stat = IFACE_STATUS_DISCONNECTED; _software_conn_stat = IFACE_STATUS_DISCONNECTED;
} }
_if_connected.notify_all(); _if_connected.notify_all();
@ -304,6 +309,7 @@ int ESP8266Interface::connect()
_cmutex.lock(); _cmutex.lock();
} }
_software_conn_stat = IFACE_STATUS_CONNECTING; _software_conn_stat = IFACE_STATUS_CONNECTING;
_esp.uart_enable_input(true);
_connect_retval = NSAPI_ERROR_NO_CONNECTION; _connect_retval = NSAPI_ERROR_NO_CONNECTION;
MBED_ASSERT(!_connect_event_id); MBED_ASSERT(!_connect_event_id);
_conn_timer.stop(); _conn_timer.stop();
@ -404,6 +410,7 @@ void ESP8266Interface::_disconnect_async()
} }
_power_off(); _power_off();
_software_conn_stat = IFACE_STATUS_DISCONNECTED;
_if_connected.notify_all(); _if_connected.notify_all();
} else { } else {
@ -418,8 +425,8 @@ void ESP8266Interface::_disconnect_async()
} }
} }
_cmutex.unlock(); _cmutex.unlock();
_software_conn_stat = IFACE_STATUS_DISCONNECTED;
_esp.uart_enable_input(false);
if (_disconnect_event_id == 0) { if (_disconnect_event_id == 0) {
if (_conn_stat_cb) { if (_conn_stat_cb) {
_conn_stat_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _conn_stat); _conn_stat_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _conn_stat);
@ -481,17 +488,31 @@ int ESP8266Interface::disconnect()
const char *ESP8266Interface::get_ip_address() const char *ESP8266Interface::get_ip_address()
{ {
const char *ip_buff = _esp.ip_addr(); if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) {
if (!ip_buff || strcmp(ip_buff, "0.0.0.0") == 0) { _esp.uart_enable_input(true);
return NULL;
} }
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; return ip_buff;
} }
const char *ESP8266Interface::get_mac_address() 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() const char *ESP8266Interface::get_gateway()
@ -506,7 +527,17 @@ const char *ESP8266Interface::get_netmask()
int8_t ESP8266Interface::get_rssi() 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) 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; return NSAPI_ERROR_PARAMETER;
} }
if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) {
_esp.uart_enable_input(true);
}
nsapi_error_t status = _init(); nsapi_error_t status = _init();
if (status != NSAPI_ERROR_OK) { if (status != NSAPI_ERROR_OK) {
return status; 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), int ret = _esp.scan(res, count, (mode == SCANMODE_ACTIVE ? ESP8266::SCANMODE_ACTIVE : ESP8266::SCANMODE_PASSIVE),
t_max, t_min); t_max, t_min);
if (_software_conn_stat == IFACE_STATUS_DISCONNECTED) {
_esp.uart_enable_input(false);
}
return ret;
} }
bool ESP8266Interface::_get_firmware_ok() bool ESP8266Interface::_get_firmware_ok()
@ -555,6 +598,7 @@ nsapi_error_t ESP8266Interface::_init(void)
if (!_initialized) { if (!_initialized) {
_pwr_pin.power_off(); _pwr_pin.power_off();
_pwr_pin.power_on(); _pwr_pin.power_on();
if (_reset() != NSAPI_ERROR_OK) { if (_reset() != NSAPI_ERROR_OK) {
return NSAPI_ERROR_DEVICE_ERROR; return NSAPI_ERROR_DEVICE_ERROR;
} }