Run Bad USB immediately after connection (#1955)
Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									95182b266c
								
							
						
					
					
						commit
						eee90c6c40
					
				| @ -524,12 +524,16 @@ static int32_t bad_usb_worker(void* context) { | |||||||
| 
 | 
 | ||||||
|         } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected
 |         } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected
 | ||||||
|             uint32_t flags = furi_thread_flags_wait( |             uint32_t flags = furi_thread_flags_wait( | ||||||
|                 WorkerEvtEnd | WorkerEvtConnect, FuriFlagWaitAny, FuriWaitForever); |                 WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, | ||||||
|  |                 FuriFlagWaitAny, | ||||||
|  |                 FuriWaitForever); | ||||||
|             furi_check((flags & FuriFlagError) == 0); |             furi_check((flags & FuriFlagError) == 0); | ||||||
|             if(flags & WorkerEvtEnd) { |             if(flags & WorkerEvtEnd) { | ||||||
|                 break; |                 break; | ||||||
|             } else if(flags & WorkerEvtConnect) { |             } else if(flags & WorkerEvtConnect) { | ||||||
|                 worker_state = BadUsbStateIdle; // Ready to run
 |                 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; |             bad_usb->st.state = worker_state; | ||||||
| 
 | 
 | ||||||
| @ -556,6 +560,31 @@ static int32_t bad_usb_worker(void* context) { | |||||||
|             } |             } | ||||||
|             bad_usb->st.state = worker_state; |             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
 |         } else if(worker_state == BadUsbStateRunning) { // State: running
 | ||||||
|             uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); |             uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); | ||||||
|             uint32_t flags = furi_thread_flags_wait( |             uint32_t flags = furi_thread_flags_wait( | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ typedef enum { | |||||||
|     BadUsbStateInit, |     BadUsbStateInit, | ||||||
|     BadUsbStateNotConnected, |     BadUsbStateNotConnected, | ||||||
|     BadUsbStateIdle, |     BadUsbStateIdle, | ||||||
|  |     BadUsbStateWillRun, | ||||||
|     BadUsbStateRunning, |     BadUsbStateRunning, | ||||||
|     BadUsbStateDelay, |     BadUsbStateDelay, | ||||||
|     BadUsbStateDone, |     BadUsbStateDone, | ||||||
|  | |||||||
| @ -29,10 +29,13 @@ static void bad_usb_draw_callback(Canvas* canvas, void* _model) { | |||||||
| 
 | 
 | ||||||
|     canvas_draw_icon(canvas, 22, 20, &I_UsbTree_48x22); |     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"); |         elements_button_center(canvas, "Run"); | ||||||
|     } else if((model->state.state == BadUsbStateRunning) || (model->state.state == BadUsbStateDelay)) { |     } else if((model->state.state == BadUsbStateRunning) || (model->state.state == BadUsbStateDelay)) { | ||||||
|         elements_button_center(canvas, "Stop"); |         elements_button_center(canvas, "Stop"); | ||||||
|  |     } else if(model->state.state == BadUsbStateWillRun) { | ||||||
|  |         elements_button_center(canvas, "Cancel"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(model->state.state == BadUsbStateNotConnected) { |     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_set_font(canvas, FontPrimary); | ||||||
|         canvas_draw_str_aligned(canvas, 127, 27, AlignRight, AlignBottom, "Connect"); |         canvas_draw_str_aligned(canvas, 127, 27, AlignRight, AlignBottom, "Connect"); | ||||||
|         canvas_draw_str_aligned(canvas, 127, 39, AlignRight, AlignBottom, "to USB"); |         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) { |     } else if(model->state.state == BadUsbStateFileError) { | ||||||
|         canvas_draw_icon(canvas, 4, 22, &I_Error_18x18); |         canvas_draw_icon(canvas, 4, 22, &I_Error_18x18); | ||||||
|         canvas_set_font(canvas, FontPrimary); |         canvas_set_font(canvas, FontPrimary); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 head47
						head47