irda-app-transceiver.cpp 1.6 KB

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