[FL-1994] Add Saved Struct (#804)

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Albert Kharisov
2021-11-03 21:22:49 +04:00
committed by GitHub
parent 6d548637f2
commit 0c1bcf144b
18 changed files with 279 additions and 212 deletions

View File

@@ -1,49 +0,0 @@
#include <furi.h>
#include <file-worker.h>
#include "desktop_settings.h"
#define DESKTOP_SETTINGS_TAG "Desktop settings"
#define DESKTOP_SETTINGS_PATH "/int/desktop.settings"
bool desktop_settings_load(DesktopSettings* desktop_settings) {
furi_assert(desktop_settings);
bool file_loaded = false;
DesktopSettings settings = {};
FURI_LOG_I(DESKTOP_SETTINGS_TAG, "Loading settings from \"%s\"", DESKTOP_SETTINGS_PATH);
FileWorker* file_worker = file_worker_alloc(true);
if(file_worker_open(file_worker, DESKTOP_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) {
if(file_worker_read(file_worker, &settings, sizeof(settings))) {
file_loaded = true;
}
}
file_worker_free(file_worker);
if(file_loaded) {
if(settings.version != DESKTOP_SETTINGS_VER) {
FURI_LOG_E(DESKTOP_SETTINGS_TAG, "Settings version mismatch");
} else {
osKernelLock();
*desktop_settings = settings;
osKernelUnlock();
}
} else {
FURI_LOG_E(DESKTOP_SETTINGS_TAG, "Settings load failed");
}
return file_loaded;
}
bool desktop_settings_save(DesktopSettings* desktop_settings) {
furi_assert(desktop_settings);
bool result = false;
FileWorker* file_worker = file_worker_alloc(true);
if(file_worker_open(file_worker, DESKTOP_SETTINGS_PATH, FSAM_WRITE, FSOM_OPEN_ALWAYS)) {
if(file_worker_write(file_worker, desktop_settings, sizeof(DesktopSettings))) {
FURI_LOG_I(DESKTOP_SETTINGS_TAG, "Settings saved to \"%s\"", DESKTOP_SETTINGS_PATH);
result = true;
}
}
file_worker_free(file_worker);
return result;
}

View File

@@ -2,23 +2,35 @@
#include <stdint.h>
#include <stdbool.h>
#include <toolbox/saved_struct.h>
#define DESKTOP_SETTINGS_VER (1)
#define DESKTOP_SETTINGS_PATH "/int/desktop.settings"
#define DESKTOP_SETTINGS_MAGIC (0x17)
#define PIN_MAX_LENGTH 12
#define SAVE_DESKTOP_SETTINGS(x) \
saved_struct_save( \
DESKTOP_SETTINGS_PATH, \
(x), \
sizeof(DesktopSettings), \
DESKTOP_SETTINGS_MAGIC, \
DESKTOP_SETTINGS_VER)
#define LOAD_DESKTOP_SETTINGS(x) \
saved_struct_load( \
DESKTOP_SETTINGS_PATH, \
(x), \
sizeof(DesktopSettings), \
DESKTOP_SETTINGS_MAGIC, \
DESKTOP_SETTINGS_VER)
typedef struct {
uint8_t length;
uint8_t data[PIN_MAX_LENGTH];
} PinCode;
typedef struct {
uint8_t version;
uint16_t favorite;
PinCode pincode;
bool locked;
} DesktopSettings;
bool desktop_settings_load(DesktopSettings* desktop_settings);
bool desktop_settings_save(DesktopSettings* desktop_settings);

View File

@@ -15,9 +15,6 @@ static bool desktop_settings_back_event_callback(void* context) {
DesktopSettingsApp* desktop_settings_app_alloc() {
DesktopSettingsApp* app = furi_alloc(sizeof(DesktopSettingsApp));
app->settings.version = DESKTOP_SETTINGS_VER;
desktop_settings_load(&app->settings);
app->gui = furi_record_open("gui");
app->view_dispatcher = view_dispatcher_alloc();
app->scene_manager = scene_manager_alloc(&desktop_settings_scene_handlers, app);
@@ -62,8 +59,8 @@ void desktop_settings_app_free(DesktopSettingsApp* app) {
extern int32_t desktop_settings_app(void* p) {
DesktopSettingsApp* app = desktop_settings_app_alloc();
LOAD_DESKTOP_SETTINGS(&app->settings);
view_dispatcher_run(app->view_dispatcher);
desktop_settings_save(&app->settings);
desktop_settings_app_free(app);
return 0;
}

View File

@@ -1,5 +1,6 @@
#include "../desktop_settings_app.h"
#include "applications.h"
#include "desktop/desktop_settings/desktop_settings.h"
static void desktop_settings_scene_favorite_submenu_callback(void* context, uint32_t index) {
DesktopSettingsApp* app = context;
@@ -43,5 +44,6 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e
void desktop_settings_scene_favorite_on_exit(void* context) {
DesktopSettingsApp* app = context;
SAVE_DESKTOP_SETTINGS(&app->settings);
submenu_clean(app->submenu);
}

View File

@@ -1,4 +1,5 @@
#include "../desktop_settings_app.h"
#include "desktop/desktop_settings/desktop_settings.h"
#define SCENE_EXIT_EVENT (0U)
@@ -57,6 +58,7 @@ bool desktop_settings_scene_pincode_input_on_event(void* context, SceneManagerEv
void desktop_settings_scene_pincode_input_on_exit(void* context) {
DesktopSettingsApp* app = context;
SAVE_DESKTOP_SETTINGS(&app->settings);
code_input_set_result_callback(app->code_input, NULL, NULL, NULL, NULL, NULL, 0);
code_input_set_header_text(app->code_input, "");
}