91 lines
2.4 KiB
C++
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; }
|