ir_Hitachi_test.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. // Copyright 2018 David Conran
  2. #include "ir_Hitachi.h"
  3. #include "IRrecv.h"
  4. #include "IRrecv_test.h"
  5. #include "IRremoteESP8266.h"
  6. #include "IRsend.h"
  7. #include "IRsend_test.h"
  8. #include "gtest/gtest.h"
  9. // Tests for sendHitachiAC().
  10. // Test sending typical data only.
  11. TEST(TestSendHitachiAC, SendData) {
  12. IRsendTest irsend(0);
  13. irsend.begin();
  14. uint8_t hitachi_code[kHitachiAcStateLength] = {
  15. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  16. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  17. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
  18. irsend.reset();
  19. irsend.sendHitachiAC(hitachi_code);
  20. EXPECT_EQ(
  21. "m3300s1700"
  22. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  23. "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  24. "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
  25. "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
  26. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
  27. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  28. "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  29. "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  30. "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
  31. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  32. "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
  33. "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
  34. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  35. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  36. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  37. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  38. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  39. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
  40. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  41. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  42. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  43. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  44. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  45. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  46. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  47. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  48. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  49. "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
  50. "m400s100000",
  51. irsend.outputStr());
  52. }
  53. // Test sending with repeats.
  54. TEST(TestSendHitachiAC, SendWithRepeats) {
  55. IRsendTest irsend(0);
  56. irsend.begin();
  57. uint8_t hitachi_code[kHitachiAcStateLength] = {
  58. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  59. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  60. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
  61. irsend.reset();
  62. irsend.sendHitachiAC(hitachi_code, kHitachiAcStateLength, 1);
  63. EXPECT_EQ(
  64. "m3300s1700"
  65. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  66. "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  67. "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
  68. "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
  69. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
  70. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  71. "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  72. "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  73. "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
  74. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  75. "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
  76. "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
  77. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  78. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  79. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  80. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  81. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  82. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
  83. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  84. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  85. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  86. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  87. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  88. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  89. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  90. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  91. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  92. "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
  93. "m400s100000"
  94. "m3300s1700"
  95. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  96. "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  97. "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
  98. "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
  99. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
  100. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  101. "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  102. "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  103. "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
  104. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  105. "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
  106. "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
  107. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  108. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  109. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  110. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  111. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  112. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
  113. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  114. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  115. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  116. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  117. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  118. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  119. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  120. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  121. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  122. "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
  123. "m400s100000",
  124. irsend.outputStr());
  125. }
  126. // Test sending atypical sizes.
  127. TEST(TestSendHitachiAC, SendUnexpectedSizes) {
  128. IRsendTest irsend(0);
  129. irsend.begin();
  130. uint8_t hitachi_short_code[kHitachiAcStateLength - 1] = {
  131. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48,
  132. 0x80, 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01,
  133. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00};
  134. uint8_t hitachi_long_code[kHitachiAcStateLength + 1] = {
  135. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  136. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  137. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC, 0xFF};
  138. irsend.reset();
  139. irsend.sendHitachiAC(hitachi_short_code, kHitachiAcStateLength - 1);
  140. ASSERT_EQ("", irsend.outputStr());
  141. irsend.reset();
  142. irsend.sendHitachiAC(hitachi_long_code, kHitachiAcStateLength + 1);
  143. ASSERT_EQ(
  144. "m3300s1700"
  145. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  146. "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  147. "m400s500m400s500m400s500m400s500m400s1250m400s1250m400s500m400s500"
  148. "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
  149. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
  150. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  151. "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  152. "m400s1250m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  153. "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s500"
  154. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  155. "m400s500m400s500m400s1250m400s500m400s500m400s500m400s500m400s500"
  156. "m400s500m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
  157. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  158. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  159. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  160. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  161. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  162. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
  163. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  164. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  165. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  166. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  167. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  168. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  169. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  170. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  171. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  172. "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s500m400s500"
  173. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  174. "m400s100000",
  175. irsend.outputStr());
  176. }
  177. // Tests for IRHitachiAc class.
  178. TEST(TestIRHitachiAcClass, SetAndGetPower) {
  179. IRHitachiAc ac(0);
  180. ac.on();
  181. EXPECT_TRUE(ac.getPower());
  182. ac.off();
  183. EXPECT_FALSE(ac.getPower());
  184. ac.setPower(true);
  185. EXPECT_TRUE(ac.getPower());
  186. ac.setPower(false);
  187. EXPECT_FALSE(ac.getPower());
  188. }
  189. TEST(TestIRHitachiAcClass, SetAndGetSwing) {
  190. IRHitachiAc ac(0);
  191. ac.setSwingVertical(true);
  192. ac.setSwingHorizontal(true);
  193. EXPECT_TRUE(ac.getSwingVertical());
  194. EXPECT_TRUE(ac.getSwingHorizontal());
  195. ac.setSwingVertical(false);
  196. EXPECT_FALSE(ac.getSwingVertical());
  197. EXPECT_TRUE(ac.getSwingHorizontal());
  198. ac.setSwingVertical(true);
  199. EXPECT_TRUE(ac.getSwingVertical());
  200. EXPECT_TRUE(ac.getSwingHorizontal());
  201. ac.setSwingHorizontal(false);
  202. EXPECT_TRUE(ac.getSwingVertical());
  203. EXPECT_FALSE(ac.getSwingHorizontal());
  204. ac.setSwingHorizontal(true);
  205. EXPECT_TRUE(ac.getSwingHorizontal());
  206. }
  207. TEST(TestIRHitachiAcClass, SetAndGetTemp) {
  208. IRHitachiAc ac(0);
  209. ac.setTemp(25);
  210. EXPECT_EQ(25, ac.getTemp());
  211. ac.setTemp(kHitachiAcMinTemp);
  212. EXPECT_EQ(kHitachiAcMinTemp, ac.getTemp());
  213. ac.setTemp(kHitachiAcMinTemp - 1);
  214. EXPECT_EQ(kHitachiAcMinTemp, ac.getTemp());
  215. ac.setTemp(kHitachiAcMaxTemp);
  216. EXPECT_EQ(kHitachiAcMaxTemp, ac.getTemp());
  217. ac.setTemp(kHitachiAcMaxTemp + 1);
  218. EXPECT_EQ(kHitachiAcMaxTemp, ac.getTemp());
  219. ac.setTemp(64);
  220. EXPECT_EQ(64, ac.getTemp());
  221. }
  222. TEST(TestIRHitachiAcClass, SetAndGetMode) {
  223. IRHitachiAc ac(0);
  224. ac.setMode(kHitachiAcCool);
  225. ac.setFan(kHitachiAcFanAuto);
  226. EXPECT_EQ(kHitachiAcCool, ac.getMode());
  227. ac.setTemp(25);
  228. EXPECT_EQ(25, ac.getTemp());
  229. EXPECT_EQ(kHitachiAcFanAuto, ac.getFan());
  230. ac.setMode(kHitachiAcFan);
  231. EXPECT_EQ(kHitachiAcFan, ac.getMode());
  232. EXPECT_EQ(64, ac.getTemp());
  233. EXPECT_NE(kHitachiAcFanAuto, ac.getFan());
  234. ac.setMode(kHitachiAcHeat);
  235. EXPECT_EQ(25, ac.getTemp());
  236. EXPECT_EQ(kHitachiAcHeat, ac.getMode());
  237. ac.setMode(kHitachiAcAuto);
  238. ac.setFan(kHitachiAcFanAuto);
  239. EXPECT_EQ(kHitachiAcAuto, ac.getMode());
  240. ac.setMode(kHitachiAcDry);
  241. EXPECT_EQ(kHitachiAcDry, ac.getMode());
  242. EXPECT_NE(kHitachiAcFanAuto, ac.getFan());
  243. }
  244. TEST(TestIRHitachiAcClass, SetAndGetFan) {
  245. IRHitachiAc ac(0);
  246. ac.setMode(kHitachiAcCool); // All fan options are available in this mode.
  247. ac.setFan(kHitachiAcFanAuto);
  248. EXPECT_EQ(kHitachiAcFanAuto, ac.getFan());
  249. ac.setFan(kHitachiAcFanLow);
  250. EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
  251. ac.setFan(kHitachiAcFanHigh);
  252. EXPECT_EQ(kHitachiAcFanHigh, ac.getFan());
  253. ac.setFan(kHitachiAcFanHigh + 1);
  254. EXPECT_EQ(kHitachiAcFanHigh, ac.getFan());
  255. ac.setFan(0);
  256. EXPECT_EQ(kHitachiAcFanAuto, ac.getFan());
  257. ac.setMode(kHitachiAcFan); // No auto-fan in Fan mode.
  258. EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
  259. ac.setFan(kHitachiAcFanAuto);
  260. EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
  261. ac.setFan(kHitachiAcFanHigh);
  262. EXPECT_EQ(kHitachiAcFanHigh, ac.getFan());
  263. // Only Low and one higher fan settin in Dry mode.
  264. ac.setMode(kHitachiAcDry);
  265. EXPECT_EQ(kHitachiAcFanLow + 1, ac.getFan());
  266. ac.setFan(kHitachiAcFanHigh);
  267. EXPECT_EQ(kHitachiAcFanLow + 1, ac.getFan());
  268. ac.setFan(kHitachiAcFanLow);
  269. EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
  270. ac.setFan(kHitachiAcFanAuto);
  271. EXPECT_EQ(kHitachiAcFanLow, ac.getFan());
  272. }
  273. TEST(TestIRHitachiAcClass, HumanReadable) {
  274. IRHitachiAc ac(0);
  275. ac.setMode(kHitachiAcHeat);
  276. ac.setTemp(kHitachiAcMaxTemp);
  277. ac.on();
  278. ac.setFan(kHitachiAcFanHigh);
  279. ac.setSwingVertical(true);
  280. EXPECT_EQ(
  281. "Power: On, Mode: 3 (HEAT), Temp: 32C, Fan: 5 (HIGH), "
  282. "Swing (Vertical): On, Swing (Horizontal): Off",
  283. ac.toString());
  284. ac.setMode(kHitachiAcCool);
  285. ac.setTemp(kHitachiAcMinTemp);
  286. ac.setFan(kHitachiAcFanLow);
  287. ac.setSwingVertical(false);
  288. ac.setSwingHorizontal(true);
  289. EXPECT_EQ(
  290. "Power: On, Mode: 4 (COOL), Temp: 16C, Fan: 2 (LOW), "
  291. "Swing (Vertical): Off, Swing (Horizontal): On",
  292. ac.toString());
  293. }
  294. TEST(TestIRHitachiAcClass, ChecksumCalculation) {
  295. IRHitachiAc ac(0);
  296. const uint8_t originalstate[kHitachiAcStateLength] = {
  297. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  298. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  299. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
  300. uint8_t examplestate[kHitachiAcStateLength] = {
  301. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  302. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  303. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
  304. EXPECT_TRUE(IRHitachiAc::validChecksum(examplestate));
  305. EXPECT_EQ(0xAC, IRHitachiAc::calcChecksum(examplestate));
  306. examplestate[kHitachiAcStateLength - 1] =
  307. 0x12; // Make the existing checksum invalid
  308. EXPECT_FALSE(IRHitachiAc::validChecksum(examplestate));
  309. EXPECT_EQ(0xAC, IRHitachiAc::calcChecksum(examplestate));
  310. ac.setRaw(examplestate);
  311. // Extracting the state from the object should have a correct checksum.
  312. EXPECT_TRUE(IRHitachiAc::validChecksum(ac.getRaw()));
  313. EXPECT_STATE_EQ(originalstate, ac.getRaw(), kHitachiAcBits);
  314. examplestate[8] = 0x12; // Force a different checksum calc.
  315. EXPECT_FALSE(IRHitachiAc::validChecksum(examplestate));
  316. EXPECT_EQ(0xFF, IRHitachiAc::calcChecksum(examplestate));
  317. }
  318. // Tests for decodeHitachiAC().
  319. // Decode a synthetic HitachiAC message.
  320. TEST(TestDecodeHitachiAC, NormalSynthetic) {
  321. IRsendTest irsend(0);
  322. IRrecv irrecv(0);
  323. irsend.begin();
  324. uint8_t hitachi_code[kHitachiAcStateLength] = {
  325. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  326. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  327. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
  328. irsend.reset();
  329. irsend.sendHitachiAC(hitachi_code);
  330. irsend.makeDecodeResult();
  331. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  332. EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type);
  333. ASSERT_EQ(kHitachiAcBits, irsend.capture.bits);
  334. EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits);
  335. }
  336. // Decode a 'real' HitachiAC message.
  337. TEST(TestDecodeHitachiAC, NormalRealExample1) {
  338. IRsendTest irsend(0);
  339. IRrecv irrecv(0);
  340. irsend.begin();
  341. uint8_t hitachi_code[kHitachiAcStateLength] = {
  342. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x80,
  343. 0x20, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  344. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xAC};
  345. // Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
  346. // 'On' '16c' 'auto fan' 'cooling mode'
  347. uint16_t rawData[451] = {
  348. 3318, 1720, 400, 1276, 400, 432, 398, 434, 398, 434, 400, 432,
  349. 398, 432, 398, 432, 398, 434, 398, 432, 398, 434, 400, 432,
  350. 398, 434, 398, 1278, 398, 434, 398, 434, 396, 434, 398, 434,
  351. 398, 432, 398, 434, 398, 432, 398, 1276, 426, 1252, 424, 408,
  352. 424, 406, 424, 408, 426, 406, 398, 432, 398, 434, 398, 432,
  353. 400, 432, 398, 1276, 426, 408, 424, 1252, 426, 1252, 424, 1250,
  354. 426, 1252, 428, 1250, 426, 1252, 424, 406, 426, 1248, 428, 1252,
  355. 426, 406, 426, 406, 424, 408, 400, 432, 400, 430, 400, 432,
  356. 400, 430, 400, 432, 400, 1276, 400, 1276, 402, 1276, 400, 1276,
  357. 400, 1276, 400, 1278, 400, 1276, 402, 1276, 402, 428, 402, 430,
  358. 400, 430, 402, 1276, 400, 430, 402, 430, 400, 432, 402, 428,
  359. 402, 1278, 400, 430, 402, 430, 402, 1276, 402, 428, 402, 430,
  360. 402, 430, 400, 1276, 402, 430, 402, 430, 402, 430, 402, 430,
  361. 402, 428, 402, 430, 404, 430, 402, 428, 402, 430, 402, 1276,
  362. 402, 430, 402, 428, 402, 430, 400, 428, 402, 430, 402, 430,
  363. 402, 430, 402, 430, 402, 428, 402, 430, 402, 1274, 402, 428,
  364. 402, 430, 402, 430, 402, 430, 402, 430, 402, 428, 402, 428,
  365. 402, 428, 404, 428, 404, 428, 402, 1276, 400, 430, 402, 430,
  366. 400, 432, 400, 456, 374, 432, 400, 456, 404, 428, 404, 426,
  367. 404, 428, 402, 428, 402, 430, 402, 430, 400, 432, 398, 434,
  368. 376, 454, 378, 454, 380, 452, 378, 452, 404, 428, 406, 424,
  369. 432, 398, 406, 426, 430, 402, 404, 428, 428, 402, 400, 430,
  370. 400, 432, 398, 434, 398, 432, 398, 434, 372, 460, 374, 434,
  371. 398, 432, 398, 434, 396, 434, 376, 456, 376, 456, 376, 456,
  372. 376, 1300, 378, 454, 378, 452, 378, 454, 378, 454, 378, 454,
  373. 378, 452, 378, 454, 400, 432, 402, 430, 402, 430, 402, 430,
  374. 402, 428, 402, 430, 402, 430, 400, 430, 402, 430, 400, 432,
  375. 400, 430, 400, 432, 400, 430, 402, 430, 400, 432, 398, 432,
  376. 400, 430, 400, 432, 398, 432, 398, 434, 398, 432, 398, 432,
  377. 400, 434, 398, 432, 398, 432, 398, 434, 398, 434, 396, 434,
  378. 398, 434, 398, 432, 398, 434, 398, 432, 398, 456, 376, 454,
  379. 376, 436, 396, 454, 376, 454, 378, 454, 376, 454, 376, 456,
  380. 374, 458, 374, 1302, 374, 456, 374, 458, 374, 458, 376, 456,
  381. 374, 456, 374, 456, 374, 456, 376, 456, 376, 456, 374, 458,
  382. 374, 458, 374, 458, 372, 458, 372, 460, 374, 458, 372, 460,
  383. 372, 460, 372, 460, 370, 462, 372, 460, 372, 460, 370, 462,
  384. 370, 462, 356, 1320, 368, 464, 346, 1332, 356, 476, 368, 1310,
  385. 366, 1312, 366, 464, 366, 466, 366};
  386. irsend.reset();
  387. irsend.sendRaw(rawData, 451, 38000);
  388. irsend.makeDecodeResult();
  389. EXPECT_TRUE(irrecv.decodeHitachiAC(&irsend.capture));
  390. EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type);
  391. ASSERT_EQ(kHitachiAcBits, irsend.capture.bits);
  392. EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits);
  393. IRHitachiAc ac(0);
  394. ac.setRaw(irsend.capture.state);
  395. EXPECT_EQ(
  396. "Power: On, Mode: 4 (COOL), Temp: 16C, Fan: 1 (AUTO), "
  397. "Swing (Vertical): Off, Swing (Horizontal): Off",
  398. ac.toString());
  399. }
  400. // Decode another 'real' HitachiAC message.
  401. TEST(TestDecodeHitachiAC, NormalRealExample2) {
  402. IRsendTest irsend(0);
  403. IRrecv irrecv(0);
  404. irsend.begin();
  405. uint8_t hitachi_code[kHitachiAcStateLength] = {
  406. 0x80, 0x08, 0x0C, 0x02, 0xFD, 0x80, 0x7F, 0x88, 0x48, 0x10,
  407. 0xC0, 0x02, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  408. 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xD0};
  409. // Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
  410. // 'On' '32c' 'auto fan' 'heating mode'
  411. uint16_t rawData[451] = {
  412. 3322, 1718, 400, 1278, 398, 432, 402, 430, 400, 430, 402, 430,
  413. 402, 430, 400, 432, 400, 432, 402, 430, 400, 430, 402, 430,
  414. 400, 430, 402, 1276, 402, 430, 400, 430, 402, 430, 402, 430,
  415. 402, 428, 402, 430, 400, 430, 402, 1278, 400, 1274, 402, 430,
  416. 400, 432, 400, 430, 402, 430, 402, 430, 400, 430, 400, 432,
  417. 402, 428, 402, 1276, 404, 428, 402, 1276, 402, 1274, 402, 1274,
  418. 404, 1272, 402, 1274, 402, 1274, 404, 430, 402, 1274, 402, 1274,
  419. 402, 430, 402, 430, 402, 430, 400, 430, 402, 430, 404, 428,
  420. 402, 430, 400, 430, 402, 1274, 402, 1276, 402, 1276, 402, 1276,
  421. 400, 1276, 402, 1272, 404, 1274, 402, 1272, 404, 430, 402, 430,
  422. 402, 430, 402, 1274, 404, 428, 402, 428, 404, 430, 402, 430,
  423. 402, 1274, 402, 430, 402, 430, 402, 1274, 402, 430, 402, 430,
  424. 402, 428, 404, 428, 402, 430, 402, 430, 402, 1272, 406, 430,
  425. 402, 428, 402, 430, 402, 430, 400, 1276, 400, 1276, 402, 430,
  426. 402, 430, 402, 430, 402, 430, 402, 428, 402, 430, 402, 430,
  427. 402, 430, 402, 430, 402, 430, 402, 430, 400, 430, 402, 1272,
  428. 404, 430, 400, 430, 402, 430, 402, 428, 404, 430, 400, 430,
  429. 402, 430, 402, 430, 402, 428, 402, 1276, 402, 428, 402, 1276,
  430. 402, 430, 402, 428, 402, 430, 402, 430, 402, 430, 402, 428,
  431. 402, 430, 402, 430, 402, 430, 402, 430, 402, 428, 402, 428,
  432. 404, 430, 402, 428, 402, 430, 402, 428, 402, 430, 402, 432,
  433. 402, 428, 402, 430, 402, 430, 402, 430, 400, 430, 400, 430,
  434. 402, 430, 402, 430, 402, 426, 404, 430, 402, 430, 400, 428,
  435. 404, 428, 404, 432, 398, 432, 400, 456, 376, 456, 376, 456,
  436. 376, 1276, 402, 454, 378, 456, 376, 454, 378, 454, 402, 430,
  437. 376, 454, 376, 456, 400, 430, 378, 454, 400, 432, 402, 430,
  438. 376, 454, 376, 456, 376, 454, 400, 432, 374, 458, 400, 430,
  439. 398, 434, 374, 456, 374, 456, 374, 458, 374, 458, 374, 456,
  440. 352, 482, 372, 460, 374, 458, 364, 468, 352, 480, 372, 460,
  441. 352, 480, 352, 480, 352, 480, 352, 480, 352, 454, 400, 432,
  442. 376, 480, 374, 456, 374, 456, 378, 430, 404, 452, 376, 430,
  443. 404, 428, 406, 426, 406, 426, 404, 426, 406, 428, 406, 426,
  444. 430, 400, 430, 1244, 408, 424, 434, 398, 432, 400, 406, 424,
  445. 432, 400, 406, 426, 430, 400, 432, 400, 432, 400, 430, 402,
  446. 428, 402, 404, 428, 404, 426, 406, 426, 406, 426, 404, 428,
  447. 428, 402, 404, 428, 404, 428, 402, 428, 404, 428, 402, 428,
  448. 404, 428, 404, 1274, 402, 1274, 404, 428, 400, 1276, 402, 430,
  449. 402, 430, 402, 430, 402, 430, 400};
  450. irsend.reset();
  451. irsend.sendRaw(rawData, 451, 38000);
  452. irsend.makeDecodeResult();
  453. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  454. EXPECT_EQ(HITACHI_AC, irsend.capture.decode_type);
  455. ASSERT_EQ(kHitachiAcBits, irsend.capture.bits);
  456. EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAcBits);
  457. IRHitachiAc ac(0);
  458. ac.setRaw(irsend.capture.state);
  459. EXPECT_EQ(
  460. "Power: On, Mode: 3 (HEAT), Temp: 32C, Fan: 5 (HIGH), "
  461. "Swing (Vertical): Off, Swing (Horizontal): Off",
  462. ac.toString());
  463. }
  464. // Tests for sendHitachiAC1().
  465. // Test sending typical data only.
  466. TEST(TestSendHitachiAC1, SendData) {
  467. IRsendTest irsend(0);
  468. irsend.begin();
  469. uint8_t hitachi_code[kHitachiAc1StateLength] = {0xB2, 0xAE, 0x4D, 0x51, 0xF0,
  470. 0x61, 0x84, 0x00, 0x00, 0x00,
  471. 0x00, 0x30, 0xB8};
  472. irsend.reset();
  473. irsend.sendHitachiAC1(hitachi_code);
  474. EXPECT_EQ(
  475. "m3400s3400"
  476. "m400s1250m400s500m400s1250m400s1250m400s500m400s500m400s1250m400s500"
  477. "m400s1250m400s500m400s1250m400s500m400s1250m400s1250m400s1250m400s500"
  478. "m400s500m400s1250m400s500m400s500m400s1250m400s1250m400s500m400s1250"
  479. "m400s500m400s1250m400s500m400s1250m400s500m400s500m400s500m400s1250"
  480. "m400s1250m400s1250m400s1250m400s1250m400s500m400s500m400s500m400s500"
  481. "m400s500m400s1250m400s1250m400s500m400s500m400s500m400s500m400s1250"
  482. "m400s1250m400s500m400s500m400s500m400s500m400s1250m400s500m400s500"
  483. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  484. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  485. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  486. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  487. "m400s500m400s500m400s1250m400s1250m400s500m400s500m400s500m400s500"
  488. "m400s1250m400s500m400s1250m400s1250m400s1250m400s500m400s500m400s500"
  489. "m400s100000",
  490. irsend.outputStr());
  491. }
  492. // Decode a 'real' HitachiAC1 message.
  493. TEST(TestDecodeHitachiAC1, NormalRealExample) {
  494. IRsendTest irsend(0);
  495. IRrecv irrecv(0);
  496. irsend.begin();
  497. uint8_t hitachi_code[kHitachiAc1StateLength] = {0xB2, 0xAE, 0x4D, 0x51, 0xF0,
  498. 0x61, 0x84, 0x00, 0x00, 0x00,
  499. 0x00, 0x10, 0x98};
  500. // Ref: https://github.com/markszabo/IRremoteESP8266/issues/453
  501. uint16_t rawData[211] = {
  502. 3400, 3350, 450, 1250, 450, 400, 400, 1300, 400, 1300, 400, 400,
  503. 450, 400, 400, 1300, 400, 400, 400, 1300, 400, 400, 450, 1250,
  504. 400, 450, 400, 1300, 400, 1250, 450, 1250, 450, 400, 400, 450,
  505. 400, 1250, 450, 400, 400, 400, 400, 1300, 400, 1300, 400, 400,
  506. 450, 1250, 450, 400, 400, 1300, 400, 400, 450, 1250, 400, 400,
  507. 450, 400, 400, 400, 450, 1250, 400, 1300, 450, 1250, 450, 1250,
  508. 400, 1300, 400, 400, 450, 400, 400, 450, 350, 450, 400, 400,
  509. 400, 1300, 400, 1300, 400, 400, 450, 400, 400, 400, 450, 400,
  510. 400, 1300, 400, 1250, 450, 400, 400, 400, 450, 400, 400, 400,
  511. 450, 1250, 450, 400, 400, 400, 450, 400, 400, 400, 450, 400,
  512. 400, 400, 450, 400, 400, 400, 450, 400, 400, 400, 400, 450,
  513. 400, 400, 400, 400, 450, 400, 400, 400, 450, 400, 400, 450,
  514. 400, 400, 400, 400, 450, 400, 400, 400, 450, 400, 400, 450,
  515. 400, 400, 400, 400, 400, 450, 400, 400, 400, 400, 450, 400,
  516. 400, 400, 450, 400, 400, 400, 450, 400, 400, 400, 450, 400,
  517. 400, 400, 450, 400, 400, 1300, 400, 400, 450, 400, 400, 400,
  518. 400, 400, 450, 1250, 450, 400, 400, 400, 450, 1250, 450, 1250,
  519. 450, 400, 400, 400, 450, 400, 400}; // UNKNOWN 828A89E1
  520. irsend.reset();
  521. irsend.sendRaw(rawData, 211, 38000);
  522. irsend.makeDecodeResult();
  523. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  524. EXPECT_EQ(HITACHI_AC1, irsend.capture.decode_type);
  525. ASSERT_EQ(kHitachiAc1Bits, irsend.capture.bits);
  526. EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAc1Bits);
  527. }
  528. // Tests for sendHitachiAC2().
  529. // Test sending typical data only.
  530. TEST(TestSendHitachiAC2, SendData) {
  531. IRsendTest irsend(0);
  532. irsend.begin();
  533. uint8_t hitachi_code[kHitachiAc2StateLength] = {
  534. 0x80, 0x08, 0x00, 0x02, 0xFD, 0xFF, 0x00, 0x33, 0xCC, 0x49, 0xB6,
  535. 0x22, 0xDD, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
  536. 0xFF, 0x00, 0xFF, 0xCA, 0x35, 0x8F, 0x70, 0x00, 0xFF, 0x00, 0xFF,
  537. 0x01, 0xFE, 0xC0, 0x3F, 0x80, 0x7F, 0x11, 0xEE, 0x00, 0xFF, 0x00,
  538. 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};
  539. irsend.reset();
  540. irsend.sendHitachiAC2(hitachi_code);
  541. EXPECT_EQ(
  542. "m3300s1700"
  543. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  544. "m400s500m400s500m400s500m400s500m400s1250m400s500m400s500m400s500"
  545. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  546. "m400s500m400s500m400s500m400s500m400s500m400s500m400s1250m400s500"
  547. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500m400s1250"
  548. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  549. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  550. "m400s500m400s500m400s1250m400s1250m400s500m400s500m400s1250m400s1250"
  551. "m400s1250m400s1250m400s500m400s500m400s1250m400s1250m400s500m400s500"
  552. "m400s500m400s1250m400s500m400s500m400s1250m400s500m400s500m400s1250"
  553. "m400s1250m400s500m400s1250m400s1250m400s500m400s1250m400s1250m400s500"
  554. "m400s500m400s500m400s1250m400s500m400s500m400s500m400s1250m400s500"
  555. "m400s1250m400s1250m400s500m400s1250m400s1250m400s1250m400s500m400s1250"
  556. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
  557. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500"
  558. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  559. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  560. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  561. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  562. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  563. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  564. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  565. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  566. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  567. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  568. "m400s1250m400s1250m400s500m400s500m400s1250m400s500m400s1250m400s500"
  569. "m400s500m400s500m400s1250m400s1250m400s500m400s1250m400s500m400s1250"
  570. "m400s1250m400s500m400s500m400s500m400s1250m400s1250m400s1250m400s1250"
  571. "m400s500m400s1250m400s1250m400s1250m400s500m400s500m400s500m400s500"
  572. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  573. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  574. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  575. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  576. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s1250"
  577. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s500"
  578. "m400s1250m400s1250m400s500m400s500m400s500m400s500m400s500m400s500"
  579. "m400s500m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  580. "m400s1250m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  581. "m400s500m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  582. "m400s500m400s500m400s500m400s1250m400s500m400s500m400s500m400s1250"
  583. "m400s1250m400s1250m400s1250m400s500m400s1250m400s1250m400s1250m400s500"
  584. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  585. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  586. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  587. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  588. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  589. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  590. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  591. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  592. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  593. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  594. "m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250m400s1250"
  595. "m400s500m400s500m400s500m400s500m400s500m400s500m400s500m400s500"
  596. "m400s100000",
  597. irsend.outputStr());
  598. }
  599. // Decode a synthetic HitachiAC2 message.
  600. TEST(TestDecodeHitachiAC2, NormalSyntheticExample) {
  601. IRsendTest irsend(0);
  602. IRrecv irrecv(0);
  603. irsend.begin();
  604. // ON - 32c cool (fan auto)
  605. uint8_t hitachi_code[kHitachiAc2StateLength] = {
  606. 0x80, 0x08, 0x00, 0x02, 0xFD, 0xFF, 0x00, 0x33, 0xCC, 0x49, 0xB6,
  607. 0x22, 0xDD, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
  608. 0xFF, 0x00, 0xFF, 0xCA, 0x35, 0x8F, 0x70, 0x00, 0xFF, 0x00, 0xFF,
  609. 0x01, 0xFE, 0xC0, 0x3F, 0x80, 0x7F, 0x11, 0xEE, 0x00, 0xFF, 0x00,
  610. 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};
  611. irsend.reset();
  612. irsend.sendHitachiAC2(hitachi_code);
  613. irsend.makeDecodeResult();
  614. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  615. EXPECT_EQ(HITACHI_AC2, irsend.capture.decode_type);
  616. ASSERT_EQ(kHitachiAc2Bits, irsend.capture.bits);
  617. EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAc2Bits);
  618. }
  619. // Decode a 'real' HitachiAC2 message.
  620. TEST(TestDecodeHitachiAC2, NormalRealExample) {
  621. IRsendTest irsend(0);
  622. IRrecv irrecv(0);
  623. irsend.begin();
  624. uint8_t hitachi_code[kHitachiAc2StateLength] = {
  625. 0x80, 0x08, 0x00, 0x02, 0xFD, 0xFF, 0x00, 0x33, 0xCC, 0x49, 0xB6,
  626. 0x22, 0xDD, 0x01, 0xFE, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
  627. 0xFF, 0x00, 0xFF, 0xCA, 0x35, 0x8F, 0x70, 0x00, 0xFF, 0x00, 0xFF,
  628. 0x01, 0xFE, 0xC0, 0x3F, 0x80, 0x7F, 0x11, 0xEE, 0x00, 0xFF, 0x00,
  629. 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00};
  630. // Ref: https://github.com/markszabo/IRremoteESP8266/issues/417
  631. uint16_t rawData[851] = {
  632. // ON - 32c cool (fan auto)
  633. 3432, 1654, 492, 1180, 488, 360, 486, 360, 486, 360, 486, 362,
  634. 486, 362, 460, 360, 486, 362, 486, 362, 486, 360, 486, 362,
  635. 486, 362, 486, 1184, 488, 362, 486, 360, 486, 362, 486, 362,
  636. 486, 362, 460, 362, 486, 362, 486, 362, 484, 362, 486, 362,
  637. 486, 362, 486, 362, 458, 362, 484, 362, 486, 362, 484, 364,
  638. 484, 362, 486, 1184, 486, 362, 486, 1210, 488, 1210, 488, 1184,
  639. 486, 1210, 488, 1210, 488, 1182, 488, 360, 488, 1208, 488, 1208,
  640. 488, 1182, 488, 1208, 488, 1208, 488, 1208, 462, 1208, 490, 1208,
  641. 488, 1208, 490, 332, 488, 360, 488, 360, 488, 360, 486, 360,
  642. 486, 360, 486, 362, 460, 360, 486, 362, 486, 362, 486, 1210,
  643. 488, 1210, 460, 362, 486, 362, 486, 1210, 488, 1210, 488, 1182,
  644. 488, 1210, 488, 362, 486, 360, 488, 1182, 488, 1210, 488, 362,
  645. 486, 362, 486, 360, 486, 1182, 488, 362, 486, 362, 486, 1210,
  646. 488, 360, 486, 336, 486, 1210, 488, 1210, 488, 360, 486, 1182,
  647. 488, 1210, 488, 360, 488, 1208, 488, 1182, 488, 362, 486, 362,
  648. 486, 360, 486, 1210, 460, 362, 486, 360, 486, 362, 486, 1210,
  649. 486, 362, 486, 1184, 488, 1208, 488, 360, 486, 1210, 488, 1184,
  650. 488, 1208, 488, 362, 486, 1208, 462, 360, 486, 360, 486, 362,
  651. 486, 360, 486, 362, 486, 360, 486, 334, 486, 1210, 488, 1208,
  652. 488, 1210, 488, 1182, 488, 1208, 488, 1210, 488, 1182, 488, 1208,
  653. 488, 360, 488, 360, 486, 360, 486, 334, 486, 362, 486, 362,
  654. 486, 362, 486, 362, 486, 362, 486, 1182, 488, 1210, 486, 1210,
  655. 488, 1210, 460, 1210, 488, 1210, 488, 1210, 488, 1184, 488, 360,
  656. 486, 360, 486, 362, 486, 362, 486, 360, 460, 360, 486, 362,
  657. 486, 362, 484, 1210, 488, 1182, 488, 1210, 488, 1210, 488, 1210,
  658. 488, 1182, 488, 1208, 488, 1208, 488, 360, 460, 360, 486, 360,
  659. 486, 360, 488, 360, 486, 362, 486, 362, 486, 334, 486, 1210,
  660. 488, 1208, 488, 1210, 460, 1210, 488, 1208, 488, 1210, 488, 1182,
  661. 488, 1208, 488, 360, 486, 362, 486, 360, 488, 334, 486, 360,
  662. 486, 362, 486, 362, 486, 362, 486, 1210, 460, 1210, 488, 1210,
  663. 488, 1210, 488, 1182, 488, 1210, 488, 1208, 488, 1182, 488, 360,
  664. 486, 360, 486, 362, 486, 362, 486, 360, 486, 362, 460, 360,
  665. 486, 362, 486, 1210, 486, 1212, 486, 1184, 488, 1210, 488, 1208,
  666. 488, 1182, 488, 1208, 488, 1208, 488, 1208, 462, 1208, 488, 360,
  667. 486, 362, 486, 1208, 488, 334, 486, 1208, 488, 360, 486, 360,
  668. 486, 362, 486, 1182, 488, 1210, 488, 360, 486, 1210, 488, 334,
  669. 486, 1208, 488, 1208, 488, 360, 486, 360, 486, 334, 486, 1210,
  670. 488, 1210, 488, 1210, 460, 1210, 488, 360, 486, 1208, 488, 1182,
  671. 490, 1208, 488, 360, 486, 360, 486, 360, 486, 360, 460, 360,
  672. 486, 362, 486, 362, 486, 362, 486, 362, 486, 362, 486, 362,
  673. 458, 362, 486, 1210, 488, 1210, 488, 1182, 488, 1210, 488, 1208,
  674. 488, 1208, 462, 1208, 488, 1208, 488, 360, 486, 360, 486, 334,
  675. 486, 360, 486, 362, 486, 362, 486, 362, 486, 362, 486, 1184,
  676. 488, 1210, 488, 1210, 488, 1208, 462, 1210, 488, 1208, 488, 1208,
  677. 488, 1182, 488, 360, 486, 360, 486, 360, 486, 362, 486, 360,
  678. 460, 362, 486, 360, 488, 1208, 488, 1210, 488, 1184, 488, 1208,
  679. 488, 1210, 488, 1182, 488, 1208, 488, 1208, 488, 360, 488, 1182,
  680. 488, 1208, 488, 360, 488, 360, 488, 360, 486, 334, 486, 360,
  681. 486, 362, 486, 362, 486, 360, 486, 1210, 488, 1182, 488, 1210,
  682. 488, 1210, 488, 1182, 488, 1210, 488, 1210, 488, 360, 488, 334,
  683. 486, 360, 488, 360, 486, 362, 486, 362, 486, 362, 486, 362,
  684. 460, 1210, 488, 1210, 488, 1210, 488, 1184, 488, 1208, 488, 1208,
  685. 490, 1182, 488, 360, 488, 360, 486, 362, 486, 1208, 488, 360,
  686. 460, 362, 486, 362, 486, 1210, 488, 1210, 488, 1182, 488, 1208,
  687. 488, 360, 488, 1208, 488, 1184, 486, 1210, 488, 360, 488, 360,
  688. 486, 360, 460, 362, 486, 362, 486, 362, 486, 362, 484, 362,
  689. 486, 362, 486, 1184, 488, 1210, 488, 1210, 488, 1182, 488, 1210,
  690. 488, 1208, 488, 1208, 462, 1210, 488, 360, 486, 362, 486, 360,
  691. 486, 362, 486, 334, 486, 362, 486, 360, 486, 362, 486, 1208,
  692. 488, 1184, 488, 1208, 488, 1210, 488, 1182, 488, 1208, 488, 1208,
  693. 488, 1208, 488, 1182, 488, 1208, 488, 1208, 488, 1182, 488, 1208,
  694. 488, 1208, 488, 1182, 488, 1208, 488, 360, 488, 360, 486, 360,
  695. 486, 362, 460, 362, 486, 362, 486, 362, 486, 360, 486, 1208,
  696. 488, 1182, 488, 1208, 488, 1210, 488, 1182, 488, 1208, 490, 1208,
  697. 488, 1208, 462, 360, 488, 360, 486, 360, 488, 360, 486, 360,
  698. 486, 360, 486, 336, 486, 362, 486, 1210, 488, 1208, 488, 1182,
  699. 488, 1208, 488, 1208, 488, 1208, 462, 1208, 490, 1206, 490, 360,
  700. 488, 360, 488, 332, 486, 360, 488, 360, 486, 360, 488, 360,
  701. 486, 360, 486, 1182, 488, 1208, 488, 1206, 492, 1208, 462, 1208,
  702. 488, 1208, 488, 1208, 490, 1182, 490, 360, 486, 360, 486, 360,
  703. 488, 360, 488, 360, 460, 360, 486, 362, 486, 360, 488};
  704. irsend.reset();
  705. irsend.sendRaw(rawData, 851, 38000);
  706. irsend.makeDecodeResult();
  707. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  708. EXPECT_EQ(HITACHI_AC2, irsend.capture.decode_type);
  709. ASSERT_EQ(kHitachiAc2Bits, irsend.capture.bits);
  710. EXPECT_STATE_EQ(hitachi_code, irsend.capture.state, kHitachiAc2Bits);
  711. }