sandbox gui
This commit is contained in:
		| @@ -1,17 +1,123 @@ | |||||||
| #include "flipper.h" | #include "flipper_v2.h" | ||||||
|  | #include <gui/gui.h> | ||||||
|  | #include "menu/menu.h" | ||||||
|  |  | ||||||
| /* | typedef struct { | ||||||
| render_loader |     FuriApp* handler; | ||||||
|  |     Widget* widget; | ||||||
|  |     FlipperStartupApp* current_app; | ||||||
|  | } AppLoaderState; | ||||||
|  |  | ||||||
| handle_input | typedef struct { | ||||||
|  |     AppLoaderState* state; | ||||||
|  |     FlipperStartupApp* app; | ||||||
|  | } AppLoaderContext; | ||||||
|  |  | ||||||
| handle_menu | void render_callback(CanvasApi* canvas, void* _ctx) { | ||||||
| */ |     AppLoaderState* ctx = (AppLoaderState*)_ctx; | ||||||
|  |  | ||||||
|  |     canvas->clear(canvas); | ||||||
|  |     canvas->set_color(canvas, ColorBlack); | ||||||
|  |     canvas->set_font(canvas, FontPrimary); | ||||||
|  |     canvas->draw_str(canvas, 2, 32, ctx->current_app->name); | ||||||
|  |  | ||||||
|  |     canvas->set_font(canvas, FontSecondary); | ||||||
|  |     canvas->draw_str(canvas, 2, 44, "press back to exit"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void input_callback(InputEvent* input_event, void* _ctx) { | ||||||
|  |     AppLoaderState* ctx = (AppLoaderState*)_ctx; | ||||||
|  |  | ||||||
|  |     if(input_event->state && input_event->input == InputBack){ | ||||||
|  |         widget_enabled_set(ctx->widget, false); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void handle_menu(void* _ctx) { | ||||||
|  |     AppLoaderContext* ctx = (AppLoaderContext*)_ctx; | ||||||
|  |  | ||||||
|  |     ctx->state->current_app = ctx->app; | ||||||
|  |  | ||||||
|  |     widget_enabled_set(ctx->state->widget, true); | ||||||
|  |  | ||||||
|  |     // TODO create a dependency tree and run tasks in the desired order | ||||||
|  |     // furiac_wait_libs(&FLIPPER_STARTUP[i].libs); | ||||||
|  |     // handlers[i] = furiac_start(FLIPPER_STARTUP[i].app, FLIPPER_STARTUP[i].name, NULL); | ||||||
|  |     // FuriApp* handlers[flipper_app_count]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void application_blink(void* p); | ||||||
|  | void application_uart_write(void* p); | ||||||
|  | void application_input_dump(void* p); | ||||||
|  |  | ||||||
|  | const FlipperStartupApp FLIPPER_APPS[] = { | ||||||
|  |     {.app = application_blink, .name = "blink", .libs = {0}}, | ||||||
|  |     {.app = application_uart_write, .name = "uart write", .libs = {0}}, | ||||||
|  |     {.app = application_input_dump, .name = "input dump", .libs = {1, FURI_LIB{"input_task"}}}, | ||||||
|  | }; | ||||||
|  |  | ||||||
| void app_loader(void* p) { | void app_loader(void* p) { | ||||||
|     osThreadId_t self_id = osThreadGetId(); |     osThreadId_t self_id = osThreadGetId(); | ||||||
|     assert(self_id); |     assert(self_id); | ||||||
|  |  | ||||||
|  |     AppLoaderState state; | ||||||
|  |     state.handler = NULL; | ||||||
|  |  | ||||||
|  |     state.widget = widget_alloc(); | ||||||
|  |     assert(state.widget); | ||||||
|  |     widget_enabled_set(state.widget, false); | ||||||
|  |     widget_draw_callback_set(state.widget, render_callback, &state); | ||||||
|  |     widget_input_callback_set(state.widget, input_callback, &state); | ||||||
|  |  | ||||||
|  |     ValueMutex* menu_mutex = furi_open("menu"); | ||||||
|  |     if(menu_mutex == NULL) { | ||||||
|  |         printf("menu is not available\n"); | ||||||
|  |         furiac_exit(NULL); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Open GUI and register widget | ||||||
|  |     GuiApi* gui = furi_open("gui"); | ||||||
|  |     if(gui == NULL) { | ||||||
|  |         printf("gui is not available\n"); | ||||||
|  |         furiac_exit(NULL); | ||||||
|  |     } | ||||||
|  |     gui->add_widget(gui, state.widget, WidgetLayerFullscreen); | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |         Menu* menu = acquire_mutex_block(menu_mutex); | ||||||
|  |  | ||||||
|  |         // FURI startup | ||||||
|  |         const size_t flipper_app_count = sizeof(FLIPPER_APPS) / sizeof(FLIPPER_APPS[0]); | ||||||
|  |  | ||||||
|  |         for(size_t i = 0; i < flipper_app_count; i++) { | ||||||
|  |             AppLoaderContext* ctx = furi_alloc(sizeof(AppLoaderContext)); | ||||||
|  |             ctx->state = &state; | ||||||
|  |             ctx->app = &FLIPPER_APPS[i]; | ||||||
|  |  | ||||||
|  |             menu_item_add(menu, menu_item_alloc_function( | ||||||
|  |                 FLIPPER_APPS[i].name, | ||||||
|  |                 NULL, | ||||||
|  |                 handle_menu, | ||||||
|  |                 ctx | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("Sub 1 gHz", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("125 kHz RFID", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("Infrared", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("I-Button", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("USB", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("Bluetooth", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("GPIO / HW", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("U2F", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("Tamagotchi", NULL, NULL, NULL)); | ||||||
|  |         menu_item_add(menu, menu_item_alloc_function("Plugins", NULL, NULL, NULL)); | ||||||
|  |         */ | ||||||
|  |  | ||||||
|  |         release_mutex(menu_mutex, menu); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     printf("[app loader] start\n"); |     printf("[app loader] start\n"); | ||||||
|  |  | ||||||
|     osThreadSuspend(self_id); |     osThreadSuspend(self_id); | ||||||
|   | |||||||
| @@ -17,6 +17,10 @@ APP_GUI		= 1 | |||||||
| CFLAGS		+= -DAPP_MENU | CFLAGS		+= -DAPP_MENU | ||||||
| C_SOURCES	+= $(wildcard $(APP_DIR)/menu/*.c) | C_SOURCES	+= $(wildcard $(APP_DIR)/menu/*.c) | ||||||
| C_SOURCES	+= $(wildcard $(APP_DIR)/app-loader/*.c) | C_SOURCES	+= $(wildcard $(APP_DIR)/app-loader/*.c) | ||||||
|  |  | ||||||
|  | APP_EXAMPLE_BLINK = 1 | ||||||
|  | APP_EXAMPLE_UART_WRITE = 1 | ||||||
|  | APP_EXAMPLE_INPUT_DUMP = 1 | ||||||
| endif | endif | ||||||
|  |  | ||||||
| APP_TEST	?= 0 | APP_TEST	?= 0 | ||||||
|   | |||||||
| @@ -55,17 +55,6 @@ void menu_build_main(Menu* menu) { | |||||||
|     // Root point |     // Root point | ||||||
|     menu->root = menu_item_alloc_menu(NULL, NULL); |     menu->root = menu_item_alloc_menu(NULL, NULL); | ||||||
|  |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("Sub 1 gHz", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("125 kHz RFID", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("Infrared", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("I-Button", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("USB", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("Bluetooth", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("GPIO / HW", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("U2F", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("Tamagotchi", NULL, NULL, NULL)); |  | ||||||
|     menu_item_add(menu, menu_item_alloc_function("Plugins", NULL, NULL, NULL)); |  | ||||||
|  |  | ||||||
|     menu->settings = menu_item_alloc_menu("Setting", NULL); |     menu->settings = menu_item_alloc_menu("Setting", NULL); | ||||||
|     menu_item_subitem_add(menu->settings, menu_item_alloc_function("one", NULL, NULL, NULL)); |     menu_item_subitem_add(menu->settings, menu_item_alloc_function("one", NULL, NULL, NULL)); | ||||||
|     menu_item_subitem_add(menu->settings, menu_item_alloc_function("two", NULL, NULL, NULL)); |     menu_item_subitem_add(menu->settings, menu_item_alloc_function("two", NULL, NULL, NULL)); | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
|  | #include "menu/menu_item.h" | ||||||
|  |  | ||||||
| typedef struct Menu Menu; | typedef struct Menu Menu; | ||||||
| typedef struct MenuItem MenuItem; | typedef struct MenuItem MenuItem; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,8 +2,6 @@ | |||||||
|  |  | ||||||
| #include "flipper.h" | #include "flipper.h" | ||||||
|  |  | ||||||
| #define FURI_LIB (const char*[]) |  | ||||||
|  |  | ||||||
| #ifdef APP_TEST | #ifdef APP_TEST | ||||||
| void flipper_test_app(void* p); | void flipper_test_app(void* p); | ||||||
| #endif | #endif | ||||||
| @@ -54,23 +52,11 @@ const FlipperStartupApp FLIPPER_STARTUP[] = { | |||||||
|     {.app = flipper_test_app, .name = "test app", .libs = {0}}, |     {.app = flipper_test_app, .name = "test app", .libs = {0}}, | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef APP_EXAMPLE_BLINK |  | ||||||
|     {.app = application_blink, .name = "blink", .libs = {0}}, |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef APP_EXAMPLE_UART_WRITE |  | ||||||
|     {.app = application_uart_write, .name = "uart write", .libs = {0}}, |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef APP_EXAMPLE_IPC | #ifdef APP_EXAMPLE_IPC | ||||||
|     {.app = application_ipc_display, .name = "ipc display", .libs = {0}}, |     {.app = application_ipc_display, .name = "ipc display", .libs = {0}}, | ||||||
|     {.app = application_ipc_widget, .name = "ipc widget", .libs = {0}}, |     {.app = application_ipc_widget, .name = "ipc widget", .libs = {0}}, | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef APP_EXAMPLE_INPUT_DUMP |  | ||||||
|     {.app = application_input_dump, .name = "input dump", .libs = {1, FURI_LIB{"input_task"}}}, |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef APP_EXAMPLE_QRCODE | #ifdef APP_EXAMPLE_QRCODE | ||||||
|     {.app = u8g2_qrcode, .name = "u8g2_qrcode", .libs = {1, FURI_LIB{"display_u8g2"}}}, |     {.app = u8g2_qrcode, .name = "u8g2_qrcode", .libs = {1, FURI_LIB{"display_u8g2"}}}, | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -34,3 +34,5 @@ extern "C" { | |||||||
| #define HIGH true | #define HIGH true | ||||||
|  |  | ||||||
| void set_exitcode(uint32_t _exitcode); | void set_exitcode(uint32_t _exitcode); | ||||||
|  |  | ||||||
|  | #define FURI_LIB (const char*[]) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user