Просмотр исходного кода

Run Bad USB immediately after connection (#1955)

Co-authored-by: あく <alleteam@gmail.com>
head47 3 лет назад
Родитель
Сommit
eee90c6c40

+ 30 - 1
applications/main/bad_usb/bad_usb_script.c

@@ -524,12 +524,16 @@ static int32_t bad_usb_worker(void* context) {
 
         } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected
             uint32_t flags = furi_thread_flags_wait(
-                WorkerEvtEnd | WorkerEvtConnect, FuriFlagWaitAny, FuriWaitForever);
+                WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle,
+                FuriFlagWaitAny,
+                FuriWaitForever);
             furi_check((flags & FuriFlagError) == 0);
             if(flags & WorkerEvtEnd) {
                 break;
             } else if(flags & WorkerEvtConnect) {
                 worker_state = BadUsbStateIdle; // Ready to run
+            } else if(flags & WorkerEvtToggle) {
+                worker_state = BadUsbStateWillRun; // Will run when USB is connected
             }
             bad_usb->st.state = worker_state;
 
@@ -556,6 +560,31 @@ 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);
+            if(flags & WorkerEvtEnd) {
+                break;
+            } else if(flags & WorkerEvtConnect) { // Start executing script
+                DOLPHIN_DEED(DolphinDeedBadUsbPlayScript);
+                delay_val = 0;
+                bad_usb->buf_len = 0;
+                bad_usb->st.line_cur = 0;
+                bad_usb->defdelay = 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;
+            } else if(flags & WorkerEvtToggle) { // Cancel scheduled execution
+                worker_state = BadUsbStateNotConnected;
+            }
+            bad_usb->st.state = worker_state;
+
         } else if(worker_state == BadUsbStateRunning) { // State: running
             uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val);
             uint32_t flags = furi_thread_flags_wait(

+ 1 - 0
applications/main/bad_usb/bad_usb_script.h

@@ -12,6 +12,7 @@ typedef enum {
     BadUsbStateInit,
     BadUsbStateNotConnected,
     BadUsbStateIdle,
+    BadUsbStateWillRun,
     BadUsbStateRunning,
     BadUsbStateDelay,
     BadUsbStateDone,

+ 9 - 1
applications/main/bad_usb/views/bad_usb_view.c

@@ -29,10 +29,13 @@ static void bad_usb_draw_callback(Canvas* canvas, void* _model) {
 
     canvas_draw_icon(canvas, 22, 20, &I_UsbTree_48x22);
 
-    if((model->state.state == BadUsbStateIdle) || (model->state.state == BadUsbStateDone)) {
+    if((model->state.state == BadUsbStateIdle) || (model->state.state == BadUsbStateDone) ||
+       (model->state.state == BadUsbStateNotConnected)) {
         elements_button_center(canvas, "Run");
     } else if((model->state.state == BadUsbStateRunning) || (model->state.state == BadUsbStateDelay)) {
         elements_button_center(canvas, "Stop");
+    } else if(model->state.state == BadUsbStateWillRun) {
+        elements_button_center(canvas, "Cancel");
     }
 
     if(model->state.state == BadUsbStateNotConnected) {
@@ -40,6 +43,11 @@ static void bad_usb_draw_callback(Canvas* canvas, void* _model) {
         canvas_set_font(canvas, FontPrimary);
         canvas_draw_str_aligned(canvas, 127, 27, AlignRight, AlignBottom, "Connect");
         canvas_draw_str_aligned(canvas, 127, 39, AlignRight, AlignBottom, "to USB");
+    } else if(model->state.state == BadUsbStateWillRun) {
+        canvas_draw_icon(canvas, 4, 22, &I_Clock_18x18);
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str_aligned(canvas, 127, 27, AlignRight, AlignBottom, "Will run");
+        canvas_draw_str_aligned(canvas, 127, 39, AlignRight, AlignBottom, "on connect");
     } else if(model->state.state == BadUsbStateFileError) {
         canvas_draw_icon(canvas, 4, 22, &I_Error_18x18);
         canvas_set_font(canvas, FontPrimary);