timed_remote.c (3889B)
1 #include "timed_remote.h" 2 #include "scenes/timed_remote_scene.h" 3 4 extern const SceneManagerHandlers timed_remote_scene_handlers; 5 6 /* View dispatcher navigation callback */ 7 static bool timed_remote_navigation_callback(void *context) { 8 TimedRemoteApp *app = context; 9 return scene_manager_handle_back_event(app->scene_manager); 10 } 11 12 /* View dispatcher custom event callback */ 13 static bool timed_remote_custom_event_callback(void *context, 14 uint32_t custom_event) { 15 TimedRemoteApp *app = context; 16 return scene_manager_handle_custom_event(app->scene_manager, custom_event); 17 } 18 19 TimedRemoteApp *timed_remote_app_alloc(void) { 20 TimedRemoteApp *app = malloc(sizeof(TimedRemoteApp)); 21 memset(app, 0, sizeof(TimedRemoteApp)); 22 23 /* Open GUI record */ 24 app->gui = furi_record_open(RECORD_GUI); 25 26 /* Allocate view dispatcher */ 27 app->view_dispatcher = view_dispatcher_alloc(); 28 view_dispatcher_set_event_callback_context(app->view_dispatcher, app); 29 view_dispatcher_set_navigation_event_callback( 30 app->view_dispatcher, timed_remote_navigation_callback); 31 view_dispatcher_set_custom_event_callback(app->view_dispatcher, 32 timed_remote_custom_event_callback); 33 view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, 34 ViewDispatcherTypeFullscreen); 35 36 /* Allocate scene manager */ 37 app->scene_manager = scene_manager_alloc(&timed_remote_scene_handlers, app); 38 39 /* Allocate views */ 40 app->submenu = submenu_alloc(); 41 view_dispatcher_add_view(app->view_dispatcher, TimedRemoteViewSubmenu, 42 submenu_get_view(app->submenu)); 43 44 app->variable_item_list = variable_item_list_alloc(); 45 view_dispatcher_add_view( 46 app->view_dispatcher, TimedRemoteViewVariableItemList, 47 variable_item_list_get_view(app->variable_item_list)); 48 49 app->text_input = text_input_alloc(); 50 view_dispatcher_add_view(app->view_dispatcher, TimedRemoteViewTextInput, 51 text_input_get_view(app->text_input)); 52 53 app->widget = widget_alloc(); 54 view_dispatcher_add_view(app->view_dispatcher, TimedRemoteViewWidget, 55 widget_get_view(app->widget)); 56 57 app->popup = popup_alloc(); 58 view_dispatcher_add_view(app->view_dispatcher, TimedRemoteViewPopup, 59 popup_get_view(app->popup)); 60 61 return app; 62 } 63 64 void timed_remote_app_free(TimedRemoteApp *app) { 65 /* Free timer if still running */ 66 if (app->timer) { 67 furi_timer_stop(app->timer); 68 furi_timer_free(app->timer); 69 } 70 71 /* Free IR signal if allocated */ 72 if (app->ir_signal) { 73 infrared_signal_free(app->ir_signal); 74 } 75 76 /* Remove and free views */ 77 view_dispatcher_remove_view(app->view_dispatcher, TimedRemoteViewSubmenu); 78 submenu_free(app->submenu); 79 80 view_dispatcher_remove_view(app->view_dispatcher, 81 TimedRemoteViewVariableItemList); 82 variable_item_list_free(app->variable_item_list); 83 84 view_dispatcher_remove_view(app->view_dispatcher, TimedRemoteViewTextInput); 85 text_input_free(app->text_input); 86 87 view_dispatcher_remove_view(app->view_dispatcher, TimedRemoteViewWidget); 88 widget_free(app->widget); 89 90 view_dispatcher_remove_view(app->view_dispatcher, TimedRemoteViewPopup); 91 popup_free(app->popup); 92 93 /* Free scene manager */ 94 scene_manager_free(app->scene_manager); 95 96 /* Free view dispatcher */ 97 view_dispatcher_free(app->view_dispatcher); 98 99 /* Close GUI record */ 100 furi_record_close(RECORD_GUI); 101 102 free(app); 103 } 104 105 int32_t timed_remote_app(void *p) { 106 UNUSED(p); 107 108 TimedRemoteApp *app = timed_remote_app_alloc(); 109 110 /* Start with file browser scene */ 111 scene_manager_next_scene(app->scene_manager, TimedRemoteSceneIrBrowse); 112 113 /* Run event loop */ 114 view_dispatcher_run(app->view_dispatcher); 115 116 /* Cleanup */ 117 timed_remote_app_free(app); 118 119 return 0; 120 }