timed-remote

Flipper Zero app for sending delayed IR commands
git clone git://src.adamsgaard.dk/timed-remote # fast
git clone https://src.adamsgaard.dk/timed-remote.git # slow
Log | Files | Refs | README | LICENSE Back to index

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 }