ir_Nikai_test.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // Copyright 2017 David Conran
  2. #include "IRsend.h"
  3. #include "IRsend_test.h"
  4. #include "gtest/gtest.h"
  5. // Tests for sendNikai().
  6. // Test sending typical data only.
  7. TEST(TestSendNikai, SendDataOnly) {
  8. IRsendTest irsend(4);
  9. irsend.begin();
  10. irsend.reset();
  11. irsend.sendNikai(0xD5F2A); // Nikai TV Power Off.
  12. EXPECT_EQ(
  13. "m4000s4000"
  14. "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
  15. "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
  16. "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
  17. "m500s2000m500s1000m500s2000m500s8500",
  18. irsend.outputStr());
  19. irsend.reset();
  20. }
  21. // Test sending with different repeats.
  22. TEST(TestSendNikai, SendWithRepeats) {
  23. IRsendTest irsend(4);
  24. irsend.begin();
  25. irsend.reset();
  26. irsend.sendNikai(0xD5F2A, kNikaiBits, 1); // 1 repeat.
  27. EXPECT_EQ(
  28. "m4000s4000"
  29. "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
  30. "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
  31. "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
  32. "m500s2000m500s1000m500s2000m500s8500"
  33. "m4000s4000"
  34. "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
  35. "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
  36. "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
  37. "m500s2000m500s1000m500s2000m500s8500",
  38. irsend.outputStr());
  39. irsend.sendNikai(0xD5F2A, kNikaiBits, 2); // 2 repeat.
  40. EXPECT_EQ(
  41. "m4000s4000"
  42. "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
  43. "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
  44. "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
  45. "m500s2000m500s1000m500s2000m500s8500"
  46. "m4000s4000"
  47. "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
  48. "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
  49. "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
  50. "m500s2000m500s1000m500s2000m500s8500"
  51. "m4000s4000"
  52. "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000"
  53. "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000"
  54. "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000"
  55. "m500s2000m500s1000m500s2000m500s8500",
  56. irsend.outputStr());
  57. }
  58. // Tests for decodeNikai().
  59. // Decode normal Nikai messages.
  60. TEST(TestDecodeNikai, NormalDecodeWithStrict) {
  61. IRsendTest irsend(4);
  62. IRrecv irrecv(4);
  63. irsend.begin();
  64. // Normal Nikai 24-bit message.
  65. irsend.reset();
  66. irsend.sendNikai(0x123456);
  67. irsend.makeDecodeResult();
  68. ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
  69. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  70. EXPECT_EQ(kNikaiBits, irsend.capture.bits);
  71. EXPECT_EQ(0x123456, irsend.capture.value);
  72. irsend.reset();
  73. irsend.sendNikai(0x101);
  74. irsend.makeDecodeResult();
  75. ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
  76. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  77. EXPECT_EQ(kNikaiBits, irsend.capture.bits);
  78. EXPECT_EQ(0x101, irsend.capture.value);
  79. }
  80. // Decode normal repeated Nikai messages.
  81. TEST(TestDecodeNikai, NormalDecodeWithRepeatAndStrict) {
  82. IRsendTest irsend(4);
  83. IRrecv irrecv(4);
  84. irsend.begin();
  85. // Normal Nikai 24-bit message.
  86. irsend.reset();
  87. irsend.sendNikai(0xD5F2A, kNikaiBits, 2);
  88. irsend.makeDecodeResult();
  89. ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
  90. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  91. EXPECT_EQ(kNikaiBits, irsend.capture.bits);
  92. EXPECT_EQ(0xD5F2A, irsend.capture.value);
  93. }
  94. TEST(TestDecodeNikai, NormalDecodeWithNonStrict) {
  95. IRsendTest irsend(4);
  96. IRrecv irrecv(4);
  97. irsend.begin();
  98. // Illegal under length (16-bit) message
  99. irsend.reset();
  100. irsend.sendNikai(0x0, 16);
  101. irsend.makeDecodeResult();
  102. // Should fail with strict on.
  103. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
  104. // And it should fail when we expect more bits.
  105. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, false));
  106. // Should pass if strict off if we ask for correct nr. of bits sent.
  107. ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 16, false));
  108. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  109. EXPECT_EQ(16, irsend.capture.bits);
  110. EXPECT_EQ(0x0, irsend.capture.value);
  111. // Should fail as we are expecting less bits than there are.
  112. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, 12, false));
  113. }
  114. // Decode (non-standard) 64-bit messages.
  115. // Decode unsupported Nikai messages.
  116. TEST(TestDecodeNikai, Decode64BitMessages) {
  117. IRsendTest irsend(4);
  118. IRrecv irrecv(4);
  119. irsend.begin();
  120. irsend.reset();
  121. // Illegal size Nikai 64-bit message.
  122. irsend.sendNikai(0xFFFFFFFFFFFFFFFF, 64);
  123. irsend.makeDecodeResult();
  124. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, true));
  125. // Should work with a 'normal' match (not strict)
  126. ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, 64, false));
  127. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  128. EXPECT_EQ(64, irsend.capture.bits);
  129. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  130. }
  131. // Decode real example via Issue #309
  132. TEST(TestDecodeNikai, DecodeExamples) {
  133. IRsendTest irsend(4);
  134. IRrecv irrecv(4);
  135. irsend.begin();
  136. irsend.reset();
  137. // Nikai TV Power Off from Issue #309
  138. uint16_t rawdata_off[100] = {
  139. 4060, 3918, 508, 2004, 508, 2002, 510, 2002, 508, 2004, 506,
  140. 1050, 508, 1048, 510, 2004, 508, 1048, 508, 2002, 510, 1050,
  141. 508, 2004, 510, 1048, 508, 1050, 508, 1048, 508, 1050, 508,
  142. 1050, 508, 2004, 508, 2002, 510, 1048, 508, 2004, 508, 1050,
  143. 506, 2004, 508, 1048, 510, 2002, 456, 8446, 3956, 3998, 508,
  144. 2004, 508, 2002, 508, 2004, 508, 1978, 532, 1050, 508, 1050,
  145. 508, 2002, 508, 1050, 508, 2004, 508, 1050, 508, 2002, 510,
  146. 1050, 508, 1050, 508, 1048, 508, 1050, 508, 1050, 508, 2002,
  147. 510, 2002, 508, 1050, 508, 2002, 510, 1050, 508, 2002, 508};
  148. irsend.sendRaw(rawdata_off, 100, 38);
  149. irsend.makeDecodeResult();
  150. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  151. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  152. EXPECT_EQ(kNikaiBits, irsend.capture.bits);
  153. EXPECT_EQ(0xD5F2A, irsend.capture.value);
  154. // Nikai TV Volume Up from Issue #309
  155. uint16_t rawdata_volup[52] = {
  156. 3972, 4002, 504, 1982, 526, 2010, 502, 2010, 502, 2010, 500,
  157. 1056, 502, 1056, 502, 2010, 500, 1056, 502, 2010, 502, 2010,
  158. 500, 2010, 502, 2010, 502, 1056, 502, 1056, 502, 1056, 500,
  159. 1056, 502, 2010, 502, 2010, 500, 1056, 502, 2008, 502, 1054,
  160. 504, 1054, 504, 1054, 500, 1056, 450};
  161. irsend.reset();
  162. irsend.sendRaw(rawdata_volup, 52, 38);
  163. irsend.makeDecodeResult();
  164. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  165. EXPECT_EQ(NIKAI, irsend.capture.decode_type);
  166. EXPECT_EQ(kNikaiBits, irsend.capture.bits);
  167. EXPECT_EQ(0xD0F2F, irsend.capture.value);
  168. }
  169. // Fail to decode a non-Nikai example via GlobalCache
  170. TEST(TestDecodeNikai, FailToDecodeNonNikaiExample) {
  171. IRsendTest irsend(4);
  172. IRrecv irrecv(4);
  173. irsend.begin();
  174. irsend.reset();
  175. uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22,
  176. 21, 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22,
  177. 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22,
  178. 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22,
  179. 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22,
  180. 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820};
  181. irsend.sendGC(gc_test, 71);
  182. irsend.makeDecodeResult();
  183. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture));
  184. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kNikaiBits, false));
  185. }