Files
Mqtt-Dcc/src/WifiManager.cpp
T
2026-08-05 09:14:31 +02:00

91 lines
2.4 KiB
C++

#include "WifiManager.h"
#include "config.h"
#include <Preferences.h>
#include <functional>
static const char* AP_SSID = DEFAULT_AP_SSID;
WifiManager::WifiManager(): ssid(""), pass(""), apMode(false) {}
void WifiManager::loadCredentials() {
Preferences prefs;
prefs.begin("dcc", true);
ssid = prefs.getString("ssid", "");
pass = prefs.getString("pass", "");
prefs.end();
}
void WifiManager::saveCredentials(const String &s, const String &p) {
Preferences prefs;
prefs.begin("dcc", false);
prefs.putString("ssid", s);
prefs.putString("pass", p);
prefs.end();
}
void WifiManager::startAP() {
apMode = true;
WiFi.mode(WIFI_AP);
WiFi.softAP(AP_SSID);
IPAddress ip = WiFi.softAPIP();
Serial.print("AP started: ");
Serial.println(AP_SSID);
Serial.print("Configure at http://");
Serial.println(ip);
server.on("/", std::bind(&WifiManager::handleRoot, this));
server.on("/save", std::bind(&WifiManager::handleSave, this));
server.begin();
}
void WifiManager::handleRoot() {
String page = "<html><body><h1>Configure WiFi</h1>"
"<form action=\"/save\" method=\"POST\">"
"SSID: <input name=\"ssid\"><br>"
"Password: <input name=\"pass\" type=\"password\"><br>"
"<input type=\"submit\" value=\"Save\"></form></body></html>";
server.send(200, "text/html", page);
}
void WifiManager::handleSave() {
if (server.hasArg("ssid")) {
String s = server.arg("ssid");
String p = server.arg("pass");
saveCredentials(s, p);
String resp = "<html><body>Saved. Rebooting...</body></html>";
server.send(200, "text/html", resp);
delay(1000);
ESP.restart();
} else {
server.send(400, "text/plain", "Missing ssid");
}
}
void WifiManager::begin() {
loadCredentials();
if (ssid.length() > 0) {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid.c_str(), pass.c_str());
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
delay(250);
Serial.print('.');
}
Serial.println();
}
if (WiFi.status() == WL_CONNECTED) {
Serial.print("WiFi connected, IP: ");
Serial.println(WiFi.localIP());
apMode = false;
} else {
startAP();
}
}
bool WifiManager::isConnected() { return WiFi.status() == WL_CONNECTED; }
void WifiManager::loop() { if (apMode) server.handleClient(); }
String WifiManager::getSSID() { return ssid; }
String WifiManager::getPassword() { return pass; }