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

[FL-3117] Infrared: Fix hangups on repeated button press (#2441)

Co-authored-by: あく <alleteam@gmail.com>
Georgii Surkov 2 лет назад
Родитель
Сommit
6cc5119c64
2 измененных файлов с 14 добавлено и 8 удалено
  1. 13 8
      applications/main/infrared/infrared.c
  2. 1 0
      applications/main/infrared/infrared_i.h

+ 13 - 8
applications/main/infrared/infrared.c

@@ -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, ...) {

+ 1 - 0
applications/main/infrared/infrared_i.h

@@ -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 {