增加断网保存数据到FLASH,恢复联网重新补发,并加上标志位
This commit is contained in:
5
components/FLASH_SPIFS/CMakeLists.txt
Normal file
5
components/FLASH_SPIFS/CMakeLists.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
idf_component_register(
|
||||
SRCS "FLASH_SPIFS.c"
|
||||
INCLUDE_DIRS "include"
|
||||
REQUIRES spiffs
|
||||
)
|
||||
128
components/FLASH_SPIFS/FLASH_SPIFS.c
Normal file
128
components/FLASH_SPIFS/FLASH_SPIFS.c
Normal file
@@ -0,0 +1,128 @@
|
||||
#include "FLASH_SPIFS.h"
|
||||
#include "esp_spiffs.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
#define TAG "FLASH_SPIFS"
|
||||
#define MOUNT_POINT "/flash"
|
||||
|
||||
static bool is_mounted = false;
|
||||
|
||||
esp_err_t flash_spiffs_init(void)
|
||||
{
|
||||
ESP_LOGI(TAG, "正在初始化SPIFFS文件系统...");
|
||||
|
||||
esp_vfs_spiffs_conf_t conf = {
|
||||
.base_path = MOUNT_POINT,
|
||||
.partition_label = "storage",
|
||||
.max_files = 20,
|
||||
.format_if_mount_failed = true
|
||||
};
|
||||
|
||||
esp_err_t ret = esp_vfs_spiffs_register(&conf);
|
||||
if (ret != ESP_OK) {
|
||||
if (ret == ESP_FAIL) {
|
||||
ESP_LOGE(TAG, "无法挂载或格式化文件系统");
|
||||
} else if (ret == ESP_ERR_NOT_FOUND) {
|
||||
ESP_LOGE(TAG, "找不到分区 'storage'");
|
||||
} else {
|
||||
ESP_LOGE(TAG, "初始化失败 (%s)", esp_err_to_name(ret));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t total = 0, used = 0;
|
||||
ret = esp_spiffs_info(conf.partition_label, &total, &used);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "获取文件系统信息失败: %s", esp_err_to_name(ret));
|
||||
esp_vfs_spiffs_unregister(conf.partition_label);
|
||||
return ret;
|
||||
}
|
||||
|
||||
is_mounted = true;
|
||||
|
||||
ESP_LOGI(TAG, "SPIFFS文件系统挂载成功");
|
||||
ESP_LOGI(TAG, "总空间: %u 字节", total);
|
||||
ESP_LOGI(TAG, "已用空间: %u 字节", used);
|
||||
ESP_LOGI(TAG, "可用空间: %u 字节", total - used);
|
||||
ESP_LOGI(TAG, "挂载点: %s", MOUNT_POINT);
|
||||
|
||||
// 注意: 文件系统检查 (esp_spiffs_check) 在初始化阶段耗时过长,可能触发看门狗
|
||||
// 如果需要检查文件系统完整性,可以在单独的任务中调用 flash_spiffs_format() 格式化
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
bool flash_spiffs_is_mounted(void)
|
||||
{
|
||||
return is_mounted;
|
||||
}
|
||||
|
||||
uint32_t flash_spiffs_get_total_size(void)
|
||||
{
|
||||
if (!is_mounted) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t total = 0, used = 0;
|
||||
if (esp_spiffs_info("storage", &total, &used) == ESP_OK) {
|
||||
return total;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t flash_spiffs_get_used_size(void)
|
||||
{
|
||||
if (!is_mounted) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t total = 0, used = 0;
|
||||
if (esp_spiffs_info("storage", &total, &used) == ESP_OK) {
|
||||
return used;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
esp_err_t flash_spiffs_format(void)
|
||||
{
|
||||
if (!is_mounted) {
|
||||
ESP_LOGE(TAG, "文件系统未挂载");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
ESP_LOGW(TAG, "正在格式化文件系统,所有数据将被删除...");
|
||||
|
||||
// 先卸载
|
||||
esp_vfs_spiffs_unregister("storage");
|
||||
is_mounted = false;
|
||||
|
||||
// 重新格式化并挂载
|
||||
esp_vfs_spiffs_conf_t conf = {
|
||||
.base_path = MOUNT_POINT,
|
||||
.partition_label = "storage",
|
||||
.max_files = 20,
|
||||
.format_if_mount_failed = true
|
||||
};
|
||||
|
||||
esp_err_t ret = esp_vfs_spiffs_register(&conf);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "格式化失败: %s", esp_err_to_name(ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
is_mounted = true;
|
||||
|
||||
// 重新获取信息
|
||||
size_t total = 0, used = 0;
|
||||
esp_spiffs_info("storage", &total, &used);
|
||||
ESP_LOGI(TAG, "文件系统格式化完成");
|
||||
ESP_LOGI(TAG, "总空间: %u 字节", total);
|
||||
ESP_LOGI(TAG, "已用空间: %u 字节", used);
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
const char* flash_spiffs_get_mount_point(void)
|
||||
{
|
||||
return MOUNT_POINT;
|
||||
}
|
||||
52
components/FLASH_SPIFS/include/FLASH_SPIFS.h
Normal file
52
components/FLASH_SPIFS/include/FLASH_SPIFS.h
Normal file
@@ -0,0 +1,52 @@
|
||||
#ifndef FLASH_SPIFS_H
|
||||
#define FLASH_SPIFS_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "esp_err.h"
|
||||
|
||||
/**
|
||||
* @brief 初始化SPIFFS文件系统
|
||||
*
|
||||
* @return ESP_OK 成功
|
||||
* 其他 失败
|
||||
*/
|
||||
esp_err_t flash_spiffs_init(void);
|
||||
|
||||
/**
|
||||
* @brief 检查文件系统是否已挂载
|
||||
*
|
||||
* @return true 已挂载
|
||||
* false 未挂载
|
||||
*/
|
||||
bool flash_spiffs_is_mounted(void);
|
||||
|
||||
/**
|
||||
* @brief 获取文件系统总大小
|
||||
*
|
||||
* @return 总大小(字节)
|
||||
*/
|
||||
uint32_t flash_spiffs_get_total_size(void);
|
||||
|
||||
/**
|
||||
* @brief 获取文件系统已使用大小
|
||||
*
|
||||
* @return 已使用大小(字节)
|
||||
*/
|
||||
uint32_t flash_spiffs_get_used_size(void);
|
||||
|
||||
/**
|
||||
* @brief 格式化文件系统(清空所有数据)
|
||||
*
|
||||
* @return ESP_OK 成功
|
||||
* 其他 失败
|
||||
*/
|
||||
esp_err_t flash_spiffs_format(void);
|
||||
|
||||
/**
|
||||
* @brief 获取文件系统挂载路径
|
||||
*
|
||||
* @return 挂载路径字符串(如 "/flash")
|
||||
*/
|
||||
const char* flash_spiffs_get_mount_point(void);
|
||||
|
||||
#endif // FLASH_SPIFS_H
|
||||
Reference in New Issue
Block a user