URI:
       timed_remote.c - timed-remote - Flipper Zero app for sending delayed IR commands
  HTML git clone git://src.adamsgaard.dk/timed-remote
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       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 }