Fixes connect, and network-status logic

pull/9064/head
Veijo Pesonen 2018-12-04 17:18:52 +02:00 committed by Cruz Monrreal II
parent fc548ec367
commit 5799daef72
2 changed files with 21 additions and 34 deletions

View File

@ -55,7 +55,6 @@ ESP8266Interface::ESP8266Interface()
_rst_pin(MBED_CONF_ESP8266_RST), // Notice that Pin7 CH_EN cannot be left floating if used as reset _rst_pin(MBED_CONF_ESP8266_RST), // Notice that Pin7 CH_EN cannot be left floating if used as reset
_ap_sec(NSAPI_SECURITY_UNKNOWN), _ap_sec(NSAPI_SECURITY_UNKNOWN),
_initialized(false), _initialized(false),
_started(false),
_conn_stat(NSAPI_STATUS_DISCONNECTED), _conn_stat(NSAPI_STATUS_DISCONNECTED),
_conn_stat_cb(NULL), _conn_stat_cb(NULL),
_global_event_queue(NULL), _global_event_queue(NULL),
@ -73,6 +72,8 @@ ESP8266Interface::ESP8266Interface()
_sock_i[i].open = false; _sock_i[i].open = false;
_sock_i[i].sport = 0; _sock_i[i].sport = 0;
} }
_oob2global_event_queue();
} }
#endif #endif
@ -82,7 +83,6 @@ ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug, PinName r
_rst_pin(rst), _rst_pin(rst),
_ap_sec(NSAPI_SECURITY_UNKNOWN), _ap_sec(NSAPI_SECURITY_UNKNOWN),
_initialized(false), _initialized(false),
_started(false),
_conn_stat(NSAPI_STATUS_DISCONNECTED), _conn_stat(NSAPI_STATUS_DISCONNECTED),
_conn_stat_cb(NULL), _conn_stat_cb(NULL),
_global_event_queue(NULL), _global_event_queue(NULL),
@ -100,6 +100,8 @@ 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;
} }
_oob2global_event_queue();
} }
ESP8266Interface::~ESP8266Interface() ESP8266Interface::~ESP8266Interface()
@ -183,10 +185,6 @@ int ESP8266Interface::connect()
return status; return status;
} }
if (!_oob_event_id) {
_oob2global_event_queue();
}
if (get_ip_address()) { if (get_ip_address()) {
return NSAPI_ERROR_IS_CONNECTED; return NSAPI_ERROR_IS_CONNECTED;
} }
@ -195,22 +193,12 @@ int ESP8266Interface::connect()
if (status != NSAPI_ERROR_OK) { if (status != NSAPI_ERROR_OK) {
return status; return status;
} }
_started = true;
if (!_esp.dhcp(true, 1)) { if (!_esp.dhcp(true, 1)) {
return NSAPI_ERROR_DHCP_FAILURE; return NSAPI_ERROR_DHCP_FAILURE;
} }
int connect_error = _esp.connect(ap_ssid, ap_pass); return _esp.connect(ap_ssid, ap_pass);
if (connect_error) {
return connect_error;
}
if (!get_ip_address()) {
return NSAPI_ERROR_DHCP_FAILURE;
}
return NSAPI_ERROR_OK;
} }
int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security) int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
@ -272,8 +260,13 @@ int ESP8266Interface::disconnect()
if (ret == NSAPI_ERROR_OK) { if (ret == NSAPI_ERROR_OK) {
// Try to lure the nw status update from ESP8266, might come later // Try to lure the nw status update from ESP8266, might come later
_esp.bg_process_oob(ESP8266_RECV_TIMEOUT, true); _esp.bg_process_oob(ESP8266_RECV_TIMEOUT, true);
// In case the status update arrives later // In case the status update arrives later inform upper layers manually
_conn_stat = NSAPI_STATUS_DISCONNECTED; if (_conn_stat != NSAPI_STATUS_DISCONNECTED) {
_conn_stat = NSAPI_STATUS_DISCONNECTED;
if (_conn_stat_cb) {
_conn_stat_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _conn_stat);
}
}
} }
return ret; return ret;
@ -281,10 +274,6 @@ int ESP8266Interface::disconnect()
const char *ESP8266Interface::get_ip_address() const char *ESP8266Interface::get_ip_address()
{ {
if (!_started) {
return NULL;
}
const char *ip_buff = _esp.ip_addr(); const char *ip_buff = _esp.ip_addr();
if (!ip_buff || strcmp(ip_buff, "0.0.0.0") == 0) { if (!ip_buff || strcmp(ip_buff, "0.0.0.0") == 0) {
return NULL; return NULL;
@ -300,17 +289,17 @@ const char *ESP8266Interface::get_mac_address()
const char *ESP8266Interface::get_gateway() const char *ESP8266Interface::get_gateway()
{ {
return _started ? _esp.gateway() : NULL; return _conn_stat != NSAPI_STATUS_DISCONNECTED ? _esp.gateway() : NULL;
} }
const char *ESP8266Interface::get_netmask() const char *ESP8266Interface::get_netmask()
{ {
return _started ? _esp.netmask() : NULL; return _conn_stat != NSAPI_STATUS_DISCONNECTED ? _esp.netmask() : NULL;
} }
int8_t ESP8266Interface::get_rssi() int8_t ESP8266Interface::get_rssi()
{ {
return _started ? _esp.rssi() : 0; return _esp.rssi();
} }
int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count) int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count)
@ -391,7 +380,7 @@ void ESP8266Interface::_hw_reset()
nsapi_error_t ESP8266Interface::_startup(const int8_t wifi_mode) nsapi_error_t ESP8266Interface::_startup(const int8_t wifi_mode)
{ {
if (!_started) { if (_conn_stat == NSAPI_STATUS_DISCONNECTED) {
if (!_esp.startup(wifi_mode)) { if (!_esp.startup(wifi_mode)) {
return NSAPI_ERROR_DEVICE_ERROR; return NSAPI_ERROR_DEVICE_ERROR;
} }
@ -692,8 +681,13 @@ WiFiInterface *WiFiInterface::get_default_instance()
void ESP8266Interface::update_conn_state_cb() void ESP8266Interface::update_conn_state_cb()
{ {
nsapi_connection_status_t prev_stat = _conn_stat;
_conn_stat = _esp.connection_status(); _conn_stat = _esp.connection_status();
if (prev_stat == _conn_stat) {
return;
}
switch (_conn_stat) { switch (_conn_stat) {
// Doesn't require changes // Doesn't require changes
case NSAPI_STATUS_CONNECTING: case NSAPI_STATUS_CONNECTING:
@ -701,16 +695,12 @@ void ESP8266Interface::update_conn_state_cb()
break; break;
// Start from scratch if connection drops/is dropped // Start from scratch if connection drops/is dropped
case NSAPI_STATUS_DISCONNECTED: case NSAPI_STATUS_DISCONNECTED:
_started = false;
break; break;
// Handled on AT layer // Handled on AT layer
case NSAPI_STATUS_LOCAL_UP: case NSAPI_STATUS_LOCAL_UP:
case NSAPI_STATUS_ERROR_UNSUPPORTED: case NSAPI_STATUS_ERROR_UNSUPPORTED:
default: default:
_started = false;
_initialized = false; _initialized = false;
_global_event_queue->cancel(_oob_event_id);
_oob_event_id = 0;
_conn_stat = NSAPI_STATUS_DISCONNECTED; _conn_stat = NSAPI_STATUS_DISCONNECTED;
} }
@ -722,8 +712,6 @@ void ESP8266Interface::update_conn_state_cb()
void ESP8266Interface::proc_oob_evnt() void ESP8266Interface::proc_oob_evnt()
{ {
if (_initialized) {
_esp.bg_process_oob(ESP8266_RECV_TIMEOUT, true); _esp.bg_process_oob(ESP8266_RECV_TIMEOUT, true);
}
} }
#endif #endif

View File

@ -353,7 +353,6 @@ private:
bool _get_firmware_ok(); bool _get_firmware_ok();
nsapi_error_t _init(void); nsapi_error_t _init(void);
void _hw_reset(); void _hw_reset();
int _started;
nsapi_error_t _startup(const int8_t wifi_mode); nsapi_error_t _startup(const int8_t wifi_mode);
//sigio //sigio