[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 <string.h> | ||||||
| #include <dolphin/dolphin.h> | #include <dolphin/dolphin.h> | ||||||
| 
 | 
 | ||||||
|  | #define INFRARED_TX_MIN_INTERVAL_MS 50U | ||||||
|  | 
 | ||||||
| static const NotificationSequence* infrared_notification_sequences[] = { | static const NotificationSequence* infrared_notification_sequences[] = { | ||||||
|     &sequence_success, |     &sequence_success, | ||||||
|     &sequence_set_only_green_255, |     &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) { | void infrared_tx_start_signal(Infrared* infrared, InfraredSignal* signal) { | ||||||
|     if(infrared->app_state.is_transmitting) { |     if(infrared->app_state.is_transmitting) { | ||||||
|         FURI_LOG_D(INFRARED_LOG_TAG, "Transmitter is already active"); |  | ||||||
|         return; |         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)) { |     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_tx_set_get_signal_callback( | ||||||
|         infrared->worker, infrared_worker_tx_get_signal_steady_callback, infrared); |         infrared->worker, infrared_worker_tx_get_signal_steady_callback, infrared); | ||||||
|     infrared_worker_tx_start(infrared->worker); |     infrared_worker_tx_start(infrared->worker); | ||||||
|  | 
 | ||||||
|  |     infrared->app_state.is_transmitting = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void infrared_tx_start_button_index(Infrared* infrared, size_t button_index) { | 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); |     InfraredSignal* signal = infrared_remote_button_get_signal(button); | ||||||
| 
 | 
 | ||||||
|     infrared_tx_start_signal(infrared, signal); |     infrared_tx_start_signal(infrared, signal); | ||||||
|     infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStartSend); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void infrared_tx_start_received(Infrared* infrared) { | void infrared_tx_start_received(Infrared* infrared) { | ||||||
|     infrared_tx_start_signal(infrared, infrared->received_signal); |     infrared_tx_start_signal(infrared, infrared->received_signal); | ||||||
|     infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStartSend); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void infrared_tx_stop(Infrared* infrared) { | void infrared_tx_stop(Infrared* infrared) { | ||||||
|     if(!infrared->app_state.is_transmitting) { |     if(!infrared->app_state.is_transmitting) { | ||||||
|         FURI_LOG_D(INFRARED_LOG_TAG, "Transmitter is already stopped"); |  | ||||||
|         return; |         return; | ||||||
|     } else { |  | ||||||
|         infrared->app_state.is_transmitting = false; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     infrared_worker_tx_stop(infrared->worker); |     infrared_worker_tx_stop(infrared->worker); | ||||||
|     infrared_worker_tx_set_get_signal_callback(infrared->worker, NULL, NULL); |     infrared_worker_tx_set_get_signal_callback(infrared->worker, NULL, NULL); | ||||||
| 
 | 
 | ||||||
|     infrared_play_notification_message(infrared, InfraredNotificationMessageBlinkStop); |     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, ...) { | void infrared_text_store_set(Infrared* infrared, uint32_t bank, const char* text, ...) { | ||||||
|  | |||||||
| @ -69,6 +69,7 @@ typedef struct { | |||||||
|     InfraredEditTarget edit_target : 8; |     InfraredEditTarget edit_target : 8; | ||||||
|     InfraredEditMode edit_mode : 8; |     InfraredEditMode edit_mode : 8; | ||||||
|     int32_t current_button_index; |     int32_t current_button_index; | ||||||
|  |     uint32_t last_transmit_time; | ||||||
| } InfraredAppState; | } InfraredAppState; | ||||||
| 
 | 
 | ||||||
| struct Infrared { | struct Infrared { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Georgii Surkov
						Georgii Surkov