#include #include #include #include #include "mp_flipper_context.h" static void infrared_receive_callback(void* ctx, bool level, uint32_t duration) { mp_flipper_infrared_rx_t* session = ctx; if(session->pointer == 0 && !level) { return; } if(session->pointer < session->size) { session->buffer[session->pointer] = duration; session->pointer++; } else { session->running = false; } } static void infrared_timeout_callback(void* ctx) { mp_flipper_infrared_rx_t* session = ctx; session->running = false; furi_hal_infrared_async_rx_stop(); } inline uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length) { const mp_flipper_context_t* ctx = mp_flipper_context; mp_flipper_infrared_rx_t* session = ctx->infrared_rx; session->pointer = 0; session->running = true; furi_hal_infrared_async_rx_set_capture_isr_callback(infrared_receive_callback, session); furi_hal_infrared_async_rx_set_timeout_isr_callback(infrared_timeout_callback, session); furi_hal_infrared_async_rx_start(); furi_hal_infrared_async_rx_set_timeout(timeout); while(session->running) { furi_delay_tick(10); } *length = session->pointer; return session->buffer; }