[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…
Reference in New Issue
Block a user