Xtreme assets/settings boot process improvements

This commit is contained in:
Willy-JL
2023-02-16 05:49:16 +00:00
parent c7e02a5faa
commit 68353563ec
7 changed files with 55 additions and 22 deletions

View File

@@ -6,6 +6,7 @@ App(
"crypto_start", "crypto_start",
"rpc_start", "rpc_start",
"bt", "bt",
"xtreme",
"desktop", "desktop",
"loader", "loader",
"power", "power",

View File

@@ -7,7 +7,7 @@ App(
requires=["storage_settings"], requires=["storage_settings"],
provides=["storage_start"], provides=["storage_start"],
stack_size=3 * 1024, stack_size=3 * 1024,
order=120, order=44,
sdk_headers=["storage.h"], sdk_headers=["storage.h"],
) )

View File

@@ -1,10 +1,10 @@
App( App(
appid="xtreme", appid="xtreme",
apptype=FlipperAppType.STARTUP, name="Xtreme",
entry_point="xtreme_on_system_start", apptype=FlipperAppType.SERVICE,
entry_point="xtreme_srv",
cdefines=["SRV_XTREME"],
requires=["storage"], requires=["storage"],
order=1000, stack_size=1 * 1024,
provides=[ order=46,
"xtreme",
],
) )

View File

@@ -2,6 +2,8 @@
#include <assets_icons.h> #include <assets_icons.h>
#include <core/dangerous_defines.h> #include <core/dangerous_defines.h>
#define TAG "XtremeAssets"
#define ICONS_FMT PACKS_DIR "/%s/Icons/%s" #define ICONS_FMT PACKS_DIR "/%s/Icons/%s"
XtremeAssets* xtreme_assets = NULL; XtremeAssets* xtreme_assets = NULL;
@@ -111,7 +113,6 @@ void XTREME_ASSETS_LOAD() {
if(xtreme_assets != NULL) return; if(xtreme_assets != NULL) return;
xtreme_assets = malloc(sizeof(XtremeAssets)); xtreme_assets = malloc(sizeof(XtremeAssets));
XtremeSettings* xtreme_settings = XTREME_SETTINGS();
xtreme_assets->A_Levelup_128x64 = &A_Levelup_128x64; xtreme_assets->A_Levelup_128x64 = &A_Levelup_128x64;
xtreme_assets->I_BLE_Pairing_128x64 = &I_BLE_Pairing_128x64; xtreme_assets->I_BLE_Pairing_128x64 = &I_BLE_Pairing_128x64;
@@ -136,20 +137,34 @@ void XTREME_ASSETS_LOAD() {
xtreme_assets->I_Connected_62x31 = &I_Connected_62x31; xtreme_assets->I_Connected_62x31 = &I_Connected_62x31;
xtreme_assets->I_Error_62x31 = &I_Error_62x31; xtreme_assets->I_Error_62x31 = &I_Error_62x31;
if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) {
FURI_LOG_W(TAG, "Load skipped. Device is in special startup mode.");
return;
}
XtremeSettings* xtreme_settings = XTREME_SETTINGS();
if(xtreme_settings->asset_pack[0] == '\0') return; if(xtreme_settings->asset_pack[0] == '\0') return;
xtreme_assets->is_nsfw = strncmp(xtreme_settings->asset_pack, "NSFW", strlen("NSFW")) == 0; xtreme_assets->is_nsfw = strncmp(xtreme_settings->asset_pack, "NSFW", strlen("NSFW")) == 0;
Storage* storage = furi_record_open(RECORD_STORAGE);
int32_t timeout = 5000;
while(timeout > 0) {
if(storage_sd_status(storage) == FSE_OK) break;
furi_delay_ms(250);
timeout -= 250;
}
FileInfo info; FileInfo info;
FuriString* path = furi_string_alloc(); FuriString* path = furi_string_alloc();
furi_string_printf(path, PACKS_DIR "/%s", xtreme_settings->asset_pack); furi_string_printf(path, PACKS_DIR "/%s", xtreme_settings->asset_pack);
Storage* storage = furi_record_open(RECORD_STORAGE);
if(storage_common_stat(storage, furi_string_get_cstr(path), &info) == FSE_OK && if(storage_common_stat(storage, furi_string_get_cstr(path), &info) == FSE_OK &&
info.flags & FSF_DIRECTORY) { info.flags & FSF_DIRECTORY) {
File* file = storage_file_alloc(storage); File* file = storage_file_alloc(storage);
swap(xtreme_assets, path, file); swap(xtreme_assets, path, file);
storage_file_free(file); storage_file_free(file);
} }
furi_record_close(RECORD_STORAGE);
furi_string_free(path); furi_string_free(path);
furi_record_close(RECORD_STORAGE);
} }
XtremeAssets* XTREME_ASSETS() { XtremeAssets* XTREME_ASSETS() {

View File

@@ -1,5 +1,7 @@
#include "settings.h" #include "settings.h"
#define TAG "XtremeSettings"
XtremeSettings* xtreme_settings = NULL; XtremeSettings* xtreme_settings = NULL;
XtremeSettings* XTREME_SETTINGS() { XtremeSettings* XTREME_SETTINGS() {
@@ -9,28 +11,39 @@ XtremeSettings* XTREME_SETTINGS() {
return xtreme_settings; return xtreme_settings;
} }
bool XTREME_SETTINGS_LOAD() { void XTREME_SETTINGS_LOAD() {
if(xtreme_settings == NULL) { if(xtreme_settings == NULL) {
xtreme_settings = malloc(sizeof(XtremeSettings)); xtreme_settings = malloc(sizeof(XtremeSettings));
bool loaded = saved_struct_load( bool loaded;
XTREME_SETTINGS_PATH,
xtreme_settings, if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) {
sizeof(XtremeSettings), FURI_LOG_W(TAG, "Load skipped. Device is in special startup mode.");
XTREME_SETTINGS_MAGIC, loaded = false;
XTREME_SETTINGS_VERSION); } else {
loaded = saved_struct_load(
XTREME_SETTINGS_PATH,
xtreme_settings,
sizeof(XtremeSettings),
XTREME_SETTINGS_MAGIC,
XTREME_SETTINGS_VERSION);
}
if(!loaded) { if(!loaded) {
memset(xtreme_settings, 0, sizeof(XtremeSettings)); memset(xtreme_settings, 0, sizeof(XtremeSettings));
loaded = XTREME_SETTINGS_SAVE();
} }
return loaded;
} }
return true;
} }
bool XTREME_SETTINGS_SAVE() { bool XTREME_SETTINGS_SAVE() {
if(xtreme_settings == NULL) { if(xtreme_settings == NULL) {
XTREME_SETTINGS_LOAD(); XTREME_SETTINGS_LOAD();
} }
if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) {
return true;
}
return saved_struct_save( return saved_struct_save(
XTREME_SETTINGS_PATH, XTREME_SETTINGS_PATH,
xtreme_settings, xtreme_settings,

View File

@@ -34,6 +34,6 @@ typedef struct {
XtremeSettings* XTREME_SETTINGS(); XtremeSettings* XTREME_SETTINGS();
bool XTREME_SETTINGS_LOAD(); void XTREME_SETTINGS_LOAD();
bool XTREME_SETTINGS_SAVE(); bool XTREME_SETTINGS_SAVE();

View File

@@ -1,7 +1,11 @@
#include "settings.h" #include "settings.h"
#include "assets.h" #include "assets.h"
void xtreme_on_system_start() { int32_t xtreme_srv(void* p) {
UNUSED(p);
XTREME_SETTINGS_LOAD(); XTREME_SETTINGS_LOAD();
XTREME_ASSETS_LOAD(); XTREME_ASSETS_LOAD();
return 0;
} }