#include "wifi_manager.h" #include "config.h" #include #include static Preferences prefs; static bool wifi_log_save_failure(const char *key, const char *reason) { if (SERIAL_DEBUG_MODE) { Serial.printf("wifi_cfg: save failed key=%s reason=%s\n", key, reason); } return false; } static bool wifi_write_string_pref(const char *key, const String &value) { size_t written = prefs.putString(key, value); if (written != value.length()) { return wifi_log_save_failure(key, "write_short"); } if (!prefs.isKey(key)) { return wifi_log_save_failure(key, "missing_key"); } String readback = prefs.getString(key, ""); if (readback != value) { return wifi_log_save_failure(key, "verify_mismatch"); } return true; } static bool wifi_write_bool_pref(const char *key, bool value) { size_t written = prefs.putBool(key, value); if (written != sizeof(uint8_t)) { return wifi_log_save_failure(key, "write_short"); } if (!prefs.isKey(key)) { return wifi_log_save_failure(key, "missing_key"); } bool readback = prefs.getBool(key, !value); if (readback != value) { return wifi_log_save_failure(key, "verify_mismatch"); } return true; } static bool wifi_write_ushort_pref(const char *key, uint16_t value) { size_t written = prefs.putUShort(key, value); if (written != sizeof(uint16_t)) { return wifi_log_save_failure(key, "write_short"); } if (!prefs.isKey(key)) { return wifi_log_save_failure(key, "missing_key"); } uint16_t fallback = value == static_cast(0xFFFF) ? 0 : static_cast(0xFFFF); uint16_t readback = prefs.getUShort(key, fallback); if (readback != value) { return wifi_log_save_failure(key, "verify_mismatch"); } return true; } void wifi_manager_init() { prefs.begin("dd3cfg", false); } bool wifi_load_config(WifiMqttConfig &config) { config.valid = prefs.getBool("valid", false); config.ssid = prefs.getString("ssid", ""); config.password = prefs.getString("pass", ""); config.mqtt_host = prefs.getString("mqhost", ""); config.mqtt_port = prefs.getUShort("mqport", 1883); config.mqtt_user = prefs.getString("mquser", ""); config.mqtt_pass = prefs.getString("mqpass", ""); config.ntp_server_1 = prefs.getString("ntp1", "pool.ntp.org"); config.ntp_server_2 = prefs.getString("ntp2", "time.nist.gov"); config.web_user = prefs.getString("webuser", WEB_AUTH_DEFAULT_USER); config.web_pass = prefs.getString("webpass", WEB_AUTH_DEFAULT_PASS); if (!config.valid) { return false; } return config.ssid.length() > 0 && config.mqtt_host.length() > 0; } bool wifi_save_config(const WifiMqttConfig &config) { if (!wifi_write_bool_pref("valid", true)) { return false; } if (!wifi_write_string_pref("ssid", config.ssid)) { return false; } if (!wifi_write_string_pref("pass", config.password)) { return false; } if (!wifi_write_string_pref("mqhost", config.mqtt_host)) { return false; } if (!wifi_write_ushort_pref("mqport", config.mqtt_port)) { return false; } if (!wifi_write_string_pref("mquser", config.mqtt_user)) { return false; } if (!wifi_write_string_pref("mqpass", config.mqtt_pass)) { return false; } if (!wifi_write_string_pref("ntp1", config.ntp_server_1)) { return false; } if (!wifi_write_string_pref("ntp2", config.ntp_server_2)) { return false; } if (!wifi_write_string_pref("webuser", config.web_user)) { return false; } if (!wifi_write_string_pref("webpass", config.web_pass)) { return false; } return true; } bool wifi_connect_sta(const WifiMqttConfig &config, uint32_t timeout_ms) { WiFi.mode(WIFI_STA); WiFi.begin(config.ssid.c_str(), config.password.c_str()); uint32_t start = millis(); while (WiFi.status() != WL_CONNECTED && millis() - start < timeout_ms) { delay(200); } bool connected = WiFi.status() == WL_CONNECTED; if (connected) { esp_wifi_set_ps(WIFI_PS_MIN_MODEM); } return connected; } void wifi_start_ap(const char *ap_ssid, const char *ap_pass) { WiFi.mode(WIFI_AP); WiFi.softAP(ap_ssid, ap_pass); } bool wifi_is_connected() { return WiFi.status() == WL_CONNECTED; } String wifi_get_ssid() { return WiFi.SSID(); }