Files
immich-frame/src/wifi_manager.cpp
2026-08-31 13:23:39 -04:00

91 lines
2.3 KiB
C++

#include "wifi_manager.h"
#include <WiFi.h>
#include <ESPmDNS.h>
#include "config.h"
void WiFiManager::begin(SettingsManager& settings) {
_settings = &settings;
if (!_settings->isProvisioned()) {
Serial.println("[wifi] Not provisioned — starting AP");
startAP();
return;
}
startStation();
}
bool WiFiManager::isConnected() {
return WiFi.status() == WL_CONNECTED;
}
bool WiFiManager::isAPMode() {
return _apMode;
}
String WiFiManager::getIP() {
if (_apMode) {
return WiFi.softAPIP().toString();
}
return WiFi.localIP().toString();
}
int WiFiManager::getRSSI() {
if (_apMode) return 0;
return WiFi.RSSI();
}
void WiFiManager::startAP() {
WiFi.disconnect(true);
WiFi.mode(WIFI_AP);
WiFi.softAP("PaperColor-Setup");
_apMode = true;
Serial.printf("[wifi] AP started: PaperColor-Setup, IP: %s\n",
WiFi.softAPIP().toString().c_str());
}
void WiFiManager::startStation() {
Settings s = _settings->get();
WiFi.disconnect(true);
WiFi.mode(WIFI_STA);
_apMode = false;
Serial.printf("[wifi] Connecting to: %s\n", s.wifi_ssid.c_str());
for (_retryCount = 0; _retryCount < WIFI_MAX_RETRIES; _retryCount++) {
if (attemptConnection(s.wifi_ssid, s.wifi_pass)) {
Serial.printf("[wifi] Connected! IP: %s, RSSI: %d\n",
WiFi.localIP().toString().c_str(), WiFi.RSSI());
WiFi.setSleep(WIFI_PS_MIN_MODEM);
setupMDNS("papercolor");
return;
}
Serial.printf("[wifi] Attempt %d/%d failed\n", _retryCount + 1, WIFI_MAX_RETRIES);
}
Serial.println("[wifi] All attempts failed — falling back to AP mode");
startAP();
}
void WiFiManager::setupMDNS(const char* hostname) {
if (MDNS.begin(hostname)) {
MDNS.addService("http", "tcp", 80);
Serial.printf("[wifi] mDNS: %s.local\n", hostname);
} else {
Serial.println("[wifi] mDNS failed to start");
}
}
bool WiFiManager::attemptConnection(const String& ssid, const String& pass) {
WiFi.begin(ssid.c_str(), pass.c_str());
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED) {
if (millis() - start > WIFI_CONNECT_TIMEOUT_MS) {
return false;
}
delay(100);
}
return true;
}