libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp32_nvs_flash_database.hpp
1#pragma once
2
3#include <cstring>
4
5#include "libxr.hpp"
6#include "libxr_def.hpp"
7#include "libxr_type.hpp"
8#include "nvs.h"
9#include "nvs_flash.h"
10
11namespace LibXR
12{
13
15{
16 public:
21 explicit ESP32NvsFlashDatabase(const char* namespace_name = "storage")
22 : namespace_(namespace_name)
23 {
24 esp_err_t err = nvs_flash_init();
25 if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND)
26 {
27 nvs_flash_erase();
28 err = nvs_flash_init();
29 }
30 valid_ = (err == ESP_OK);
31 }
32
36 bool IsValid() const { return valid_; }
37
38 private:
39 const char* namespace_;
40 bool valid_{false};
41
42 ErrorCode Add(KeyBase& key) override { return Set(key, key.raw_data_); }
43
44 ErrorCode Get(KeyBase& key) override
45 {
46 if (!valid_) return ErrorCode::FAILED;
47
48 nvs_handle_t handle;
49 esp_err_t err = nvs_open(namespace_, NVS_READONLY, &handle);
50 if (err != ESP_OK) return ErrorCode::FAILED;
51
52 size_t required_size = 0;
53 err = nvs_get_blob(handle, key.name_, nullptr, &required_size);
54 if (err == ESP_ERR_NVS_NOT_FOUND)
55 {
56 nvs_close(handle);
57 return ErrorCode::NOT_FOUND;
58 }
59
60 if (required_size != key.raw_data_.size_)
61 {
62 nvs_close(handle);
63 return ErrorCode::FAILED;
64 }
65
66 err = nvs_get_blob(handle, key.name_, key.raw_data_.addr_, &required_size);
67 nvs_close(handle);
68 return (err == ESP_OK) ? ErrorCode::OK : ErrorCode::FAILED;
69 }
70
71 ErrorCode Set(KeyBase& key, RawData data) override
72 {
73 if (!valid_) return ErrorCode::FAILED;
74
75 nvs_handle_t handle;
76 esp_err_t err = nvs_open(namespace_, NVS_READWRITE, &handle);
77 if (err != ESP_OK) return ErrorCode::FAILED;
78
79 err = nvs_set_blob(handle, key.name_, data.addr_, data.size_);
80 if (err != ESP_OK)
81 {
82 nvs_close(handle);
83 return ErrorCode::FAILED;
84 }
85
86 err = nvs_commit(handle);
87 nvs_close(handle);
88 return (err == ESP_OK) ? ErrorCode::OK : ErrorCode::FAILED;
89 }
90};
91
92} // namespace LibXR
键的基类,存储键名及其数据 (Base class for keys, storing key name and associated data).
Definition database.hpp:28
RawData raw_data_
原始数据 (Raw data associated with the key).
Definition database.hpp:31
const char * name_
键名 (Key name).
Definition database.hpp:30
数据库接口,提供键值存储和管理功能 (Database interface providing key-value storage and management).
Definition database.hpp:21
ESP32NvsFlashDatabase(const char *namespace_name="storage")
构造函数,初始化 NVS 和命名空间
bool IsValid() const
数据库是否有效初始化
ErrorCode Set(KeyBase &key, RawData data) override
设置数据库中的键值 (Set the key's value in the database).
ErrorCode Add(KeyBase &key) override
添加新键到数据库 (Add a new key to the database).
ErrorCode Get(KeyBase &key) override
从数据库获取键的值 (Retrieve the key's value from the database).
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
LibXR 命名空间
Definition ch32_gpio.hpp:9