mp_flipper_modflipperzero_infrared.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. static void infrared_receive_callback(void* ctx, bool level, uint32_t duration) {
  7. mp_flipper_infrared_rx_t* session = ctx;
  8. if(session->pointer == 0 && !level) {
  9. return;
  10. }
  11. if(session->pointer < session->size) {
  12. session->buffer[session->pointer] = duration;
  13. session->pointer++;
  14. } else {
  15. session->running = false;
  16. }
  17. }
  18. static void infrared_timeout_callback(void* ctx) {
  19. mp_flipper_infrared_rx_t* session = ctx;
  20. session->running = false;
  21. furi_hal_infrared_async_rx_stop();
  22. }
  23. inline uint32_t* mp_flipper_infrared_receive(uint32_t timeout, size_t* length) {
  24. const mp_flipper_context_t* ctx = mp_flipper_context;
  25. mp_flipper_infrared_rx_t* session = ctx->infrared_rx;
  26. session->pointer = 0;
  27. session->running = true;
  28. furi_hal_infrared_async_rx_set_capture_isr_callback(infrared_receive_callback, session);
  29. furi_hal_infrared_async_rx_set_timeout_isr_callback(infrared_timeout_callback, session);
  30. furi_hal_infrared_async_rx_start();
  31. furi_hal_infrared_async_rx_set_timeout(timeout);
  32. while(session->running) {
  33. furi_delay_tick(10);
  34. }
  35. *length = session->pointer;
  36. return session->buffer;
  37. }