Wifi AP start after 10 sec, stay if not connected

This commit is contained in:
MichaelDvP
2023-10-27 10:28:59 +02:00
parent 900112a967
commit fcdc4314e3
2 changed files with 37 additions and 6 deletions

View File

@@ -7,13 +7,43 @@ APSettingsService::APSettingsService(AsyncWebServer * server, FS * fs, SecurityM
, _fsPersistence(APSettings::read, APSettings::update, this, fs, AP_SETTINGS_FILE) , _fsPersistence(APSettings::read, APSettings::update, this, fs, AP_SETTINGS_FILE)
, _dnsServer(nullptr) , _dnsServer(nullptr)
, _lastManaged(0) , _lastManaged(0)
, _reconfigureAp(false) { , _reconfigureAp(false)
, _connected(0) {
addUpdateHandler([&](const String & originId) { reconfigureAP(); }, false); addUpdateHandler([&](const String & originId) { reconfigureAP(); }, false);
WiFi.onEvent(std::bind(&APSettingsService::WiFiEvent, this, _1));
} }
void APSettingsService::begin() { void APSettingsService::begin() {
_fsPersistence.readFromFS(); _fsPersistence.readFromFS();
reconfigureAP(); // disabled for delayed start, first try station mode
// reconfigureAP();
}
// wait 10 sec on STA disconnect before starting AP
void APSettingsService::WiFiEvent(WiFiEvent_t event) {
uint8_t was_connected = _connected;
switch (event) {
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
_connected &= ~1;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
_connected &= ~2;
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
_connected |= 1;
break;
case ARDUINO_EVENT_ETH_GOT_IP:
case ARDUINO_EVENT_ETH_GOT_IP6:
_connected |= 2;
break;
default:
break;
}
// wait 10 sec before starting AP
if (was_connected && !_connected) {
_lastManaged = uuid::get_uptime();
}
} }
void APSettingsService::reconfigureAP() { void APSettingsService::reconfigureAP() {
@@ -34,12 +64,11 @@ void APSettingsService::loop() {
void APSettingsService::manageAP() { void APSettingsService::manageAP() {
WiFiMode_t currentWiFiMode = WiFi.getMode(); WiFiMode_t currentWiFiMode = WiFi.getMode();
bool network_connected = (emsesp::EMSESP::system_.ethernet_connected() || (WiFi.status() == WL_CONNECTED)); if (_state.provisionMode == AP_MODE_ALWAYS || (_state.provisionMode == AP_MODE_DISCONNECTED && !_connected)) {
if (_state.provisionMode == AP_MODE_ALWAYS || (_state.provisionMode == AP_MODE_DISCONNECTED && !network_connected)) {
if (_reconfigureAp || currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) { if (_reconfigureAp || currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) {
startAP(); startAP();
} }
} else if ((currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA) && (_reconfigureAp || !WiFi.softAPgetStationNum())) { } else if ((currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA) && _connected && (_reconfigureAp || !WiFi.softAPgetStationNum())) {
stopAP(); stopAP();
} }
_reconfigureAp = false; _reconfigureAp = false;

View File

@@ -134,12 +134,14 @@ class APSettingsService : public StatefulService<APSettings> {
// for the management delay loop // for the management delay loop
volatile unsigned long _lastManaged; volatile unsigned long _lastManaged;
volatile boolean _reconfigureAp; volatile boolean _reconfigureAp;
uint8_t _connected;
void reconfigureAP(); void reconfigureAP();
void manageAP(); void manageAP();
void startAP(); void startAP();
void stopAP(); void stopAP();
void handleDNS(); void handleDNS();
void WiFiEvent(WiFiEvent_t event);
}; };
#endif #endif