Skip to content

Commit 48f0ad5

Browse files
authored
Merge pull request #336 from ESurge/420
Added ability to create "loader apps" for use on Main Menu
2 parents ba7292f + 7cb7a20 commit 48f0ad5

File tree

10 files changed

+92
-49
lines changed

10 files changed

+92
-49
lines changed

applications/main/application.fam

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@ App(
33
name="Basic applications for main menu",
44
apptype=FlipperAppType.METAPACKAGE,
55
provides=[
6+
"clock_loader",
67
"gpio",
78
# "ibutton",
9+
"ibutton_loader",
810
"infrared",
911
"lfrfid",
1012
"nfc",
1113
"subghz",
1214
"bad_usb",
1315
# "u2f",
16+
"u2f_loader",
1417
"fap_loader",
1518
"archive",
1619
# "Clock",
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
App(
2+
appid="clock_loader",
3+
name="Clock",
4+
apptype=FlipperAppType.APP,
5+
entry_point="clock_loader_app",
6+
requires=["gui"],
7+
stack_size=int(1.5 * 1024),
8+
icon="A_Clock_14",
9+
order=9,
10+
link="/ext/apps/Main/Clock.fap",
11+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include <applications/services/loader/loader_i.h>
2+
3+
#define TAG "clock_loader_app"
4+
5+
int32_t clock_loader_app(void* p) {
6+
UNUSED(p);
7+
8+
return 0;
9+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
App(
2+
appid="ibutton_loader",
3+
name="iButton",
4+
apptype=FlipperAppType.APP,
5+
entry_point="ibutton_loader_app",
6+
requires=[
7+
"gui",
8+
"storage",
9+
],
10+
stack_size=int(1.5 * 1024),
11+
icon="A_iButton_14",
12+
order=60,
13+
link="/ext/apps/Main/ibutton.fap",
14+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include <applications/services/loader/loader_i.h>
2+
3+
#define TAG "ibutton_loader_app"
4+
5+
int32_t ibutton_loader_app(void* p) {
6+
UNUSED(p);
7+
8+
return 0;
9+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
App(
2+
appid="u2f_loader",
3+
name="U2F",
4+
apptype=FlipperAppType.APP,
5+
entry_point="u2f_loader_app",
6+
requires=[
7+
"gui",
8+
"dialogs",
9+
],
10+
stack_size=int(2 * 1024),
11+
icon="A_U2F_14",
12+
order=80,
13+
link="/ext/apps/Main/u2f.fap",
14+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include <applications/services/loader/loader_i.h>
2+
3+
#define TAG "u2f_loader_app"
4+
5+
int32_t u2f_loader_app(void* p) {
6+
UNUSED(p);
7+
8+
return 0;
9+
}

applications/services/applications.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ typedef struct {
1414
const size_t stack_size;
1515
const Icon* icon;
1616
const FlipperApplicationFlag flags;
17+
const char* link;
1718
} FlipperApplication;
1819

1920
typedef void (*FlipperOnStartHook)(void);

applications/services/loader/loader.c

Lines changed: 20 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,18 @@ static void loader_menu_callback(void* _ctx, uint32_t index) {
4141

4242
furi_assert(application->app);
4343
furi_assert(application->name);
44+
furi_assert(application->link);
4445

45-
if(!loader_lock(loader_instance)) {
46-
FURI_LOG_E(TAG, "Loader is locked");
47-
return;
48-
}
46+
if(strcmp(application->link, "NULL") != 0) {
47+
LoaderStatus status = loader_start(NULL, "Applications", application->link);
48+
} else {
49+
if(!loader_lock(loader_instance)) {
50+
FURI_LOG_E(TAG, "Loader is locked");
51+
return;
52+
}
4953

50-
loader_start_application(application, NULL);
54+
loader_start_application(application, NULL);
55+
}
5156
}
5257

5358
static void loader_submenu_callback(void* context, uint32_t index) {
@@ -56,24 +61,6 @@ static void loader_submenu_callback(void* context, uint32_t index) {
5661
view_dispatcher_switch_to_view(loader_instance->view_dispatcher, view_id);
5762
}
5863

59-
static void loader_clock_callback(void* context, uint32_t index) {
60-
UNUSED(context);
61-
UNUSED(index);
62-
LoaderStatus status = loader_start(NULL, "Applications", EXT_PATH("/apps/Main/Clock.fap"));
63-
}
64-
65-
static void loader_ibutton_callback(void* context, uint32_t index) {
66-
UNUSED(context);
67-
UNUSED(index);
68-
LoaderStatus status = loader_start(NULL, "Applications", EXT_PATH("/apps/Main/ibutton.fap"));
69-
}
70-
71-
static void loader_u2f_callback(void* context, uint32_t index) {
72-
UNUSED(context);
73-
UNUSED(index);
74-
LoaderStatus status = loader_start(NULL, "Applications", EXT_PATH("/apps/Main/u2f.fap"));
75-
}
76-
7764
static void loader_cli_print_usage() {
7865
printf("Usage:\r\n");
7966
printf("loader <cmd> <args>\r\n");
@@ -161,19 +148,24 @@ void loader_cli_list(Cli* cli, string_t args, Loader* instance) {
161148
UNUSED(args);
162149
UNUSED(instance);
163150
printf("Applications:\r\n");
164-
printf("\t%s\r\n", "Clock");
151+
//printf("\t%s\r\n", "Clock");
165152
for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) {
166-
printf("\t%s\r\n", FLIPPER_APPS[i].name);
153+
if(strcmp(FLIPPER_APPS[i].link, "NULL") != 0) {
154+
printf(
155+
"\tFor %s, Use: Applications %s\r\n", FLIPPER_APPS[i].name, FLIPPER_APPS[i].link);
156+
} else {
157+
printf("\t%s\r\n", FLIPPER_APPS[i].name);
158+
}
167159
}
168160

169161
printf("Plugins:\r\n");
170162
for(size_t i = 0; i < FLIPPER_PLUGINS_COUNT; i++) {
171163
printf("\t%s\r\n", FLIPPER_PLUGINS[i].name);
172164
}
173-
printf("\t%s\r\n", "iButton");
174-
printf("\t%s\r\n", "U2F");
165+
//printf("\t%s\r\n", "iButton");
166+
//printf("\t%s\r\n", "U2F");
175167

176-
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && FLIPPER_DEBUG_APPS_COUNT!=0) {
168+
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && FLIPPER_DEBUG_APPS_COUNT != 0) {
177169
printf("Debug:\r\n");
178170
for(size_t i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) {
179171
printf("\t%s\r\n", FLIPPER_DEBUG_APPS[i].name);
@@ -392,13 +384,6 @@ static void loader_free(Loader* instance) {
392384
static void loader_build_menu() {
393385
FURI_LOG_I(TAG, "Building main menu");
394386
size_t i;
395-
menu_add_item(
396-
loader_instance->primary_menu,
397-
"Clock",
398-
&A_Clock_14,
399-
0,
400-
loader_clock_callback,
401-
(void*)NULL);
402387
for(i = 0; i < FLIPPER_APPS_COUNT; i++) {
403388
menu_add_item(
404389
loader_instance->primary_menu,
@@ -417,20 +402,6 @@ static void loader_build_menu() {
417402
loader_submenu_callback,
418403
(void*)LoaderMenuViewPlugins);
419404
}
420-
menu_add_item(
421-
loader_instance->primary_menu,
422-
"iButton",
423-
&A_iButton_14,
424-
i++,
425-
loader_ibutton_callback,
426-
(void*)NULL);
427-
menu_add_item(
428-
loader_instance->primary_menu,
429-
"U2F",
430-
&A_U2F_14,
431-
i++,
432-
loader_u2f_callback,
433-
(void*)NULL);
434405
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && FLIPPER_DEBUG_APPS_COUNT != 0) {
435406
menu_add_item(
436407
loader_instance->primary_menu,

site_scons/fbt/appmanifest.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class FlipperApplication:
3535
stack_size: int = 2048
3636
icon: Optional[str] = None
3737
order: int = 0
38+
link: Optional[str] = ""
3839
sdk_headers: List[str] = field(default_factory=list)
3940
# .fap-specific
4041
sources: List[str] = field(default_factory=lambda: ["*.c*"])
@@ -255,6 +256,7 @@ def get_app_descr(self, app: FlipperApplication):
255256
.name = "{app.name}",
256257
.stack_size = {app.stack_size},
257258
.icon = {f"&{app.icon}" if app.icon else "NULL"},
259+
.link = "{f"{app.link}" if app.link else "NULL"}",
258260
.flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)} }}"""
259261

260262
def generate(self):

0 commit comments

Comments
 (0)