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 }