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

scene_ir_browse.c (2103B)


      1 #include "../helpers/ir_helper.h"
      2 #include "../timed_remote.h"
      3 #include "timed_remote_scene.h"
      4 
      5 #define IR_DIR_PATH "/ext/infrared"
      6 
      7 static FuriString **file_list = NULL;
      8 static size_t file_count = 0;
      9 
     10 static void ir_browse_callback(void *context, uint32_t index) {
     11   TimedRemoteApp *app = context;
     12   if (index < file_count) {
     13     /* Store selected file path */
     14     snprintf(app->selected_file_path, sizeof(app->selected_file_path), "%s/%s",
     15              IR_DIR_PATH, furi_string_get_cstr(file_list[index]));
     16     view_dispatcher_send_custom_event(app->view_dispatcher,
     17                                       TimedRemoteEventFileSelected);
     18   }
     19 }
     20 
     21 void timed_remote_scene_ir_browse_on_enter(void *context) {
     22   TimedRemoteApp *app = context;
     23 
     24   submenu_reset(app->submenu);
     25   submenu_set_header(app->submenu, "Select IR File");
     26 
     27   /* Get list of .ir files */
     28   if (ir_helper_list_files(IR_DIR_PATH, &file_list, &file_count)) {
     29     if (file_count == 0) {
     30       submenu_add_item(app->submenu, "(No IR files found)", 0, NULL, NULL);
     31     } else {
     32       for (size_t i = 0; i < file_count; i++) {
     33         submenu_add_item(app->submenu, furi_string_get_cstr(file_list[i]), i,
     34                          ir_browse_callback, app);
     35       }
     36     }
     37   } else {
     38     submenu_add_item(app->submenu, "(Error reading directory)", 0, NULL, NULL);
     39   }
     40 
     41   view_dispatcher_switch_to_view(app->view_dispatcher, TimedRemoteViewSubmenu);
     42 }
     43 
     44 bool timed_remote_scene_ir_browse_on_event(void *context,
     45                                            SceneManagerEvent event) {
     46   TimedRemoteApp *app = context;
     47   bool consumed = false;
     48 
     49   if (event.type == SceneManagerEventTypeCustom) {
     50     if (event.event == TimedRemoteEventFileSelected) {
     51       scene_manager_next_scene(app->scene_manager, TimedRemoteSceneIrSelect);
     52       consumed = true;
     53     }
     54   }
     55 
     56   return consumed;
     57 }
     58 
     59 void timed_remote_scene_ir_browse_on_exit(void *context) {
     60   TimedRemoteApp *app = context;
     61   submenu_reset(app->submenu);
     62 
     63   /* Free file list */
     64   if (file_list) {
     65     ir_helper_free_file_list(file_list, file_count);
     66     file_list = NULL;
     67     file_count = 0;
     68   }
     69 }