add some code
This commit is contained in:
125
managed_components/78__esp-wifi-connect/ssid_manager.cc
Normal file
125
managed_components/78__esp-wifi-connect/ssid_manager.cc
Normal file
@@ -0,0 +1,125 @@
|
||||
#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();
|
||||
}
|
||||
Reference in New Issue
Block a user