ir_Aiwa_test.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. // Copyright 2017 David Conran
  2. #include "IRsend.h"
  3. #include "IRsend_test.h"
  4. #include "gtest/gtest.h"
  5. // Tests for sendAiwaRCT501().
  6. // Test sending typical data only.
  7. TEST(TestSendAiwa, SendDataOnly) {
  8. IRsendTest irsend(4);
  9. irsend.begin();
  10. irsend.reset();
  11. irsend.sendAiwaRCT501(0x7F); // Aiwa Power Toggle.
  12. EXPECT_EQ(
  13. "m8960s4480"
  14. "m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
  15. "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
  16. "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
  17. "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
  18. "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  19. "m560s1680m560s1680m560s23520"
  20. "m8960s2240m560s96320",
  21. irsend.outputStr());
  22. }
  23. // Test sending oversized data.
  24. TEST(TestSendAiwa, SendOversizedData) {
  25. IRsendTest irsend(4);
  26. irsend.begin();
  27. irsend.reset();
  28. irsend.sendAiwaRCT501(0x7F, 38); // 38 bits is over the maximum. Should fail.
  29. EXPECT_EQ("", irsend.outputStr());
  30. }
  31. // Test sending with different repeats.
  32. TEST(TestSendAiwa, SendWithRepeats) {
  33. IRsendTest irsend(4);
  34. irsend.begin();
  35. irsend.reset();
  36. irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 0); // No repeats.
  37. EXPECT_EQ(
  38. "m8960s4480"
  39. "m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
  40. "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
  41. "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
  42. "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
  43. "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  44. "m560s1680m560s1680m560s23520",
  45. irsend.outputStr());
  46. irsend.reset();
  47. irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 1); // 1 repeat.
  48. EXPECT_EQ(
  49. "m8960s4480"
  50. "m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
  51. "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
  52. "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
  53. "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
  54. "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  55. "m560s1680m560s1680m560s23520"
  56. "m8960s2240m560s96320",
  57. irsend.outputStr());
  58. irsend.reset();
  59. irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 2); // 2 repeats.
  60. EXPECT_EQ(
  61. "m8960s4480"
  62. "m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
  63. "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
  64. "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
  65. "m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s560"
  66. "m560s560m560s560m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  67. "m560s1680m560s1680m560s23520"
  68. "m8960s2240m560s96320"
  69. "m8960s2240m560s96320",
  70. irsend.outputStr());
  71. }
  72. // Test sending an atypical data size.
  73. TEST(TestSendAiwa, SendUnusualSize) {
  74. IRsendTest irsend(4);
  75. irsend.begin();
  76. irsend.reset();
  77. irsend.sendAiwaRCT501(0x12, 8);
  78. EXPECT_EQ(
  79. "m8960s4480"
  80. "m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
  81. "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
  82. "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
  83. "m560s1680m560s1680m560s560m560s560m560s560m560s1680m560s560m560s560"
  84. "m560s1680m560s560m560s1680m560s36960"
  85. "m8960s2240m560s96320",
  86. irsend.outputStr());
  87. irsend.reset();
  88. irsend.sendAiwaRCT501(0x1234567890, 37);
  89. EXPECT_EQ(
  90. "m8960s4480"
  91. "m560s560m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
  92. "m560s560m560s560m560s560m560s560m560s560m560s1680m560s560m560s560"
  93. "m560s560m560s1680m560s560m560s560m560s1680m560s1680m560s1680m560s1680"
  94. "m560s1680m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s560"
  95. "m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560m560s560"
  96. "m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s560m560s560"
  97. "m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s1680"
  98. "m560s560m560s560m560s1680m560s560m560s560m560s560m560s560m560s1680"
  99. "m560s22400"
  100. "m8960s2240m560s96320",
  101. irsend.outputStr());
  102. }
  103. // Tests for decodeAiwaRCT501().
  104. // Decode normal Aiwa messages.
  105. TEST(TestDecodeAiwa, NormalDecodeWithStrict) {
  106. IRsendTest irsend(4);
  107. IRrecv irrecv(4);
  108. irsend.begin();
  109. // Normal Aiwa 15-bit(42bit) message.
  110. irsend.reset();
  111. irsend.sendAiwaRCT501(0x7F);
  112. irsend.makeDecodeResult();
  113. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  114. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  115. EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
  116. EXPECT_EQ(0x7F, irsend.capture.value);
  117. EXPECT_EQ(0x0, irsend.capture.address);
  118. EXPECT_EQ(0x0, irsend.capture.command);
  119. EXPECT_FALSE(irsend.capture.repeat);
  120. // Normal Aiwa 15-bit(42bit) message.
  121. irsend.reset();
  122. irsend.sendAiwaRCT501(0x0);
  123. irsend.makeDecodeResult();
  124. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  125. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  126. EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
  127. EXPECT_EQ(0x0, irsend.capture.value);
  128. EXPECT_EQ(0x0, irsend.capture.address);
  129. EXPECT_EQ(0x0, irsend.capture.command);
  130. EXPECT_FALSE(irsend.capture.repeat);
  131. // Normal Aiwa 15-bit(42bit) message.
  132. irsend.reset();
  133. irsend.sendAiwaRCT501(0x7FFF);
  134. irsend.makeDecodeResult();
  135. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  136. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  137. EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
  138. EXPECT_EQ(0x7FFF, irsend.capture.value);
  139. EXPECT_EQ(0x0, irsend.capture.address);
  140. EXPECT_EQ(0x0, irsend.capture.command);
  141. EXPECT_FALSE(irsend.capture.repeat);
  142. }
  143. // Decode normal repeated Aiwa messages.
  144. TEST(TestDecodeAiwa, NormalDecodeWithRepeatAndStrict) {
  145. IRsendTest irsend(4);
  146. IRrecv irrecv(4);
  147. irsend.begin();
  148. // Normal Aiwa 15-bit(42bit) message with 2 repeats.
  149. irsend.reset();
  150. irsend.sendAiwaRCT501(0x7F, kAiwaRcT501Bits, 2);
  151. irsend.makeDecodeResult();
  152. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  153. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  154. EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
  155. EXPECT_EQ(0x7F, irsend.capture.value);
  156. EXPECT_EQ(0x0, irsend.capture.address);
  157. EXPECT_EQ(0x0, irsend.capture.command);
  158. EXPECT_FALSE(irsend.capture.repeat);
  159. }
  160. // Decode unsupported Aiwa messages.
  161. TEST(TestDecodeAiwa, DecodeWithNonStrictValues) {
  162. IRsendTest irsend(4);
  163. IRrecv irrecv(4);
  164. irsend.begin();
  165. irsend.reset();
  166. // Confirm using sendNEC(data, 42, 1) can make a legal Aiwa message.
  167. irsend.sendNEC(0x1D8113F00FF, 42, kAiwaRcT501MinRepeats);
  168. irsend.makeDecodeResult();
  169. // MUST pass with strict on.
  170. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  171. ASSERT_EQ(0x7F, irsend.capture.value);
  172. irsend.reset();
  173. // Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
  174. // Value is illegal due to bad pre & post data.
  175. irsend.sendNEC(0x1234567890A, 42, kAiwaRcT501MinRepeats);
  176. irsend.makeDecodeResult();
  177. // Should fail with strict on.
  178. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  179. // Should fail if strict off too.
  180. ASSERT_FALSE(
  181. irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
  182. irsend.reset();
  183. // Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
  184. // Value is illegal due to bad post data only.
  185. irsend.sendNEC(0x1D8113F00FE, 42, kAiwaRcT501MinRepeats);
  186. irsend.makeDecodeResult();
  187. // Should fail with strict on.
  188. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  189. // Should fail if strict off too.
  190. ASSERT_FALSE(
  191. irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
  192. irsend.reset();
  193. // Use sendNEC(data, 42) to make/send an illegal value Aiwa message.
  194. // Value is illegal due to bad pre data only.
  195. irsend.sendNEC(0x0D8113F00FF, 42, kAiwaRcT501MinRepeats);
  196. irsend.makeDecodeResult();
  197. // Should fail with strict on.
  198. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  199. // Should fail if strict off too.
  200. ASSERT_FALSE(
  201. irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
  202. }
  203. // Decode unsupported Aiwa messages.
  204. TEST(TestDecodeAiwa, DecodeWithNonStrictSizes) {
  205. IRsendTest irsend(4);
  206. IRrecv irrecv(4);
  207. irsend.begin();
  208. irsend.reset();
  209. irsend.sendAiwaRCT501(0x0, 8); // Illegal size Aiwa 8-bit message.
  210. irsend.makeDecodeResult();
  211. // Should fail with strict on.
  212. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  213. // Should pass if strict off.
  214. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 8, false));
  215. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  216. EXPECT_EQ(8, irsend.capture.bits);
  217. EXPECT_EQ(0x0, irsend.capture.value);
  218. irsend.reset();
  219. irsend.sendAiwaRCT501(0x12345678, 32); // Illegal size Aiwa 32-bit message.
  220. irsend.makeDecodeResult();
  221. // Should fail with strict on.
  222. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, true));
  223. // Should fail with strict when we ask for the wrong bit size.
  224. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture, 32, true));
  225. // Should pass if strict off.
  226. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 32, false));
  227. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  228. EXPECT_EQ(32, irsend.capture.bits);
  229. EXPECT_EQ(0x12345678, irsend.capture.value);
  230. }
  231. // Decode (non-standard) 64-bit messages.
  232. TEST(TestDecodeAiwa, Decode64BitMessages) {
  233. IRsendTest irsend(4);
  234. IRrecv irrecv(4);
  235. irsend.begin();
  236. irsend.reset();
  237. // Illegal value & size Aiwa 37(64)-bit message.
  238. irsend.sendAiwaRCT501(0x1FFFFFFFFF, 37);
  239. irsend.makeDecodeResult();
  240. // Should work with a 'normal' match (not strict)
  241. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 37, false));
  242. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  243. EXPECT_EQ(37, irsend.capture.bits);
  244. EXPECT_EQ(0x1FFFFFFFFF, irsend.capture.value);
  245. // Reconfirm it by sending a true 64bit NEC message with the Aiwa prefix.
  246. irsend.reset();
  247. irsend.sendNEC(0x76044FFFFFFFFFFF, 64, kAiwaRcT501MinRepeats);
  248. irsend.makeDecodeResult();
  249. // Should work with a 'normal' match (not strict)
  250. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture, 37, false));
  251. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  252. EXPECT_EQ(37, irsend.capture.bits);
  253. EXPECT_EQ(0x1FFFFFFFFF, irsend.capture.value);
  254. }
  255. // Decode a 'real' example via GlobalCache
  256. TEST(TestDecodeAiwa, DecodeGlobalCacheExample) {
  257. IRsendTest irsend(4);
  258. IRrecv irrecv(4);
  259. irsend.begin();
  260. irsend.reset();
  261. // Aiwa Power Toggle from Global Cache.
  262. uint16_t gc_test[95] = {
  263. 38000, 1, 89, 342, 171, 21, 21, 21, 64, 21, 64, 21, 64, 21, 21, 21,
  264. 64, 21, 64, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
  265. 64, 21, 21, 21, 21, 21, 21, 21, 64, 21, 21, 21, 21, 21, 64, 21,
  266. 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 21, 21, 21, 21, 21, 21,
  267. 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 64, 21, 64, 21, 64, 21,
  268. 64, 21, 64, 21, 64, 21, 64, 21, 64, 21, 875, 342, 171, 21, 3565};
  269. irsend.sendGC(gc_test, 95);
  270. irsend.makeDecodeResult();
  271. ASSERT_TRUE(irrecv.decodeAiwaRCT501(&irsend.capture));
  272. EXPECT_EQ(AIWA_RC_T501, irsend.capture.decode_type);
  273. EXPECT_EQ(kAiwaRcT501Bits, irsend.capture.bits);
  274. EXPECT_EQ(0x7F, irsend.capture.value);
  275. EXPECT_EQ(0x0, irsend.capture.address);
  276. EXPECT_EQ(0x0, irsend.capture.command);
  277. EXPECT_FALSE(irsend.capture.repeat);
  278. // Confirm what the 42-bit NEC decode is.
  279. ASSERT_TRUE(irrecv.decodeNEC(&irsend.capture, 42, false));
  280. EXPECT_EQ(0x1D8113F00FF, irsend.capture.value);
  281. }
  282. // Fail to decode a non-Aiwa example via GlobalCache
  283. TEST(TestDecodeAiwa, FailToDecodeNonAiwaExample) {
  284. IRsendTest irsend(4);
  285. IRrecv irrecv(4);
  286. irsend.begin();
  287. irsend.reset();
  288. uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
  289. 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
  290. 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
  291. 61, 20, 20, 20, 20, 20, 20, 20, 884};
  292. irsend.sendGC(gc_test, 39);
  293. irsend.makeDecodeResult();
  294. ASSERT_FALSE(irrecv.decodeAiwaRCT501(&irsend.capture));
  295. ASSERT_FALSE(
  296. irrecv.decodeAiwaRCT501(&irsend.capture, kAiwaRcT501Bits, false));
  297. }