irda-app-receiver.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "irda-app.hpp"
  2. #include "irda.h"
  3. #include <api-hal-irda.h>
  4. void IrdaAppSignalReceiver::irda_rx_callback(void* ctx, bool level, uint32_t duration) {
  5. IrdaAppEvent event;
  6. const IrdaMessage* irda_message;
  7. IrdaAppSignalReceiver* this_ = static_cast<IrdaAppSignalReceiver*>(ctx);
  8. irda_message = irda_decode(this_->decoder, level, duration);
  9. if(irda_message) {
  10. this_->capture_stop();
  11. this_->message = *irda_message;
  12. event.type = IrdaAppEvent::Type::IrdaMessageReceived;
  13. osStatus_t result = osMessageQueuePut(this_->event_queue, &event, 0, 0);
  14. furi_check(result == osOK);
  15. }
  16. }
  17. IrdaAppSignalReceiver::IrdaAppSignalReceiver(void)
  18. : decoder(irda_alloc_decoder()) {
  19. }
  20. IrdaAppSignalReceiver::~IrdaAppSignalReceiver() {
  21. api_hal_irda_rx_irq_deinit();
  22. irda_free_decoder(decoder);
  23. }
  24. void IrdaAppSignalReceiver::capture_once_start(osMessageQueueId_t queue) {
  25. event_queue = queue;
  26. irda_reset_decoder(decoder);
  27. api_hal_irda_rx_irq_init();
  28. api_hal_irda_rx_irq_set_callback(IrdaAppSignalReceiver::irda_rx_callback, this);
  29. }
  30. void IrdaAppSignalReceiver::capture_stop(void) {
  31. api_hal_irda_rx_irq_deinit();
  32. }
  33. IrdaMessage* IrdaAppSignalReceiver::get_last_message(void) {
  34. return &message;
  35. }
  36. void IrdaAppSignalReceiver::send_message(const IrdaMessage* message) {
  37. irda_send(message, 1);
  38. }