@@ -345,6 +345,10 @@ void Mycila::ESPConnect::loop() {
345
345
if (_dnsServer != nullptr )
346
346
_dnsServer->processNextRequest ();
347
347
348
+ #ifndef ESPCONNECT_NO_MUTEX
349
+ std::lock_guard<std::mutex> lock (_mutex);
350
+ #endif
351
+
348
352
// first check if we have to enter AP mode
349
353
if (_state == Mycila::ESPConnect::State::NETWORK_ENABLED && _config.apMode ) {
350
354
_startAP ();
@@ -396,13 +400,34 @@ void Mycila::ESPConnect::loop() {
396
400
_disableCaptivePortal ();
397
401
}
398
402
399
- if (_state == Mycila::ESPConnect::State::PORTAL_COMPLETE || _state == Mycila::ESPConnect::State::PORTAL_TIMEOUT) {
403
+ if (_state == Mycila::ESPConnect::State::PORTAL_TIMEOUT) {
404
+ LOGW (TAG, " Portal timeout!" );
400
405
_stopAP ();
401
406
if (_autoRestart) {
402
- LOGW (TAG, " Auto Restart of ESP..." );
407
+ LOGW (TAG, " Restarting ESP..." );
403
408
ESP.restart ();
404
- } else
409
+ } else {
410
+ // try to reconnect again with configured settings
405
411
_setState (Mycila::ESPConnect::State::NETWORK_ENABLED);
412
+ }
413
+ }
414
+
415
+ if (_state == Mycila::ESPConnect::State::PORTAL_COMPLETE) {
416
+ if (_autoRestart) {
417
+ if (!_restartRequestTime) {
418
+ // init _restartRequestTime if not already set to teh time when the portal completed
419
+ _restartRequestTime = millis ();
420
+ } else if (millis () - _restartRequestTime >= _restartDelay) {
421
+ // delay is over restart
422
+ LOGW (TAG, " Auto Restart of ESP..." );
423
+ _stopAP ();
424
+ ESP.restart ();
425
+ }
426
+ } else {
427
+ _stopAP ();
428
+ // try to reconnect again with new configured settings
429
+ _setState (Mycila::ESPConnect::State::NETWORK_ENABLED);
430
+ }
406
431
}
407
432
}
408
433
@@ -804,6 +829,10 @@ void Mycila::ESPConnect::_onWiFiEvent(WiFiEvent_t event) {
804
829
if (_state == Mycila::ESPConnect::State::NETWORK_DISABLED)
805
830
return ;
806
831
832
+ #ifndef ESPCONNECT_NO_MUTEX
833
+ std::lock_guard<std::mutex> lock (_mutex);
834
+ #endif
835
+
807
836
switch (event) {
808
837
#ifdef ESPCONNECT_ETH_SUPPORT
809
838
case ARDUINO_EVENT_ETH_START:
@@ -836,21 +865,23 @@ void Mycila::ESPConnect::_onWiFiEvent(WiFiEvent_t event) {
836
865
837
866
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
838
867
LOGD (TAG, " [%s] WiFiEvent: ARDUINO_EVENT_WIFI_STA_GOT_IP: %s" , getStateName (), WiFi.localIP ().toString ().c_str ());
839
- #ifndef ESPCONNECT_NO_MDNS
840
- MDNS.begin (_config.hostname .c_str ());
841
- #endif
842
868
if (_state == Mycila::ESPConnect::State::NETWORK_CONNECTING || _state == Mycila::ESPConnect::State::NETWORK_RECONNECTING) {
843
869
_lastTime = -1 ;
844
870
_setState (Mycila::ESPConnect::State::NETWORK_CONNECTED);
845
871
}
872
+ #ifndef ESPCONNECT_NO_MDNS
873
+ MDNS.begin (_config.hostname .c_str ());
874
+ #endif
846
875
break ;
847
876
848
877
#ifndef ESP8266
849
878
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
850
- LOGD (TAG, " [%s] WiFiEvent: ARDUINO_EVENT_WIFI_STA_GOT_IP6: %s" , getStateName (), WiFi.globalIPv6 ().toString ().c_str ());
851
- if (_state == Mycila::ESPConnect::State::NETWORK_CONNECTING || _state == Mycila::ESPConnect::State::NETWORK_RECONNECTING) {
852
- _lastTime = -1 ;
853
- _setState (Mycila::ESPConnect::State::NETWORK_CONNECTED);
879
+ if (WiFi.globalIPv6 () != IN6ADDR_ANY) {
880
+ LOGD (TAG, " [%s] WiFiEvent: ARDUINO_EVENT_WIFI_STA_GOT_IP6: %s" , getStateName (), WiFi.globalIPv6 ().toString ().c_str ());
881
+ if (_state == Mycila::ESPConnect::State::NETWORK_CONNECTING || _state == Mycila::ESPConnect::State::NETWORK_RECONNECTING) {
882
+ _lastTime = -1 ;
883
+ _setState (Mycila::ESPConnect::State::NETWORK_CONNECTED);
884
+ }
854
885
}
855
886
break ;
856
887
#endif
@@ -867,7 +898,7 @@ void Mycila::ESPConnect::_onWiFiEvent(WiFiEvent_t event) {
867
898
// we have to move to state disconnected only if we are not connected to ethernet
868
899
#ifdef ESPCONNECT_ETH_SUPPORT
869
900
if (ETH.linkUp () && ETH.localIP ()[0 ] != 0 )
870
- return ;
901
+ break ;
871
902
#endif
872
903
_setState (Mycila::ESPConnect::State::NETWORK_DISCONNECTED);
873
904
}
0 commit comments