various bug fixes
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <dirent.h>
|
||||
#include "esp_log.h"
|
||||
#include "esp_littlefs.h"
|
||||
#include "cJSON.h"
|
||||
@@ -129,6 +130,18 @@ esp_err_t storage_manager_bind_uid(const char *uid, const char *card_name)
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
|
||||
/* If previous mapping was for a different card, purge cached files so new card fetches clean */
|
||||
cJSON *prev = cJSON_GetObjectItem(root, uid);
|
||||
if (prev == NULL || prev->valuestring == NULL || strcasecmp(prev->valuestring, card_name) != 0) {
|
||||
char old_json[64];
|
||||
char old_jpg[64];
|
||||
snprintf(old_json, sizeof(old_json), STORAGE_CARDS_DIR "/%s.json", uid);
|
||||
snprintf(old_jpg, sizeof(old_jpg), STORAGE_CARDS_DIR "/%s.jpg", uid);
|
||||
remove(old_json);
|
||||
remove(old_jpg);
|
||||
ESP_LOGI(TAG, "purged old card cache for %s due to new binding -> '%s'", uid, card_name);
|
||||
}
|
||||
|
||||
cJSON_DeleteItemFromObject(root, uid);
|
||||
cJSON_AddItemToObject(root, uid, cJSON_CreateString(card_name));
|
||||
|
||||
@@ -139,6 +152,47 @@ esp_err_t storage_manager_bind_uid(const char *uid, const char *card_name)
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t storage_manager_unbind_uid(const char *uid)
|
||||
{
|
||||
if (uid == NULL || uid[0] == '\0') {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
char *existing = NULL;
|
||||
size_t existing_len = 0;
|
||||
cJSON *root = NULL;
|
||||
|
||||
if (storage_read_text(STORAGE_MAPPINGS, &existing, &existing_len) == ESP_OK && existing != NULL) {
|
||||
root = cJSON_Parse(existing);
|
||||
}
|
||||
free(existing);
|
||||
|
||||
if (root == NULL || !cJSON_IsObject(root)) {
|
||||
if (root) cJSON_Delete(root);
|
||||
return ESP_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
if (!cJSON_HasObjectItem(root, uid)) {
|
||||
cJSON_Delete(root);
|
||||
return ESP_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
cJSON_DeleteItemFromObject(root, uid);
|
||||
|
||||
char old_json[64];
|
||||
char old_jpg[64];
|
||||
snprintf(old_json, sizeof(old_json), STORAGE_CARDS_DIR "/%s.json", uid);
|
||||
snprintf(old_jpg, sizeof(old_jpg), STORAGE_CARDS_DIR "/%s.jpg", uid);
|
||||
remove(old_json);
|
||||
remove(old_jpg);
|
||||
ESP_LOGI(TAG, "unbound UID %s and removed cached files", uid);
|
||||
|
||||
char *out = cJSON_Print(root);
|
||||
esp_err_t ret = out ? storage_write_text(STORAGE_MAPPINGS, out) : ESP_ERR_NO_MEM;
|
||||
free(out);
|
||||
cJSON_Delete(root);
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t storage_manager_lookup_name(const char *uid, char **out)
|
||||
{
|
||||
*out = NULL;
|
||||
@@ -157,6 +211,17 @@ esp_err_t storage_manager_lookup_name(const char *uid, char **out)
|
||||
}
|
||||
|
||||
cJSON *item = cJSON_GetObjectItem(root, uid);
|
||||
if (item == NULL) {
|
||||
char prefix[48];
|
||||
snprintf(prefix, sizeof(prefix), "%s&name=", uid);
|
||||
cJSON *child = NULL;
|
||||
cJSON_ArrayForEach(child, root) {
|
||||
if (child->string && strncmp(child->string, prefix, strlen(prefix)) == 0) {
|
||||
item = child;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
esp_err_t ret = (item && cJSON_IsString(item) && item->valuestring) ? ESP_OK : ESP_ERR_NOT_FOUND;
|
||||
if (ret == ESP_OK) {
|
||||
*out = strdup(item->valuestring);
|
||||
@@ -256,4 +321,63 @@ esp_err_t storage_manager_init(void)
|
||||
|
||||
cross_reboot_persistence_test();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t storage_manager_get_info(size_t *total_bytes, size_t *used_bytes)
|
||||
{
|
||||
if (total_bytes == NULL || used_bytes == NULL) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return esp_littlefs_info(STORAGE_PARTITION_LABEL, total_bytes, used_bytes);
|
||||
}
|
||||
|
||||
esp_err_t storage_manager_count_cached(int *json_count, int *jpg_count)
|
||||
{
|
||||
if (json_count == NULL || jpg_count == NULL) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
*json_count = 0;
|
||||
*jpg_count = 0;
|
||||
|
||||
DIR *d = opendir(STORAGE_CARDS_DIR);
|
||||
if (d == NULL) {
|
||||
return ESP_OK;
|
||||
}
|
||||
struct dirent *entry;
|
||||
while ((entry = readdir(d)) != NULL) {
|
||||
if (entry->d_type == DT_REG || entry->d_type == DT_UNKNOWN) {
|
||||
size_t nlen = strlen(entry->d_name);
|
||||
if (nlen > 5 && strcmp(entry->d_name + nlen - 5, ".json") == 0) {
|
||||
(*json_count)++;
|
||||
} else if (nlen > 4 && strcmp(entry->d_name + nlen - 4, ".jpg") == 0) {
|
||||
(*jpg_count)++;
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t storage_manager_clear_all_cards(bool reset_mappings)
|
||||
{
|
||||
DIR *d = opendir(STORAGE_CARDS_DIR);
|
||||
if (d != NULL) {
|
||||
struct dirent *entry;
|
||||
while ((entry = readdir(d)) != NULL) {
|
||||
if (entry->d_name[0] == '.') {
|
||||
continue;
|
||||
}
|
||||
char path[300];
|
||||
snprintf(path, sizeof(path), STORAGE_CARDS_DIR "/%s", entry->d_name);
|
||||
unlink(path);
|
||||
}
|
||||
closedir(d);
|
||||
ESP_LOGI(TAG, "Cleared all files in %s", STORAGE_CARDS_DIR);
|
||||
}
|
||||
|
||||
if (reset_mappings) {
|
||||
storage_write_text(STORAGE_MAPPINGS, "{\n}\n");
|
||||
ESP_LOGI(TAG, "Reset %s to empty", STORAGE_MAPPINGS);
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
Reference in New Issue
Block a user