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 (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 }