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(); } diff --git a/lib/irda/irda_common_decoder.c b/lib/irda/irda_common_decoder.c index 8710e974..a2738594 100644 --- a/lib/irda/irda_common_decoder.c +++ b/lib/irda/irda_common_decoder.c @@ -95,7 +95,6 @@ IrdaMessage* irda_common_decode(IrdaCommonDecoder* decoder, bool level, uint32_t DecodeStatus status = DecodeStatusError; if (decoder->level == level) { - furi_assert(0); decoder->timings_cnt = 0; } decoder->level = level; // start with high level (Space timing)