irda_monitor.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <stdio.h>
  2. #include <furi.h>
  3. #include <api-hal-irda.h>
  4. #include <api-hal.h>
  5. #include <notification/notification-messages.h>
  6. #define IRDA_TIMINGS_SIZE 2000
  7. typedef struct {
  8. uint32_t timing_cnt;
  9. struct {
  10. uint8_t level;
  11. uint32_t duration;
  12. } timing[IRDA_TIMINGS_SIZE];
  13. } IrdaDelaysArray;
  14. static void irda_rx_callback(void* ctx, bool level, uint32_t duration) {
  15. IrdaDelaysArray* delays = ctx;
  16. if(delays->timing_cnt < IRDA_TIMINGS_SIZE) {
  17. if(delays->timing_cnt > 1)
  18. furi_check(level != delays->timing[delays->timing_cnt - 1].level);
  19. delays->timing[delays->timing_cnt].level = level;
  20. delays->timing[delays->timing_cnt].duration = duration;
  21. delays->timing_cnt++; // Read-Modify-Write in ISR only: no need to add synchronization
  22. }
  23. }
  24. int32_t irda_monitor_app(void* p) {
  25. (void)p;
  26. static uint32_t counter = 0;
  27. IrdaDelaysArray* delays = furi_alloc(sizeof(IrdaDelaysArray));
  28. NotificationApp* notification = furi_record_open("notification");
  29. api_hal_irda_rx_irq_init();
  30. api_hal_irda_rx_irq_set_callback(irda_rx_callback, delays);
  31. while(1) {
  32. delay(20);
  33. if(counter != delays->timing_cnt) {
  34. notification_message(notification, &sequence_blink_blue_100);
  35. counter = delays->timing_cnt;
  36. }
  37. if(delays->timing_cnt >= IRDA_TIMINGS_SIZE) {
  38. api_hal_irda_rx_irq_deinit();
  39. printf("== IRDA MONITOR FOUND (%d) records) ==\r\n", IRDA_TIMINGS_SIZE);
  40. printf("{");
  41. for(int i = 0; i < IRDA_TIMINGS_SIZE; ++i) {
  42. printf(
  43. "%s%lu, ",
  44. (delays->timing[i].duration > 15000) ? "\r\n" : "",
  45. delays->timing[i].duration);
  46. }
  47. printf("\r\n};\r\n");
  48. break;
  49. }
  50. }
  51. free(delays);
  52. return 0;
  53. }