From 1d4cba8c610db3706e97c63652d9ae49b5c2ff0e Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Fri, 6 Sep 2024 01:26:07 +0200 Subject: [PATCH] Settings: Hybrid internal/external, unused for now - Reverts part of acc352e61f30ef93b18dc8fed97d43f9d4eb5b5a - Reverts part of ca5f3bb09aa8b1ea610ce7cb45b6567b7bfc13b3 - Based partly on 71d1c1d0f1456c2a901559cdbde03eefe132340f - Use FlipperInternalApplication for settings for settings - Set FlipperInternalApplicationFlagExternal accordingly - Keep storage and power settings internal, all others external - Unused for now, uses too much flash: - Previously: 29kb free flash - All internal: 4kb free flash - Power internal: 22kb free flash - Power and storage internal: 16kb free flash --- applications/services/applications.h | 21 ++++--- applications/services/loader/loader.c | 21 ++++--- applications/settings/about/application.fam | 2 +- .../settings/bt_settings_app/application.fam | 2 +- .../settings/desktop_settings/application.fam | 2 +- .../settings/dolphin_passport/application.fam | 2 +- .../expansion_settings_app/application.fam | 2 +- .../notification_settings/application.fam | 2 +- .../mock_imports/mock_power_api.c | 7 --- applications/settings/system/application.fam | 2 +- scripts/fbt/appmanifest.py | 4 +- scripts/fbt_tools/fbt_apps.py | 61 +++++++++++-------- scripts/fbt_tools/fbt_extapps.py | 2 +- scripts/ufbt/SConstruct | 2 +- targets/f7/api_symbols.csv | 2 +- 15 files changed, 74 insertions(+), 60 deletions(-) delete mode 100644 applications/settings/power_settings_app/mock_imports/mock_power_api.c diff --git a/applications/services/applications.h b/applications/services/applications.h index 44f00f6df..42d255bd2 100644 --- a/applications/services/applications.h +++ b/applications/services/applications.h @@ -4,24 +4,31 @@ #include typedef enum { - FlipperApplicationFlagDefault = 0, - FlipperApplicationFlagInsomniaSafe = (1 << 0), -} FlipperApplicationFlag; + FlipperInternalApplicationFlagDefault = 0, + FlipperInternalApplicationFlagInsomniaSafe = (1 << 0), + + // Workaround for int and ext apps in same array: + // - use FlipperInternalApplication struct and array + // - set this flag to indicate it is external + FlipperInternalApplicationFlagExternal = (1 << 7), +} FlipperInternalApplicationFlag; typedef struct { const FuriThreadCallback app; const char* name; - const char* appid; + union { + const char* appid; // When internal + const char* path; // When flag FlipperInternalApplicationFlagExternal is set + }; const size_t stack_size; const Icon* icon; - const FlipperApplicationFlag flags; + const FlipperInternalApplicationFlag flags; } FlipperInternalApplication; typedef struct { const char* name; const Icon* icon; const char* path; - const FlipperApplicationFlag flags; } FlipperExternalApplication; typedef void (*FlipperInternalOnStartHook)(void); @@ -63,7 +70,7 @@ extern const FlipperInternalApplication FLIPPER_ARCHIVE; /* Settings list * Spawned by loader */ -extern const FlipperExternalApplication FLIPPER_SETTINGS_APPS[]; +extern const FlipperInternalApplication FLIPPER_SETTINGS_APPS[]; extern const size_t FLIPPER_SETTINGS_APPS_COUNT; /* External Menu Apps list diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index de895c45a..0db08a829 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -16,18 +16,21 @@ // helpers -static const char* - loader_find_external_application_by_name(const char* app_name, FlipperApplicationFlag* flags) { +static const char* loader_find_external_application_by_name( + const char* app_name, + FlipperInternalApplicationFlag* flags) { for(size_t i = 0; i < FLIPPER_EXTERNAL_APPS_COUNT; i++) { if(strcmp(FLIPPER_EXTERNAL_APPS[i].name, app_name) == 0) { - if(flags) *flags = FLIPPER_EXTERNAL_APPS[i].flags; + if(flags) *flags = FlipperInternalApplicationFlagDefault; return FLIPPER_EXTERNAL_APPS[i].path; } } for(size_t i = 0; i < FLIPPER_SETTINGS_APPS_COUNT; i++) { + FlipperInternalApplicationFlag app_flags = FLIPPER_SETTINGS_APPS[i].flags; + if(!(app_flags & FlipperInternalApplicationFlagExternal)) continue; if(strcmp(FLIPPER_SETTINGS_APPS[i].name, app_name) == 0) { - if(flags) *flags = FLIPPER_SETTINGS_APPS[i].flags; + if(flags) *flags = app_flags & ~FlipperInternalApplicationFlagExternal; return FLIPPER_SETTINGS_APPS[i].path; } } @@ -358,6 +361,7 @@ static FlipperInternalApplication const* loader_find_application_by_name_in_list const FlipperInternalApplication* list, const uint32_t n_apps) { for(size_t i = 0; i < n_apps; i++) { + if(list[i].flags & FlipperInternalApplicationFlagExternal) continue; if((strcmp(name, list[i].name) == 0) || (strcmp(name, list[i].appid) == 0)) { return &list[i]; } @@ -371,6 +375,7 @@ static const FlipperInternalApplication* loader_find_application_by_name(const c const uint32_t count; } lists[] = { {FLIPPER_APPS, FLIPPER_APPS_COUNT}, + {FLIPPER_SETTINGS_APPS, FLIPPER_SETTINGS_APPS_COUNT}, {FLIPPER_SYSTEM_APPS, FLIPPER_SYSTEM_APPS_COUNT}, {FLIPPER_DEBUG_APPS, FLIPPER_DEBUG_APPS_COUNT}, }; @@ -386,7 +391,7 @@ static const FlipperInternalApplication* loader_find_application_by_name(const c return NULL; } -static void loader_start_app_thread(Loader* loader, FlipperApplicationFlag flags) { +static void loader_start_app_thread(Loader* loader, FlipperInternalApplicationFlag flags) { // setup heap trace FuriHalRtcHeapTrackMode mode = furi_hal_rtc_get_heap_track_mode(); if(mode > FuriHalRtcHeapTrackModeNone) { @@ -396,7 +401,7 @@ static void loader_start_app_thread(Loader* loader, FlipperApplicationFlag flags } // setup insomnia - if(!(flags & FlipperApplicationFlagInsomniaSafe)) { + if(!(flags & FlipperInternalApplicationFlagInsomniaSafe)) { furi_hal_power_insomnia_enter(); loader->app.insomniac = true; } else { @@ -502,7 +507,7 @@ static LoaderMessageLoaderStatusResult loader_start_external_app( const char* path, const char* args, FuriString* error_message, - FlipperApplicationFlag flags) { + FlipperInternalApplicationFlag flags) { LoaderMessageLoaderStatusResult result; result.value = loader_make_success_status(error_message); result.error = LoaderStatusErrorUnknown; @@ -700,7 +705,7 @@ static LoaderMessageLoaderStatusResult loader_do_start_by_name( } // check External Applications - FlipperApplicationFlag flags = FlipperApplicationFlagDefault; + FlipperInternalApplicationFlag flags = FlipperInternalApplicationFlagDefault; { const char* path = loader_find_external_application_by_name(name, &flags); if(path) { diff --git a/applications/settings/about/application.fam b/applications/settings/about/application.fam index 055933544..564289408 100644 --- a/applications/settings/about/application.fam +++ b/applications/settings/about/application.fam @@ -1,7 +1,7 @@ App( appid="about", name="About", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="about_settings_app", cdefines=["APP_ABOUT"], requires=[ diff --git a/applications/settings/bt_settings_app/application.fam b/applications/settings/bt_settings_app/application.fam index 3807fe426..1e3705dc4 100644 --- a/applications/settings/bt_settings_app/application.fam +++ b/applications/settings/bt_settings_app/application.fam @@ -1,7 +1,7 @@ App( appid="bt_settings", name="Bluetooth", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="bt_settings_app", stack_size=1 * 1024, requires=[ diff --git a/applications/settings/desktop_settings/application.fam b/applications/settings/desktop_settings/application.fam index 09d7b97ae..620802af2 100644 --- a/applications/settings/desktop_settings/application.fam +++ b/applications/settings/desktop_settings/application.fam @@ -1,7 +1,7 @@ App( appid="desktop_settings", name="Desktop", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="desktop_settings_app", requires=[ "desktop", diff --git a/applications/settings/dolphin_passport/application.fam b/applications/settings/dolphin_passport/application.fam index 9d4f31144..92e5b83b2 100644 --- a/applications/settings/dolphin_passport/application.fam +++ b/applications/settings/dolphin_passport/application.fam @@ -1,7 +1,7 @@ App( appid="passport", name="Passport", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="passport_app", cdefines=["APP_PASSPORT"], requires=[ diff --git a/applications/settings/expansion_settings_app/application.fam b/applications/settings/expansion_settings_app/application.fam index 75418cdd3..983cb0ed6 100644 --- a/applications/settings/expansion_settings_app/application.fam +++ b/applications/settings/expansion_settings_app/application.fam @@ -1,7 +1,7 @@ App( appid="expansion_settings", name="Expansion Modules", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="expansion_settings_app", requires=["gui"], flags=["InsomniaSafe"], diff --git a/applications/settings/notification_settings/application.fam b/applications/settings/notification_settings/application.fam index a2b661dfa..c382ee815 100644 --- a/applications/settings/notification_settings/application.fam +++ b/applications/settings/notification_settings/application.fam @@ -1,7 +1,7 @@ App( appid="notification_settings", name="LCD and Notifications", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="notification_settings_app", requires=["notification"], flags=["InsomniaSafe"], diff --git a/applications/settings/power_settings_app/mock_imports/mock_power_api.c b/applications/settings/power_settings_app/mock_imports/mock_power_api.c deleted file mode 100644 index ef69fc9ca..000000000 --- a/applications/settings/power_settings_app/mock_imports/mock_power_api.c +++ /dev/null @@ -1,7 +0,0 @@ -// Since settings app is external, it cannot access firmware functions -// For simple utils like this, easier to include C code in app rather than exposing to API -// Instead of copying the file, can (ab)use the preprocessor to insert the source code here -// Then, we still use the Header from original code as if nothing happened - -// power_get_settings(), power_set_settings() -#include diff --git a/applications/settings/system/application.fam b/applications/settings/system/application.fam index f9668e5f4..fd961a996 100644 --- a/applications/settings/system/application.fam +++ b/applications/settings/system/application.fam @@ -1,7 +1,7 @@ App( appid="system_settings", name="System", - apptype=FlipperAppType.SETTINGS, + apptype=FlipperAppType.SETTINGSEXTERNAL, entry_point="system_settings_app", requires=["gui", "locale"], flags=["InsomniaSafe"], diff --git a/scripts/fbt/appmanifest.py b/scripts/fbt/appmanifest.py index 469248127..4e4cf8b24 100644 --- a/scripts/fbt/appmanifest.py +++ b/scripts/fbt/appmanifest.py @@ -26,6 +26,7 @@ class FlipperAppType(Enum): STARTUP = "StartupHook" EXTERNAL = "External" MENUEXTERNAL = "MenuExternal" + SETTINGSEXTERNAL = "SettingsExternal" METAPACKAGE = "Package" PLUGIN = "Plugin" @@ -250,6 +251,7 @@ class AppBuildset: FlipperAppType.APP, FlipperAppType.DEBUG, FlipperAppType.ARCHIVE, + FlipperAppType.SETTINGS, FlipperAppType.STARTUP, ) EXTERNAL_APP_TYPES_MAP = { @@ -258,7 +260,7 @@ class AppBuildset: FlipperAppType.PLUGIN: True, FlipperAppType.DEBUG: True, FlipperAppType.MENUEXTERNAL: False, - FlipperAppType.SETTINGS: False, + FlipperAppType.SETTINGSEXTERNAL: False, } @classmethod diff --git a/scripts/fbt_tools/fbt_apps.py b/scripts/fbt_tools/fbt_apps.py index c5e49d6e0..63f670b2f 100644 --- a/scripts/fbt_tools/fbt_apps.py +++ b/scripts/fbt_tools/fbt_apps.py @@ -23,22 +23,20 @@ class ApplicationsCGenerator: FlipperAppType.SYSTEM: ("FlipperInternalApplication", "FLIPPER_SYSTEM_APPS"), FlipperAppType.APP: ("FlipperInternalApplication", "FLIPPER_APPS"), FlipperAppType.DEBUG: ("FlipperInternalApplication", "FLIPPER_DEBUG_APPS"), + FlipperAppType.SETTINGS: ( + "FlipperInternalApplication", + "FLIPPER_SETTINGS_APPS", + ), FlipperAppType.STARTUP: ( "FlipperInternalOnStartHook", "FLIPPER_ON_SYSTEM_START", ), } - EXTERNAL_TYPE_MAP = { - FlipperAppType.MENUEXTERNAL: ( - "FlipperExternalApplication", - "FLIPPER_EXTERNAL_APPS", - ), - FlipperAppType.SETTINGS: ( - "FlipperExternalApplication", - "FLIPPER_SETTINGS_APPS", - ), - } + APP_EXTERNAL_TYPE = ( + "FlipperExternalApplication", + "FLIPPER_EXTERNAL_APPS", + ) def __init__(self, buildset: AppBuildset, autorun_app: str = ""): self.buildset = buildset @@ -52,13 +50,26 @@ class ApplicationsCGenerator: def get_app_descr(self, app: FlipperApplication): if app.apptype == FlipperAppType.STARTUP: return app.entry_point + if app.apptype == FlipperAppType.SETTINGSEXTERNAL: + app_path = "/ext/apps" + if app.fap_category: + app_path += f"/{app.fap_category}" + app_path += f"/{app.appid}.fap" + flags = app.flags + ["External"] + return f""" + {{.app = NULL, + .name = "{app.name}", + .path = "{app_path}", + .stack_size = 0, + .icon = {f"&{app.icon}" if app.icon else "NULL"}, + .flags = {'|'.join(f"FlipperInternalApplicationFlag{flag}" for flag in flags)} }}""" return f""" {{.app = {app.entry_point}, .name = "{app.name}", .appid = "{app.appid}", .stack_size = {app.stack_size}, .icon = {f"&{app.icon}" if app.icon else "NULL"}, - .flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)} }}""" + .flags = {'|'.join(f"FlipperInternalApplicationFlag{flag}" for flag in app.flags)} }}""" def get_external_app_descr(self, app: FlipperApplication): app_path = "/ext/apps" @@ -69,8 +80,7 @@ class ApplicationsCGenerator: {{ .name = "{app.name}", .icon = {f"&{app.icon}" if app.icon else "NULL"}, - .path = "{app_path}", - .flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)} }}""" + .path = "{app_path}" }}""" def generate(self): contents = [ @@ -84,11 +94,11 @@ class ApplicationsCGenerator: ) entry_type, entry_block = self.APP_TYPE_MAP[apptype] contents.append(f"const {entry_type} {entry_block}[] = {{") - contents.append( - ",\n".join( - map(self.get_app_descr, self.buildset.get_apps_of_type(apptype)) - ) - ) + apps = self.buildset.get_apps_of_type(apptype) + if apptype is FlipperAppType.SETTINGS: + apps += self.buildset.get_apps_of_type(FlipperAppType.SETTINGSEXTERNAL) + apps.sort(key=lambda app: app.order) + contents.append(",\n".join(map(self.get_app_descr, apps))) contents.append("};") contents.append( f"const size_t {entry_block}_COUNT = COUNT_OF({entry_block});" @@ -103,15 +113,12 @@ class ApplicationsCGenerator: ] ) - for apptype in self.EXTERNAL_TYPE_MAP: - entry_type, entry_block = self.EXTERNAL_TYPE_MAP[apptype] - external_apps = self.buildset.get_apps_of_type(apptype) - contents.append(f"const {entry_type} {entry_block}[] = {{") - contents.append(",\n".join(map(self.get_external_app_descr, external_apps))) - contents.append("};") - contents.append( - f"const size_t {entry_block}_COUNT = COUNT_OF({entry_block});" - ) + entry_type, entry_block = self.APP_EXTERNAL_TYPE + external_apps = self.buildset.get_apps_of_type(FlipperAppType.MENUEXTERNAL) + contents.append(f"const {entry_type} {entry_block}[] = {{") + contents.append(",\n".join(map(self.get_external_app_descr, external_apps))) + contents.append("};") + contents.append(f"const size_t {entry_block}_COUNT = COUNT_OF({entry_block});") return "\n".join(contents) diff --git a/scripts/fbt_tools/fbt_extapps.py b/scripts/fbt_tools/fbt_extapps.py index 086caf4cf..c39e9b709 100644 --- a/scripts/fbt_tools/fbt_extapps.py +++ b/scripts/fbt_tools/fbt_extapps.py @@ -491,7 +491,7 @@ def _gather_app_components(env, appname) -> AppDeploymentComponents: if host_app.apptype in [ FlipperAppType.EXTERNAL, FlipperAppType.MENUEXTERNAL, - FlipperAppType.SETTINGS, + FlipperAppType.SETTINGSEXTERNAL, ]: components.add_app(host_app) else: diff --git a/scripts/ufbt/SConstruct b/scripts/ufbt/SConstruct index 7f07971f0..4460aeef7 100644 --- a/scripts/ufbt/SConstruct +++ b/scripts/ufbt/SConstruct @@ -232,7 +232,7 @@ apps_to_build_as_faps = [ FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL, FlipperAppType.MENUEXTERNAL, - FlipperAppType.SETTINGS, + FlipperAppType.SETTINGSEXTERNAL, ] known_extapps = [ diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index c5ab23a9d..7a36bfbfa 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -3852,7 +3852,7 @@ Variable,-,FLIPPER_ON_SYSTEM_START,const FlipperInternalOnStartHook[], Variable,-,FLIPPER_ON_SYSTEM_START_COUNT,const size_t, Variable,-,FLIPPER_SERVICES,const FlipperInternalApplication[], Variable,-,FLIPPER_SERVICES_COUNT,const size_t, -Variable,+,FLIPPER_SETTINGS_APPS,const FlipperExternalApplication[], +Variable,+,FLIPPER_SETTINGS_APPS,const FlipperInternalApplication[], Variable,+,FLIPPER_SETTINGS_APPS_COUNT,const size_t, Variable,-,FLIPPER_SYSTEM_APPS,const FlipperInternalApplication[], Variable,-,FLIPPER_SYSTEM_APPS_COUNT,const size_t,