IRsend_test.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. // Copyright 2017 David Conran
  2. #include "IRsend_test.h"
  3. #include "IRsend.h"
  4. #include "gtest/gtest.h"
  5. // Tests sendData().
  6. // Test sending zero bits.
  7. TEST(TestSendData, SendZeroBits) {
  8. IRsendTest irsend(4);
  9. irsend.begin();
  10. irsend.sendData(1, 2, 3, 4, 0b1, 0, true);
  11. EXPECT_EQ("", irsend.outputStr());
  12. }
  13. // Test sending zero and one.
  14. TEST(TestSendData, SendSingleBit) {
  15. IRsendTest irsend(4);
  16. irsend.begin();
  17. irsend.sendData(1, 2, 3, 4, 0b1, 1, true);
  18. EXPECT_EQ("m1s2", irsend.outputStr());
  19. irsend.sendData(1, 2, 3, 4, 0b0, 1, true);
  20. EXPECT_EQ("m3s4", irsend.outputStr());
  21. }
  22. // Test sending bit order.
  23. TEST(TestSendData, TestingBitSendOrder) {
  24. IRsendTest irsend(4);
  25. irsend.begin();
  26. irsend.sendData(1, 2, 3, 4, 0b10, 2, true);
  27. EXPECT_EQ("m1s2m3s4", irsend.outputStr());
  28. irsend.sendData(1, 2, 3, 4, 0b10, 2, false);
  29. EXPECT_EQ("m3s4m1s2", irsend.outputStr());
  30. irsend.sendData(1, 2, 3, 4, 0b0001, 4, false);
  31. EXPECT_EQ("m1s2m3s4m3s4m3s4", irsend.outputStr());
  32. }
  33. // Test sending typical data.
  34. TEST(TestSendData, SendTypicalData) {
  35. IRsendTest irsend(4);
  36. irsend.begin();
  37. irsend.sendData(1, 2, 3, 4, 0b1010110011110000, 16, true);
  38. EXPECT_EQ("m1s2m3s4m1s2m3s4m1s2m1s2m3s4m3s4m1s2m1s2m1s2m1s2m3s4m3s4m3s4m3s4",
  39. irsend.outputStr());
  40. irsend.sendData(1, 2, 3, 4, 0x1234567890ABCDEF, 64, true);
  41. EXPECT_EQ(
  42. "m3s4m3s4m3s4m1s2m3s4m3s4m1s2m3s4m3s4m3s4m1s2m1s2m3s4m1s2m3s4m3s4"
  43. "m3s4m1s2m3s4m1s2m3s4m1s2m1s2m3s4m3s4m1s2m1s2m1s2m1s2m3s4m3s4m3s4"
  44. "m1s2m3s4m3s4m1s2m3s4m3s4m3s4m3s4m1s2m3s4m1s2m3s4m1s2m3s4m1s2m1s2"
  45. "m1s2m1s2m3s4m3s4m1s2m1s2m3s4m1s2m1s2m1s2m1s2m3s4m1s2m1s2m1s2m1s2",
  46. irsend.outputStr());
  47. }
  48. // Test sending more than expected bits.
  49. TEST(TestSendData, SendOverLargeData) {
  50. IRsendTest irsend(4);
  51. irsend.begin();
  52. irsend.sendData(1, 2, 3, 4, 0xFFFFFFFFFFFFFFFF, 70, true);
  53. EXPECT_EQ(
  54. "m3s4m3s4m3s4m3s4m3s4m3s4"
  55. "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
  56. "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
  57. "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2"
  58. "m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2m1s2",
  59. irsend.outputStr());
  60. }
  61. // Test inverting the output.
  62. TEST(TestIRSend, InvertedOutput) {
  63. IRsendTest irsend(4, true);
  64. irsend.begin();
  65. irsend.sendData(1, 2, 3, 4, 0b1, 1, true);
  66. EXPECT_EQ("s1m2", irsend.outputStr());
  67. irsend.sendData(1, 2, 3, 4, 0b0, 1, true);
  68. EXPECT_EQ("s3m4", irsend.outputStr());
  69. }
  70. // Test typical use of sendRaw().
  71. TEST(TestSendRaw, GeneralUse) {
  72. IRsendTest irsend(4);
  73. IRrecv irrecv(0);
  74. irsend.begin();
  75. // NEC C3E0E0E8 as measured in #204
  76. uint16_t rawData[67] = {
  77. 8950, 4500, 550, 1650, 600, 1650, 550, 550, 600, 500, 600, 550,
  78. 550, 550, 600, 1650, 550, 1650, 600, 1650, 600, 1650, 550, 1700,
  79. 550, 550, 600, 550, 550, 550, 600, 500, 600, 550, 550, 1650,
  80. 600, 1650, 600, 1650, 550, 550, 600, 500, 600, 500, 600, 550,
  81. 550, 550, 600, 1650, 550, 1650, 600, 1650, 600, 500, 650, 1600,
  82. 600, 500, 600, 550, 550, 550, 600};
  83. irsend.sendRaw(rawData, 67, 38);
  84. EXPECT_EQ(
  85. "m8950s4500"
  86. "m550s1650m600s1650m550s550m600s500m600s550m550s550m600s1650m550s1650"
  87. "m600s1650m600s1650m550s1700m550s550m600s550m550s550m600s500m600s550"
  88. "m550s1650m600s1650m600s1650m550s550m600s500m600s500m600s550m550s550"
  89. "m600s1650m550s1650m600s1650m600s500m650s1600m600s500m600s550m550s550"
  90. "m600",
  91. irsend.outputStr());
  92. irsend.reset();
  93. irsend.sendRaw(rawData, 67, 38);
  94. irsend.makeDecodeResult();
  95. ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, kNECBits, false));
  96. EXPECT_EQ(NEC, irsend.capture.decode_type);
  97. EXPECT_EQ(32, irsend.capture.bits);
  98. EXPECT_EQ(0xC3E0E0E8, irsend.capture.value);
  99. EXPECT_EQ(
  100. "m8950s4500"
  101. "m550s1650m600s1650m550s550m600s500m600s550m550s550m600s1650m550s1650"
  102. "m600s1650m600s1650m550s1700m550s550m600s550m550s550m600s500m600s550"
  103. "m550s1650m600s1650m600s1650m550s550m600s500m600s500m600s550m550s550"
  104. "m600s1650m550s1650m600s1650m600s500m650s1600m600s500m600s550m550s550"
  105. "m600",
  106. irsend.outputStr());
  107. }
  108. // Incorrect handling of decodes from Raw. i.e. There is no gap recorded at
  109. // the end of a command when using the interrupt code. sendRaw() best emulates
  110. // this for unit testing purposes. sendGC() and sendXXX() will add the trailing
  111. // gap. Users won't see this in normal use.
  112. TEST(TestSendRaw, NoTrailingGap) {
  113. IRsendTest irsend(4);
  114. IRrecv irrecv(4);
  115. irsend.begin();
  116. irsend.reset();
  117. uint16_t rawData[67] = {
  118. 9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550, 600, 1650,
  119. 650, 550, 600, 1650, 650, 1650, 650, 1650, 600, 550, 650, 1650,
  120. 650, 1650, 650, 550, 600, 1650, 650, 1650, 650, 550, 650, 550,
  121. 650, 1650, 650, 550, 650, 550, 650, 550, 600, 550, 650, 550,
  122. 650, 550, 650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
  123. 650, 1650, 650, 1650, 650, 1650, 600};
  124. irsend.sendRaw(rawData, 67, 38);
  125. irsend.makeDecodeResult();
  126. EXPECT_TRUE(irrecv.decodeNEC(&irsend.capture));
  127. EXPECT_EQ(NEC, irsend.capture.decode_type);
  128. EXPECT_EQ(kNECBits, irsend.capture.bits);
  129. }
  130. TEST(TestLowLevelSend, MarkFrequencyModulationAt38kHz) {
  131. IRsendLowLevelTest irsend(0);
  132. irsend.begin();
  133. irsend.reset();
  134. irsend.enableIROut(38000, 50);
  135. EXPECT_EQ(5, irsend.mark(100));
  136. EXPECT_EQ(
  137. "[On]10usecs[Off]11usecs[On]10usecs[Off]11usecs[On]10usecs[Off]11usecs"
  138. "[On]10usecs[Off]11usecs[On]10usecs[Off]6usecs",
  139. irsend.low_level_sequence);
  140. irsend.reset();
  141. irsend.enableIROut(38000, 33);
  142. EXPECT_EQ(5, irsend.mark(100));
  143. EXPECT_EQ(
  144. "[On]6usecs[Off]15usecs[On]6usecs[Off]15usecs[On]6usecs[Off]15usecs"
  145. "[On]6usecs[Off]15usecs[On]6usecs[Off]10usecs",
  146. irsend.low_level_sequence);
  147. irsend.reset();
  148. irsend.enableIROut(38000, 100);
  149. EXPECT_EQ(1, irsend.mark(1000));
  150. EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
  151. }
  152. TEST(TestLowLevelSend, MarkFrequencyModulationAt36_7kHz) {
  153. IRsendLowLevelTest irsend(0);
  154. irsend.begin();
  155. irsend.reset();
  156. irsend.enableIROut(36700, 50);
  157. EXPECT_EQ(5, irsend.mark(100));
  158. EXPECT_EQ(
  159. "[On]11usecs[Off]11usecs[On]11usecs[Off]11usecs[On]11usecs[Off]11usecs"
  160. "[On]11usecs[Off]11usecs[On]11usecs[Off]1usecs",
  161. irsend.low_level_sequence);
  162. irsend.reset();
  163. irsend.enableIROut(36700, 33);
  164. EXPECT_EQ(5, irsend.mark(100));
  165. EXPECT_EQ(
  166. "[On]7usecs[Off]15usecs[On]7usecs[Off]15usecs[On]7usecs[Off]15usecs"
  167. "[On]7usecs[Off]15usecs[On]7usecs[Off]5usecs",
  168. irsend.low_level_sequence);
  169. irsend.reset();
  170. irsend.enableIROut(36700, 100);
  171. EXPECT_EQ(1, irsend.mark(1000));
  172. EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
  173. }
  174. TEST(TestLowLevelSend, MarkFrequencyModulationAt40kHz) {
  175. IRsendLowLevelTest irsend(0);
  176. irsend.begin();
  177. irsend.reset();
  178. irsend.enableIROut(40000, 50);
  179. EXPECT_EQ(5, irsend.mark(100));
  180. EXPECT_EQ(
  181. "[On]10usecs[Off]10usecs[On]10usecs[Off]10usecs[On]10usecs[Off]10usecs"
  182. "[On]10usecs[Off]10usecs[On]10usecs[Off]10usecs",
  183. irsend.low_level_sequence);
  184. irsend.reset();
  185. irsend.enableIROut(40000, 33);
  186. EXPECT_EQ(5, irsend.mark(100));
  187. EXPECT_EQ(
  188. "[On]6usecs[Off]14usecs[On]6usecs[Off]14usecs[On]6usecs[Off]14usecs"
  189. "[On]6usecs[Off]14usecs[On]6usecs[Off]14usecs",
  190. irsend.low_level_sequence);
  191. irsend.reset();
  192. irsend.enableIROut(40000, 100);
  193. EXPECT_EQ(1, irsend.mark(1000));
  194. EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
  195. }
  196. TEST(TestLowLevelSend, MarkNoModulation) {
  197. IRsendLowLevelTest irsend(0, false, false);
  198. irsend.begin();
  199. irsend.reset();
  200. irsend.enableIROut(38000, 50);
  201. EXPECT_EQ(1, irsend.mark(1000));
  202. EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
  203. irsend.reset();
  204. irsend.enableIROut(36700, 25);
  205. EXPECT_EQ(1, irsend.mark(1000));
  206. EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
  207. irsend.reset();
  208. irsend.enableIROut(40000, 75);
  209. EXPECT_EQ(1, irsend.mark(1000));
  210. EXPECT_EQ("[On]1000usecs[Off]", irsend.low_level_sequence);
  211. }
  212. TEST(TestLowLevelSend, SpaceFrequencyModulation) {
  213. IRsendLowLevelTest irsend(0);
  214. irsend.reset();
  215. irsend.enableIROut(38000);
  216. irsend.space(1000);
  217. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  218. irsend.reset();
  219. irsend.enableIROut(40000, 75);
  220. irsend.space(1000);
  221. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  222. irsend.reset();
  223. irsend.enableIROut(38000, 100);
  224. irsend.space(1000);
  225. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  226. irsend.reset();
  227. irsend.enableIROut(38000, 33);
  228. irsend.space(1000);
  229. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  230. }
  231. TEST(TestLowLevelSend, SpaceNoModulation) {
  232. IRsendLowLevelTest irsend(0, false, false);
  233. irsend.begin();
  234. irsend.reset();
  235. irsend.enableIROut(38000, 50);
  236. irsend.space(1000);
  237. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  238. irsend.reset();
  239. irsend.enableIROut(36700, 25);
  240. irsend.space(1000);
  241. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  242. irsend.reset();
  243. irsend.enableIROut(40000, 75);
  244. irsend.space(1000);
  245. EXPECT_EQ("[Off]1000usecs", irsend.low_level_sequence);
  246. }