irda-app-signal.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "irda-app-signal.h"
  2. #include <irda_transmit.h>
  3. void IrdaAppSignal::copy_timings(const uint32_t* timings, size_t size) {
  4. furi_assert(size);
  5. furi_assert(timings);
  6. payload.raw.timings_cnt = size;
  7. if(size) {
  8. payload.raw.timings = new uint32_t[size];
  9. memcpy(payload.raw.timings, timings, size * sizeof(uint32_t));
  10. }
  11. }
  12. void IrdaAppSignal::clear_timings() {
  13. if(!decoded) {
  14. delete[] payload.raw.timings;
  15. payload.raw.timings_cnt = 0;
  16. payload.raw.timings = nullptr;
  17. }
  18. }
  19. IrdaAppSignal::IrdaAppSignal(const uint32_t* timings, size_t timings_cnt) {
  20. decoded = false;
  21. copy_timings(timings, timings_cnt);
  22. }
  23. IrdaAppSignal::IrdaAppSignal(const IrdaMessage* irda_message) {
  24. decoded = true;
  25. payload.message = *irda_message;
  26. }
  27. IrdaAppSignal& IrdaAppSignal::operator=(const IrdaAppSignal& other) {
  28. clear_timings();
  29. decoded = other.decoded;
  30. if(decoded) {
  31. payload.message = other.payload.message;
  32. } else {
  33. copy_timings(other.payload.raw.timings, other.payload.raw.timings_cnt);
  34. }
  35. return *this;
  36. }
  37. IrdaAppSignal::IrdaAppSignal(const IrdaAppSignal& other) {
  38. decoded = other.decoded;
  39. if(decoded) {
  40. payload.message = other.payload.message;
  41. } else {
  42. copy_timings(other.payload.raw.timings, other.payload.raw.timings_cnt);
  43. }
  44. }
  45. IrdaAppSignal::IrdaAppSignal(IrdaAppSignal&& other) {
  46. clear_timings();
  47. decoded = other.decoded;
  48. if(decoded) {
  49. payload.message = other.payload.message;
  50. } else {
  51. furi_assert(other.payload.raw.timings_cnt > 0);
  52. payload.raw.timings = other.payload.raw.timings;
  53. payload.raw.timings_cnt = other.payload.raw.timings_cnt;
  54. other.payload.raw.timings = nullptr;
  55. other.payload.raw.timings_cnt = 0;
  56. }
  57. }
  58. void IrdaAppSignal::set_message(const IrdaMessage* irda_message) {
  59. clear_timings();
  60. decoded = true;
  61. payload.message = *irda_message;
  62. }
  63. void IrdaAppSignal::set_raw_signal(uint32_t* timings, size_t timings_cnt) {
  64. clear_timings();
  65. decoded = false;
  66. payload.raw.timings = timings;
  67. payload.raw.timings_cnt = timings_cnt;
  68. }
  69. void IrdaAppSignal::copy_raw_signal(uint32_t* timings, size_t timings_cnt) {
  70. clear_timings();
  71. decoded = false;
  72. copy_timings(timings, timings_cnt);
  73. }
  74. void IrdaAppSignal::transmit() const {
  75. if(decoded) {
  76. irda_send(&payload.message, 1);
  77. } else {
  78. irda_send_raw(payload.raw.timings, payload.raw.timings_cnt, true);
  79. }
  80. }