mp_flipper_modflipperzero_infrared.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <furi_hal.h>
  2. #include <furi_hal_infrared.h>
  3. #include <mp_flipper_modflipperzero.h>
  4. #include <mp_flipper_runtime.h>
  5. #include "mp_flipper_context.h"
  6. typedef struct {
  7. uint32_t* buffer;
  8. uint16_t pointer;
  9. bool running;
  10. } mp_flipper_infrared_rx_session_t;
  11. static void infrared_receive_callback(void* ctx, bool level, uint32_t duration) {
  12. mp_flipper_infrared_rx_session_t* session = ctx;
  13. if(session->pointer < MP_FLIPPER_INFRARED_RX_BUFFER_SIZE) {
  14. session->buffer[session->pointer] = duration;
  15. session->pointer++;
  16. } else {
  17. session->running = false;
  18. }
  19. }
  20. static void infrared_timeout_callback(void* ctx) {
  21. mp_flipper_infrared_rx_session_t* session = ctx;
  22. session->running = false;
  23. furi_hal_infrared_async_rx_stop();
  24. }
  25. inline uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length) {
  26. mp_flipper_infrared_rx_session_t* session = malloc(sizeof(mp_flipper_infrared_rx_session_t));
  27. session->buffer = calloc(MP_FLIPPER_INFRARED_RX_BUFFER_SIZE, sizeof(uint32_t));
  28. session->pointer = 0;
  29. session->running = true;
  30. furi_hal_infrared_async_rx_set_capture_isr_callback(infrared_receive_callback, session);
  31. furi_hal_infrared_async_rx_set_timeout_isr_callback(infrared_timeout_callback, session);
  32. furi_hal_infrared_async_rx_start();
  33. furi_hal_infrared_async_rx_set_timeout(timeout);
  34. while(session->running) {
  35. furi_delay_us(10);
  36. }
  37. *length = session->pointer;
  38. void* pointer = session->buffer;
  39. free(session);
  40. return pointer;
  41. }