diff --git a/applications/main/application.fam b/applications/main/application.fam index 21e58cd5f..94aff522e 100644 --- a/applications/main/application.fam +++ b/applications/main/application.fam @@ -3,14 +3,17 @@ App( name="Basic applications for main menu", apptype=FlipperAppType.METAPACKAGE, provides=[ + "clock_loader", "gpio", # "ibutton", + "ibutton_loader", "infrared", "lfrfid", "nfc", "subghz", "bad_usb", # "u2f", + "u2f_loader", "fap_loader", "archive", # "Clock", diff --git a/applications/main/clock_loader/application.fam b/applications/main/clock_loader/application.fam new file mode 100644 index 000000000..cbb627c9c --- /dev/null +++ b/applications/main/clock_loader/application.fam @@ -0,0 +1,11 @@ +App( + appid="clock_loader", + name="Clock", + apptype=FlipperAppType.APP, + entry_point="clock_loader_app", + requires=["gui"], + stack_size=int(1.5 * 1024), + icon="A_Clock_14", + order=9, + link="/ext/apps/Main/Clock.fap", +) diff --git a/applications/main/clock_loader/clock_loader_app.c b/applications/main/clock_loader/clock_loader_app.c new file mode 100644 index 000000000..cf345d9f3 --- /dev/null +++ b/applications/main/clock_loader/clock_loader_app.c @@ -0,0 +1,9 @@ +#include + +#define TAG "clock_loader_app" + +int32_t clock_loader_app(void* p) { + UNUSED(p); + + return 0; +} \ No newline at end of file diff --git a/applications/main/ibutton_loader/application.fam b/applications/main/ibutton_loader/application.fam new file mode 100644 index 000000000..b4150f46b --- /dev/null +++ b/applications/main/ibutton_loader/application.fam @@ -0,0 +1,14 @@ +App( + appid="ibutton_loader", + name="iButton", + apptype=FlipperAppType.APP, + entry_point="ibutton_loader_app", + requires=[ + "gui", + "storage", + ], + stack_size=int(1.5 * 1024), + icon="A_iButton_14", + order=60, + link="/ext/apps/Main/ibutton.fap", +) diff --git a/applications/main/ibutton_loader/ibutton_loader_app.c b/applications/main/ibutton_loader/ibutton_loader_app.c new file mode 100644 index 000000000..8738d9491 --- /dev/null +++ b/applications/main/ibutton_loader/ibutton_loader_app.c @@ -0,0 +1,9 @@ +#include + +#define TAG "ibutton_loader_app" + +int32_t ibutton_loader_app(void* p) { + UNUSED(p); + + return 0; +} \ No newline at end of file diff --git a/applications/main/u2f_loader/application.fam b/applications/main/u2f_loader/application.fam new file mode 100644 index 000000000..3da5bf205 --- /dev/null +++ b/applications/main/u2f_loader/application.fam @@ -0,0 +1,14 @@ +App( + appid="u2f_loader", + name="U2F", + apptype=FlipperAppType.APP, + entry_point="u2f_loader_app", + requires=[ + "gui", + "dialogs", + ], + stack_size=int(2 * 1024), + icon="A_U2F_14", + order=80, + link="/ext/apps/Main/u2f.fap", +) diff --git a/applications/main/u2f_loader/u2f_loader_app.c b/applications/main/u2f_loader/u2f_loader_app.c new file mode 100644 index 000000000..186d2489b --- /dev/null +++ b/applications/main/u2f_loader/u2f_loader_app.c @@ -0,0 +1,9 @@ +#include + +#define TAG "u2f_loader_app" + +int32_t u2f_loader_app(void* p) { + UNUSED(p); + + return 0; +} \ No newline at end of file diff --git a/applications/services/applications.h b/applications/services/applications.h index 012e80ddb..6559174bf 100644 --- a/applications/services/applications.h +++ b/applications/services/applications.h @@ -14,6 +14,7 @@ typedef struct { const size_t stack_size; const Icon* icon; const FlipperApplicationFlag flags; + const char* link; } FlipperApplication; typedef void (*FlipperOnStartHook)(void); diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index 4ab9bce80..73fd6b70e 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -41,13 +41,18 @@ static void loader_menu_callback(void* _ctx, uint32_t index) { furi_assert(application->app); furi_assert(application->name); + furi_assert(application->link); - if(!loader_lock(loader_instance)) { - FURI_LOG_E(TAG, "Loader is locked"); - return; + if(strcmp(application->link, "NULL") != 0) { + LoaderStatus status = loader_start(NULL, "Applications", application->link); + } else { + if(!loader_lock(loader_instance)) { + FURI_LOG_E(TAG, "Loader is locked"); + return; + } + + loader_start_application(application, NULL); } - - loader_start_application(application, NULL); } static void loader_submenu_callback(void* context, uint32_t index) { @@ -56,24 +61,6 @@ static void loader_submenu_callback(void* context, uint32_t index) { view_dispatcher_switch_to_view(loader_instance->view_dispatcher, view_id); } -static void loader_clock_callback(void* context, uint32_t index) { - UNUSED(context); - UNUSED(index); - LoaderStatus status = loader_start(NULL, "Applications", EXT_PATH("/apps/Main/Clock.fap")); -} - -static void loader_ibutton_callback(void* context, uint32_t index) { - UNUSED(context); - UNUSED(index); - LoaderStatus status = loader_start(NULL, "Applications", EXT_PATH("/apps/Main/ibutton.fap")); -} - -static void loader_u2f_callback(void* context, uint32_t index) { - UNUSED(context); - UNUSED(index); - LoaderStatus status = loader_start(NULL, "Applications", EXT_PATH("/apps/Main/u2f.fap")); -} - static void loader_cli_print_usage() { printf("Usage:\r\n"); printf("loader \r\n"); @@ -161,19 +148,24 @@ void loader_cli_list(Cli* cli, string_t args, Loader* instance) { UNUSED(args); UNUSED(instance); printf("Applications:\r\n"); - printf("\t%s\r\n", "Clock"); + //printf("\t%s\r\n", "Clock"); for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) { - printf("\t%s\r\n", FLIPPER_APPS[i].name); + if(strcmp(FLIPPER_APPS[i].link, "NULL") != 0) { + printf( + "\tFor %s, Use: Applications %s\r\n", FLIPPER_APPS[i].name, FLIPPER_APPS[i].link); + } else { + printf("\t%s\r\n", FLIPPER_APPS[i].name); + } } printf("Plugins:\r\n"); for(size_t i = 0; i < FLIPPER_PLUGINS_COUNT; i++) { printf("\t%s\r\n", FLIPPER_PLUGINS[i].name); } - printf("\t%s\r\n", "iButton"); - printf("\t%s\r\n", "U2F"); + //printf("\t%s\r\n", "iButton"); + //printf("\t%s\r\n", "U2F"); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && FLIPPER_DEBUG_APPS_COUNT!=0) { + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && FLIPPER_DEBUG_APPS_COUNT != 0) { printf("Debug:\r\n"); for(size_t i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) { printf("\t%s\r\n", FLIPPER_DEBUG_APPS[i].name); @@ -392,13 +384,6 @@ static void loader_free(Loader* instance) { static void loader_build_menu() { FURI_LOG_I(TAG, "Building main menu"); size_t i; - menu_add_item( - loader_instance->primary_menu, - "Clock", - &A_Clock_14, - 0, - loader_clock_callback, - (void*)NULL); for(i = 0; i < FLIPPER_APPS_COUNT; i++) { menu_add_item( loader_instance->primary_menu, @@ -417,20 +402,6 @@ static void loader_build_menu() { loader_submenu_callback, (void*)LoaderMenuViewPlugins); } - menu_add_item( - loader_instance->primary_menu, - "iButton", - &A_iButton_14, - i++, - loader_ibutton_callback, - (void*)NULL); - menu_add_item( - loader_instance->primary_menu, - "U2F", - &A_U2F_14, - i++, - loader_u2f_callback, - (void*)NULL); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && FLIPPER_DEBUG_APPS_COUNT != 0) { menu_add_item( loader_instance->primary_menu, diff --git a/site_scons/fbt/appmanifest.py b/site_scons/fbt/appmanifest.py index a0ab5e7c6..9df436712 100644 --- a/site_scons/fbt/appmanifest.py +++ b/site_scons/fbt/appmanifest.py @@ -35,6 +35,7 @@ class FlipperApplication: stack_size: int = 2048 icon: Optional[str] = None order: int = 0 + link: Optional[str] = "" sdk_headers: List[str] = field(default_factory=list) # .fap-specific sources: List[str] = field(default_factory=lambda: ["*.c*"]) @@ -255,6 +256,7 @@ class ApplicationsCGenerator: .name = "{app.name}", .stack_size = {app.stack_size}, .icon = {f"&{app.icon}" if app.icon else "NULL"}, + .link = "{f"{app.link}" if app.link else "NULL"}", .flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)} }}""" def generate(self):