ir_Dish_test.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. // Copyright 2017 David Conran
  2. #include "IRsend.h"
  3. #include "IRsend_test.h"
  4. #include "gtest/gtest.h"
  5. // Tests for sendDISH().
  6. // Test sending typical data only.
  7. TEST(TestSendDish, SendDataOnly) {
  8. IRsendTest irsend(4);
  9. irsend.begin();
  10. irsend.reset();
  11. irsend.sendDISH(0x0);
  12. EXPECT_EQ(
  13. "m400s6100"
  14. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  15. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  16. "m400s6100"
  17. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  18. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  19. "m400s6100"
  20. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  21. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  22. "m400s6100"
  23. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  24. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  25. "m400s6100",
  26. irsend.outputStr());
  27. irsend.reset();
  28. irsend.sendDISH(0x9C00); // Power on.
  29. EXPECT_EQ(
  30. "m400s6100"
  31. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  32. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  33. "m400s6100"
  34. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  35. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  36. "m400s6100"
  37. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  38. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  39. "m400s6100"
  40. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  41. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  42. "m400s6100",
  43. irsend.outputStr());
  44. irsend.reset();
  45. irsend.sendDISH(0xFFFF);
  46. EXPECT_EQ(
  47. "m400s6100"
  48. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  49. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  50. "m400s6100"
  51. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  52. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  53. "m400s6100"
  54. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  55. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  56. "m400s6100"
  57. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  58. "m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700m400s1700"
  59. "m400s6100",
  60. irsend.outputStr());
  61. }
  62. // Test sending with different repeats.
  63. TEST(TestSendDish, SendWithRepeats) {
  64. IRsendTest irsend(4);
  65. irsend.begin();
  66. irsend.reset();
  67. irsend.sendDISH(0x9C00, kDishBits, 0); // 0 repeats.
  68. EXPECT_EQ(
  69. "m400s6100"
  70. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  71. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  72. "m400s6100",
  73. irsend.outputStr());
  74. irsend.reset();
  75. irsend.sendDISH(0x9C00, kDishBits, 1); // 1 repeat.
  76. EXPECT_EQ(
  77. "m400s6100"
  78. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  79. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  80. "m400s6100"
  81. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  82. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  83. "m400s6100",
  84. irsend.outputStr());
  85. irsend.sendDISH(0x9C00, kDishBits, 2); // 2 repeats.
  86. EXPECT_EQ(
  87. "m400s6100"
  88. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  89. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  90. "m400s6100"
  91. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  92. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  93. "m400s6100"
  94. "m400s1700m400s2800m400s2800m400s1700m400s1700m400s1700m400s2800m400s2800"
  95. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  96. "m400s6100",
  97. irsend.outputStr());
  98. }
  99. // Test sending an atypical data size.
  100. TEST(TestSendDish, SendUnusualSize) {
  101. IRsendTest irsend(4);
  102. irsend.begin();
  103. irsend.reset();
  104. irsend.sendDISH(0x0, 8);
  105. EXPECT_EQ(
  106. "m400s6100"
  107. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  108. "m400s6100"
  109. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  110. "m400s6100"
  111. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  112. "m400s6100"
  113. "m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800m400s2800"
  114. "m400s6100",
  115. irsend.outputStr());
  116. irsend.reset();
  117. irsend.sendDISH(0x1234567890ABCDEF, 64);
  118. EXPECT_EQ(
  119. "m400s6100"
  120. "m400s2800m400s2800m400s2800m400s1700m400s2800m400s2800m400s1700m400s2800"
  121. "m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700m400s2800m400s2800"
  122. "m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700m400s2800"
  123. "m400s2800m400s1700m400s1700m400s1700m400s1700m400s2800m400s2800m400s2800"
  124. "m400s1700m400s2800m400s2800m400s1700m400s2800m400s2800m400s2800m400s2800"
  125. "m400s1700m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700"
  126. "m400s1700m400s1700m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700"
  127. "m400s1700m400s1700m400s1700m400s2800m400s1700m400s1700m400s1700m400s1700"
  128. "m400s6100"
  129. "m400s2800m400s2800m400s2800m400s1700m400s2800m400s2800m400s1700m400s2800"
  130. "m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700m400s2800m400s2800"
  131. "m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700m400s2800"
  132. "m400s2800m400s1700m400s1700m400s1700m400s1700m400s2800m400s2800m400s2800"
  133. "m400s1700m400s2800m400s2800m400s1700m400s2800m400s2800m400s2800m400s2800"
  134. "m400s1700m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700"
  135. "m400s1700m400s1700m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700"
  136. "m400s1700m400s1700m400s1700m400s2800m400s1700m400s1700m400s1700m400s1700"
  137. "m400s6100"
  138. "m400s2800m400s2800m400s2800m400s1700m400s2800m400s2800m400s1700m400s2800"
  139. "m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700m400s2800m400s2800"
  140. "m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700m400s2800"
  141. "m400s2800m400s1700m400s1700m400s1700m400s1700m400s2800m400s2800m400s2800"
  142. "m400s1700m400s2800m400s2800m400s1700m400s2800m400s2800m400s2800m400s2800"
  143. "m400s1700m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700"
  144. "m400s1700m400s1700m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700"
  145. "m400s1700m400s1700m400s1700m400s2800m400s1700m400s1700m400s1700m400s1700"
  146. "m400s6100"
  147. "m400s2800m400s2800m400s2800m400s1700m400s2800m400s2800m400s1700m400s2800"
  148. "m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700m400s2800m400s2800"
  149. "m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700m400s2800"
  150. "m400s2800m400s1700m400s1700m400s1700m400s1700m400s2800m400s2800m400s2800"
  151. "m400s1700m400s2800m400s2800m400s1700m400s2800m400s2800m400s2800m400s2800"
  152. "m400s1700m400s2800m400s1700m400s2800m400s1700m400s2800m400s1700m400s1700"
  153. "m400s1700m400s1700m400s2800m400s2800m400s1700m400s1700m400s2800m400s1700"
  154. "m400s1700m400s1700m400s1700m400s2800m400s1700m400s1700m400s1700m400s1700"
  155. "m400s6100",
  156. irsend.outputStr());
  157. }
  158. // Tests for decodeDISH().
  159. // Decode normal Dish messages.
  160. TEST(TestDecodeDish, NormalDecodeWithStrict) {
  161. IRsendTest irsend(4);
  162. IRrecv irrecv(4);
  163. irsend.begin();
  164. // Normal Dish 16-bit message.
  165. irsend.reset();
  166. irsend.sendDISH(0x9C00);
  167. irsend.makeDecodeResult();
  168. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
  169. EXPECT_EQ(DISH, irsend.capture.decode_type);
  170. EXPECT_EQ(kDishBits, irsend.capture.bits);
  171. EXPECT_EQ(0x9C00, irsend.capture.value);
  172. EXPECT_EQ(0x0, irsend.capture.address);
  173. EXPECT_EQ(0x0, irsend.capture.command);
  174. EXPECT_FALSE(irsend.capture.repeat);
  175. }
  176. // Decode Dish messages with unsupported size/lengths.
  177. TEST(TestDecodeDish, DecodeWithNonStrictSize) {
  178. IRsendTest irsend(4);
  179. IRrecv irrecv(4);
  180. irsend.begin();
  181. irsend.reset();
  182. irsend.sendDISH(0x12, 8); // Illegal size Dish message. (smaller)
  183. irsend.makeDecodeResult();
  184. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
  185. irsend.makeDecodeResult();
  186. // Should fail with strict when we ask for the wrong bit size.
  187. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, 8, true));
  188. // Should pass if strict off.
  189. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, 8, false));
  190. EXPECT_EQ(DISH, irsend.capture.decode_type);
  191. EXPECT_EQ(8, irsend.capture.bits);
  192. EXPECT_EQ(0x12, irsend.capture.value);
  193. EXPECT_EQ(0x0, irsend.capture.address);
  194. EXPECT_EQ(0x0, irsend.capture.command);
  195. irsend.reset();
  196. irsend.sendDISH(0x12345678, 32); // Illegal size Dish message. (larger)
  197. irsend.makeDecodeResult();
  198. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
  199. irsend.makeDecodeResult();
  200. // Should fail with strict when we ask for the wrong bit size.
  201. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, 32, true));
  202. // Should pass if strict off.
  203. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, 32, false));
  204. EXPECT_EQ(DISH, irsend.capture.decode_type);
  205. EXPECT_EQ(32, irsend.capture.bits);
  206. EXPECT_EQ(0x12345678, irsend.capture.value);
  207. EXPECT_EQ(0x0, irsend.capture.address);
  208. EXPECT_EQ(0x0, irsend.capture.command);
  209. }
  210. // Decode (non-standard) 64-bit messages.
  211. TEST(TestDecodeDish, Decode64BitMessages) {
  212. IRsendTest irsend(4);
  213. IRrecv irrecv(4);
  214. irsend.begin();
  215. irsend.reset();
  216. // Illegal value & size Dish 64-bit message.
  217. irsend.sendDISH(0xFFFFFFFFFFFFFFFF, 64);
  218. irsend.makeDecodeResult();
  219. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, 64, true));
  220. // Should work with a 'normal' match (not strict)
  221. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, 64, false));
  222. EXPECT_EQ(DISH, irsend.capture.decode_type);
  223. EXPECT_EQ(64, irsend.capture.bits);
  224. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  225. }
  226. // Decode a 'real' example via GlobalCache
  227. TEST(TestDecodeDish, DecodeGlobalCacheExample) {
  228. IRsendTest irsend(4);
  229. IRrecv irrecv(4);
  230. irsend.begin();
  231. /*
  232. irsend.reset();
  233. // Dish DTV Pal code from Global Cache.
  234. uint16_t gc_test_dtv[27] = {58000, 1, 3, 22, 538, 22, 252, 22, 156, 22, 156,
  235. 22, 156, 22, 156, 22, 252, 22, 252, 22, 252, 22,
  236. 252, 22, 252, 22, 538};
  237. irsend.sendGC(gc_test_dtv, 27);
  238. irsend.makeDecodeResult();
  239. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
  240. EXPECT_EQ(DISH, irsend.capture.decode_type);
  241. EXPECT_EQ(kDishBits, irsend.capture.bits);
  242. EXPECT_EQ(0x0, irsend.capture.value);
  243. EXPECT_EQ(0x0, irsend.capture.address);
  244. EXPECT_EQ(0x0, irsend.capture.command);
  245. EXPECT_FALSE(irsend.capture.repeat);
  246. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture));
  247. EXPECT_EQ(DISH, irsend.capture.decode_type);
  248. EXPECT_EQ(kDishBits, irsend.capture.bits);
  249. EXPECT_EQ(0x0, irsend.capture.value);
  250. EXPECT_EQ(0x0, irsend.capture.address);
  251. EXPECT_EQ(0x0, irsend.capture.command);
  252. EXPECT_FALSE(irsend.capture.repeat);
  253. */
  254. // Dish Hopper 3 code from Global Cache.
  255. uint16_t gc_test_hopper[73] = {
  256. 58000, 1, 37, 23, 351, 23, 94, 23, 164, 23, 164, 23, 94, 23, 94, 23,
  257. 94, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23,
  258. 164, 23, 164, 23, 164, 23, 351, 23, 94, 23, 164, 23, 164, 23, 94, 23,
  259. 94, 23, 94, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23, 164, 23,
  260. 164, 23, 164, 23, 164, 23, 164, 23, 351};
  261. irsend.reset();
  262. irsend.sendGC(gc_test_hopper, 73);
  263. irsend.makeDecodeResult();
  264. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture, kDishBits, true));
  265. EXPECT_EQ(DISH, irsend.capture.decode_type);
  266. EXPECT_EQ(kDishBits, irsend.capture.bits);
  267. EXPECT_EQ(0x9C00, irsend.capture.value);
  268. EXPECT_EQ(0x0, irsend.capture.address);
  269. EXPECT_EQ(0x0, irsend.capture.command);
  270. EXPECT_FALSE(irsend.capture.repeat);
  271. ASSERT_TRUE(irrecv.decodeDISH(&irsend.capture));
  272. EXPECT_EQ(DISH, irsend.capture.decode_type);
  273. EXPECT_EQ(kDishBits, irsend.capture.bits);
  274. EXPECT_EQ(0x9C00, irsend.capture.value);
  275. EXPECT_EQ(0x0, irsend.capture.address);
  276. EXPECT_EQ(0x0, irsend.capture.command);
  277. EXPECT_FALSE(irsend.capture.repeat);
  278. }
  279. // Fail to decode a non-Dish example via GlobalCache
  280. TEST(TestDecodeDish, FailToDecodeNonDishExample) {
  281. IRsendTest irsend(4);
  282. IRrecv irrecv(4);
  283. irsend.begin();
  284. irsend.reset();
  285. // Modified a few entries to unexpected values, based on previous test case.
  286. uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
  287. 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
  288. 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
  289. 61, 20, 20, 20, 20, 20, 20, 20, 884};
  290. irsend.sendGC(gc_test, 39);
  291. irsend.makeDecodeResult();
  292. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture));
  293. ASSERT_FALSE(irrecv.decodeDISH(&irsend.capture, kDishBits, false));
  294. }