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;
}
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

@ -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()
{
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()
@ -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),
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;
}