126 lines
3.7 KiB
C++
126 lines
3.7 KiB
C++
#include "ssid_manager.h"
|
|
|
|
#include <algorithm>
|
|
#include <esp_log.h>
|
|
#include <nvs_flash.h>
|
|
|
|
#define TAG "SsidManager"
|
|
#define NVS_NAMESPACE "wifi"
|
|
#define MAX_WIFI_SSID_COUNT 10
|
|
|
|
SsidManager::SsidManager() {
|
|
LoadFromNvs();
|
|
}
|
|
|
|
SsidManager::~SsidManager() {
|
|
}
|
|
|
|
void SsidManager::Clear() {
|
|
ssid_list_.clear();
|
|
SaveToNvs();
|
|
}
|
|
|
|
void SsidManager::LoadFromNvs() {
|
|
ssid_list_.clear();
|
|
|
|
// Load ssid and password from NVS from namespace "wifi"
|
|
// ssid, ssid1, ssid2, ... ssid9
|
|
// password, password1, password2, ... password9
|
|
nvs_handle_t nvs_handle;
|
|
auto ret = nvs_open(NVS_NAMESPACE, NVS_READONLY, &nvs_handle);
|
|
if (ret != ESP_OK) {
|
|
// The namespace doesn't exist, just return
|
|
ESP_LOGW(TAG, "NVS namespace %s doesn't exist", NVS_NAMESPACE);
|
|
return;
|
|
}
|
|
for (int i = 0; i < MAX_WIFI_SSID_COUNT; i++) {
|
|
std::string ssid_key = "ssid";
|
|
if (i > 0) {
|
|
ssid_key += std::to_string(i);
|
|
}
|
|
std::string password_key = "password";
|
|
if (i > 0) {
|
|
password_key += std::to_string(i);
|
|
}
|
|
|
|
char ssid[33];
|
|
char password[65];
|
|
size_t length = sizeof(ssid);
|
|
if (nvs_get_str(nvs_handle, ssid_key.c_str(), ssid, &length) != ESP_OK) {
|
|
continue;
|
|
}
|
|
length = sizeof(password);
|
|
if (nvs_get_str(nvs_handle, password_key.c_str(), password, &length) != ESP_OK) {
|
|
continue;
|
|
}
|
|
ssid_list_.push_back({ssid, password});
|
|
}
|
|
nvs_close(nvs_handle);
|
|
}
|
|
|
|
void SsidManager::SaveToNvs() {
|
|
nvs_handle_t nvs_handle;
|
|
ESP_ERROR_CHECK(nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs_handle));
|
|
for (int i = 0; i < MAX_WIFI_SSID_COUNT; i++) {
|
|
std::string ssid_key = "ssid";
|
|
if (i > 0) {
|
|
ssid_key += std::to_string(i);
|
|
}
|
|
std::string password_key = "password";
|
|
if (i > 0) {
|
|
password_key += std::to_string(i);
|
|
}
|
|
|
|
if (i < ssid_list_.size()) {
|
|
nvs_set_str(nvs_handle, ssid_key.c_str(), ssid_list_[i].ssid.c_str());
|
|
nvs_set_str(nvs_handle, password_key.c_str(), ssid_list_[i].password.c_str());
|
|
} else {
|
|
nvs_erase_key(nvs_handle, ssid_key.c_str());
|
|
nvs_erase_key(nvs_handle, password_key.c_str());
|
|
}
|
|
}
|
|
nvs_commit(nvs_handle);
|
|
nvs_close(nvs_handle);
|
|
}
|
|
|
|
void SsidManager::AddSsid(const std::string& ssid, const std::string& password) {
|
|
for (auto& item : ssid_list_) {
|
|
ESP_LOGI(TAG, "compare [%s:%d] [%s:%d]", item.ssid.c_str(), item.ssid.size(), ssid.c_str(), ssid.size());
|
|
if (item.ssid == ssid) {
|
|
ESP_LOGW(TAG, "SSID %s already exists, overwrite it", ssid.c_str());
|
|
item.password = password;
|
|
SaveToNvs();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (ssid_list_.size() >= MAX_WIFI_SSID_COUNT) {
|
|
ESP_LOGW(TAG, "SSID list is full, pop one");
|
|
ssid_list_.pop_back();
|
|
}
|
|
// Add the new ssid to the front of the list
|
|
ssid_list_.insert(ssid_list_.begin(), {ssid, password});
|
|
SaveToNvs();
|
|
}
|
|
|
|
void SsidManager::RemoveSsid(int index) {
|
|
if (index < 0 || index >= ssid_list_.size()) {
|
|
ESP_LOGW(TAG, "Invalid index %d", index);
|
|
return;
|
|
}
|
|
ssid_list_.erase(ssid_list_.begin() + index);
|
|
SaveToNvs();
|
|
}
|
|
|
|
void SsidManager::SetDefaultSsid(int index) {
|
|
if (index < 0 || index >= ssid_list_.size()) {
|
|
ESP_LOGW(TAG, "Invalid index %d", index);
|
|
return;
|
|
}
|
|
// Move the ssid at index to the front of the list
|
|
auto item = ssid_list_[index];
|
|
ssid_list_.erase(ssid_list_.begin() + index);
|
|
ssid_list_.insert(ssid_list_.begin(), item);
|
|
SaveToNvs();
|
|
}
|