| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #include <furi_hal.h>
- #include <furi_hal_infrared.h>
- #include <mp_flipper_modflipperzero.h>
- #include <mp_flipper_runtime.h>
- #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;
- }
|