diff options
author | Albert Kharisov <ah@bright-box.com> | 2021-07-02 15:46:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-02 15:46:13 +0300 |
commit | df9a6673da2e7a24bb4c0cd49fd339022ac6c007 (patch) | |
tree | 2577e59ad0bda913c7fa132b86fc40cf6219864c /applications/irda | |
parent | c388458462e99a79aa85926e9e84ec07fb09305c (diff) |
[FL-1513] Fix IRDA crash (#557)
Diffstat (limited to 'applications/irda')
-rw-r--r-- | applications/irda/irda-app-transceiver.cpp | 22 | ||||
-rw-r--r-- | applications/irda/irda-app-transceiver.hpp | 1 | ||||
-rw-r--r-- | applications/irda/scene/irda-app-scene-learn.cpp | 2 |
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(); } |