|
@@ -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);
|
|
|
}
|