irda_app_signal.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "irda_app_signal.h"
  2. #include <irda_transmit.h>
  3. void IrdaAppSignal::copy_raw_signal(
  4. const uint32_t* timings,
  5. size_t size,
  6. uint32_t frequency,
  7. float duty_cycle) {
  8. furi_assert(size);
  9. furi_assert(timings);
  10. payload.raw.frequency = frequency;
  11. payload.raw.duty_cycle = duty_cycle;
  12. payload.raw.timings_cnt = size;
  13. if(size) {
  14. payload.raw.timings = new uint32_t[size];
  15. memcpy(payload.raw.timings, timings, size * sizeof(uint32_t));
  16. }
  17. }
  18. void IrdaAppSignal::clear_timings() {
  19. if(raw_signal) {
  20. delete[] payload.raw.timings;
  21. payload.raw.timings_cnt = 0;
  22. payload.raw.timings = nullptr;
  23. }
  24. }
  25. IrdaAppSignal::IrdaAppSignal(
  26. const uint32_t* timings,
  27. size_t timings_cnt,
  28. uint32_t frequency,
  29. float duty_cycle) {
  30. raw_signal = true;
  31. copy_raw_signal(timings, timings_cnt, frequency, duty_cycle);
  32. }
  33. IrdaAppSignal::IrdaAppSignal(const IrdaMessage* irda_message) {
  34. raw_signal = false;
  35. payload.message = *irda_message;
  36. }
  37. IrdaAppSignal& IrdaAppSignal::operator=(const IrdaAppSignal& other) {
  38. clear_timings();
  39. raw_signal = other.raw_signal;
  40. if(!raw_signal) {
  41. payload.message = other.payload.message;
  42. } else {
  43. copy_raw_signal(
  44. other.payload.raw.timings,
  45. other.payload.raw.timings_cnt,
  46. other.payload.raw.frequency,
  47. other.payload.raw.duty_cycle);
  48. }
  49. return *this;
  50. }
  51. IrdaAppSignal::IrdaAppSignal(const IrdaAppSignal& other) {
  52. raw_signal = other.raw_signal;
  53. if(!raw_signal) {
  54. payload.message = other.payload.message;
  55. } else {
  56. copy_raw_signal(
  57. other.payload.raw.timings,
  58. other.payload.raw.timings_cnt,
  59. other.payload.raw.frequency,
  60. other.payload.raw.duty_cycle);
  61. }
  62. }
  63. IrdaAppSignal::IrdaAppSignal(IrdaAppSignal&& other) {
  64. clear_timings();
  65. raw_signal = other.raw_signal;
  66. if(!raw_signal) {
  67. payload.message = other.payload.message;
  68. } else {
  69. furi_assert(other.payload.raw.timings_cnt > 0);
  70. payload.raw.timings = other.payload.raw.timings;
  71. payload.raw.timings_cnt = other.payload.raw.timings_cnt;
  72. payload.raw.frequency = other.payload.raw.frequency;
  73. payload.raw.duty_cycle = other.payload.raw.duty_cycle;
  74. other.payload.raw.timings = nullptr;
  75. other.payload.raw.timings_cnt = 0;
  76. other.raw_signal = false;
  77. }
  78. }
  79. void IrdaAppSignal::set_message(const IrdaMessage* irda_message) {
  80. clear_timings();
  81. raw_signal = false;
  82. payload.message = *irda_message;
  83. }
  84. void IrdaAppSignal::set_raw_signal(
  85. uint32_t* timings,
  86. size_t timings_cnt,
  87. uint32_t frequency,
  88. float duty_cycle) {
  89. clear_timings();
  90. raw_signal = true;
  91. copy_raw_signal(timings, timings_cnt, frequency, duty_cycle);
  92. }
  93. void IrdaAppSignal::transmit() const {
  94. if(!raw_signal) {
  95. irda_send(&payload.message, 1);
  96. } else {
  97. irda_send_raw_ext(
  98. payload.raw.timings,
  99. payload.raw.timings_cnt,
  100. true,
  101. payload.raw.frequency,
  102. payload.raw.duty_cycle);
  103. }
  104. }