Skip to content

Commit 2b9d505

Browse files
committed
upd badkb
1 parent fb49d09 commit 2b9d505

10 files changed

+150
-32
lines changed

base_pack/bad_kb/bad_kb_app.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -345,9 +345,9 @@ BadKbApp* bad_kb_app_alloc(char* arg) {
345345
BadKbAppViewVarItemList,
346346
variable_item_list_get_view(app->var_item_list));
347347

348-
app->bad_kb_view = bad_kb_alloc();
348+
app->bad_kb_view = bad_kb_view_alloc();
349349
view_dispatcher_add_view(
350-
app->view_dispatcher, BadKbAppViewWork, bad_kb_get_view(app->bad_kb_view));
350+
app->view_dispatcher, BadKbAppViewWork, bad_kb_view_get_view(app->bad_kb_view));
351351

352352
app->text_input = text_input_alloc();
353353
view_dispatcher_add_view(
@@ -389,7 +389,7 @@ void bad_kb_app_free(BadKbApp* app) {
389389

390390
// Views
391391
view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewWork);
392-
bad_kb_free(app->bad_kb_view);
392+
bad_kb_view_free(app->bad_kb_view);
393393

394394
// Custom Widget
395395
view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewWidget);

base_pack/bad_kb/helpers/ducky_script.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ static int32_t bad_kb_worker(void* context) {
576576
bad_kb->st.line_cur = 0;
577577
bad_kb->defdelay = 0;
578578
bad_kb->stringdelay = 0;
579+
bad_kb->defstringdelay = 0;
579580
bad_kb->repeat_cnt = 0;
580581
bad_kb->key_hold_nb = 0;
581582
bad_kb->file_end = false;
@@ -605,6 +606,7 @@ static int32_t bad_kb_worker(void* context) {
605606
bad_kb->st.line_cur = 0;
606607
bad_kb->defdelay = 0;
607608
bad_kb->stringdelay = 0;
609+
bad_kb->defstringdelay = 0;
608610
bad_kb->repeat_cnt = 0;
609611
bad_kb->file_end = false;
610612
storage_file_seek(script_file, 0, true);
@@ -780,10 +782,12 @@ static int32_t bad_kb_worker(void* context) {
780782
}
781783
} else if(worker_state == BadKbStateStringDelay) { // State: print string with delays
782784
FURI_LOG_D(WORKER_TAG, "delay wait");
785+
uint32_t delay = (bad_kb->stringdelay == 0) ? bad_kb->defstringdelay :
786+
bad_kb->stringdelay;
783787
uint32_t flags = bad_kb_flags_get(
784788
WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtPauseResume | WorkerEvtConnect |
785789
WorkerEvtDisconnect,
786-
bad_kb->stringdelay);
790+
delay);
787791
FURI_LOG_D(WORKER_TAG, "delay flags: %lu", flags);
788792

789793
if(!(flags & FuriFlagError)) {

base_pack/bad_kb/helpers/ducky_script_commands.c

+60-1
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,26 @@ static int32_t ducky_fnc_strdelay(BadKbScript* bad_kb, const char* line, int32_t
4848
return 0;
4949
}
5050

51+
static int32_t ducky_fnc_defstrdelay(BadKbScript* bad_kb, const char* line, int32_t param) {
52+
UNUSED(param);
53+
54+
line = &line[ducky_get_command_len(line) + 1];
55+
bool state = ducky_get_number(line, &bad_kb->defstringdelay);
56+
if(!state) {
57+
return ducky_error(bad_kb, "Invalid number %s", line);
58+
}
59+
return 0;
60+
}
61+
5162
static int32_t ducky_fnc_string(BadKbScript* bad_kb, const char* line, int32_t param) {
5263
line = &line[ducky_get_command_len(line) + 1];
5364
furi_string_set_str(bad_kb->string_print, line);
5465
if(param == 1) {
5566
furi_string_cat(bad_kb->string_print, "\n");
5667
}
5768

58-
if(bad_kb->stringdelay == 0) { // stringdelay not set - run command immediately
69+
if(bad_kb->stringdelay == 0 &&
70+
bad_kb->defstringdelay == 0) { // stringdelay not set - run command immediately
5971
bool state = ducky_string(bad_kb, furi_string_get_cstr(bad_kb->string_print));
6072
if(!state) {
6173
return ducky_error(bad_kb, "Invalid string %s", line);
@@ -161,6 +173,49 @@ static int32_t ducky_fnc_release(BadKbScript* bad_kb, const char* line, int32_t
161173
return 0;
162174
}
163175

176+
static int32_t ducky_fnc_media(BadKbScript* bad_kb, const char* line, int32_t param) {
177+
UNUSED(param);
178+
179+
line = &line[ducky_get_command_len(line) + 1];
180+
uint16_t key = ducky_get_media_keycode_by_name(line);
181+
if(key == HID_CONSUMER_UNASSIGNED) {
182+
return ducky_error(bad_kb, "No keycode defined for %s", line);
183+
}
184+
if(bad_kb->bt) {
185+
ble_profile_hid_kb_press(bad_kb->app->ble_hid, key);
186+
furi_delay_ms(bt_timeout);
187+
ble_profile_hid_kb_release(bad_kb->app->ble_hid, key);
188+
} else {
189+
furi_hal_hid_kb_press(key);
190+
furi_hal_hid_kb_release(key);
191+
}
192+
return 0;
193+
}
194+
195+
static int32_t ducky_fnc_globe(BadKbScript* bad_kb, const char* line, int32_t param) {
196+
UNUSED(param);
197+
198+
line = &line[ducky_get_command_len(line) + 1];
199+
uint16_t key = ducky_get_keycode(bad_kb, line, true);
200+
if(key == HID_KEYBOARD_NONE) {
201+
return ducky_error(bad_kb, "No keycode defined for %s", line);
202+
}
203+
204+
if(bad_kb->bt) {
205+
ble_profile_hid_consumer_key_press(bad_kb->app->ble_hid, HID_CONSUMER_FN_GLOBE);
206+
ble_profile_hid_kb_press(bad_kb->app->ble_hid, key);
207+
furi_delay_ms(bt_timeout);
208+
ble_profile_hid_kb_release(bad_kb->app->ble_hid, key);
209+
ble_profile_hid_consumer_key_release(bad_kb->app->ble_hid, HID_CONSUMER_FN_GLOBE);
210+
} else {
211+
furi_hal_hid_consumer_key_press(HID_CONSUMER_FN_GLOBE);
212+
furi_hal_hid_kb_press(key);
213+
furi_hal_hid_kb_release(key);
214+
furi_hal_hid_consumer_key_release(HID_CONSUMER_FN_GLOBE);
215+
}
216+
return 0;
217+
}
218+
164219
static int32_t ducky_fnc_waitforbutton(BadKbScript* bad_kb, const char* line, int32_t param) {
165220
UNUSED(param);
166221
UNUSED(bad_kb);
@@ -180,6 +235,8 @@ static const DuckyCmd ducky_commands[] = {
180235
{"DEFAULTDELAY", ducky_fnc_defdelay, -1},
181236
{"STRINGDELAY", ducky_fnc_strdelay, -1},
182237
{"STRING_DELAY", ducky_fnc_strdelay, -1},
238+
{"DEFAULT_STRING_DELAY", ducky_fnc_defstrdelay, -1},
239+
{"DEFAULTSTRINGDELAY", ducky_fnc_defstrdelay, -1},
183240
{"REPEAT", ducky_fnc_repeat, -1},
184241
{"SYSRQ", ducky_fnc_sysrq, -1},
185242
{"ALTCHAR", ducky_fnc_altchar, -1},
@@ -188,6 +245,8 @@ static const DuckyCmd ducky_commands[] = {
188245
{"HOLD", ducky_fnc_hold, -1},
189246
{"RELEASE", ducky_fnc_release, -1},
190247
{"WAIT_FOR_BUTTON_PRESS", ducky_fnc_waitforbutton, -1},
248+
{"MEDIA", ducky_fnc_media, -1},
249+
{"GLOBE", ducky_fnc_globe, -1},
191250
};
192251

193252
#define TAG "BadKb"

base_pack/bad_kb/helpers/ducky_script_i.h

+3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ struct BadKbScript {
3030

3131
uint32_t defdelay;
3232
uint32_t stringdelay;
33+
uint32_t defstringdelay;
3334
uint16_t layout[128];
3435

3536
FuriString* line;
@@ -52,6 +53,8 @@ bool ducky_is_line_end(const char chr);
5253

5354
uint16_t ducky_get_keycode_by_name(const char* param);
5455

56+
uint16_t ducky_get_media_keycode_by_name(const char* param);
57+
5558
bool ducky_get_number(const char* param, uint32_t* val);
5659

5760
void ducky_numlock_on(BadKbScript* bad_kb);

base_pack/bad_kb/helpers/ducky_script_keycodes.c

+55-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#include <furi_hal.h>
2-
#include <furi_hal_usb_hid.h>
32
#include "ducky_script_i.h"
43

54
typedef struct {
@@ -64,6 +63,49 @@ static const DuckyKey ducky_keys[] = {
6463
{"F10", HID_KEYBOARD_F10},
6564
{"F11", HID_KEYBOARD_F11},
6665
{"F12", HID_KEYBOARD_F12},
66+
{"F13", HID_KEYBOARD_F13},
67+
{"F14", HID_KEYBOARD_F14},
68+
{"F15", HID_KEYBOARD_F15},
69+
{"F16", HID_KEYBOARD_F16},
70+
{"F17", HID_KEYBOARD_F17},
71+
{"F18", HID_KEYBOARD_F18},
72+
{"F19", HID_KEYBOARD_F19},
73+
{"F20", HID_KEYBOARD_F20},
74+
{"F21", HID_KEYBOARD_F21},
75+
{"F22", HID_KEYBOARD_F22},
76+
{"F23", HID_KEYBOARD_F23},
77+
{"F24", HID_KEYBOARD_F24},
78+
};
79+
80+
static const DuckyKey ducky_media_keys[] = {
81+
{"POWER", HID_CONSUMER_POWER},
82+
{"REBOOT", HID_CONSUMER_RESET},
83+
{"SLEEP", HID_CONSUMER_SLEEP},
84+
{"LOGOFF", HID_CONSUMER_AL_LOGOFF},
85+
86+
{"EXIT", HID_CONSUMER_AC_EXIT},
87+
{"HOME", HID_CONSUMER_AC_HOME},
88+
{"BACK", HID_CONSUMER_AC_BACK},
89+
{"FORWARD", HID_CONSUMER_AC_FORWARD},
90+
{"REFRESH", HID_CONSUMER_AC_REFRESH},
91+
92+
{"SNAPSHOT", HID_CONSUMER_SNAPSHOT},
93+
94+
{"PLAY", HID_CONSUMER_PLAY},
95+
{"PAUSE", HID_CONSUMER_PAUSE},
96+
{"PLAY_PAUSE", HID_CONSUMER_PLAY_PAUSE},
97+
{"NEXT_TRACK", HID_CONSUMER_SCAN_NEXT_TRACK},
98+
{"PREV_TRACK", HID_CONSUMER_SCAN_PREVIOUS_TRACK},
99+
{"STOP", HID_CONSUMER_STOP},
100+
{"EJECT", HID_CONSUMER_EJECT},
101+
102+
{"MUTE", HID_CONSUMER_MUTE},
103+
{"VOLUME_UP", HID_CONSUMER_VOLUME_INCREMENT},
104+
{"VOLUME_DOWN", HID_CONSUMER_VOLUME_DECREMENT},
105+
106+
{"FN", HID_CONSUMER_FN_GLOBE},
107+
{"BRIGHT_UP", HID_CONSUMER_BRIGHTNESS_INCREMENT},
108+
{"BRIGHT_DOWN", HID_CONSUMER_BRIGHTNESS_DECREMENT},
67109
};
68110

69111
uint16_t ducky_get_keycode_by_name(const char* param) {
@@ -77,3 +119,15 @@ uint16_t ducky_get_keycode_by_name(const char* param) {
77119

78120
return HID_KEYBOARD_NONE;
79121
}
122+
123+
uint16_t ducky_get_media_keycode_by_name(const char* param) {
124+
for(size_t i = 0; i < COUNT_OF(ducky_media_keys); i++) {
125+
size_t key_cmd_len = strlen(ducky_media_keys[i].name);
126+
if((strncmp(param, ducky_media_keys[i].name, key_cmd_len) == 0) &&
127+
(ducky_is_line_end(param[key_cmd_len]))) {
128+
return ducky_media_keys[i].keycode;
129+
}
130+
}
131+
132+
return HID_CONSUMER_UNASSIGNED;
133+
}

base_pack/bad_kb/scenes/bad_kb_scene_config.c

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "../bad_kb_app_i.h"
22
#include "furi_hal_power.h"
3-
#include "furi_hal_usb.h"
43

54
enum VarItemListIndex {
65
VarItemListIndexKeyboardLayout,

base_pack/bad_kb/scenes/bad_kb_scene_config_layout.c

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "../bad_kb_app_i.h"
22
#include "furi_hal_power.h"
3-
#include "furi_hal_usb.h"
43
#include <storage/storage.h>
54

65
static bool bad_kb_layout_select(BadKbApp* bad_kb) {

base_pack/bad_kb/scenes/bad_kb_scene_work.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ bool bad_kb_scene_work_on_event(void* context, SceneManagerEvent event) {
1616

1717
if(event.type == SceneManagerEventTypeCustom) {
1818
if(event.event == InputKeyLeft) {
19-
if(bad_kb_is_idle_state(app->bad_kb_view)) {
19+
if(bad_kb_view_is_idle_state(app->bad_kb_view)) {
2020
scene_manager_next_scene(app->scene_manager, BadKbSceneConfig);
2121
}
2222
consumed = true;
@@ -28,7 +28,7 @@ bool bad_kb_scene_work_on_event(void* context, SceneManagerEvent event) {
2828
consumed = true;
2929
}
3030
} else if(event.type == SceneManagerEventTypeTick) {
31-
bad_kb_set_state(app->bad_kb_view, bad_kb_script_get_state(app->bad_kb_script));
31+
bad_kb_view_set_state(app->bad_kb_view, bad_kb_script_get_state(app->bad_kb_script));
3232
}
3333
return consumed;
3434
}
@@ -39,18 +39,18 @@ void bad_kb_scene_work_on_enter(void* context) {
3939
FuriString* file_name;
4040
file_name = furi_string_alloc();
4141
path_extract_filename(app->file_path, file_name, true);
42-
bad_kb_set_file_name(app->bad_kb_view, furi_string_get_cstr(file_name));
42+
bad_kb_view_set_file_name(app->bad_kb_view, furi_string_get_cstr(file_name));
4343
furi_string_free(file_name);
4444

4545
FuriString* layout;
4646
layout = furi_string_alloc();
4747
path_extract_filename(app->keyboard_layout, layout, true);
48-
bad_kb_set_layout(app->bad_kb_view, furi_string_get_cstr(layout));
48+
bad_kb_view_set_layout(app->bad_kb_view, furi_string_get_cstr(layout));
4949
furi_string_free(layout);
5050

51-
bad_kb_set_state(app->bad_kb_view, bad_kb_script_get_state(app->bad_kb_script));
51+
bad_kb_view_set_state(app->bad_kb_view, bad_kb_script_get_state(app->bad_kb_script));
5252

53-
bad_kb_set_button_callback(app->bad_kb_view, bad_kb_scene_work_button_callback, app);
53+
bad_kb_view_set_button_callback(app->bad_kb_view, bad_kb_scene_work_button_callback, app);
5454
view_dispatcher_switch_to_view(app->view_dispatcher, BadKbAppViewWork);
5555
}
5656

base_pack/bad_kb/views/bad_kb_view.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) {
7575
if(state == BadKbStateNotConnected) {
7676
canvas_draw_icon(canvas, 4, 26, &I_Clock_18x18);
7777
canvas_set_font(canvas, FontPrimary);
78-
canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Connect to");
79-
canvas_draw_str_aligned(canvas, 127, 43, AlignRight, AlignBottom, "a device");
78+
canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Connect");
79+
canvas_draw_str_aligned(canvas, 127, 43, AlignRight, AlignBottom, "to device");
8080
} else if(state == BadKbStateWillRun) {
8181
canvas_draw_icon(canvas, 4, 26, &I_Clock_18x18);
8282
canvas_set_font(canvas, FontPrimary);
@@ -211,7 +211,7 @@ static bool bad_kb_input_callback(InputEvent* event, void* context) {
211211
return consumed;
212212
}
213213

214-
BadKb* bad_kb_alloc() {
214+
BadKb* bad_kb_view_alloc(void) {
215215
BadKb* bad_kb = malloc(sizeof(BadKb));
216216

217217
bad_kb->view = view_alloc();
@@ -223,18 +223,18 @@ BadKb* bad_kb_alloc() {
223223
return bad_kb;
224224
}
225225

226-
void bad_kb_free(BadKb* bad_kb) {
226+
void bad_kb_view_free(BadKb* bad_kb) {
227227
furi_assert(bad_kb);
228228
view_free(bad_kb->view);
229229
free(bad_kb);
230230
}
231231

232-
View* bad_kb_get_view(BadKb* bad_kb) {
232+
View* bad_kb_view_get_view(BadKb* bad_kb) {
233233
furi_assert(bad_kb);
234234
return bad_kb->view;
235235
}
236236

237-
void bad_kb_set_button_callback(BadKb* bad_kb, BadKbButtonCallback callback, void* context) {
237+
void bad_kb_view_set_button_callback(BadKb* bad_kb, BadKbButtonCallback callback, void* context) {
238238
furi_assert(bad_kb);
239239
furi_assert(callback);
240240
with_view_model(
@@ -248,19 +248,19 @@ void bad_kb_set_button_callback(BadKb* bad_kb, BadKbButtonCallback callback, voi
248248
true);
249249
}
250250

251-
void bad_kb_set_file_name(BadKb* bad_kb, const char* name) {
251+
void bad_kb_view_set_file_name(BadKb* bad_kb, const char* name) {
252252
furi_assert(name);
253253
with_view_model(
254254
bad_kb->view, BadKbModel * model, { strlcpy(model->file_name, name, MAX_NAME_LEN); }, true);
255255
}
256256

257-
void bad_kb_set_layout(BadKb* bad_kb, const char* layout) {
257+
void bad_kb_view_set_layout(BadKb* bad_kb, const char* layout) {
258258
furi_assert(layout);
259259
with_view_model(
260260
bad_kb->view, BadKbModel * model, { strlcpy(model->layout, layout, MAX_NAME_LEN); }, true);
261261
}
262262

263-
void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) {
263+
void bad_kb_view_set_state(BadKb* bad_kb, BadKbState* st) {
264264
furi_assert(st);
265265
uint32_t pin = 0;
266266
if(bad_kb->context != NULL) {
@@ -283,7 +283,7 @@ void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) {
283283
true);
284284
}
285285

286-
bool bad_kb_is_idle_state(BadKb* bad_kb) {
286+
bool bad_kb_view_is_idle_state(BadKb* bad_kb) {
287287
bool is_idle = false;
288288
with_view_model(
289289
bad_kb->view,

base_pack/bad_kb/views/bad_kb_view.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
typedef struct BadKb BadKb;
77
typedef void (*BadKbButtonCallback)(InputKey key, void* context);
88

9-
BadKb* bad_kb_alloc();
9+
BadKb* bad_kb_view_alloc(void);
1010

11-
void bad_kb_free(BadKb* bad_kb);
11+
void bad_kb_view_free(BadKb* bad_kb);
1212

13-
View* bad_kb_get_view(BadKb* bad_kb);
13+
View* bad_kb_view_get_view(BadKb* bad_kb);
1414

15-
void bad_kb_set_button_callback(BadKb* bad_kb, BadKbButtonCallback callback, void* context);
15+
void bad_kb_view_set_button_callback(BadKb* bad_kb, BadKbButtonCallback callback, void* context);
1616

17-
void bad_kb_set_file_name(BadKb* bad_kb, const char* name);
17+
void bad_kb_view_set_file_name(BadKb* bad_kb, const char* name);
1818

19-
void bad_kb_set_layout(BadKb* bad_kb, const char* layout);
19+
void bad_kb_view_set_layout(BadKb* bad_kb, const char* layout);
2020

21-
void bad_kb_set_state(BadKb* bad_kb, BadKbState* st);
21+
void bad_kb_view_set_state(BadKb* bad_kb, BadKbState* st);
2222

23-
bool bad_kb_is_idle_state(BadKb* bad_kb);
23+
bool bad_kb_view_is_idle_state(BadKb* bad_kb);

0 commit comments

Comments
 (0)