From 6696315d108222c13f8692717dcba0fcdf56f757 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 20 Jan 2023 15:15:18 +0000 Subject: [PATCH] Reboot on assets change --- .../scenes/xtreme_settings_scene_start.c | 9 ++- .../settings/xtreme_settings/xtreme_assets.c | 72 +++++++------------ .../settings/xtreme_settings/xtreme_assets.h | 4 +- 3 files changed, 37 insertions(+), 48 deletions(-) diff --git a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c index 027a5d46e..e09d134bc 100644 --- a/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c +++ b/applications/settings/xtreme_settings/scenes/xtreme_settings_scene_start.c @@ -1,14 +1,17 @@ #include "../xtreme_settings_app.h" #include +#include #include bool settings_changed; +bool assets_changed; static void xtreme_settings_scene_start_base_graphics_changed(VariableItem* item) { bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "SFW" : "NSFW"); XTREME_SETTINGS()->sfw_mode = value; settings_changed = true; + assets_changed = true; } static void xtreme_settings_scene_start_asset_pack_changed(VariableItem* item) { @@ -17,6 +20,7 @@ static void xtreme_settings_scene_start_asset_pack_changed(VariableItem* item) { variable_item_set_current_value_text(item, index == 0 ? "OFF" : *asset_packs_get(app->asset_packs, index - 1)); strlcpy(XTREME_SETTINGS()->asset_pack, index == 0 ? "" : *asset_packs_get(app->asset_packs, index - 1), MAX_PACK_NAME_LEN); settings_changed = true; + assets_changed = true; } #define CYCLE_ANIMS_COUNT 13 @@ -109,6 +113,7 @@ static void xtreme_settings_scene_start_subghz_bypass_changed(VariableItem* item void xtreme_settings_scene_start_on_enter(void* context) { XtremeSettingsApp* app = context; settings_changed = false; + assets_changed = false; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -243,7 +248,9 @@ void xtreme_settings_scene_start_on_exit(void* context) { if (settings_changed) { XTREME_SETTINGS_SAVE(); - XTREME_ASSETS_UPDATE(); + if (assets_changed) { + power_reboot(PowerBootModeNormal); + } } Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); diff --git a/applications/settings/xtreme_settings/xtreme_assets.c b/applications/settings/xtreme_settings/xtreme_assets.c index ceb3fb47a..30383a5f3 100644 --- a/applications/settings/xtreme_settings/xtreme_assets.c +++ b/applications/settings/xtreme_settings/xtreme_assets.c @@ -2,22 +2,19 @@ #include "assets_icons.h" #include -#define XTREME_ASSETS_COUNT 21 -Icon* loaded_icons[XTREME_ASSETS_COUNT]; - XtremeAssets* xtreme_assets = NULL; XtremeAssets* XTREME_ASSETS() { if (xtreme_assets == NULL) { - XTREME_ASSETS_UPDATE(); + XTREME_ASSETS_LOAD(); } return xtreme_assets; } -void XTREME_ASSETS_UPDATE() { - if (xtreme_assets == NULL) { - xtreme_assets = malloc(sizeof(XtremeAssets)); - } +void XTREME_ASSETS_LOAD() { + if (xtreme_assets != NULL) return; + + xtreme_assets = malloc(sizeof(XtremeAssets)); XtremeSettings* xtreme_settings = XTREME_SETTINGS(); if (xtreme_settings->sfw_mode) { @@ -68,10 +65,6 @@ void XTREME_ASSETS_UPDATE() { xtreme_assets->passport_okay = &I_flipper; } - for (int i = 0; i < XTREME_ASSETS_COUNT; i++) { - free_bmx_icon(loaded_icons[i]); - } - if (xtreme_settings->asset_pack[0] == '\0') return; FileInfo info; FuriString* path = furi_string_alloc(); @@ -80,30 +73,29 @@ void XTREME_ASSETS_UPDATE() { Storage* storage = furi_record_open(RECORD_STORAGE); if (storage_common_stat(storage, furi_string_get_cstr(path), &info) == FSE_OK && info.flags & FSF_DIRECTORY) { File* file = storage_file_alloc(storage); - int i = 0; - swap_bmx_icon(&xtreme_assets->authenticate, pack, "Icons/authenticate.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->bt_pairing, pack, "Icons/bt_pairing.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->connect_me, pack, "Icons/connect_me.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->connected, pack, "Icons/connected.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->dolphin_common, pack, "Icons/dolphin_common.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->dolphin_cry, pack, "Icons/dolphin_cry.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->dolphin_mafia, pack, "Icons/dolphin_mafia.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->dolphin_nice, pack, "Icons/dolphin_nice.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->dolphin_wait, pack, "Icons/dolphin_wait.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->error, pack, "Icons/error.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->ibutton_success, pack, "Icons/ibutton_success.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->ir_success, pack, "Icons/ir_success.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->nfc_emulation, pack, "Icons/nfc_emulation.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->rfid_receive, pack, "Icons/rfid_receive.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->rfid_send, pack, "Icons/rfid_send.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->rfid_success, pack, "Icons/rfid_success.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->subghz_scanning, pack, "Icons/subghz_scanning.bmx", path, file, i++); + swap_bmx_icon(&xtreme_assets->authenticate, pack, "Icons/authenticate.bmx", path, file); + swap_bmx_icon(&xtreme_assets->bt_pairing, pack, "Icons/bt_pairing.bmx", path, file); + swap_bmx_icon(&xtreme_assets->connect_me, pack, "Icons/connect_me.bmx", path, file); + swap_bmx_icon(&xtreme_assets->connected, pack, "Icons/connected.bmx", path, file); + swap_bmx_icon(&xtreme_assets->dolphin_common, pack, "Icons/dolphin_common.bmx", path, file); + swap_bmx_icon(&xtreme_assets->dolphin_cry, pack, "Icons/dolphin_cry.bmx", path, file); + swap_bmx_icon(&xtreme_assets->dolphin_mafia, pack, "Icons/dolphin_mafia.bmx", path, file); + swap_bmx_icon(&xtreme_assets->dolphin_nice, pack, "Icons/dolphin_nice.bmx", path, file); + swap_bmx_icon(&xtreme_assets->dolphin_wait, pack, "Icons/dolphin_wait.bmx", path, file); + swap_bmx_icon(&xtreme_assets->error, pack, "Icons/error.bmx", path, file); + swap_bmx_icon(&xtreme_assets->ibutton_success, pack, "Icons/ibutton_success.bmx", path, file); + swap_bmx_icon(&xtreme_assets->ir_success, pack, "Icons/ir_success.bmx", path, file); + swap_bmx_icon(&xtreme_assets->nfc_emulation, pack, "Icons/nfc_emulation.bmx", path, file); + swap_bmx_icon(&xtreme_assets->rfid_receive, pack, "Icons/rfid_receive.bmx", path, file); + swap_bmx_icon(&xtreme_assets->rfid_send, pack, "Icons/rfid_send.bmx", path, file); + swap_bmx_icon(&xtreme_assets->rfid_success, pack, "Icons/rfid_success.bmx", path, file); + swap_bmx_icon(&xtreme_assets->subghz_scanning, pack, "Icons/subghz_scanning.bmx", path, file); - swap_bmx_icon(&xtreme_assets->passport_angry, pack, "Passport/angry.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->passport_background, pack, "Passport/background.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->passport_happy, pack, "Passport/happy.bmx", path, file, i++); - swap_bmx_icon(&xtreme_assets->passport_okay, pack, "Passport/okay.bmx", path, file, i++); + swap_bmx_icon(&xtreme_assets->passport_angry, pack, "Passport/angry.bmx", path, file); + swap_bmx_icon(&xtreme_assets->passport_background, pack, "Passport/background.bmx", path, file); + swap_bmx_icon(&xtreme_assets->passport_happy, pack, "Passport/happy.bmx", path, file); + swap_bmx_icon(&xtreme_assets->passport_okay, pack, "Passport/okay.bmx", path, file); storage_file_free(file); } @@ -111,8 +103,7 @@ void XTREME_ASSETS_UPDATE() { furi_string_free(path); } -void swap_bmx_icon(const Icon** replace, const char* pack, const char* name, FuriString* path, File* file, int i) { - loaded_icons[i] = NULL; +void swap_bmx_icon(const Icon** replace, const char* pack, const char* name, FuriString* path, File* file) { furi_string_printf(path, PACKS_DIR "/%s/%s", pack, name); if (storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) { uint64_t size = storage_file_size(file) - 8; @@ -128,17 +119,8 @@ void swap_bmx_icon(const Icon** replace, const char* pack, const char* name, Fur icon->frames = malloc(sizeof(const uint8_t*)); FURI_CONST_ASSIGN_PTR(icon->frames[0], malloc(size)); storage_file_read(file, (void*)icon->frames[0], size); - loaded_icons[i] = icon; *replace = icon; storage_file_close(file); } } - -void free_bmx_icon(Icon* icon) { - if (icon != NULL) { - free((void*)icon->frames[0]); - free((void*)icon->frames); - free(icon); - } -} diff --git a/applications/settings/xtreme_settings/xtreme_assets.h b/applications/settings/xtreme_settings/xtreme_assets.h index ec8c03f53..37d7218e2 100644 --- a/applications/settings/xtreme_settings/xtreme_assets.h +++ b/applications/settings/xtreme_settings/xtreme_assets.h @@ -33,8 +33,8 @@ typedef struct { XtremeAssets* XTREME_ASSETS(); -void XTREME_ASSETS_UPDATE(); +void XTREME_ASSETS_LOAD(); -void swap_bmx_icon(const Icon** replace, const char* base, const char* name, FuriString* path, File* file, int i); +void swap_bmx_icon(const Icon** replace, const char* base, const char* name, FuriString* path, File* file); void free_bmx_icon(Icon* icon);