|  |  | @ -29,7 +29,8 @@ void ahoywifi::setup(settings_t *config, uint32_t *utcTimestamp, appWifiCb cb) { | 
			
		
	
		
			
				
					|  |  |  |     mUtcTimestamp = utcTimestamp; | 
			
		
	
		
			
				
					|  |  |  |     mAppWifiCb = cb; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     mStaConn    = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  |     mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |     mStaConn = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  |     mCnt        = 0; | 
			
		
	
		
			
				
					|  |  |  |     mScanActive = false; | 
			
		
	
		
			
				
					|  |  |  |     mScanCnt    = 0; | 
			
		
	
	
		
			
				
					|  |  | @ -69,12 +70,35 @@ void ahoywifi::setupWifi(bool startAP = false) { | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void ahoywifi::tickWifiLoop() { | 
			
		
	
		
			
				
					|  |  |  |     static const uint8_t DISCONN_TIMEOUT = 10; | 
			
		
	
		
			
				
					|  |  |  |     static const uint8_t TIMEOUT = 20; | 
			
		
	
		
			
				
					|  |  |  |     static const uint8_t SCAN_TIMEOUT = 10; | 
			
		
	
		
			
				
					|  |  |  |     #if !defined(AP_ONLY) | 
			
		
	
		
			
				
					|  |  |  |     if(mStaConn != GOT_IP) { | 
			
		
	
		
			
				
					|  |  |  |         if (WiFi.softAPgetStationNum() > 0) { // do not reconnect if any AP connection exists
 | 
			
		
	
		
			
				
					|  |  |  |             if(mStaConn != IN_AP_MODE) { | 
			
		
	
		
			
				
					|  |  |  |     uint8_t timeout = (mStaConn == DISCONNECTED) ? DISCONN_TIMEOUT : TIMEOUT; // seconds
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     mCnt++; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     switch (mStaConn) { | 
			
		
	
		
			
				
					|  |  |  |         case IN_STA_MODE: | 
			
		
	
		
			
				
					|  |  |  |             // Nothing to do
 | 
			
		
	
		
			
				
					|  |  |  |             if (mGotDisconnect) { | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = RESET; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |         case IN_AP_MODE: | 
			
		
	
		
			
				
					|  |  |  |             if (WiFi.softAPgetStationNum() == 0) { | 
			
		
	
		
			
				
					|  |  |  |                 mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mDns.stop(); | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.mode(WIFI_AP_STA); | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |                 mDns.processNextRequest(); | 
			
		
	
		
			
				
					|  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |         case DISCONNECTED: | 
			
		
	
		
			
				
					|  |  |  |             if (WiFi.softAPgetStationNum() > 0) { | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = IN_AP_MODE; | 
			
		
	
		
			
				
					|  |  |  |                 // first time switch to AP Mode
 | 
			
		
	
		
			
				
					|  |  |  |                 if (mScanActive) { | 
			
		
	
	
		
			
				
					|  |  | @ -86,56 +110,45 @@ void ahoywifi::tickWifiLoop() { | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.mode(WIFI_AP); | 
			
		
	
		
			
				
					|  |  |  |                 mDns.start(53, "*", mApIp); | 
			
		
	
		
			
				
					|  |  |  |                 mAppWifiCb(true); | 
			
		
	
		
			
				
					|  |  |  |                 mDns.processNextRequest(); | 
			
		
	
		
			
				
					|  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |             } else if (!mScanActive) { | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINT(F("scanning APs with SSID ")); | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINTLN(String(mConfig->sys.stationSsid)); | 
			
		
	
		
			
				
					|  |  |  |                 mScanCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |                 mScanActive = true; | 
			
		
	
		
			
				
					|  |  |  | #if defined(ESP8266) | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.scanNetworks(true, true, 0U, ([this]() { | 
			
		
	
		
			
				
					|  |  |  |                     if (mConfig->sys.isHidden) | 
			
		
	
		
			
				
					|  |  |  |                         return (uint8_t*)NULL; | 
			
		
	
		
			
				
					|  |  |  |                     return (uint8_t*)(mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |                     })()); | 
			
		
	
		
			
				
					|  |  |  | #else | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.scanNetworks(true, true, false, 300U, 0U, ([this]() { | 
			
		
	
		
			
				
					|  |  |  |                     if (mConfig->sys.isHidden) | 
			
		
	
		
			
				
					|  |  |  |                         return (char*)NULL; | 
			
		
	
		
			
				
					|  |  |  |                     return (mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |                     })()); | 
			
		
	
		
			
				
					|  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |                 return; | 
			
		
	
		
			
				
					|  |  |  |             } else if(getBSSIDs()) { | 
			
		
	
		
			
				
					|  |  |  |                 // Scan ready
 | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = SCAN_READY; | 
			
		
	
		
			
				
					|  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |                 // In case of a timeout, what do we do?
 | 
			
		
	
		
			
				
					|  |  |  |                 // For now we start scanning again as the original code did.
 | 
			
		
	
		
			
				
					|  |  |  |                 // Would be better to into PA mode
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 if (isTimeout(SCAN_TIMEOUT)) { | 
			
		
	
		
			
				
					|  |  |  |                     WiFi.scanDelete(); | 
			
		
	
		
			
				
					|  |  |  |                     mScanActive = false; | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             mDns.processNextRequest(); | 
			
		
	
		
			
				
					|  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         else if(mStaConn == IN_AP_MODE) { | 
			
		
	
		
			
				
					|  |  |  |             mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |             mDns.stop(); | 
			
		
	
		
			
				
					|  |  |  |             WiFi.mode(WIFI_AP_STA); | 
			
		
	
		
			
				
					|  |  |  |             mStaConn = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         mCnt++; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         uint8_t timeout = (mStaConn == DISCONNECTED) ? 10 : 20; // seconds
 | 
			
		
	
		
			
				
					|  |  |  |         if (mStaConn == CONNECTED) // connected but no ip
 | 
			
		
	
		
			
				
					|  |  |  |             timeout = 20; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if(!mScanActive && mBSSIDList.empty() && (mStaConn == DISCONNECTED)) { // start scanning APs with the given SSID
 | 
			
		
	
		
			
				
					|  |  |  |             DBGPRINT(F("scanning APs with SSID ")); | 
			
		
	
		
			
				
					|  |  |  |             DBGPRINTLN(String(mConfig->sys.stationSsid)); | 
			
		
	
		
			
				
					|  |  |  |             mScanCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |             mScanActive = true; | 
			
		
	
		
			
				
					|  |  |  |             #if defined(ESP8266) | 
			
		
	
		
			
				
					|  |  |  |             WiFi.scanNetworks(true, true, 0U, ([this] () { | 
			
		
	
		
			
				
					|  |  |  |                 if(mConfig->sys.isHidden) | 
			
		
	
		
			
				
					|  |  |  |                     return (uint8_t *)NULL; | 
			
		
	
		
			
				
					|  |  |  |                 return (uint8_t *)(mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |             })()); | 
			
		
	
		
			
				
					|  |  |  |             #else | 
			
		
	
		
			
				
					|  |  |  |             WiFi.scanNetworks(true, true, false, 300U, 0U, ([this] () { | 
			
		
	
		
			
				
					|  |  |  |                 if(mConfig->sys.isHidden) | 
			
		
	
		
			
				
					|  |  |  |                     return (char*)NULL; | 
			
		
	
		
			
				
					|  |  |  |                 return (mConfig->sys.stationSsid); | 
			
		
	
		
			
				
					|  |  |  |             })()); | 
			
		
	
		
			
				
					|  |  |  |             #endif | 
			
		
	
		
			
				
					|  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         DBGPRINT(F("reconnect in ")); | 
			
		
	
		
			
				
					|  |  |  |         DBGPRINT(String(timeout-mCnt)); | 
			
		
	
		
			
				
					|  |  |  |         DBGPRINTLN(F(" seconds")); | 
			
		
	
		
			
				
					|  |  |  |         if(mScanActive) { | 
			
		
	
		
			
				
					|  |  |  |             getBSSIDs(); | 
			
		
	
		
			
				
					|  |  |  |             if((!mScanActive) && (!mBSSIDList.empty()))  // scan completed
 | 
			
		
	
		
			
				
					|  |  |  |                 if ((mCnt % timeout) < timeout - 2) | 
			
		
	
		
			
				
					|  |  |  |                     mCnt = timeout - 2; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         if((mCnt % timeout) == 0) { // try to reconnect after x sec without connection
 | 
			
		
	
		
			
				
					|  |  |  |             mStaConn = CONNECTING; | 
			
		
	
		
			
				
					|  |  |  |             WiFi.disconnect(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             if(mBSSIDList.size() > 0) { // get first BSSID in list
 | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |         case SCAN_READY: | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = CONNECTING; | 
			
		
	
		
			
				
					|  |  |  |                 mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINT(F("try to connect to AP with BSSID:")); | 
			
		
	
		
			
				
					|  |  |  |                 uint8_t bssid[6]; | 
			
		
	
		
			
				
					|  |  |  |                 for (int j = 0; j < 6; j++) { | 
			
		
	
	
		
			
				
					|  |  | @ -144,17 +157,47 @@ void ahoywifi::tickWifiLoop() { | 
			
		
	
		
			
				
					|  |  |  |                     DBGPRINT(" "  + String(bssid[j], HEX)); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINTLN(""); | 
			
		
	
		
			
				
					|  |  |  |                 mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd, 0, &bssid[0]); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             else | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             mCnt = 0; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |                 break; | 
			
		
	
		
			
				
					|  |  |  |         case CONNECTING: | 
			
		
	
		
			
				
					|  |  |  |             if (isTimeout(TIMEOUT)) { | 
			
		
	
		
			
				
					|  |  |  |                 WiFi.disconnect(); | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = mBSSIDList.empty() ? DISCONNECTED : SCAN_READY; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |         case CONNECTED: | 
			
		
	
		
			
				
					|  |  |  |             // Connection but no IP yet
 | 
			
		
	
		
			
				
					|  |  |  |             if (isTimeout(TIMEOUT) || mGotDisconnect) { | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = RESET; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |         case GOT_IP: | 
			
		
	
		
			
				
					|  |  |  |             welcome(WiFi.localIP().toString(), F(" (Station)")); | 
			
		
	
		
			
				
					|  |  |  |             WiFi.softAPdisconnect(); | 
			
		
	
		
			
				
					|  |  |  |             WiFi.mode(WIFI_STA); | 
			
		
	
		
			
				
					|  |  |  |             DBGPRINTLN(F("[WiFi] AP disabled")); | 
			
		
	
		
			
				
					|  |  |  |             delay(100); | 
			
		
	
		
			
				
					|  |  |  |             mAppWifiCb(true); | 
			
		
	
		
			
				
					|  |  |  |             mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |             mStaConn = IN_STA_MODE; | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |         case RESET: | 
			
		
	
		
			
				
					|  |  |  |             mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |             mStaConn = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  |             mCnt = 5;     // try to reconnect in 5 sec
 | 
			
		
	
		
			
				
					|  |  |  |             setupWifi();        // reconnect with AP / Station setup
 | 
			
		
	
		
			
				
					|  |  |  |             mAppWifiCb(false); | 
			
		
	
		
			
				
					|  |  |  |             DPRINTLN(DBG_INFO, "[WiFi] Connection Lost"); | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |         default: | 
			
		
	
		
			
				
					|  |  |  |             DBGPRINTLN(F("Unhandled status")); | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void ahoywifi::setupAp(void) { | 
			
		
	
	
		
			
				
					|  |  | @ -213,7 +256,7 @@ void ahoywifi::setupStation(void) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | bool ahoywifi::getNtpTime(void) { | 
			
		
	
		
			
				
					|  |  |  |     if(GOT_IP != mStaConn) | 
			
		
	
		
			
				
					|  |  |  |     if(IN_STA_MODE != mStaConn) | 
			
		
	
		
			
				
					|  |  |  |         return false; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     IPAddress timeServer; | 
			
		
	
	
		
			
				
					|  |  | @ -314,11 +357,12 @@ bool ahoywifi::getAvailNetworks(JsonObject obj) { | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
		
			
				
					|  |  |  | void ahoywifi::getBSSIDs() { | 
			
		
	
		
			
				
					|  |  |  | bool ahoywifi::getBSSIDs() { | 
			
		
	
		
			
				
					|  |  |  |     bool result = false; | 
			
		
	
		
			
				
					|  |  |  |     int n = WiFi.scanComplete(); | 
			
		
	
		
			
				
					|  |  |  |     if (n < 0) { | 
			
		
	
		
			
				
					|  |  |  |         if (++mScanCnt < 20) | 
			
		
	
		
			
				
					|  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     if(n > 0) { | 
			
		
	
		
			
				
					|  |  |  |         mBSSIDList.clear(); | 
			
		
	
	
		
			
				
					|  |  | @ -333,9 +377,11 @@ void ahoywifi::getBSSIDs() { | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             DBGPRINTLN(""); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         result = true; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     mScanActive = false; | 
			
		
	
		
			
				
					|  |  |  |     WiFi.scanDelete(); | 
			
		
	
		
			
				
					|  |  |  |     return result; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //-----------------------------------------------------------------------------
 | 
			
		
	
	
		
			
				
					|  |  | @ -346,32 +392,17 @@ void ahoywifi::connectionEvent(WiFiStatus_t status) { | 
			
		
	
		
			
				
					|  |  |  |         case CONNECTED: | 
			
		
	
		
			
				
					|  |  |  |             if(mStaConn != CONNECTED) { | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = CONNECTED; | 
			
		
	
		
			
				
					|  |  |  |                 mGotDisconnect = false; | 
			
		
	
		
			
				
					|  |  |  |                 DBGPRINTLN(F("\n[WiFi] Connected")); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         case GOT_IP: | 
			
		
	
		
			
				
					|  |  |  |             mStaConn = GOT_IP; | 
			
		
	
		
			
				
					|  |  |  |             if (mScanActive) {  // maybe another scan has started
 | 
			
		
	
		
			
				
					|  |  |  |                  WiFi.scanDelete(); | 
			
		
	
		
			
				
					|  |  |  |                  mScanActive = false; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             welcome(WiFi.localIP().toString(), F(" (Station)")); | 
			
		
	
		
			
				
					|  |  |  |             WiFi.softAPdisconnect(); | 
			
		
	
		
			
				
					|  |  |  |             WiFi.mode(WIFI_STA); | 
			
		
	
		
			
				
					|  |  |  |             DBGPRINTLN(F("[WiFi] AP disabled")); | 
			
		
	
		
			
				
					|  |  |  |             delay(100); | 
			
		
	
		
			
				
					|  |  |  |             mAppWifiCb(true); | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         case DISCONNECTED: | 
			
		
	
		
			
				
					|  |  |  |             if(mStaConn != CONNECTING) { | 
			
		
	
		
			
				
					|  |  |  |                 mStaConn = DISCONNECTED; | 
			
		
	
		
			
				
					|  |  |  |                 mCnt       = 5;     // try to reconnect in 5 sec
 | 
			
		
	
		
			
				
					|  |  |  |                 setupWifi();        // reconnect with AP / Station setup
 | 
			
		
	
		
			
				
					|  |  |  |                 mAppWifiCb(false); | 
			
		
	
		
			
				
					|  |  |  |                 DPRINTLN(DBG_INFO, "[WiFi] Connection Lost"); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             mGotDisconnect = true; | 
			
		
	
		
			
				
					|  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         default: | 
			
		
	
	
		
			
				
					|  |  | 
 |