IRutils_test.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. // Copyright 2017 David Conran
  2. #include "IRutils.h"
  3. #include <stdint.h>
  4. #include "IRrecv.h"
  5. #include "IRsend.h"
  6. #include "IRsend_test.h"
  7. #include "gtest/gtest.h"
  8. // Tests reverseBits().
  9. // Tests reverseBits for typical use.
  10. TEST(ReverseBitsTest, TypicalUse) {
  11. EXPECT_EQ(0xF, reverseBits(0xF0, 8));
  12. EXPECT_EQ(0xFFFF, reverseBits(0xFFFF0000, 32));
  13. EXPECT_EQ(0x555500005555FFFF, reverseBits(0xFFFFAAAA0000AAAA, 64));
  14. EXPECT_EQ(0, reverseBits(0, 64));
  15. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, reverseBits(0xFFFFFFFFFFFFFFFF, 64));
  16. }
  17. // Tests reverseBits for bit size values <= 1
  18. TEST(ReverseBitsTest, LessThanTwoBitsReversed) {
  19. EXPECT_EQ(0x12345678, reverseBits(0x12345678, 1));
  20. EXPECT_EQ(1234, reverseBits(1234, 0));
  21. }
  22. // Tests reverseBits for bit size larger than a uint64_t.
  23. TEST(ReverseBitsTest, LargerThan64BitsReversed) {
  24. EXPECT_EQ(0, reverseBits(0, 65));
  25. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, reverseBits(0xFFFFFFFFFFFFFFFF, 100));
  26. EXPECT_EQ(0x555500005555FFFF, reverseBits(0xFFFFAAAA0000AAAA, 3000));
  27. }
  28. // Tests reverseBits for bit sizes less than all the data stored.
  29. TEST(ReverseBitsTest, LessBitsReversedThanInputHasSet) {
  30. EXPECT_EQ(0xF8, reverseBits(0xF1, 4));
  31. EXPECT_EQ(0xF5, reverseBits(0xFA, 4));
  32. EXPECT_EQ(0x12345678FFFF0000, reverseBits(0x123456780000FFFF, 32));
  33. }
  34. // Tests for uint64ToString()
  35. TEST(TestUint64ToString, TrivialCases) {
  36. EXPECT_EQ("0", uint64ToString(0)); // Default base (10)
  37. EXPECT_EQ("0", uint64ToString(0, 2)); // Base-2
  38. EXPECT_EQ("0", uint64ToString(0, 8)); // Base-8
  39. EXPECT_EQ("0", uint64ToString(0, 10)); // Base-10
  40. EXPECT_EQ("0", uint64ToString(0, 16)); // Base-16
  41. EXPECT_EQ("1", uint64ToString(1, 2)); // Base-2
  42. EXPECT_EQ("2", uint64ToString(2, 8)); // Base-8
  43. EXPECT_EQ("3", uint64ToString(3, 10)); // Base-10
  44. EXPECT_EQ("4", uint64ToString(4, 16)); // Base-16
  45. }
  46. TEST(TestUint64ToString, NormalUse) {
  47. EXPECT_EQ("12345", uint64ToString(12345));
  48. EXPECT_EQ("100", uint64ToString(4, 2));
  49. EXPECT_EQ("3039", uint64ToString(12345, 16));
  50. EXPECT_EQ("123456", uint64ToString(123456));
  51. EXPECT_EQ("1E240", uint64ToString(123456, 16));
  52. EXPECT_EQ("FEEDDEADBEEF", uint64ToString(0xfeeddeadbeef, 16));
  53. }
  54. TEST(TestUint64ToString, Max64Bit) {
  55. EXPECT_EQ("18446744073709551615", uint64ToString(UINT64_MAX)); // Default
  56. EXPECT_EQ("1111111111111111111111111111111111111111111111111111111111111111",
  57. uint64ToString(UINT64_MAX, 2)); // Base-2
  58. EXPECT_EQ("1777777777777777777777", uint64ToString(UINT64_MAX, 8)); // Base-8
  59. EXPECT_EQ("18446744073709551615", uint64ToString(UINT64_MAX, 10)); // Base-10
  60. EXPECT_EQ("FFFFFFFFFFFFFFFF", uint64ToString(UINT64_MAX, 16)); // Base-16
  61. }
  62. TEST(TestUint64ToString, Max32Bit) {
  63. EXPECT_EQ("4294967295", uint64ToString(UINT32_MAX)); // Default
  64. EXPECT_EQ("37777777777", uint64ToString(UINT32_MAX, 8)); // Base-8
  65. EXPECT_EQ("4294967295", uint64ToString(UINT32_MAX, 10)); // Base-10
  66. EXPECT_EQ("FFFFFFFF", uint64ToString(UINT32_MAX, 16)); // Base-16
  67. }
  68. TEST(TestUint64ToString, InterestingCases) {
  69. // Previous hacky-code didn't handle leading zeros in the lower 32 bits.
  70. EXPECT_EQ("100000000", uint64ToString(0x100000000, 16));
  71. EXPECT_EQ("100000001", uint64ToString(0x100000001, 16));
  72. }
  73. TEST(TestUint64ToString, SillyBases) {
  74. // If we are given a silly base, we should defer to Base-10.
  75. EXPECT_EQ("12345", uint64ToString(12345, 0)); // Super silly, makes no sense.
  76. EXPECT_EQ("12345", uint64ToString(12345, 1)); // We don't do unary.
  77. EXPECT_EQ("12345", uint64ToString(12345, 100)); // We can't print base-100.
  78. EXPECT_EQ("12345", uint64ToString(12345, 37)); // Base-37 is one to far.
  79. EXPECT_EQ("9IX", uint64ToString(12345, 36)); // But we *can* do base-36.
  80. }
  81. TEST(TestGetCorrectedRawLength, NoLargeValues) {
  82. IRsendTest irsend(0);
  83. IRrecv irrecv(1);
  84. uint16_t test_data[7] = {1, 2, 3, 4, 5, 6, 7};
  85. irsend.begin();
  86. irsend.reset();
  87. irsend.sendRaw(test_data, 7, 38000);
  88. irsend.makeDecodeResult();
  89. irrecv.decode(&irsend.capture);
  90. EXPECT_EQ(7, getCorrectedRawLength(&irsend.capture));
  91. }
  92. TEST(TestGetCorrectedRawLength, WithLargeValues) {
  93. IRsendTest irsend(0);
  94. IRrecv irrecv(1);
  95. uint16_t test_data[7] = {10, 20, 30, 40, 50, 60, 70};
  96. irsend.begin();
  97. irsend.reset();
  98. irsend.sendRaw(test_data, 7, 38000);
  99. irsend.makeDecodeResult();
  100. irrecv.decode(&irsend.capture);
  101. irsend.capture.rawbuf[3] = 60000;
  102. ASSERT_EQ(2, kRawTick); // The following values rely on kRawTick being 2.
  103. EXPECT_EQ(7 + 2, getCorrectedRawLength(&irsend.capture));
  104. irsend.capture.rawbuf[4] = UINT16_MAX - 1;
  105. EXPECT_EQ(7 + 2 * 2, getCorrectedRawLength(&irsend.capture));
  106. irsend.capture.rawbuf[4] = UINT16_MAX;
  107. EXPECT_EQ(7 + 2 * 2, getCorrectedRawLength(&irsend.capture));
  108. }
  109. TEST(TestResultToSourceCode, SimpleTests) {
  110. IRsendTest irsend(0);
  111. IRrecv irrecv(1);
  112. uint16_t test_data[7] = {10, 20, 30, 40, 50, 60, 70};
  113. irsend.begin();
  114. irsend.reset();
  115. irsend.sendRaw(test_data, 7, 38000);
  116. irsend.makeDecodeResult();
  117. irrecv.decode(&irsend.capture);
  118. EXPECT_EQ(
  119. "uint16_t rawData[7] = {10, 20, 30, 40, 50, 60, 70};"
  120. " // UNKNOWN A5E5F35D\n",
  121. resultToSourceCode(&irsend.capture));
  122. // Stick in some large values.
  123. irsend.capture.rawbuf[3] = 60000;
  124. EXPECT_EQ(
  125. "uint16_t rawData[9] = {10, 20, 65535, 0, 54465, 40,"
  126. " 50, 60, 70}; // UNKNOWN A5E5F35D\n",
  127. resultToSourceCode(&irsend.capture));
  128. irsend.capture.rawbuf[5] = UINT16_MAX;
  129. EXPECT_EQ(
  130. "uint16_t rawData[11] = {10, 20, 65535, 0, 54465, 40,"
  131. " 65535, 0, 65535, 60, 70}; // UNKNOWN A5E5F35D\n",
  132. resultToSourceCode(&irsend.capture));
  133. // Reset and put the large value in a space location.
  134. irsend.reset();
  135. irsend.sendRaw(test_data, 7, 38000);
  136. irsend.makeDecodeResult();
  137. irrecv.decode(&irsend.capture);
  138. irsend.capture.rawbuf[4] = UINT16_MAX - 1;
  139. EXPECT_EQ(
  140. "uint16_t rawData[9] = {10, 20, 30, 65535, 0, 65533,"
  141. " 50, 60, 70}; // UNKNOWN A5E5F35D\n",
  142. resultToSourceCode(&irsend.capture));
  143. }
  144. TEST(TestResultToSourceCode, SimpleProtocols) {
  145. IRsendTest irsend(0);
  146. IRrecv irrecv(1);
  147. irsend.begin();
  148. // Generate a code which has address & command values.
  149. irsend.reset();
  150. irsend.sendNEC(irsend.encodeNEC(0x10, 0x20));
  151. irsend.makeDecodeResult();
  152. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  153. ASSERT_EQ(NEC, irsend.capture.decode_type);
  154. ASSERT_EQ(kNECBits, irsend.capture.bits);
  155. EXPECT_EQ(
  156. "uint16_t rawData[68] = {8960, 4480, 560, 560, 560, 560, 560, 560, "
  157. "560, 560, 560, 1680, 560, 560, 560, 560, 560, 560, 560, 1680, "
  158. "560, 1680, 560, 1680, 560, 1680, 560, 560, 560, 1680, 560, 1680, "
  159. "560, 1680, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, "
  160. "560, 1680, 560, 560, 560, 560, 560, 1680, 560, 1680, 560, 1680, "
  161. "560, 1680, 560, 1680, 560, 560, 560, 1680, 560, 1680, 560, 40320 "
  162. "}; // NEC 8F704FB\n"
  163. "uint32_t address = 0x10;\n"
  164. "uint32_t command = 0x20;\n"
  165. "uint64_t data = 0x8F704FB;\n",
  166. resultToSourceCode(&irsend.capture));
  167. // Generate a code which DOESN'T have address & command values.
  168. irsend.reset();
  169. irsend.sendNikai(0xD0F2F);
  170. irsend.makeDecodeResult();
  171. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  172. ASSERT_EQ(NIKAI, irsend.capture.decode_type);
  173. ASSERT_EQ(kNikaiBits, irsend.capture.bits);
  174. EXPECT_EQ(
  175. "uint16_t rawData[52] = {4000, 4000, 500, 2000, 500, 2000, "
  176. "500, 2000, 500, 2000, 500, 1000, 500, 1000, 500, 2000, 500, 1000, "
  177. "500, 2000, 500, 2000, 500, 2000, 500, 2000, 500, 1000, 500, 1000, "
  178. "500, 1000, 500, 1000, 500, 2000, 500, 2000, 500, 1000, 500, 2000, "
  179. "500, 1000, 500, 1000, 500, 1000, 500, 1000, 500, 8500 };"
  180. " // NIKAI D0F2F\n"
  181. "uint64_t data = 0xD0F2F;\n",
  182. resultToSourceCode(&irsend.capture));
  183. }
  184. TEST(TestResultToSourceCode, ComplexProtocols) {
  185. IRsendTest irsend(0);
  186. IRrecv irrecv(1);
  187. irsend.begin();
  188. uint8_t state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  189. 0x00, 0x00, 0x00, 0x01};
  190. irsend.reset();
  191. irsend.sendToshibaAC(state);
  192. irsend.makeDecodeResult();
  193. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  194. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  195. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  196. EXPECT_EQ(
  197. "uint16_t rawData[296] = {4400, 4300, 542, 1622, 542, 1622, "
  198. "542, 1622, 542, 1622, 542, 472, 542, 472, 542, 1622, 542, 472, "
  199. "542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, 542, 1622, "
  200. "542, 472, 542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, "
  201. "542, 472, 542, 472, 542, 1622, 542, 1622, 542, 1622, 542, 1622, "
  202. "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 472, 542, 472, "
  203. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  204. "542, 472, 542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, "
  205. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  206. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  207. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  208. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  209. "542, 472, 542, 472, 542, 472, 542, 1622, 542, 7048, 4400, 4300, "
  210. "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 472, 542, 472, "
  211. "542, 1622, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  212. "542, 1622, 542, 1622, 542, 472, 542, 1622, 542, 472, 542, 472, "
  213. "542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, 542, 1622, "
  214. "542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 1622, 542, 1622, "
  215. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  216. "542, 472, 542, 472, 542, 472, 542, 1622, 542, 472, 542, 472, "
  217. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  218. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  219. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  220. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 472, "
  221. "542, 472, 542, 472, 542, 472, 542, 472, 542, 472, 542, 1622, "
  222. "542, 7048 }; // TOSHIBA_AC\n"
  223. "uint8_t state[9] = {0xF2, 0x0D, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, "
  224. "0x01};\n",
  225. resultToSourceCode(&irsend.capture));
  226. }
  227. TEST(TestResultToTimingInfo, General) {
  228. IRsendTest irsend(0);
  229. IRrecv irrecv(1);
  230. irsend.begin();
  231. irsend.reset();
  232. irsend.sendNEC(irsend.encodeNEC(0x10, 0x20));
  233. irsend.makeDecodeResult();
  234. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  235. ASSERT_EQ(NEC, irsend.capture.decode_type);
  236. ASSERT_EQ(kNECBits, irsend.capture.bits);
  237. EXPECT_EQ(
  238. "Raw Timing[68]:\n"
  239. " + 8960, - 4480, + 560, - 560, + 560, - 560,"
  240. " + 560, - 560, \n"
  241. " + 560, - 560, + 560, - 1680, + 560, - 560,"
  242. " + 560, - 560, \n"
  243. " + 560, - 560, + 560, - 1680, + 560, - 1680,"
  244. " + 560, - 1680, \n"
  245. " + 560, - 1680, + 560, - 560, + 560, - 1680,"
  246. " + 560, - 1680, \n"
  247. " + 560, - 1680, + 560, - 560, + 560, - 560,"
  248. " + 560, - 560, \n"
  249. " + 560, - 560, + 560, - 560, + 560, - 1680,"
  250. " + 560, - 560, \n"
  251. " + 560, - 560, + 560, - 1680, + 560, - 1680,"
  252. " + 560, - 1680, \n"
  253. " + 560, - 1680, + 560, - 1680, + 560, - 560,"
  254. " + 560, - 1680, \n"
  255. " + 560, - 1680, + 560, - 40320\n",
  256. resultToTimingInfo(&irsend.capture));
  257. irsend.reset();
  258. uint16_t rawData[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90};
  259. irsend.sendRaw(rawData, 9, 38000);
  260. irsend.makeDecodeResult();
  261. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  262. EXPECT_EQ(
  263. "Raw Timing[9]:\n"
  264. " + 10, - 20, + 30, - 40, + 50, - 60,"
  265. " + 70, - 80, \n"
  266. " + 90\n",
  267. resultToTimingInfo(&irsend.capture));
  268. }
  269. TEST(TestResultToHumanReadableBasic, SimpleCodes) {
  270. IRsendTest irsend(0);
  271. IRrecv irrecv(1);
  272. irsend.begin();
  273. irsend.reset();
  274. irsend.sendNEC(irsend.encodeNEC(0x10, 0x20));
  275. irsend.makeDecodeResult();
  276. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  277. ASSERT_EQ(NEC, irsend.capture.decode_type);
  278. ASSERT_EQ(kNECBits, irsend.capture.bits);
  279. EXPECT_EQ(
  280. "Encoding : NEC\n"
  281. "Code : 8F704FB (32 bits)\n",
  282. resultToHumanReadableBasic(&irsend.capture));
  283. }
  284. TEST(TestResultToHumanReadableBasic, ComplexCodes) {
  285. IRsendTest irsend(0);
  286. IRrecv irrecv(1);
  287. irsend.begin();
  288. uint8_t state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  289. 0x00, 0x00, 0x00, 0x01};
  290. irsend.reset();
  291. irsend.sendToshibaAC(state);
  292. irsend.makeDecodeResult();
  293. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  294. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  295. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  296. EXPECT_EQ(
  297. "Encoding : TOSHIBA_AC\n"
  298. "Code : F20D03FC0100000001 (72 bits)\n",
  299. resultToHumanReadableBasic(&irsend.capture));
  300. }
  301. TEST(TestInvertBits, Normal) {
  302. ASSERT_EQ(0xAAAA5555AAAA5555, invertBits(0x5555AAAA5555AAAA, 64));
  303. ASSERT_EQ(0xAAAA5555, invertBits(0x5555AAAA, 32));
  304. ASSERT_EQ(0xFFFFFFFFFFFFFFFF, invertBits(0x0, 64));
  305. ASSERT_EQ(0x0, invertBits(invertBits(0x0, 64), 64));
  306. ASSERT_EQ(0x2, invertBits(0x1, 2));
  307. }
  308. TEST(TestInvertBits, ZeroBits) {
  309. ASSERT_EQ(0xAAAA5555AAAA5555, invertBits(0xAAAA5555AAAA5555, 0));
  310. ASSERT_EQ(0x0, invertBits(0x0, 0));
  311. ASSERT_EQ(0x1, invertBits(0x1, 0));
  312. }
  313. TEST(TestInvertBits, MoreThan64Bits) {
  314. ASSERT_EQ(0xAAAA5555AAAA5555, invertBits(0x5555AAAA5555AAAA, 70));
  315. ASSERT_EQ(0xFFFFFFFFFFFFFFFF, invertBits(0x0, 128));
  316. }