Skip to content

Commit

Permalink
refactor: Storage flash code
Browse files Browse the repository at this point in the history
  • Loading branch information
JahazielLem committed Jan 22, 2025
1 parent ea9cf7f commit f4e2256
Show file tree
Hide file tree
Showing 4 changed files with 277 additions and 7 deletions.
5 changes: 1 addition & 4 deletions firmware/main/apps/wifi/ssid_spam/ssid_spam.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ static void ssid_spam_input_cb(uint8_t button_name, uint8_t button_event) {
}
switch (button_name) {
case BUTTON_LEFT:
animations_task_stop();
spam_main_menu();
break;
case BUTTON_RIGHT:
Expand Down Expand Up @@ -204,8 +205,4 @@ static void ssid_spam_main_cb(uint8_t button_name, uint8_t button_event) {

void ssid_spam_begin() {
spam_main_menu();
// ssid_spam_screens_running();
// animations_task_run(ssid_spam_animation, 200, NULL);
// ssid_spam_init();
// menus_module_set_app_state(true, ssid_spam_input_cb);
}
187 changes: 187 additions & 0 deletions firmware/main/general/general_flash_storage/general_flash_storage.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
#include "general_flash_storage.h"
#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "preferences.h"

#define FS_TREE_MAIN_COUNT "fsmc"
#define FS_TREE_SUBITEM_COUNT "fsmc"
#define FS_TREE_MAIN_PREFIX "fsm"
#define FS_TREE_SUBITEM_SUFIX "si"
#define MAX_LEN_STRING 1024
#define MAX_NVS_CHARS 15

static const char* TAG = "flash_storage";
static esp_err_t err;

static bool flash_storage_exist_main_item(char* base_name) {
char* idx_main_item = malloc(MAX_NVS_CHARS);
char* main_item = malloc(MAX_NVS_CHARS);
bool return_val = false;
esp_err_t err;

uint16_t main_count = preferences_get_ushort(FS_TREE_MAIN_COUNT, 0);

for (int i = 0; i < main_count; i++) {
sprintf(idx_main_item, "%d%s", i, FS_TREE_MAIN_PREFIX);
err = preferences_get_string(idx_main_item, main_item, MAX_LEN_STRING);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item found: %s", esp_err_to_name(err));
continue;
}
if (strcmp(base_name, main_item) == 0) {
return_val = true;
break;
}
}
free(idx_main_item);
free(main_item);
return return_val;
}

static esp_err_t flash_storage_save_main_item(char* base_name) {
uint16_t item_count = preferences_get_ushort(FS_TREE_MAIN_COUNT, 0);
char* idx_item = malloc(MAX_NVS_CHARS);

sprintf(idx_item, "%d%s", item_count, FS_TREE_MAIN_PREFIX);
err = preferences_put_string(idx_item, base_name);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item saved: %s", esp_err_to_name(err));
return err;
}
item_count++;
err = preferences_put_ushort(FS_TREE_MAIN_COUNT, item_count);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Error saving count: %s", esp_err_to_name(err));
return err;
}
free(idx_item);
return err;
}

static void flash_storage_save_subitem(storage_contex_t* storage_context) {
char* idx_item = malloc(MAX_NVS_CHARS);
char* main_item_str = malloc(MAX_NVS_CHARS);
char* subitem_str = malloc(MAX_NVS_CHARS);
char* idx_subitem_count = malloc(MAX_NVS_CHARS);
char* main_subitem = malloc(MAX_NVS_CHARS);
char* main_subitem_val = malloc(MAX_LEN_STRING);

// First get the main item for the class
uint16_t main_count = preferences_get_ushort(FS_TREE_MAIN_COUNT, 0);

for (int i = 0; i < main_count; i++) {
sprintf(idx_item, "%d%s", i, FS_TREE_MAIN_PREFIX);
err = preferences_get_string(idx_item, main_item_str, MAX_LEN_STRING);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item found: %s", esp_err_to_name(err));
continue;
}
if (strcmp(main_item_str, storage_context->main_storage_name) == 0) {
break;
}
}
// 0fsm
sprintf(idx_subitem_count, "%sc", main_item_str);
uint16_t subitem_count = preferences_get_ushort(idx_subitem_count, 0);
sprintf(main_subitem, "%d%s", subitem_count, idx_item);

err =
preferences_put_string(main_subitem, storage_context->item_storage_name);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item saved: %s", esp_err_to_name(err));
return;
}
subitem_count++;
err = preferences_put_ushort(idx_subitem_count, subitem_count);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Error saving count: %s", esp_err_to_name(err));
return;
}

sprintf(main_subitem_val, "%sv", main_subitem);
err = preferences_put_string(main_subitem_val,
storage_context->items_storage_value);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item saved: %s", esp_err_to_name(err));
return;
}

free(idx_item);
free(main_item_str);
free(subitem_str);
free(idx_subitem_count);
free(main_subitem);
free(main_subitem_val);
}

void flash_storage_show_list(char* main_tree) {
char* idx_main_item = malloc(MAX_NVS_CHARS);
char* main_item = malloc(MAX_NVS_CHARS);
char* idx_subitem = malloc(MAX_NVS_CHARS);
char* idx_subitem_count = malloc(MAX_NVS_CHARS);
char* tree_subitem_str = malloc(MAX_NVS_CHARS);
char* tree_subitem = malloc(MAX_NVS_CHARS);
char* tree_subitem_val = malloc(MAX_LEN_STRING);
esp_err_t err;

uint16_t main_count = preferences_get_ushort(FS_TREE_MAIN_COUNT, 0);

for (int i = 0; i < main_count; i++) {
sprintf(idx_main_item, "%d%s", i, FS_TREE_MAIN_PREFIX);
err = preferences_get_string(idx_main_item, main_item, MAX_LEN_STRING);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item found: %s", esp_err_to_name(err));
continue;
}
if (strcmp(main_tree, main_item) == 0) {
break;
}
}

ESP_LOGI(TAG, "Main item: %s", main_tree);

sprintf(idx_subitem_count, "%sc", main_item);
uint16_t subitem_count = preferences_get_ushort(idx_subitem_count, 0);
for (int j = 0; j < subitem_count; j++) {
sprintf(idx_subitem, "%d%s", j, idx_main_item);
err = preferences_get_string(idx_subitem, tree_subitem, MAX_LEN_STRING);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item found: %s", esp_err_to_name(err));
continue;
}
sprintf(tree_subitem_str, "%sv", idx_subitem);
err = preferences_get_string(tree_subitem_str, tree_subitem_val,
MAX_LEN_STRING);
if (err != ESP_OK) {
ESP_LOGW(TAG, "No item found: %s", esp_err_to_name(err));
continue;
}
ESP_LOGI(TAG, "Subitem: %s:%s", tree_subitem, tree_subitem_val);
}

free(idx_main_item);
free(main_item);
free(idx_subitem_count);
free(idx_subitem);
free(tree_subitem);
free(tree_subitem_str);
free(tree_subitem_val);
}

void flash_storage_save_list_items(storage_contex_t* storage_context) {
uint16_t main_count = preferences_get_ushort(FS_TREE_MAIN_COUNT, 0);
uint16_t subitems_count = preferences_get_ushort(FS_TREE_SUBITEM_COUNT, 0);

if (!flash_storage_exist_main_item(storage_context->main_storage_name)) {
err = flash_storage_save_main_item(storage_context->main_storage_name);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Error saving: %s", esp_err_to_name(err));
return;
}
}

flash_storage_save_subitem(storage_context);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#pragma once
#include "esp_err.h"

#define GENERAL_FLASH_STORAGE_COUNT_LIMIT 99

typedef enum {
GFS_SPAM,
GFS_WIFI,
GFS_GENERALS,
GFS_COUNT
} storage_categories_t;

typedef struct {
char* main_storage_name;
char* item_storage_name;
char* items_storage_value;
storage_categories_t category;
} storage_contex_t;

/* @brief Get the value in flash as the form of prefix_basename
@param char base_name - The name of the option
@param char str_value - The array to save the returned value
*/
esp_err_t flash_storage_get_str_item(char* base_name, char* str_value);

/* @brief Save the value in flash as the form of prefix_basename
@param char base_name - The name of the option
@param char value - The value
*/
esp_err_t flash_storage_save_str_item(char* base_name, char* value);

/* @brief Delete the value in flash as the form of prefix_basename
@param char base_name - The name of the option
*/
esp_err_t flash_storage_delete_str_item(char* base_name);

void flash_storage_save_list_items(storage_contex_t* storage_context);
esp_err_t flash_storage_delete_uint32_item(char* base_name);
void flash_storage_show_list(char* main_tree);
53 changes: 50 additions & 3 deletions firmware/main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "esp_timer.h"
#include "flash_fs.h"
#include "flash_fs_screens.h"
#include "general_flash_storage.h"
#include "keyboard_module.h"
#include "leds.h"
#include "menus_module.h"
Expand All @@ -19,9 +20,9 @@

static const char* TAG = "main";
void app_main() {
#if !defined(CONFIG_MAIN_DEBUG)
esp_log_level_set(TAG, ESP_LOG_NONE);
#endif
// #if !defined(CONFIG_MAIN_DEBUG)
// esp_log_level_set(TAG, ESP_LOG_NONE);
// #endif

uart_config_t uart_config = {
.baud_rate = BAUD_RATE,
Expand All @@ -47,5 +48,51 @@ void app_main() {
menus_module_begin();
leds_off();
preferences_put_bool("wifi_connected", false);
char* values[1] = {
"Never gonna give you upNever gonna let you downNever gonna run around "
"and desert youNever gonna make you cryNever gonna say goodbyeNever "
"gonna tell a lie and hurt youWe've known each other for so longYour "
"heart's been aching, but you're too shy to say iInside, we both know "
"what's been going onWe know the game and we're gonna play itAnd if you "
"ask me how I'm feelingDon't tell me you're too blind to seeNever gonna "
"give you upNever gonna let you downNever gonna run around and desert "
"youNever gonna make you cryNever gonna say goodbyeNever gonna tell a "
"lie and hurt youNever gonna give you upNever gonna let you downNever "
"gonna run around and desert youNever gonna make you cryNever gonna say "
"goodbyeNever gonna tell a lie and hurt you"};
storage_contex_t new_ssid;
new_ssid.main_storage_name = "spam";
new_ssid.item_storage_name = "Nevergonna";
new_ssid.items_storage_value = malloc(UART_BUFFER_SIZE);
strcpy(new_ssid.items_storage_value, values);
flash_storage_save_list_items(&new_ssid);
new_ssid.main_storage_name = "spam";
new_ssid.item_storage_name = "sextape";
new_ssid.items_storage_value = values;
flash_storage_save_list_items(&new_ssid);
new_ssid.main_storage_name = "wifi";
new_ssid.item_storage_name = "Hacknet_EXT";
new_ssid.items_storage_value = values;
flash_storage_save_list_items(&new_ssid);
flash_storage_show_list("spam");
flash_storage_show_list("wifi");
// esp_err_t err = flash_storage_save_str_item("ssid", "Never gonna give you
// upNever gonna let you downNever gonna run around and desert youNever gonna
// make you cryNever gonna say goodbyeNever gonna tell a lie and hurt youWe've
// known each other for so longYour heart's been aching, but you're too shy to
// say iInside, we both know what's been going onWe know the game and we're
// gonna play itAnd if you ask me how I'm feelingDon't tell me you're too
// blind to seeNever gonna give you upNever gonna let you downNever gonna run
// around and desert youNever gonna make you cryNever gonna say goodbyeNever
// gonna tell a lie and hurt youNever gonna give you upNever gonna let you
// downNever gonna run around and desert youNever gonna make you cryNever
// gonna say goodbyeNever gonna tell a lie and hurt you"); if(err != ESP_OK){
// ESP_LOGW("main", "Error");
// }
// ESP_LOGI(TAG, "Saved");
// char* str_ssid = malloc(1024);
// err = flash_storage_get_str_item("ssid", str_ssid);
// ESP_LOGI(TAG, "%s", str_ssid);
// free(str_ssid);
cat_console_begin(); // Contains a while(true) loop, it must be at the end
}

0 comments on commit f4e2256

Please sign in to comment.