39a86b0411
Allow config to be accessed from outside the framework core code.
95 lines
2.5 KiB
C++
95 lines
2.5 KiB
C++
#include <APSettingsService.h>
|
|
|
|
APSettingsService::APSettingsService(AsyncWebServer* server, FS* fs, SecurityManager* securityManager) :
|
|
AdminSettingsService(server, fs, securityManager, AP_SETTINGS_SERVICE_PATH, AP_SETTINGS_FILE) {
|
|
}
|
|
|
|
APSettingsService::~APSettingsService() {
|
|
}
|
|
|
|
void APSettingsService::begin() {
|
|
SettingsService::begin();
|
|
reconfigureAP();
|
|
}
|
|
|
|
void APSettingsService::reconfigureAP() {
|
|
_lastManaged = millis() - MANAGE_NETWORK_DELAY;
|
|
}
|
|
|
|
void APSettingsService::loop() {
|
|
unsigned long currentMillis = millis();
|
|
unsigned long manageElapsed = (unsigned long)(currentMillis - _lastManaged);
|
|
if (manageElapsed >= MANAGE_NETWORK_DELAY) {
|
|
_lastManaged = currentMillis;
|
|
manageAP();
|
|
}
|
|
handleDNS();
|
|
}
|
|
|
|
void APSettingsService::manageAP() {
|
|
WiFiMode_t currentWiFiMode = WiFi.getMode();
|
|
if (_settings.provisionMode == AP_MODE_ALWAYS ||
|
|
(_settings.provisionMode == AP_MODE_DISCONNECTED && WiFi.status() != WL_CONNECTED)) {
|
|
if (currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) {
|
|
startAP();
|
|
}
|
|
} else {
|
|
if (currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA) {
|
|
stopAP();
|
|
}
|
|
}
|
|
}
|
|
|
|
void APSettingsService::startAP() {
|
|
Serial.println("Starting software access point");
|
|
WiFi.softAP(_settings.ssid.c_str(), _settings.password.c_str());
|
|
if (!_dnsServer) {
|
|
IPAddress apIp = WiFi.softAPIP();
|
|
Serial.print("Starting captive portal on ");
|
|
Serial.println(apIp);
|
|
_dnsServer = new DNSServer;
|
|
_dnsServer->start(DNS_PORT, "*", apIp);
|
|
}
|
|
}
|
|
|
|
void APSettingsService::stopAP() {
|
|
if (_dnsServer) {
|
|
Serial.println("Stopping captive portal");
|
|
_dnsServer->stop();
|
|
delete _dnsServer;
|
|
_dnsServer = nullptr;
|
|
}
|
|
Serial.println("Stopping software access point");
|
|
WiFi.softAPdisconnect(true);
|
|
}
|
|
|
|
void APSettingsService::handleDNS() {
|
|
if (_dnsServer) {
|
|
_dnsServer->processNextRequest();
|
|
}
|
|
}
|
|
|
|
void APSettingsService::readFromJsonObject(JsonObject& root) {
|
|
_settings.provisionMode = root["provision_mode"] | AP_MODE_ALWAYS;
|
|
switch (_settings.provisionMode) {
|
|
case AP_MODE_ALWAYS:
|
|
case AP_MODE_DISCONNECTED:
|
|
case AP_MODE_NEVER:
|
|
break;
|
|
default:
|
|
_settings.provisionMode = AP_MODE_ALWAYS;
|
|
}
|
|
_settings.ssid = root["ssid"] | AP_DEFAULT_SSID;
|
|
_settings.password = root["password"] | AP_DEFAULT_PASSWORD;
|
|
}
|
|
|
|
void APSettingsService::writeToJsonObject(JsonObject& root) {
|
|
root["provision_mode"] = _settings.provisionMode;
|
|
root["ssid"] = _settings.ssid;
|
|
root["password"] = _settings.password;
|
|
}
|
|
|
|
void APSettingsService::onConfigUpdated() {
|
|
reconfigureAP();
|
|
}
|