From 71d1c1d0f1456c2a901559cdbde03eefe132340f Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sun, 25 Jun 2023 22:39:15 +0100 Subject: [PATCH] FAPP(TM) support --- applications/services/loader/loader.c | 13 ++++++++++--- scripts/fbt/appmanifest.py | 19 ++++++++++++++----- scripts/fbt_tools/fbt_extapps.py | 2 +- site_scons/extapps.scons | 1 + 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index ab7876a03..91b6d1a2d 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -366,8 +366,15 @@ static LoaderStatus loader_do_start_by_name( { const FlipperInternalApplication* app = loader_find_application_by_name(name); if(app) { - loader_start_internal_app(loader, app, args); - status = loader_make_success_status(error_message); + if(app->app == NULL) { + // FAPP support + status = loader_start_external_app( + loader, furi_record_open(RECORD_STORAGE), app->appid, args, error_message); + furi_record_close(RECORD_STORAGE); + } else { + loader_start_internal_app(loader, app, args); + status = loader_make_success_status(error_message); + } break; } } @@ -495,4 +502,4 @@ int32_t loader_srv(void* p) { } return 0; -} \ No newline at end of file +} diff --git a/scripts/fbt/appmanifest.py b/scripts/fbt/appmanifest.py index c917c9a7a..86ed066ed 100644 --- a/scripts/fbt/appmanifest.py +++ b/scripts/fbt/appmanifest.py @@ -13,6 +13,7 @@ class FlipperAppType(Enum): SERVICE = "Service" SYSTEM = "System" APP = "App" + FAPP = "Fapp" DEBUG = "Debug" ARCHIVE = "Archive" SETTINGS = "Settings" @@ -375,6 +376,14 @@ class ApplicationsCGenerator: def get_app_descr(self, app: FlipperApplication): if app.apptype == FlipperAppType.STARTUP: return app.entry_point + if app.apptype == FlipperAppType.FAPP: + return f""" + {{.app = NULL, + .name = "{app.name}", + .appid = "/ext/apps/.Main/{app.appid}.fap", + .stack_size = 0, + .icon = {f"&{app.icon}" if app.icon else "NULL"}, + .flags = {'|'.join(f"FlipperInternalApplicationFlag{flag}" for flag in app.flags)}}}""" return f""" {{.app = {app.entry_point}, .name = "{app.name}", @@ -395,11 +404,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.APP: + apps += self.buildset.get_apps_of_type(FlipperAppType.FAPP) + 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});" diff --git a/scripts/fbt_tools/fbt_extapps.py b/scripts/fbt_tools/fbt_extapps.py index 3ad3fbda8..2441ed883 100644 --- a/scripts/fbt_tools/fbt_extapps.py +++ b/scripts/fbt_tools/fbt_extapps.py @@ -179,7 +179,7 @@ class AppBuilder: deployable = False app_artifacts.dist_entries.append((deployable, fal_path)) else: - fap_path = f"apps/{self.app.fap_category}/{app_artifacts.compact.name}" + fap_path = f"apps/{'.Main' if self.app.apptype == FlipperAppType.FAPP else self.app.fap_category}/{app_artifacts.compact.name}" app_artifacts.dist_entries.append( (self.app.is_default_deployable, fap_path) ) diff --git a/site_scons/extapps.scons b/site_scons/extapps.scons index 6db0e538d..1005ab1a6 100644 --- a/site_scons/extapps.scons +++ b/site_scons/extapps.scons @@ -65,6 +65,7 @@ class FlipperExtAppBuildArtifacts: apps_to_build_as_faps = [ + FlipperAppType.FAPP, FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL, FlipperAppType.DEBUG,