ir_Denon_test.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. // Copyright 2017 David Conran
  2. #include "IRsend.h"
  3. #include "IRsend_test.h"
  4. #include "gtest/gtest.h"
  5. // Tests for sendDenon().
  6. // Test sending typical data only.
  7. TEST(TestSendDenon, SendDataOnly) {
  8. IRsendTest irsend(4);
  9. irsend.begin();
  10. irsend.reset();
  11. irsend.sendDenon(0x2278); // Denon AVR Power On. (Sharp)
  12. EXPECT_EQ(
  13. "m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
  14. "m260s1820m260s1820m260s1820m260s1820m260s780m260s780m260s780"
  15. "m260s43602"
  16. "m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
  17. "m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
  18. "m260s43602",
  19. irsend.outputStr());
  20. irsend.reset();
  21. // Denon Eco Mode On. (Panasonic/Kaseikyo)
  22. irsend.sendDenon(0x2A4C028D6CE3, DENON_48_BITS);
  23. EXPECT_EQ(
  24. "m3456s1728"
  25. "m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
  26. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  27. "m432s432m432s432m432s432m432s432m432s432m432s432m432s1296m432s432"
  28. "m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  29. "m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
  30. "m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
  31. "m432s98928",
  32. irsend.outputStr());
  33. }
  34. // Test sending with different repeats.
  35. TEST(TestSendDenon, SendNormalWithRepeats) {
  36. IRsendTest irsend(4);
  37. irsend.begin();
  38. irsend.reset();
  39. irsend.sendDenon(0x2278, DENON_BITS, 1); // 1 repeat.
  40. EXPECT_EQ(
  41. "m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
  42. "m260s1820m260s1820m260s1820m260s1820m260s780m260s780m260s780"
  43. "m260s43602"
  44. "m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
  45. "m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
  46. "m260s43602"
  47. "m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
  48. "m260s1820m260s1820m260s1820m260s1820m260s780m260s780m260s780"
  49. "m260s43602"
  50. "m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
  51. "m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
  52. "m260s43602",
  53. irsend.outputStr());
  54. irsend.sendDenon(0x2278, DENON_BITS, 2); // 2 repeats.
  55. EXPECT_EQ(
  56. "m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
  57. "m260s1820m260s1820m260s1820m260s1820m260s780m260s780m260s780"
  58. "m260s43602"
  59. "m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
  60. "m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
  61. "m260s43602"
  62. "m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
  63. "m260s1820m260s1820m260s1820m260s1820m260s780m260s780m260s780"
  64. "m260s43602"
  65. "m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
  66. "m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
  67. "m260s43602"
  68. "m260s780m260s1820m260s780m260s780m260s780m260s1820m260s780m260s780"
  69. "m260s1820m260s1820m260s1820m260s1820m260s780m260s780m260s780"
  70. "m260s43602"
  71. "m260s780m260s1820m260s780m260s780m260s780m260s780m260s1820m260s1820"
  72. "m260s780m260s780m260s780m260s780m260s1820m260s1820m260s1820"
  73. "m260s43602",
  74. irsend.outputStr());
  75. }
  76. TEST(TestSendDenon, Send48BitWithRepeats) {
  77. IRsendTest irsend(4);
  78. irsend.begin();
  79. irsend.reset();
  80. irsend.sendDenon(0x2A4C028D6CE3, DENON_48_BITS, 1); // 1 repeat.
  81. EXPECT_EQ(
  82. "m3456s1728"
  83. "m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
  84. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  85. "m432s432m432s432m432s432m432s432m432s432m432s432m432s1296m432s432"
  86. "m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  87. "m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
  88. "m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
  89. "m432s98928"
  90. "m3456s1728"
  91. "m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
  92. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  93. "m432s432m432s432m432s432m432s432m432s432m432s432m432s1296m432s432"
  94. "m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  95. "m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
  96. "m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
  97. "m432s98928",
  98. irsend.outputStr());
  99. irsend.sendDenon(0x2A4C028D6CE3, DENON_48_BITS, 2); // 2 repeats.
  100. EXPECT_EQ(
  101. "m3456s1728"
  102. "m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
  103. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  104. "m432s432m432s432m432s432m432s432m432s432m432s432m432s1296m432s432"
  105. "m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  106. "m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
  107. "m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
  108. "m432s98928"
  109. "m3456s1728"
  110. "m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
  111. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  112. "m432s432m432s432m432s432m432s432m432s432m432s432m432s1296m432s432"
  113. "m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  114. "m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
  115. "m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
  116. "m432s98928"
  117. "m3456s1728"
  118. "m432s432m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s432"
  119. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  120. "m432s432m432s432m432s432m432s432m432s432m432s432m432s1296m432s432"
  121. "m432s1296m432s432m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  122. "m432s432m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s432"
  123. "m432s1296m432s1296m432s1296m432s432m432s432m432s432m432s1296m432s1296"
  124. "m432s98928",
  125. irsend.outputStr());
  126. }
  127. // Test sending an atypical data size.
  128. TEST(TestSendDenon, SendUnusualSize) {
  129. IRsendTest irsend(4);
  130. irsend.begin();
  131. irsend.reset();
  132. irsend.sendDenon(0x12, 8);
  133. EXPECT_EQ(
  134. "m260s780m260s780m260s780m260s1820m260s780m260s780m260s1820m260s780"
  135. "m260s43602"
  136. "m260s1820m260s1820m260s1820m260s780m260s1820m260s1820m260s780m260s1820"
  137. "m260s43602",
  138. irsend.outputStr());
  139. irsend.reset();
  140. irsend.sendDenon(0x1234567890ABCDEF, 64);
  141. EXPECT_EQ(
  142. "m3456s1728"
  143. "m432s432m432s432m432s432m432s1296m432s432m432s432m432s1296m432s432"
  144. "m432s432m432s432m432s1296m432s1296m432s432m432s1296m432s432m432s432"
  145. "m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296m432s432"
  146. "m432s432m432s1296m432s1296m432s1296m432s1296m432s432m432s432m432s432"
  147. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  148. "m432s1296m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296"
  149. "m432s1296m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  150. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s1296m432s1296"
  151. "m432s74736",
  152. irsend.outputStr());
  153. }
  154. // Tests for decodeDenon().
  155. // Decode normal Denon messages.
  156. TEST(TestDecodeDenon, NormalDecodeWithStrict) {
  157. IRsendTest irsend(4);
  158. IRrecv irrecv(4);
  159. irsend.begin();
  160. // Normal Denon 15-bit message. (Sharp)
  161. irsend.reset();
  162. irsend.sendDenon(0x2278);
  163. irsend.makeDecodeResult();
  164. ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, DENON_BITS, true));
  165. EXPECT_EQ(DENON, irsend.capture.decode_type);
  166. EXPECT_EQ(DENON_BITS, irsend.capture.bits);
  167. EXPECT_EQ(0x2278, irsend.capture.value);
  168. EXPECT_EQ(0x2, irsend.capture.address);
  169. EXPECT_EQ(0x79, irsend.capture.command);
  170. EXPECT_FALSE(irsend.capture.repeat);
  171. // Legacy Denon 14-bit message.
  172. irsend.reset();
  173. irsend.sendDenon(0x1278, kDenonLegacyBits);
  174. irsend.makeDecodeResult();
  175. ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, kDenonLegacyBits, true));
  176. EXPECT_EQ(DENON, irsend.capture.decode_type);
  177. EXPECT_EQ(kDenonLegacyBits, irsend.capture.bits);
  178. EXPECT_EQ(0x1278, irsend.capture.value);
  179. EXPECT_EQ(0x0, irsend.capture.address);
  180. EXPECT_EQ(0x0, irsend.capture.command);
  181. EXPECT_FALSE(irsend.capture.repeat);
  182. // Normal Denon 48-bit message. (Panasonic/Kaseikyo)
  183. irsend.reset();
  184. irsend.sendDenon(0x2A4C028D6CE3, DENON_48_BITS);
  185. irsend.makeDecodeResult();
  186. ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, DENON_48_BITS, true));
  187. EXPECT_EQ(DENON, irsend.capture.decode_type);
  188. EXPECT_EQ(DENON_48_BITS, irsend.capture.bits);
  189. EXPECT_EQ(0x2A4C028D6CE3, irsend.capture.value);
  190. EXPECT_EQ(0x2A4C, irsend.capture.address);
  191. EXPECT_EQ(0x028D6CE3, irsend.capture.command);
  192. EXPECT_FALSE(irsend.capture.repeat);
  193. }
  194. // Decode a 'real' example via GlobalCache
  195. TEST(TestDecodeDenon, DecodeGlobalCacheExample) {
  196. IRsendTest irsend(4);
  197. IRrecv irrecv(4);
  198. irsend.begin();
  199. irsend.reset();
  200. // Denon AVR series Power On code from Global Cache. (Sharp style)
  201. uint16_t gc_test_power[67] = {
  202. 38000, 1, 1, 10, 30, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 30,
  203. 10, 30, 10, 70, 10, 70, 10, 70, 10, 70, 10, 30, 10, 30, 10, 30, 10,
  204. 1657, 10, 30, 10, 70, 10, 30, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70,
  205. 10, 30, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70, 10, 70, 10, 1657};
  206. irsend.sendGC(gc_test_power, 67);
  207. irsend.makeDecodeResult();
  208. ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, DENON_BITS, true));
  209. EXPECT_EQ(DENON, irsend.capture.decode_type);
  210. EXPECT_EQ(DENON_BITS, irsend.capture.bits);
  211. EXPECT_EQ(0x2278, irsend.capture.value);
  212. EXPECT_EQ(0x2, irsend.capture.address);
  213. EXPECT_EQ(0x79, irsend.capture.command);
  214. EXPECT_FALSE(irsend.capture.repeat);
  215. // Denon "Eco Mode Auto" code from Global Cache. (Panasonic style)
  216. uint16_t gc_test_eco[103] = {
  217. 37000, 1, 1, 128, 64, 16, 16, 16, 16, 16, 48, 16, 16, 16, 48,
  218. 16, 16, 16, 48, 16, 16, 16, 16, 16, 48, 16, 16, 16, 16, 16,
  219. 48, 16, 48, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  220. 16, 16, 16, 16, 16, 48, 16, 16, 16, 48, 16, 16, 16, 16, 16,
  221. 16, 16, 48, 16, 48, 16, 16, 16, 48, 16, 16, 16, 48, 16, 48,
  222. 16, 16, 16, 48, 16, 48, 16, 16, 16, 16, 16, 48, 16, 48, 16,
  223. 48, 16, 16, 16, 16, 16, 16, 16, 48, 16, 48, 16, 2766};
  224. irsend.reset();
  225. irsend.sendGC(gc_test_eco, 103);
  226. irsend.makeDecodeResult();
  227. ASSERT_TRUE(irrecv.decodeDenon(&irsend.capture, DENON_48_BITS, true));
  228. EXPECT_EQ(DENON, irsend.capture.decode_type);
  229. EXPECT_EQ(DENON_48_BITS, irsend.capture.bits);
  230. EXPECT_EQ(0x2A4C028D6CE3, irsend.capture.value);
  231. EXPECT_EQ(0x2A4C, irsend.capture.address);
  232. EXPECT_EQ(0x028D6CE3, irsend.capture.command);
  233. EXPECT_FALSE(irsend.capture.repeat);
  234. }
  235. // Fail to decode a non-Denon example via GlobalCache
  236. TEST(TestDecodeDenon, FailToDecodeNonDenonExample) {
  237. IRsendTest irsend(4);
  238. IRrecv irrecv(4);
  239. irsend.begin();
  240. irsend.reset();
  241. uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
  242. 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
  243. 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
  244. 61, 20, 20, 20, 20, 20, 20, 20, 884};
  245. irsend.sendGC(gc_test, 39);
  246. irsend.makeDecodeResult();
  247. ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture));
  248. ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, kDenonLegacyBits, false));
  249. ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, DENON_BITS, false));
  250. ASSERT_FALSE(irrecv.decodeDenon(&irsend.capture, DENON_48_BITS, false));
  251. }