timed_remote.c (2443B)
1 #include <stdlib.h> 2 #include <string.h> 3 4 #include "scenes/timed_remote_scene.h" 5 #include "timed_remote.h" 6 7 extern const SceneManagerHandlers scene_handlers; 8 9 static bool 10 nav_cb(void *context) 11 { 12 TimedRemoteApp *app; 13 14 app = context; 15 return scene_manager_handle_back_event(app->sm); 16 } 17 18 static bool 19 evt_cb(void *context, uint32_t evt) 20 { 21 TimedRemoteApp *app; 22 23 app = context; 24 return scene_manager_handle_custom_event(app->sm, evt); 25 } 26 27 TimedRemoteApp * 28 timed_remote_app_alloc(void) 29 { 30 TimedRemoteApp *app; 31 32 app = malloc(sizeof(TimedRemoteApp)); 33 if (app == NULL) 34 return NULL; 35 memset(app, 0, sizeof(TimedRemoteApp)); 36 37 app->gui = furi_record_open(RECORD_GUI); 38 39 app->vd = view_dispatcher_alloc(); 40 view_dispatcher_set_event_callback_context(app->vd, app); 41 view_dispatcher_set_navigation_event_callback(app->vd, nav_cb); 42 view_dispatcher_set_custom_event_callback(app->vd, evt_cb); 43 view_dispatcher_attach_to_gui( 44 app->vd, app->gui, ViewDispatcherTypeFullscreen); 45 46 app->sm = scene_manager_alloc(&scene_handlers, app); 47 48 app->submenu = submenu_alloc(); 49 view_dispatcher_add_view( 50 app->vd, VIEW_MENU, submenu_get_view(app->submenu)); 51 52 app->vlist = variable_item_list_alloc(); 53 view_dispatcher_add_view( 54 app->vd, VIEW_LIST, variable_item_list_get_view(app->vlist)); 55 56 app->widget = widget_alloc(); 57 view_dispatcher_add_view( 58 app->vd, VIEW_RUN, widget_get_view(app->widget)); 59 60 app->popup = popup_alloc(); 61 view_dispatcher_add_view( 62 app->vd, VIEW_POP, popup_get_view(app->popup)); 63 64 return app; 65 } 66 67 void 68 timed_remote_app_free(TimedRemoteApp *app) 69 { 70 if (app == NULL) 71 return; 72 73 if (app->timer != NULL) { 74 furi_timer_stop(app->timer); 75 furi_timer_free(app->timer); 76 } 77 78 if (app->ir != NULL) 79 infrared_signal_free(app->ir); 80 81 view_dispatcher_remove_view(app->vd, VIEW_MENU); 82 submenu_free(app->submenu); 83 84 view_dispatcher_remove_view(app->vd, VIEW_LIST); 85 variable_item_list_free(app->vlist); 86 87 view_dispatcher_remove_view(app->vd, VIEW_RUN); 88 widget_free(app->widget); 89 90 view_dispatcher_remove_view(app->vd, VIEW_POP); 91 popup_free(app->popup); 92 93 scene_manager_free(app->sm); 94 view_dispatcher_free(app->vd); 95 furi_record_close(RECORD_GUI); 96 97 free(app); 98 } 99 100 int32_t 101 timed_remote_app(void *p) 102 { 103 TimedRemoteApp *app; 104 105 UNUSED(p); 106 107 app = timed_remote_app_alloc(); 108 if (app == NULL) 109 return -1; 110 111 scene_manager_next_scene(app->sm, SCENE_BROWSE); 112 view_dispatcher_run(app->vd); 113 timed_remote_app_free(app); 114 115 return 0; 116 }