Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Kharisov <ah@bright-box.com>2021-07-02 15:46:13 +0300
committerGitHub <noreply@github.com>2021-07-02 15:46:13 +0300
commitdf9a6673da2e7a24bb4c0cd49fd339022ac6c007 (patch)
tree2577e59ad0bda913c7fa132b86fc40cf6219864c /applications/irda
parentc388458462e99a79aa85926e9e84ec07fb09305c (diff)
[FL-1513] Fix IRDA crash (#557)
Diffstat (limited to 'applications/irda')
-rw-r--r--applications/irda/irda-app-transceiver.cpp22
-rw-r--r--applications/irda/irda-app-transceiver.hpp1
-rw-r--r--applications/irda/scene/irda-app-scene-learn.cpp2
3 files changed, 19 insertions, 6 deletions
diff --git a/applications/irda/irda-app-transceiver.cpp b/applications/irda/irda-app-transceiver.cpp
index 75bf1dcc..c9f7d19c 100644
--- a/applications/irda/irda-app-transceiver.cpp
+++ b/applications/irda/irda-app-transceiver.cpp
@@ -9,7 +9,6 @@ void IrdaAppSignalTransceiver::irda_rx_callback(void* ctx, bool level, uint32_t
irda_message = irda_decode(this_->decoder, level, duration);
if(irda_message) {
- this_->capture_stop();
this_->message = *irda_message;
event.type = IrdaAppEvent::Type::IrdaMessageReceived;
osStatus_t result = osMessageQueuePut(this_->event_queue, &event, 0, 0);
@@ -18,23 +17,34 @@ void IrdaAppSignalTransceiver::irda_rx_callback(void* ctx, bool level, uint32_t
}
IrdaAppSignalTransceiver::IrdaAppSignalTransceiver(void)
- : decoder(irda_alloc_decoder()) {
+ : capture_started(false)
+ , decoder(irda_alloc_decoder()) {
}
IrdaAppSignalTransceiver::~IrdaAppSignalTransceiver() {
- api_hal_irda_rx_irq_deinit();
+ capture_stop();
irda_free_decoder(decoder);
}
void IrdaAppSignalTransceiver::capture_once_start(osMessageQueueId_t queue) {
event_queue = queue;
irda_reset_decoder(decoder);
- api_hal_irda_rx_irq_init();
- api_hal_irda_rx_irq_set_callback(IrdaAppSignalTransceiver::irda_rx_callback, this);
+ if(!capture_started) {
+ capture_started = true;
+ api_hal_irda_rx_irq_set_callback(IrdaAppSignalTransceiver::irda_rx_callback, this);
+ api_hal_irda_rx_irq_init();
+ }
}
void IrdaAppSignalTransceiver::capture_stop(void) {
- api_hal_irda_rx_irq_deinit();
+ IrdaAppEvent event;
+
+ if(capture_started) {
+ capture_started = false;
+ api_hal_irda_rx_irq_deinit();
+ while(osMessageQueueGet(this->event_queue, &event, 0, 0) == osOK)
+ ;
+ }
}
IrdaMessage* IrdaAppSignalTransceiver::get_last_message(void) {
diff --git a/applications/irda/irda-app-transceiver.hpp b/applications/irda/irda-app-transceiver.hpp
index a084061f..498f79f1 100644
--- a/applications/irda/irda-app-transceiver.hpp
+++ b/applications/irda/irda-app-transceiver.hpp
@@ -12,6 +12,7 @@ public:
void send_message(const IrdaMessage* message) const;
private:
+ bool capture_started;
osMessageQueueId_t event_queue;
static void irda_rx_callback(void* ctx, bool level, uint32_t duration);
IrdaHandler* decoder;
diff --git a/applications/irda/scene/irda-app-scene-learn.cpp b/applications/irda/scene/irda-app-scene-learn.cpp
index 4c8f9061..b369df6f 100644
--- a/applications/irda/scene/irda-app-scene-learn.cpp
+++ b/applications/irda/scene/irda-app-scene-learn.cpp
@@ -37,4 +37,6 @@ bool IrdaAppSceneLearn::on_event(IrdaApp* app, IrdaAppEvent* event) {
}
void IrdaAppSceneLearn::on_exit(IrdaApp* app) {
+ auto transceiver = app->get_transceiver();
+ transceiver->capture_stop();
}