reference: 早先那版 C 写的装甲板固件(ESP-IDF 工程)
`armor/` 是它的 Rust 改写版,这一份留着当参考:ADC 阈值的 2000 就是从它标定出来的 (`.env.example` 里那句 "same as the reference firmware" 指的就是它),而且它的 README 记着实测设备与 MAC,换硬件时是有用的现场记录。 只收了 20 个源文件。它自带的 `.gitignore` 已经排掉 `build/`(211 MB 的 ESP-IDF 构建产物) 与生成的 `sdkconfig`,所以仓库里不会多出这些东西。 两处顺带处理: - `reference/armor/.git` 是一个**空的**仓库壳(`git init` 过,零提交、零 remote、零 ref), 而外层 git 正因为它的存在而拒绝索引 `reference/` 下的任何文件 (`error: 'reference/armor/' does not have a commit checked out`)。它被挪到 `desktop/.dev/backup/reference-armor-git`(可逆,且该目录已被忽略),不是删除。 - 它的 README 指着 `../armor-platformio-backup/`,那份备份并不存在。改成明说"没有进仓库", 免得以后有人照着找一个不存在的目录。 另外把 `/docs/` 加进 .gitignore:那是工作区里另起的一个 Astro 文档站,与本仓库无关。
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
#include "storage.hpp"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "nvs.h"
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr const char *TAG = "storage";
|
||||
|
||||
nvs_handle_t s_handle = 0;
|
||||
bool s_open = false;
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace Storage {
|
||||
|
||||
esp_err_t begin(const char *name_space) {
|
||||
esp_err_t err = nvs_open(name_space, NVS_READWRITE, &s_handle);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "nvs_open(%s) failed: %s", name_space, esp_err_to_name(err));
|
||||
return err;
|
||||
}
|
||||
s_open = true;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
bool hasKey(const char *key) {
|
||||
if (!s_open) {
|
||||
return false;
|
||||
}
|
||||
// nvs_get_u32() requires a real output pointer, so probe with a scratch value.
|
||||
uint32_t scratch = 0;
|
||||
if (nvs_get_u32(s_handle, key, &scratch) == ESP_OK) {
|
||||
return true;
|
||||
}
|
||||
size_t len = 0;
|
||||
return nvs_get_blob(s_handle, key, nullptr, &len) == ESP_OK;
|
||||
}
|
||||
|
||||
uint32_t getUInt(const char *key, uint32_t default_value) {
|
||||
if (!s_open) {
|
||||
return default_value;
|
||||
}
|
||||
uint32_t value = default_value;
|
||||
if (nvs_get_u32(s_handle, key, &value) != ESP_OK) {
|
||||
return default_value;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
size_t getBytes(const char *key, void *out, size_t max_len) {
|
||||
if (!s_open || out == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
size_t len = max_len;
|
||||
if (nvs_get_blob(s_handle, key, out, &len) != ESP_OK) {
|
||||
return 0;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
esp_err_t putUInt(const char *key, uint32_t value) {
|
||||
if (!s_open) {
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
esp_err_t err = nvs_set_u32(s_handle, key, value);
|
||||
if (err == ESP_OK) {
|
||||
err = nvs_commit(s_handle);
|
||||
}
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "putUInt(%s) failed: %s", key, esp_err_to_name(err));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t putBytes(const char *key, const void *data, size_t len) {
|
||||
if (!s_open) {
|
||||
return ESP_ERR_INVALID_STATE;
|
||||
}
|
||||
esp_err_t err = nvs_set_blob(s_handle, key, data, len);
|
||||
if (err == ESP_OK) {
|
||||
err = nvs_commit(s_handle);
|
||||
}
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "putBytes(%s) failed: %s", key, esp_err_to_name(err));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
} // namespace Storage
|
||||
Reference in New Issue
Block a user