From c2cbe3015bc470dea144eec42a29c3058ed93093 Mon Sep 17 00:00:00 2001 From: Shawn A Date: Wed, 21 Mar 2018 12:18:00 -0500 Subject: [PATCH] refactor connectwifi, adds save timeout wifi save now no longer uses settimeout timeout --- WiFiManager.cpp | 124 ++++++++++++++++++++++++++++++++---------------- WiFiManager.h | 5 ++ 2 files changed, 89 insertions(+), 40 deletions(-) diff --git a/WiFiManager.cpp b/WiFiManager.cpp index f03bcf0..ab9a9b7 100644 --- a/WiFiManager.cpp +++ b/WiFiManager.cpp @@ -571,10 +571,9 @@ boolean WiFiManager::stopConfigPortal(){ if(!configPortalActive) return false; // turn off AP - // @todo bug workaround *WM: disconnect configportal + // @todo bug workaround // https://github.com/esp8266/Arduino/issues/3793 - // [APdisconnect] set_config failed! - // *WM: disconnect configportal - softAPdisconnect failed + // [APdisconnect] set_config failed! *WM: disconnect configportal - softAPdisconnect failed // still no way to reproduce reliably DEBUG_WM(DEBUG_VERBOSE,F("disconnect configportal")); bool ret = false; @@ -594,45 +593,30 @@ boolean WiFiManager::stopConfigPortal(){ uint8_t WiFiManager::connectWifi(String ssid, String pass) { DEBUG_WM(DEBUG_VERBOSE,F("Connecting as wifi client...")); - bool waitforconx = true; - - // Setup static IP config if provided - if (_sta_static_ip) { - if(_sta_static_dns) { - DEBUG_WM(DEBUG_VERBOSE,F("Custom STA IP/GW/Subnet/DNS")); - WiFi.config(_sta_static_ip, _sta_static_gw, _sta_static_sn, _sta_static_dns); - } - else { - DEBUG_WM(DEBUG_VERBOSE,F("Custom STA IP/GW/Subnet")); - WiFi.config(_sta_static_ip, _sta_static_gw, _sta_static_sn); - } - DEBUG_WM(WiFi.localIP()); - } + uint8_t connRes = (uint8_t)WL_NO_SSID_AVAIL; + setSTAConfig(); + //@todo catch failures in set_config + // make sure sta is on before `begin` so it does not call enablesta->mode while persistent is ON ( which would save WM AP state to eeprom !) WiFi_Disconnect(); // disconnect before begin, in case anything is hung // if ssid argument provided connect to that if (ssid != "") { - DEBUG_WM(F("Connecting to new AP")); - WiFi_enableSTA(true,storeSTAmode); // storeSTAmode will also toggle STA on in default opmode (persistent) if true (default) - WiFi.persistent(true); - WiFi.begin(ssid.c_str(), pass.c_str()); - WiFi.persistent(false); - //@todo catch failures in set_config - } else { + wifiConnectNew(ssid,pass); + connRes = waitForConnectResult(_saveTimeout); + } + else { // connect using saved ssid if there is one if (WiFi_hasAutoConnect()) { - DEBUG_WM(F("Connecting to saved AP:"),WiFi_SSID()); - WiFi_enableSTA(true,storeSTAmode); - WiFi.begin(); - } else { + wifiConnectDefault(); + connRes = waitForConnectResult(); + } + else { DEBUG_WM(F("No saved credentials, skipping wifi")); - waitforconx = false; } } - - uint8_t connRes = waitforconx ? waitForConnectResult() : (uint8_t)WL_NO_SSID_AVAIL; + DEBUG_WM(DEBUG_VERBOSE,F("Connection result:"),getWLStatusString(connRes)); // do WPS, if WPS options enabled and not connected and no password was supplied @@ -650,6 +634,61 @@ uint8_t WiFiManager::connectWifi(String ssid, String pass) { return connRes; } +/** + * connect to a new wifi ap + * @since $dev + * @param String ssid + * @param String pass + * @return bool success + */ +bool WiFiManager::wifiConnectNew(String ssid, String pass){ + bool ret = false; + DEBUG_WM(F("Connecting to new AP")); + WiFi_enableSTA(true,storeSTAmode); // storeSTAmode will also toggle STA on in default opmode (persistent) if true (default) + WiFi.persistent(true); + WiFi.begin(ssid.c_str(), pass.c_str()); + WiFi.persistent(false); + if(!ret) DEBUG_WM(DEBUG_ERROR,"[ERROR] wifi begin failed"); + return ret; +} + +/** + * connect to stored wifi + * @since dev + * @return bool success + */ +bool WiFiManager::wifiConnectDefault(){ + bool ret = false; + DEBUG_WM(F("Connecting to saved AP:"),WiFi_SSID()); + WiFi_enableSTA(true,storeSTAmode); + ret = WiFi.begin(); + if(!ret) DEBUG_WM(DEBUG_ERROR,"[ERROR] wifi begin failed"); + return ret; +} + + +/** + * set sta config if set + * @since $dev + * @return bool success + */ +bool WiFiManager::setSTAConfig(){ + bool ret = false; + if (_sta_static_ip) { + if(_sta_static_dns) { + DEBUG_WM(DEBUG_VERBOSE,F("Custom STA IP/GW/Subnet/DNS")); + ret = WiFi.config(_sta_static_ip, _sta_static_gw, _sta_static_sn, _sta_static_dns); + } + else { + DEBUG_WM(DEBUG_VERBOSE,F("Custom STA IP/GW/Subnet")); + ret = WiFi.config(_sta_static_ip, _sta_static_gw, _sta_static_sn); + } + } + if(!ret) DEBUG_WM(DEBUG_ERROR,"[ERROR] wifi config failed"); + else DEBUG_WM(F("STA IP set:"),WiFi.localIP()); + return ret; +} + // @todo change to getLastFailureReason and do not touch conxresult void WiFiManager::updateConxResult(uint8_t status){ // hack in wrong password detection @@ -675,27 +714,32 @@ void WiFiManager::updateConxResult(uint8_t status){ // @todo uses _connectTimeout for wifi save also, add timeout argument to bypass? -uint8_t WiFiManager::waitForConnectResult(uint16_t timeout) { - return waitForConnectResult(timeout * 1000); +uint8_t WiFiManager::waitForConnectResult() { + return waitForConnectResult(_connectTimeout); } -uint8_t WiFiManager::waitForConnectResult() { - if (_connectTimeout == 0){ - DEBUG_WM (F("connectTimeout not set, ESP waitForConnectResult...")); +/** + * waitForConnectResult + * @param uint16_t timeout in seconds + * @return uint8_t WL Status + */ +uint8_t WiFiManager::waitForConnectResult(uint16_t timeout) { + if (timeout == 0){ + DEBUG_WM(F("connectTimeout not set, ESP waitForConnectResult...")); return WiFi.waitForConnectResult(); } - DEBUG_WM (F("connectTimeout set, waiting for connect....")); + unsigned long timeoutmillis = millis() + timeout; + DEBUG_WM(DEBUG_NOTIFY,timeout,F("connectTimeout set, waiting for connect....")); uint8_t status = WiFi.status(); - unsigned long timeout = millis() + _connectTimeout; - while(millis() < timeout) { + while(millis() < timeoutmillis) { status = WiFi.status(); // @todo detect additional states, connect happens, then dhcp then get ip, there is some delay here, make sure not to timeout if waiting on IP if (status == WL_CONNECTED || status == WL_CONNECT_FAILED) { return status; } - DEBUG_WM (2,F(".")); + DEBUG_WM (DEBUG_VERBOSE,F(".")); delay(100); } return status; diff --git a/WiFiManager.h b/WiFiManager.h index 5db44e2..61f8a01 100644 --- a/WiFiManager.h +++ b/WiFiManager.h @@ -258,6 +258,7 @@ class WiFiManager // options flags unsigned long _configPortalTimeout = 0; // ms close config portal loop if set (depending on _cp/webClientCheck options) unsigned long _connectTimeout = 0; // ms stop trying to connect to ap if set + unsigned long _saveTimeout = 5000; // ms stop trying to connect to ap on saves unsigned long _configPortalStart = 0; // ms config portal start time (updated for timeouts) unsigned long _webPortalAccessed = 0; // ms last web access time WiFiMode_t _usermode = WIFI_OFF; @@ -304,6 +305,10 @@ class WiFiManager bool startAP(); uint8_t connectWifi(String ssid, String pass); + bool setSTAConfig(); + bool wifiConnectDefault(); + bool wifiConnectNew(String ssid, String pass); + uint8_t waitForConnectResult(); uint8_t waitForConnectResult(uint16_t timeout); void updateConxResult(uint8_t status);