Browse Source

storage: add functionality to write with string keys and erase old values

Helmut Pozimski 1 year ago
parent
commit
a1254496d4
3 changed files with 48 additions and 7 deletions
  1. 1 0
      .gitignore
  2. 42 5
      main/storage.c
  3. 5 2
      main/storage.h

+ 1 - 0
.gitignore

@@ -24,6 +24,7 @@ CMakeCache.txt
 .bin_timestamp
 *.bin
 *.map
+*.elf
 project_elf_src_esp32.c
 x509_crt_bundle.S
 

+ 42 - 5
main/storage.c

@@ -7,6 +7,9 @@
 #include <stdio.h>
 #include <esp_err.h>
 #include <nvs_flash.h>
+#include <esp_log.h>
+
+#define TAG "storage"
 
 static void format_date(struct tm* datetime, char* output) {
     char year[12], month[12], day[12];
@@ -20,15 +23,49 @@ esp_err_t storage_init(char* name, nvs_handle_t* handle) {
    return nvs_open(name, NVS_READWRITE, handle);
 }
 
-esp_err_t write_wakeup_time_day(nvs_handle_t handle, struct tm* datetime, int16_t value) {
+esp_err_t write_wakeup_time_str(nvs_handle_t handle, char* key, uint16_t value) {
+	esp_err_t ret = nvs_set_u16(handle, key, value);
+	return ret | nvs_commit(handle);
+}
+
+esp_err_t write_wakeup_time_tm(nvs_handle_t handle, struct tm* datetime, uint16_t value) {
 	char key[9];
 	format_date(datetime, key);
-	esp_err_t ret = nvs_set_i16(handle, key, value);
-	return ret | nvs_commit(handle);
+	return write_wakeup_time_str(handle, key, value);
 }
 
-esp_err_t read_wakeup_time_day(nvs_handle_t handle, struct tm* datetime, int16_t* value) {
+esp_err_t read_wakeup_time_str(nvs_handle_t handle, char* key, uint16_t* value) {
+	return nvs_get_u16(handle, key, value);
+}
+
+esp_err_t read_wakeup_time_tm(nvs_handle_t handle, struct tm* datetime, uint16_t* value) {
 	char key[9];
 	format_date(datetime, key);
-	return nvs_get_i16(handle, key, value);
+	return read_wakeup_time_str(handle, key, value);
+}
+
+void delete_outdated_entries(struct tm* datetime, char* namespace, nvs_handle_t handle) {
+	char reference_date_str[9];
+	format_date(datetime, reference_date_str);
+	int reference_date = atoi(reference_date_str);
+	if (reference_date == 0) {
+		ESP_LOGE(TAG, "Error while determining reference date");
+		return;
+	}
+	nvs_iterator_t it = NULL;
+ 	esp_err_t res = nvs_entry_find("nvs", namespace, NVS_TYPE_ANY, &it);
+ 	while(res == ESP_OK) {
+  		nvs_entry_info_t info;
+     	nvs_entry_info(it, &info);
+     	int entry_date = atoi(info.key);
+     	if (entry_date == 0) {
+			ESP_LOGI(TAG, "Could not convert key %s to int, skipping entry during cleanup", info.key);     	
+     	} else if (entry_date < reference_date) {
+     		ESP_LOGI(TAG, "Erasing outdated entry %s", info.key);
+     		nvs_erase_key(handle, info.key);
+     	}
+     	res = nvs_entry_next(&it);
+ }
+ nvs_commit(handle);
+ nvs_release_iterator(it);
 }

+ 5 - 2
main/storage.h

@@ -4,5 +4,8 @@
 #include <nvs_flash.h>
 
 esp_err_t storage_init(char* name, nvs_handle_t* handle);
-esp_err_t write_wakeup_time_day(nvs_handle_t handle, struct tm* datetime, int16_t value);
-esp_err_t read_wakeup_time_day(nvs_handle_t handle, struct tm* datetime, int16_t* value);
+esp_err_t write_wakeup_time_tm(nvs_handle_t handle, struct tm* datetime, uint16_t value);
+esp_err_t write_wakeup_time_str(nvs_handle_t handle, char* key, uint16_t value);
+esp_err_t read_wakeup_time_tm(nvs_handle_t handle, struct tm* datetime, uint16_t* value);
+esp_err_t read_wakeup_time_str(nvs_handle_t handle, char* key, uint16_t* value);
+void delete_outdated_entries(struct tm* datetime, char* namespace, nvs_handle_t handle);