/// © MiroZ 2024 #include #include #include #include #include "Settings.h" #include "errors.h" #include static const char *TAG = "Settings"; Settings & Settings::getInstance() { static Settings instance; return instance; } Settings::Settings() { ESP_LOGI(TAG, "Starting settings..."); loadData(); if(m_data.version != SETTINGS_VERSION) setDefaults(); } uint32_t Settings::loadData() { esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { // NVS partition was truncated and needs to be erased // Retry nvs_flash_init ESP_ERROR_CHECK(nvs_flash_erase()); ESP_ERROR_CHECK(nvs_flash_init()); } nvs_handle handle; ESP_ERROR_CHECK(nvs_open(m_namespace, NVS_READWRITE, &handle)); size_t key_size = 0; err = nvs_get_blob(handle, m_dataname, NULL, &key_size); if(err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) { ESP_LOGE(TAG, "Unable to read NVS key: (%d) %s", err, esp_err_to_name(err)); abort(); } if(key_size != sizeof(m_data)) { ESP_LOGI(TAG, "Stored len (%d) doesn't match expected (%d), using default settings", key_size, sizeof(m_data)); setDefaults(); ESP_ERROR_CHECK(nvs_set_blob(handle, m_dataname, &m_data, sizeof(m_data))); } else { ESP_LOGI(TAG, "reading blob"); ESP_ERROR_CHECK(nvs_get_blob(handle, m_dataname, &m_data, &key_size)); } nvs_close(handle); return WH_OK; } uint32_t Settings::saveData() { nvs_handle handle; ESP_ERROR_CHECK(nvs_open(m_namespace, NVS_READWRITE, &handle)); ESP_ERROR_CHECK(nvs_set_blob(handle, m_dataname, &m_data, sizeof(m_data))); nvs_close(handle); return WH_OK; } void Settings::setDefaults() { ESP_LOGI(TAG, "Setting defaults"); memset(&m_data, 0, sizeof(m_data)); m_data.version = SETTINGS_VERSION; m_data.led.brightness = 25; // 25 % // strcpy(m_data.wifi.entry[0].ssid, "gumball"); // strcpy(m_data.wifi.entry[0].pwd, "mikelemembe"); // strcpy(m_data.wifi.entry[1].ssid, "miro"); // strcpy(m_data.wifi.entry[1].pwd, "mikelemembe"); // m_data.wifi.num = 2; // m_data.wifi.selected = 0xff; }