From 82ad44a8631bd9fa9c9876d519500f8e331446aa Mon Sep 17 00:00:00 2001 From: Konstantin Volkov <72250702+doomwastaken@users.noreply.github.com> Date: Sat, 25 Feb 2023 15:05:02 +0300 Subject: [PATCH 1/4] changed updater and unit benches (#2427) * changed updater and unit benches * switched flipper name from macos style to searching Co-authored-by: Konstantin Volkov --- .github/workflows/unit_tests.yml | 2 +- .github/workflows/updater_test.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 7e625229a..527e9a71e 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -10,7 +10,7 @@ env: jobs: run_units_on_bench: - runs-on: [self-hosted, FlipperZeroTest] + runs-on: [self-hosted, FlipperZeroUnitTest] steps: - name: 'Decontaminate previous build leftovers' run: | diff --git a/.github/workflows/updater_test.yml b/.github/workflows/updater_test.yml index 0b02920fa..300440aae 100644 --- a/.github/workflows/updater_test.yml +++ b/.github/workflows/updater_test.yml @@ -10,7 +10,7 @@ env: jobs: test_updater_on_bench: - runs-on: [self-hosted, FlipperZeroTestMac1] + runs-on: [self-hosted, FlipperZeroUpdaterTest] steps: - name: 'Decontaminate previous build leftovers' run: | @@ -27,7 +27,7 @@ jobs: - name: 'Get flipper from device manager (mock)' id: device run: | - echo "flipper=/dev/tty.usbmodemflip_Rekigyn1" >> $GITHUB_OUTPUT + echo "flipper=Rekigyn" >> $GITHUB_OUTPUT echo "stlink=0F020D026415303030303032" >> $GITHUB_OUTPUT - name: 'Flashing target firmware' From 203adabc46ff70f7179de849c165001dd6c1abaa Mon Sep 17 00:00:00 2001 From: Mathie <62908057+MathieDev@users.noreply.github.com> Date: Sat, 25 Feb 2023 08:41:49 -0500 Subject: [PATCH 2/4] Update update.py (#2426) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed grammar mistake Co-authored-by: あく --- scripts/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update.py b/scripts/update.py index 3259c5b09..2b0157260 100755 --- a/scripts/update.py +++ b/scripts/update.py @@ -199,7 +199,7 @@ class Main(App): def disclaimer(self): self.logger.error( - "You might brick you device into a state in which you'd need an SWD programmer to fix it." + "You might brick your device into a state in which you'd need an SWD programmer to fix it." ) self.logger.error( "Please confirm that you REALLY want to do that with --I-understand-what-I-am-doing=yes" From e999c3574977db5243cf011d21673b4d1a929819 Mon Sep 17 00:00:00 2001 From: Logandev_ Date: Sat, 25 Feb 2023 05:49:53 -0800 Subject: [PATCH 3/4] Grammar fix in CLI (#2390) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixed grammar * Update cli_commands.c: made it a little nicer Co-authored-by: あく --- applications/services/cli/cli_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/services/cli/cli_commands.c b/applications/services/cli/cli_commands.c index 4414d365f..b0f1bdbdf 100644 --- a/applications/services/cli/cli_commands.c +++ b/applications/services/cli/cli_commands.c @@ -31,7 +31,7 @@ void cli_command_device_info(Cli* cli, FuriString* args, void* context) { void cli_command_help(Cli* cli, FuriString* args, void* context) { UNUSED(args); UNUSED(context); - printf("Commands we have:"); + printf("Commands available:"); // Command count const size_t commands_count = CliCommandTree_size(cli->commands); @@ -61,9 +61,9 @@ void cli_command_help(Cli* cli, FuriString* args, void* context) { if(furi_string_size(args) > 0) { cli_nl(); - printf("Also I have no clue what '"); + printf("`"); printf("%s", furi_string_get_cstr(args)); - printf("' is."); + printf("` command not found"); } } From eaf965c66f7e57855f2cd9be8247882070bf6453 Mon Sep 17 00:00:00 2001 From: n30f0x <87524177+n30f0x@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:34:48 +0300 Subject: [PATCH 4/4] BadUsb: STRINGDELAY feature, worker signal handling refactoring (#2269) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BadUsb: Added stringdelay feature * BadUsb: added stringdelay feature, fixed delay * BadUsb: fix cursed delay structure * BadUsb: long delay check added * BadUsb: long delay distribution * furi_delay_ms(0) edgecase fix, add documentation entry * additional documentation entry * BadUsb: get rid of bad logic, fixed documentation * BadUSB script: fix events handling * Delay value fix * Script execution fix Co-authored-by: あく Co-authored-by: nminaylov --- applications/main/bad_usb/bad_usb_script.c | 81 ++++++++++++++----- .../scenes/bad_usb_scene_file_select.c | 2 - .../file_formats/BadUsbScriptFormat.md | 8 ++ 3 files changed, 69 insertions(+), 22 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_script.c b/applications/main/bad_usb/bad_usb_script.c index 34dfec2ca..d66ce8a91 100644 --- a/applications/main/bad_usb/bad_usb_script.c +++ b/applications/main/bad_usb/bad_usb_script.c @@ -32,6 +32,7 @@ struct BadUsbScript { FuriString* file_path; uint32_t defdelay; uint16_t layout[128]; + uint32_t stringdelay; FuriThread* thread; uint8_t file_buf[FILE_BUFFER_LEN + 1]; uint8_t buf_start; @@ -113,6 +114,8 @@ static const char ducky_cmd_delay[] = {"DELAY "}; static const char ducky_cmd_string[] = {"STRING "}; static const char ducky_cmd_defdelay_1[] = {"DEFAULT_DELAY "}; static const char ducky_cmd_defdelay_2[] = {"DEFAULTDELAY "}; +static const char ducky_cmd_stringdelay_1[] = {"STRINGDELAY "}; +static const char ducky_cmd_stringdelay_2[] = {"STRING_DELAY "}; static const char ducky_cmd_repeat[] = {"REPEAT "}; static const char ducky_cmd_sysrq[] = {"SYSRQ "}; @@ -211,14 +214,19 @@ static bool ducky_altstring(const char* param) { static bool ducky_string(BadUsbScript* bad_usb, const char* param) { uint32_t i = 0; + while(param[i] != '\0') { uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, param[i]); if(keycode != HID_KEYBOARD_NONE) { furi_hal_hid_kb_press(keycode); furi_hal_hid_kb_release(keycode); + if(bad_usb->stringdelay > 0) { + furi_delay_ms(bad_usb->stringdelay); + } } i++; } + bad_usb->stringdelay = 0; return true; } @@ -277,6 +285,20 @@ static int32_t snprintf(error, error_len, "Invalid number %s", line_tmp); } return (state) ? (0) : SCRIPT_STATE_ERROR; + } else if( + (strncmp(line_tmp, ducky_cmd_stringdelay_1, strlen(ducky_cmd_stringdelay_1)) == 0) || + (strncmp(line_tmp, ducky_cmd_stringdelay_2, strlen(ducky_cmd_stringdelay_2)) == 0)) { + //STRINGDELAY, finally it's here + line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; + state = ducky_get_number(line_tmp, &bad_usb->stringdelay); + if((state) && (bad_usb->stringdelay > 0)) { + return state; + } + if(error != NULL) { + snprintf(error, error_len, "Invalid number %s", line_tmp); + } + return SCRIPT_STATE_ERROR; + } else if(strncmp(line_tmp, ducky_cmd_string, strlen(ducky_cmd_string)) == 0) { // STRING line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; @@ -484,6 +506,19 @@ static void bad_usb_hid_state_callback(bool state, void* context) { furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtDisconnect); } +static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) { + uint32_t flags = furi_thread_flags_get(); + furi_check((flags & FuriFlagError) == 0); + if(flags == 0) { + flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); + furi_check(((flags & FuriFlagError) == 0) || (flags == FuriFlagErrorTimeout)); + } else { + uint32_t state = furi_thread_flags_clear(flags); + furi_check((state & FuriFlagError) == 0); + } + return flags; +} + static int32_t bad_usb_worker(void* context) { BadUsbScript* bad_usb = context; @@ -520,11 +555,9 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_usb_flags_get( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { @@ -535,11 +568,9 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateIdle) { // State: ready to start - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_usb_flags_get( + WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtToggle) { // Start executing script @@ -548,6 +579,7 @@ static int32_t bad_usb_worker(void* context) { bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; + bad_usb->stringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); @@ -558,11 +590,9 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateWillRun) { // State: start on connection - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_usb_flags_get( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { // Start executing script @@ -571,12 +601,22 @@ static int32_t bad_usb_worker(void* context) { bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; + bad_usb->stringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); // extra time for PC to recognize Flipper as keyboard - furi_thread_flags_wait(0, FuriFlagWaitAny, 1500); - worker_state = BadUsbStateRunning; + flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle, + FuriFlagWaitAny | FuriFlagNoClear, + 1500); + if(flags == FuriFlagErrorTimeout) { + // If nothing happened - start script execution + worker_state = BadUsbStateRunning; + } else if(flags & WorkerEvtToggle) { + worker_state = BadUsbStateIdle; + furi_thread_flags_clear(WorkerEvtToggle); + } } else if(flags & WorkerEvtToggle) { // Cancel scheduled execution worker_state = BadUsbStateNotConnected; } @@ -586,6 +626,7 @@ static int32_t bad_usb_worker(void* context) { uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); uint32_t flags = furi_thread_flags_wait( WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriFlagWaitAny, delay_cur); + delay_val -= delay_cur; if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { @@ -629,9 +670,9 @@ static int32_t bad_usb_worker(void* context) { } else if( (worker_state == BadUsbStateFileError) || (worker_state == BadUsbStateScriptError)) { // State: error - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd, FuriFlagWaitAny, FuriWaitForever); // Waiting for exit command - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = + bad_usb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command + if(flags & WorkerEvtEnd) { break; } diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c index b04669252..d6f05a1ed 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c @@ -22,7 +22,6 @@ static bool bad_usb_file_select(BadUsbApp* bad_usb) { void bad_usb_scene_file_select_on_enter(void* context) { BadUsbApp* bad_usb = context; - furi_hal_usb_disable(); if(bad_usb->bad_usb_script) { bad_usb_script_close(bad_usb->bad_usb_script); bad_usb->bad_usb_script = NULL; @@ -34,7 +33,6 @@ void bad_usb_scene_file_select_on_enter(void* context) { scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneWork); } else { - furi_hal_usb_enable(); view_dispatcher_stop(bad_usb->view_dispatcher); } } diff --git a/documentation/file_formats/BadUsbScriptFormat.md b/documentation/file_formats/BadUsbScriptFormat.md index 2ef1d3135..94dee5943 100644 --- a/documentation/file_formats/BadUsbScriptFormat.md +++ b/documentation/file_formats/BadUsbScriptFormat.md @@ -75,6 +75,14 @@ Can be combined with a special key command or a single character. | ------- | ----------- | ----------------- | | STRING | Text string | Print text string | +## String delay + +Delay between keypresses. +|Command|Parameters|Notes| +|-|-|-| +|STRING_DELAY|Delay value in ms|Applied once to next appearing string| +|STRINGDELAY|Delay value in ms|Same as STRING_DELAY| + ## Repeat | Command | Parameters | Notes |