[FL-3117] Infrared: Fix hangups on repeated button press (#2441)
Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									42d27d04f6
								
							
						
					
					
						commit
						6cc5119c64
					
				| @ -3,6 +3,8 @@ | ||||
| #include <string.h> | ||||
| #include <dolphin/dolphin.h> | ||||
| 
 | ||||
| #define INFRARED_TX_MIN_INTERVAL_MS 50U | ||||
| 
 | ||||
| static const NotificationSequence* infrared_notification_sequences[] = { | ||||
|     &sequence_success, | ||||
|     &sequence_set_only_green_255, | ||||
| @ -299,10 +301,13 @@ bool infrared_rename_current_remote(Infrared* infrared, const char* name) { | ||||
| 
 | ||||
| void infrared_tx_start_signal(Infrared* infrared, InfraredSignal* signal) { | ||||
|     if(infrared->app_state.is_transmitting) { | ||||
|         FURI_LOG_D(INFRARED_LOG_TAG, "Transmitter is already active"); | ||||
|         return; | ||||
|     } else { | ||||
|         infrared->app_state.is_transmitting = true; | ||||
|     } | ||||
| 
 | ||||
|     const uint32_t time_elapsed = furi_get_tick() - infrared->app_state.last_transmit_time; | ||||
| 
 | ||||
|     if(time_elapsed < INFRARED_TX_MIN_INTERVAL_MS) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if(infrared_signal_is_raw(signal)) { | ||||
| @ -319,6 +324,8 @@ void infrared_tx_start_signal(Infrared* infrared, InfraredSignal* signal) { | ||||
|     infrared_worker_tx_set_get_signal_callback( | ||||
|         infrared->worker, infrared_worker_tx_get_signal_steady_callback, infrared); | ||||
|     infrared_worker_tx_start(infrared->worker); | ||||
| 
 | ||||
|     infrared->app_state.is_transmitting = true; | ||||
| } | ||||
| 
 | ||||
| void infrared_tx_start_button_index(Infrared* infrared, size_t button_index) { | ||||
| @ -328,26 +335,24 @@ void infrared_tx_start_button_index(Infrared* infrared, size_t button_index) { | ||||
|     InfraredSignal* signal = infrared_remote_button_get_signal(button); | ||||
| 
 | ||||
|     infrared_tx_start_signal(infrared, signal); | ||||
|     infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStartSend); | ||||
| } | ||||
| 
 | ||||
| void infrared_tx_start_received(Infrared* infrared) { | ||||
|     infrared_tx_start_signal(infrared, infrared->received_signal); | ||||
|     infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStartSend); | ||||
| } | ||||
| 
 | ||||
| void infrared_tx_stop(Infrared* infrared) { | ||||
|     if(!infrared->app_state.is_transmitting) { | ||||
|         FURI_LOG_D(INFRARED_LOG_TAG, "Transmitter is already stopped"); | ||||
|         return; | ||||
|     } else { | ||||
|         infrared->app_state.is_transmitting = false; | ||||
|     } | ||||
| 
 | ||||
|     infrared_worker_tx_stop(infrared->worker); | ||||
|     infrared_worker_tx_set_get_signal_callback(infrared->worker, NULL, NULL); | ||||
| 
 | ||||
|     infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStop); | ||||
| 
 | ||||
|     infrared->app_state.is_transmitting = false; | ||||
|     infrared->app_state.last_transmit_time = furi_get_tick(); | ||||
| } | ||||
| 
 | ||||
| void infrared_text_store_set(Infrared* infrared, uint32_t bank, const char* text, ...) { | ||||
|  | ||||
| @ -69,6 +69,7 @@ typedef struct { | ||||
|     InfraredEditTarget edit_target : 8; | ||||
|     InfraredEditMode edit_mode : 8; | ||||
|     int32_t current_button_index; | ||||
|     uint32_t last_transmit_time; | ||||
| } InfraredAppState; | ||||
| 
 | ||||
| struct Infrared { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Georgii Surkov
						Georgii Surkov