Skip to content

Commit 854bd83

Browse files
authored
Merge pull request #26 from hryamzik/new_menus
Added movie menu + minor tunes
2 parents 20364fa + e7c0dea commit 854bd83

File tree

8 files changed

+267
-5
lines changed

8 files changed

+267
-5
lines changed

base_pack/hid_app/hid.c

+15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ enum HidDebugSubmenuIndex {
1010
HidSubmenuIndexKeyboard,
1111
HidSubmenuIndexNumpad,
1212
HidSubmenuIndexMedia,
13+
HidSubmenuIndexMovie,
1314
HidSubmenuIndexTikShorts,
1415
HidSubmenuIndexMouse,
1516
HidSubmenuIndexMouseClicker,
@@ -36,6 +37,9 @@ static void hid_submenu_callback(void* context, uint32_t index) {
3637
} else if(index == HidSubmenuIndexMedia) {
3738
app->view_id = HidViewMedia;
3839
view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMedia);
40+
} else if(index == HidSubmenuIndexMovie) {
41+
app->view_id = HidViewMovie;
42+
view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMovie);
3943
} else if(index == HidSubmenuIndexMouse) {
4044
app->view_id = HidViewMouse;
4145
view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMouse);
@@ -66,6 +70,7 @@ static void bt_hid_connection_status_changed_callback(BtStatus status, void* con
6670
hid_keyboard_set_connected_status(hid->hid_keyboard, connected);
6771
hid_numpad_set_connected_status(hid->hid_numpad, connected);
6872
hid_media_set_connected_status(hid->hid_media, connected);
73+
hid_movie_set_connected_status(hid->hid_movie, connected);
6974
hid_mouse_set_connected_status(hid->hid_mouse, connected);
7075
hid_mouse_clicker_set_connected_status(hid->hid_mouse_clicker, connected);
7176
hid_mouse_jiggler_set_connected_status(hid->hid_mouse_jiggler, connected);
@@ -127,6 +132,8 @@ Hid* hid_alloc(HidTransport transport) {
127132
app->device_type_submenu, "Numpad", HidSubmenuIndexNumpad, hid_submenu_callback, app);
128133
submenu_add_item(
129134
app->device_type_submenu, "Media", HidSubmenuIndexMedia, hid_submenu_callback, app);
135+
submenu_add_item(
136+
app->device_type_submenu, "Movie", HidSubmenuIndexMovie, hid_submenu_callback, app);
130137
submenu_add_item(
131138
app->device_type_submenu, "Mouse", HidSubmenuIndexMouse, hid_submenu_callback, app);
132139
if(app->transport == HidTransportBle) {
@@ -194,6 +201,12 @@ Hid* hid_app_alloc_view(void* context) {
194201
view_set_previous_callback(hid_media_get_view(app->hid_media), hid_exit_confirm_view);
195202
view_dispatcher_add_view(
196203
app->view_dispatcher, HidViewMedia, hid_media_get_view(app->hid_media));
204+
205+
// Movie view
206+
app->hid_movie = hid_movie_alloc(app);
207+
view_set_previous_callback(hid_movie_get_view(app->hid_movie), hid_exit_confirm_view);
208+
view_dispatcher_add_view(
209+
app->view_dispatcher, HidViewMovie, hid_movie_get_view(app->hid_movie));
197210

198211
// TikTok / YT Shorts view
199212
app->hid_tikshorts = hid_tikshorts_alloc(app);
@@ -249,6 +262,8 @@ void hid_free(Hid* app) {
249262
hid_numpad_free(app->hid_numpad);
250263
view_dispatcher_remove_view(app->view_dispatcher, HidViewMedia);
251264
hid_media_free(app->hid_media);
265+
view_dispatcher_remove_view(app->view_dispatcher, HidViewMovie);
266+
hid_movie_free(app->hid_movie);
252267
view_dispatcher_remove_view(app->view_dispatcher, HidViewMouse);
253268
hid_mouse_free(app->hid_mouse);
254269
view_dispatcher_remove_view(app->view_dispatcher, HidViewMouseClicker);

base_pack/hid_app/hid.h

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "views/hid_keyboard.h"
2121
#include "views/hid_numpad.h"
2222
#include "views/hid_media.h"
23+
#include "views/hid_movie.h"
2324
#include "views/hid_mouse.h"
2425
#include "views/hid_mouse_jiggler.h"
2526
#include "views/hid_tikshorts.h"
@@ -45,6 +46,7 @@ struct Hid {
4546
HidKeyboard* hid_keyboard;
4647
HidNumpad* hid_numpad;
4748
HidMedia* hid_media;
49+
HidMovie* hid_movie;
4850
HidMouse* hid_mouse;
4951
HidMouseClicker* hid_mouse_clicker;
5052
HidMouseJiggler* hid_mouse_jiggler;

base_pack/hid_app/views.h

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ typedef enum {
44
HidViewKeyboard,
55
HidViewNumpad,
66
HidViewMedia,
7+
HidViewMovie,
78
HidViewMouse,
89
HidViewMouseClicker,
910
HidViewMouseJiggler,

base_pack/hid_app/views/hid_media.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ static void hid_media_draw_callback(Canvas* canvas, void* context) {
8585
canvas_set_bitmap_mode(canvas, 0);
8686
canvas_set_color(canvas, ColorWhite);
8787
}
88-
hid_media_draw_arrow(canvas, 65, 28, CanvasDirectionRightToLeft);
88+
hid_media_draw_arrow(canvas, 67, 28, CanvasDirectionRightToLeft);
8989
hid_media_draw_arrow(canvas, 70, 28, CanvasDirectionRightToLeft);
90+
canvas_draw_line(canvas, 64, 26, 64, 30);
9091
canvas_set_color(canvas, ColorBlack);
9192

9293
// Right
@@ -97,7 +98,8 @@ static void hid_media_draw_callback(Canvas* canvas, void* context) {
9798
canvas_set_color(canvas, ColorWhite);
9899
}
99100
hid_media_draw_arrow(canvas, 96, 28, CanvasDirectionLeftToRight);
100-
hid_media_draw_arrow(canvas, 101, 28, CanvasDirectionLeftToRight);
101+
hid_media_draw_arrow(canvas, 99, 28, CanvasDirectionLeftToRight);
102+
canvas_draw_line(canvas, 102, 26, 102, 30);
101103
canvas_set_color(canvas, ColorBlack);
102104

103105
// Ok

base_pack/hid_app/views/hid_mouse_jiggler.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ static void hid_mouse_jiggler_timer_callback(void* context) {
8282
model->counter++;
8383
hid_hal_mouse_move(
8484
hid_mouse_jiggler->hid,
85-
(model->counter % 2 == 0) ? MOUSE_MOVE_SHORT : -MOUSE_MOVE_SHORT,
85+
(model->counter % 2 == 0) ? MOUSE_MOVE_TINY : -MOUSE_MOVE_TINY,
8686
0);
8787
}
8888
},

base_pack/hid_app/views/hid_mouse_jiggler.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
#include <gui/view.h>
44

5-
#define MOUSE_MOVE_SHORT 5
6-
#define MOUSE_MOVE_LONG 20
5+
#define MOUSE_MOVE_TINY 1
76

87
typedef struct Hid Hid;
98
typedef struct HidMouseJiggler HidMouseJiggler;

base_pack/hid_app/views/hid_movie.c

+229
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
#include "hid_movie.h"
2+
#include <furi.h>
3+
#include <furi_hal_bt_hid.h>
4+
#include <furi_hal_usb_hid.h>
5+
#include <gui/elements.h>
6+
#include "../hid.h"
7+
8+
#include "hid_icons.h"
9+
10+
#define TAG "HidMovie"
11+
12+
struct HidMovie {
13+
View* view;
14+
Hid* hid;
15+
};
16+
17+
typedef struct {
18+
bool left_pressed;
19+
bool up_pressed;
20+
bool right_pressed;
21+
bool down_pressed;
22+
bool ok_pressed;
23+
bool connected;
24+
bool back_pressed;
25+
HidTransport transport;
26+
} HidMovieModel;
27+
28+
static void hid_movie_draw_arrow(Canvas* canvas, uint8_t x, uint8_t y, CanvasDirection dir) {
29+
canvas_draw_triangle(canvas, x, y, 5, 3, dir);
30+
if(dir == CanvasDirectionBottomToTop) {
31+
canvas_draw_dot(canvas, x, y - 1);
32+
} else if(dir == CanvasDirectionTopToBottom) {
33+
canvas_draw_dot(canvas, x, y + 1);
34+
} else if(dir == CanvasDirectionRightToLeft) {
35+
canvas_draw_dot(canvas, x - 1, y);
36+
} else if(dir == CanvasDirectionLeftToRight) {
37+
canvas_draw_dot(canvas, x + 1, y);
38+
}
39+
}
40+
41+
static void hid_movie_draw_callback(Canvas* canvas, void* context) {
42+
furi_assert(context);
43+
HidMovieModel* model = context;
44+
45+
// Header
46+
if(model->transport == HidTransportBle) {
47+
if(model->connected) {
48+
canvas_draw_icon(canvas, 0, 0, &I_Ble_connected_15x15);
49+
} else {
50+
canvas_draw_icon(canvas, 0, 0, &I_Ble_disconnected_15x15);
51+
}
52+
}
53+
54+
canvas_set_font(canvas, FontPrimary);
55+
elements_multiline_text_aligned(canvas, 17, 3, AlignLeft, AlignTop, "Movie");
56+
canvas_set_font(canvas, FontSecondary);
57+
58+
// Keypad circles
59+
canvas_draw_icon(canvas, 58, 3, &I_OutCircles_70x51);
60+
61+
// Up
62+
if(model->up_pressed) {
63+
canvas_set_bitmap_mode(canvas, 1);
64+
canvas_draw_icon(canvas, 68, 6, &I_S_UP_31x15);
65+
canvas_set_bitmap_mode(canvas, 0);
66+
canvas_set_color(canvas, ColorWhite);
67+
}
68+
canvas_draw_icon(canvas, 79, 9, &I_Volup_8x6);
69+
canvas_set_color(canvas, ColorBlack);
70+
71+
// Down
72+
if(model->down_pressed) {
73+
canvas_set_bitmap_mode(canvas, 1);
74+
canvas_draw_icon(canvas, 68, 36, &I_S_DOWN_31x15);
75+
canvas_set_bitmap_mode(canvas, 0);
76+
canvas_set_color(canvas, ColorWhite);
77+
}
78+
canvas_draw_icon(canvas, 80, 41, &I_Voldwn_6x6);
79+
canvas_set_color(canvas, ColorBlack);
80+
81+
// Left
82+
if(model->left_pressed) {
83+
canvas_set_bitmap_mode(canvas, 1);
84+
canvas_draw_icon(canvas, 61, 13, &I_S_LEFT_15x31);
85+
canvas_set_bitmap_mode(canvas, 0);
86+
canvas_set_color(canvas, ColorWhite);
87+
}
88+
hid_movie_draw_arrow(canvas, 65, 28, CanvasDirectionRightToLeft);
89+
hid_movie_draw_arrow(canvas, 70, 28, CanvasDirectionRightToLeft);
90+
canvas_set_color(canvas, ColorBlack);
91+
92+
// Right
93+
if(model->right_pressed) {
94+
canvas_set_bitmap_mode(canvas, 1);
95+
canvas_draw_icon(canvas, 91, 13, &I_S_RIGHT_15x31);
96+
canvas_set_bitmap_mode(canvas, 0);
97+
canvas_set_color(canvas, ColorWhite);
98+
}
99+
hid_movie_draw_arrow(canvas, 96, 28, CanvasDirectionLeftToRight);
100+
hid_movie_draw_arrow(canvas, 101, 28, CanvasDirectionLeftToRight);
101+
canvas_set_color(canvas, ColorBlack);
102+
103+
// Ok
104+
if(model->ok_pressed) {
105+
canvas_set_bitmap_mode(canvas, 1);
106+
canvas_draw_icon(canvas, 74, 19, &I_Pressed_Button_19x19);
107+
canvas_set_bitmap_mode(canvas, 0);
108+
canvas_set_color(canvas, ColorWhite);
109+
}
110+
hid_movie_draw_arrow(canvas, 80, 28, CanvasDirectionLeftToRight);
111+
canvas_draw_line(canvas, 84, 26, 84, 30);
112+
canvas_draw_line(canvas, 86, 26, 86, 30);
113+
canvas_set_color(canvas, ColorBlack);
114+
115+
// Exit
116+
if(model->back_pressed) {
117+
canvas_set_bitmap_mode(canvas, 1);
118+
canvas_draw_icon(canvas, 107, 33, &I_Pressed_Button_19x19);
119+
canvas_set_bitmap_mode(canvas, 0);
120+
canvas_set_color(canvas, ColorWhite);
121+
}
122+
canvas_draw_icon(canvas, 111, 38, &I_Pin_back_arrow_10x10);
123+
canvas_set_color(canvas, ColorBlack);
124+
125+
canvas_draw_icon(canvas, 0, 54, &I_Pin_back_arrow_10x8);
126+
canvas_set_font(canvas, FontSecondary);
127+
elements_multiline_text_aligned(canvas, 13, 62, AlignLeft, AlignBottom, "Hold to exit");
128+
}
129+
130+
static void hid_movie_process_press(HidMovie* hid_movie, InputEvent* event) {
131+
with_view_model(
132+
hid_movie->view,
133+
HidMovieModel * model,
134+
{
135+
if(event->key == InputKeyUp) {
136+
model->up_pressed = true;
137+
hid_hal_consumer_key_press(hid_movie->hid, HID_CONSUMER_VOLUME_INCREMENT);
138+
} else if(event->key == InputKeyDown) {
139+
model->down_pressed = true;
140+
hid_hal_consumer_key_press(hid_movie->hid, HID_CONSUMER_VOLUME_DECREMENT);
141+
} else if(event->key == InputKeyLeft) {
142+
model->left_pressed = true;
143+
hid_hal_keyboard_press(hid_movie->hid, HID_KEYBOARD_LEFT_ARROW);
144+
} else if(event->key == InputKeyRight) {
145+
model->right_pressed = true;
146+
hid_hal_keyboard_press(hid_movie->hid, HID_KEYBOARD_RIGHT_ARROW);
147+
} else if(event->key == InputKeyOk) {
148+
model->ok_pressed = true;
149+
hid_hal_consumer_key_press(hid_movie->hid, HID_CONSUMER_PLAY_PAUSE);
150+
} else if(event->key == InputKeyBack) {
151+
model->back_pressed = true;
152+
}
153+
},
154+
true);
155+
}
156+
157+
static void hid_movie_process_release(HidMovie* hid_movie, InputEvent* event) {
158+
with_view_model(
159+
hid_movie->view,
160+
HidMovieModel * model,
161+
{
162+
if(event->key == InputKeyUp) {
163+
model->up_pressed = false;
164+
hid_hal_consumer_key_release(hid_movie->hid, HID_CONSUMER_VOLUME_INCREMENT);
165+
} else if(event->key == InputKeyDown) {
166+
model->down_pressed = false;
167+
hid_hal_consumer_key_release(hid_movie->hid, HID_CONSUMER_VOLUME_DECREMENT);
168+
} else if(event->key == InputKeyLeft) {
169+
model->left_pressed = false;
170+
hid_hal_keyboard_release(hid_movie->hid, HID_KEYBOARD_LEFT_ARROW);
171+
} else if(event->key == InputKeyRight) {
172+
model->right_pressed = false;
173+
hid_hal_keyboard_release(hid_movie->hid, HID_KEYBOARD_RIGHT_ARROW);
174+
} else if(event->key == InputKeyOk) {
175+
model->ok_pressed = false;
176+
hid_hal_consumer_key_release(hid_movie->hid, HID_CONSUMER_PLAY_PAUSE);
177+
} else if(event->key == InputKeyBack) {
178+
model->back_pressed = false;
179+
}
180+
},
181+
true);
182+
}
183+
184+
static bool hid_movie_input_callback(InputEvent* event, void* context) {
185+
furi_assert(context);
186+
HidMovie* hid_movie = context;
187+
bool consumed = false;
188+
189+
if(event->type == InputTypePress) {
190+
hid_movie_process_press(hid_movie, event);
191+
consumed = true;
192+
} else if(event->type == InputTypeRelease) {
193+
hid_movie_process_release(hid_movie, event);
194+
consumed = true;
195+
}
196+
return consumed;
197+
}
198+
199+
HidMovie* hid_movie_alloc(Hid* hid) {
200+
HidMovie* hid_movie = malloc(sizeof(HidMovie));
201+
hid_movie->view = view_alloc();
202+
hid_movie->hid = hid;
203+
view_set_context(hid_movie->view, hid_movie);
204+
view_allocate_model(hid_movie->view, ViewModelTypeLocking, sizeof(HidMovieModel));
205+
view_set_draw_callback(hid_movie->view, hid_movie_draw_callback);
206+
view_set_input_callback(hid_movie->view, hid_movie_input_callback);
207+
208+
with_view_model(
209+
hid_movie->view, HidMovieModel * model, { model->transport = hid->transport; }, true);
210+
211+
return hid_movie;
212+
}
213+
214+
void hid_movie_free(HidMovie* hid_movie) {
215+
furi_assert(hid_movie);
216+
view_free(hid_movie->view);
217+
free(hid_movie);
218+
}
219+
220+
View* hid_movie_get_view(HidMovie* hid_movie) {
221+
furi_assert(hid_movie);
222+
return hid_movie->view;
223+
}
224+
225+
void hid_movie_set_connected_status(HidMovie* hid_movie, bool connected) {
226+
furi_assert(hid_movie);
227+
with_view_model(
228+
hid_movie->view, HidMovieModel * model, { model->connected = connected; }, true);
229+
}

base_pack/hid_app/views/hid_movie.h

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include <gui/view.h>
4+
5+
typedef struct Hid Hid;
6+
typedef struct HidMovie HidMovie;
7+
8+
HidMovie* hid_movie_alloc(Hid* bt_hid);
9+
10+
void hid_movie_free(HidMovie* hid_movie);
11+
12+
View* hid_movie_get_view(HidMovie* hid_movie);
13+
14+
void hid_movie_set_connected_status(HidMovie* hid_movie, bool connected);

0 commit comments

Comments
 (0)