ir_Sharp_test.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. // Copyright 2017 David Conran
  2. #include "IRsend.h"
  3. #include "IRsend_test.h"
  4. #include "gtest/gtest.h"
  5. // Tests for encodeSharp().
  6. TEST(TestEncodeSharp, NormalEncoding) {
  7. IRsendTest irsend(4);
  8. EXPECT_EQ(0x2, irsend.encodeSharp(0, 0));
  9. EXPECT_EQ(0x4202, irsend.encodeSharp(1, 1));
  10. EXPECT_EQ(0x4102, irsend.encodeSharp(1, 2));
  11. EXPECT_EQ(0x62E2, irsend.encodeSharp(0x43, 0x1D));
  12. EXPECT_EQ(0x2AAA, irsend.encodeSharp(0xAA, 0x55));
  13. EXPECT_EQ(0x7FFE, irsend.encodeSharp(0x1F, 0xFF));
  14. EXPECT_EQ(0x454A, irsend.encodeSharp(0x11, 0x4A));
  15. }
  16. TEST(TestEncodeSharp, AdvancedEncoding) {
  17. IRsendTest irsend(4);
  18. EXPECT_EQ(0x0, irsend.encodeSharp(0, 0, 0, 0));
  19. EXPECT_EQ(0x1, irsend.encodeSharp(0, 0, 0, 1));
  20. EXPECT_EQ(0x2, irsend.encodeSharp(0, 0, 1, 0));
  21. EXPECT_EQ(0x3, irsend.encodeSharp(0, 0, 1, 1));
  22. EXPECT_EQ(0x4200, irsend.encodeSharp(1, 1, 0, 0));
  23. EXPECT_EQ(0x4203, irsend.encodeSharp(1, 1, 1, 1));
  24. EXPECT_EQ(0x4200, irsend.encodeSharp(1, 1, 0, 0, false));
  25. EXPECT_EQ(0x4201, irsend.encodeSharp(1, 1, 0, 1, false));
  26. EXPECT_EQ(0x4203, irsend.encodeSharp(1, 1, 1, 1, false));
  27. EXPECT_EQ(0x0404, irsend.encodeSharp(1, 1, 0, 0, true));
  28. EXPECT_EQ(0x0405, irsend.encodeSharp(1, 1, 0, 1, true));
  29. EXPECT_EQ(0x0407, irsend.encodeSharp(1, 1, 1, 1, true));
  30. EXPECT_EQ(0x454A, irsend.encodeSharp(0x11, 0x52, 1, 0, true));
  31. }
  32. // Tests for sendSharp().
  33. // Test sending typical data only.
  34. TEST(TestSendSharp, SendDataOnly) {
  35. IRsendTest irsend(4);
  36. irsend.begin();
  37. irsend.reset();
  38. irsend.sendSharp(0x11, 0x52);
  39. EXPECT_EQ(
  40. "m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
  41. "m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
  42. "m260s43602"
  43. "m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
  44. "m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
  45. "m260s43602",
  46. irsend.outputStr());
  47. }
  48. // Test sending with different repeats.
  49. TEST(TestSendSharp, SendWithRepeats) {
  50. IRsendTest irsend(4);
  51. irsend.begin();
  52. irsend.reset();
  53. irsend.sendSharp(0x11, 0x52, kSharpBits, 1); // 1 repeat.
  54. EXPECT_EQ(
  55. "m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
  56. "m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
  57. "m260s43602"
  58. "m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
  59. "m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
  60. "m260s43602"
  61. "m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
  62. "m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
  63. "m260s43602"
  64. "m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
  65. "m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
  66. "m260s43602",
  67. irsend.outputStr());
  68. }
  69. // Test sending an atypical data size.
  70. TEST(TestSendSharp, SendUnusualSize) {
  71. IRsendTest irsend(4);
  72. irsend.begin();
  73. irsend.reset();
  74. irsend.sendSharp(0x0, 0x0, 8);
  75. EXPECT_EQ(
  76. "m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s780"
  77. "m260s43602"
  78. "m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
  79. "m260s43602",
  80. irsend.outputStr());
  81. irsend.reset();
  82. irsend.sendSharp(0x0, 0x0, 16);
  83. EXPECT_EQ(
  84. "m260s780m260s780m260s780m260s780m260s780m260s780m260s780m260s780"
  85. "m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s780"
  86. "m260s43602"
  87. "m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s1820"
  88. "m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
  89. "m260s43602",
  90. irsend.outputStr());
  91. }
  92. // Tests for sendSharpRaw().
  93. // Test sending typical data only.
  94. TEST(TestSendSharpRaw, SendDataOnly) {
  95. IRsendTest irsend(4);
  96. irsend.begin();
  97. irsend.reset();
  98. irsend.sendSharpRaw(0x454A);
  99. EXPECT_EQ(
  100. "m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
  101. "m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
  102. "m260s43602"
  103. "m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
  104. "m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
  105. "m260s43602",
  106. irsend.outputStr());
  107. }
  108. // Test sending with different repeats.
  109. TEST(TestSendSharpRaw, SendWithRepeats) {
  110. IRsendTest irsend(4);
  111. irsend.begin();
  112. irsend.reset();
  113. irsend.sendSharpRaw(0x454A, kSharpBits, 1); // 1 repeat.
  114. EXPECT_EQ(
  115. "m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
  116. "m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
  117. "m260s43602"
  118. "m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
  119. "m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
  120. "m260s43602"
  121. "m260s1820m260s780m260s780m260s780m260s1820m260s780m260s1820m260s780"
  122. "m260s1820m260s780m260s780m260s1820m260s780m260s1820m260s780"
  123. "m260s43602"
  124. "m260s1820m260s780m260s780m260s780m260s1820m260s1820m260s780m260s1820"
  125. "m260s780m260s1820m260s1820m260s780m260s1820m260s780m260s1820"
  126. "m260s43602",
  127. irsend.outputStr());
  128. }
  129. // Test sending an atypical data size.
  130. TEST(TestSendSharpRaw, SendUnusualSize) {
  131. IRsendTest irsend(4);
  132. irsend.begin();
  133. irsend.reset();
  134. irsend.sendSharpRaw(0x2, 8);
  135. EXPECT_EQ(
  136. "m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s780"
  137. "m260s43602"
  138. "m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
  139. "m260s43602",
  140. irsend.outputStr());
  141. irsend.reset();
  142. irsend.sendSharpRaw(0x2, 16);
  143. EXPECT_EQ(
  144. "m260s780m260s780m260s780m260s780m260s780m260s780m260s780m260s780"
  145. "m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s780"
  146. "m260s43602"
  147. "m260s780m260s780m260s780m260s780m260s780m260s780m260s1820m260s1820"
  148. "m260s1820m260s1820m260s1820m260s1820m260s1820m260s1820m260s780m260s1820"
  149. "m260s43602",
  150. irsend.outputStr());
  151. }
  152. // Tests for decodeSharp().
  153. // Decode normal Sharp messages.
  154. TEST(TestDecodeSharp, NormalDecodeWithStrict) {
  155. IRsendTest irsend(4);
  156. IRrecv irrecv(4);
  157. irsend.begin();
  158. // Normal Sharp 15-bit message.
  159. irsend.reset();
  160. irsend.sendSharpRaw(0x454A);
  161. irsend.makeDecodeResult();
  162. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  163. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  164. EXPECT_EQ(kSharpBits, irsend.capture.bits);
  165. EXPECT_EQ(0x454A, irsend.capture.value);
  166. EXPECT_EQ(0x11, irsend.capture.address);
  167. EXPECT_EQ(0x4A, irsend.capture.command);
  168. EXPECT_FALSE(irsend.capture.repeat);
  169. // Synthesised Normal Sharp 15-bit message.
  170. irsend.reset();
  171. irsend.sendSharpRaw(irsend.encodeSharp(0x07, 0x99));
  172. irsend.makeDecodeResult();
  173. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  174. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  175. EXPECT_EQ(kSharpBits, irsend.capture.bits);
  176. EXPECT_EQ(0x7266, irsend.capture.value);
  177. EXPECT_EQ(0x07, irsend.capture.address);
  178. EXPECT_EQ(0x99, irsend.capture.command);
  179. EXPECT_FALSE(irsend.capture.repeat);
  180. // Synthesised Normal Sharp 15-bit message.
  181. irsend.reset();
  182. irsend.sendSharpRaw(irsend.encodeSharp(0x1, 0x1));
  183. irsend.makeDecodeResult();
  184. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  185. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  186. EXPECT_EQ(kSharpBits, irsend.capture.bits);
  187. EXPECT_EQ(0x4202, irsend.capture.value);
  188. EXPECT_EQ(0x1, irsend.capture.address);
  189. EXPECT_EQ(0x1, irsend.capture.command);
  190. EXPECT_FALSE(irsend.capture.repeat);
  191. }
  192. // Decode normal repeated Sharp messages.
  193. TEST(TestDecodeSharp, NormalDecodeWithRepeatAndStrict) {
  194. IRsendTest irsend(4);
  195. IRrecv irrecv(4);
  196. irsend.begin();
  197. // Normal Sharp 15-bit message with 1 repeat.
  198. irsend.reset();
  199. irsend.sendSharpRaw(0x7266, kSharpBits, 1);
  200. irsend.makeDecodeResult();
  201. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  202. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  203. EXPECT_EQ(kSharpBits, irsend.capture.bits);
  204. EXPECT_EQ(0x7266, irsend.capture.value);
  205. EXPECT_EQ(0x07, irsend.capture.address);
  206. EXPECT_EQ(0x99, irsend.capture.command);
  207. irsend.makeDecodeResult(2 * (2 * kSharpBits + kFooter));
  208. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  209. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  210. EXPECT_EQ(kSharpBits, irsend.capture.bits);
  211. EXPECT_EQ(0x7266, irsend.capture.value);
  212. }
  213. // Decode unsupported Sharp messages.
  214. TEST(TestDecodeSharp, DecodeWithNonStrict) {
  215. IRsendTest irsend(4);
  216. IRrecv irrecv(4);
  217. irsend.begin();
  218. irsend.reset();
  219. irsend.sendSharpRaw(0x0, 8); // Illegal length Sharp 8-bit message.
  220. irsend.makeDecodeResult();
  221. // Should fail with strict on.
  222. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  223. // Should pass if strict off.
  224. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 8, false));
  225. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  226. EXPECT_EQ(8, irsend.capture.bits);
  227. EXPECT_EQ(0x0, irsend.capture.value);
  228. EXPECT_EQ(0x0, irsend.capture.address);
  229. EXPECT_EQ(0x0, irsend.capture.command);
  230. irsend.reset();
  231. irsend.sendSharpRaw(0x12345678, 32); // Illegal length Sharp 32-bit message.
  232. irsend.makeDecodeResult();
  233. // Should fail with strict on.
  234. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, true));
  235. // Should fail with strict when we ask for the wrong bit size.
  236. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, 32, true));
  237. // Should pass if strict off.
  238. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 32, false));
  239. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  240. EXPECT_EQ(32, irsend.capture.bits);
  241. EXPECT_EQ(0x12345678, irsend.capture.value);
  242. EXPECT_EQ(0x8, irsend.capture.address);
  243. EXPECT_EQ(0x79, irsend.capture.command);
  244. }
  245. // Decode (non-standard) 64-bit messages.
  246. TEST(TestDecodeSharp, Decode64BitMessages) {
  247. IRsendTest irsend(4);
  248. IRrecv irrecv(4);
  249. irsend.begin();
  250. irsend.reset();
  251. // Illegal value & size Sharp 64-bit message.
  252. irsend.sendSharpRaw(0xFFFFFFFFFFFFFFFF, 64);
  253. irsend.makeDecodeResult();
  254. // Should work with a 'normal' match (not strict)
  255. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture, 64, false));
  256. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  257. EXPECT_EQ(64, irsend.capture.bits);
  258. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  259. EXPECT_EQ(0x1F, irsend.capture.address);
  260. EXPECT_EQ(0xFF, irsend.capture.command);
  261. }
  262. // Decode a 'real' example via GlobalCache
  263. TEST(TestDecodeSharp, DecodeGlobalCacheExample) {
  264. IRsendTest irsend(4);
  265. IRrecv irrecv(4);
  266. irsend.begin();
  267. irsend.reset();
  268. // Sharp Power On from Global Cache.
  269. uint16_t gc_test[67] = {
  270. 38000, 1, 1, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70,
  271. 10, 30, 10, 70, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70, 10, 30, 10,
  272. 1657, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70, 10, 30, 10, 70,
  273. 10, 30, 10, 70, 10, 70, 10, 30, 10, 70, 10, 30, 10, 70, 10, 1657};
  274. irsend.sendGC(gc_test, 67);
  275. irsend.makeDecodeResult();
  276. ASSERT_TRUE(irrecv.decodeSharp(&irsend.capture));
  277. EXPECT_EQ(SHARP, irsend.capture.decode_type);
  278. EXPECT_EQ(kSharpBits, irsend.capture.bits);
  279. EXPECT_EQ(0x454A, irsend.capture.value);
  280. EXPECT_EQ(0x11, irsend.capture.address);
  281. EXPECT_EQ(0x4A, irsend.capture.command);
  282. EXPECT_FALSE(irsend.capture.repeat);
  283. }
  284. // Fail to decode a non-Sharp example via GlobalCache
  285. TEST(TestDecodeSharp, FailToDecodeNonSharpExample) {
  286. IRsendTest irsend(4);
  287. IRrecv irrecv(4);
  288. irsend.begin();
  289. irsend.reset();
  290. // Modified a few entries to unexpected values, based on previous test case.
  291. uint16_t gc_test[67] = {
  292. 38000, 1, 1, 10, 70, 30, 30, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70,
  293. 10, 30, 10, 70, 10, 30, 10, 30, 10, 70, 10, 30, 10, 70, 10, 30, 10,
  294. 1657, 10, 70, 10, 30, 10, 30, 10, 30, 10, 70, 10, 70, 10, 30, 10, 60,
  295. 10, 30, 10, 70, 10, 70, 10, 30, 10, 10, 70, 30, 10, 70, 10, 1657};
  296. irsend.sendGC(gc_test, 67);
  297. irsend.makeDecodeResult();
  298. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture));
  299. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, false));
  300. // Test only half of a good message, as it is sent (sort of) twice.
  301. uint16_t gc_half[35] = {38000, 1, 1, 10, 70, 10, 30, 10, 30, 10, 30, 10,
  302. 70, 10, 30, 10, 70, 10, 30, 10, 70, 10, 30, 10,
  303. 30, 10, 70, 10, 30, 10, 70, 10, 30, 10, 1657};
  304. irsend.sendGC(gc_half, 35);
  305. irsend.makeDecodeResult();
  306. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture));
  307. ASSERT_FALSE(irrecv.decodeSharp(&irsend.capture, kSharpBits, false));
  308. }