ir_Haier_test.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. // Copyright 2018 David Conran
  2. #include "ir_Haier.h"
  3. #include "IRrecv.h"
  4. #include "IRrecv_test.h"
  5. #include "IRsend.h"
  6. #include "IRsend_test.h"
  7. #include "gtest/gtest.h"
  8. // Tests for sendHaierAC()
  9. // Test sending typical data only.
  10. TEST(TestSendHaierAC, SendDataOnly) {
  11. IRsendTest irsend(0);
  12. irsend.begin();
  13. uint8_t haier_zero[kHaierACStateLength] = {0x00, 0x00, 0x00, 0x00, 0x00,
  14. 0x00, 0x00, 0x00, 0x00};
  15. irsend.reset();
  16. irsend.sendHaierAC(haier_zero);
  17. EXPECT_EQ(
  18. "m3000s3000m3000s4300"
  19. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  20. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  21. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  22. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  23. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  24. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  25. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  26. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  27. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  28. "m520s150000",
  29. irsend.outputStr());
  30. uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
  31. 0xC0, 0x20, 0x00, 0xA7};
  32. irsend.reset();
  33. irsend.sendHaierAC(haier_test);
  34. EXPECT_EQ(
  35. "m3000s3000m3000s4300"
  36. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
  37. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  38. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  39. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  40. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  41. "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
  42. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  43. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  44. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
  45. "m520s150000",
  46. irsend.outputStr());
  47. }
  48. // Test sending typical data with repeats.
  49. TEST(TestSendHaierAC, SendWithRepeats) {
  50. IRsendTest irsend(0);
  51. irsend.begin();
  52. irsend.reset();
  53. uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
  54. 0xC0, 0x20, 0x00, 0xA7};
  55. irsend.reset();
  56. irsend.sendHaierAC(haier_test, kHaierACStateLength, 2); // two repeats.
  57. EXPECT_EQ(
  58. "m3000s3000m3000s4300"
  59. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
  60. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  61. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  62. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  63. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  64. "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
  65. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  66. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  67. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
  68. "m520s150000"
  69. "m3000s3000m3000s4300"
  70. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
  71. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  72. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  73. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  74. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  75. "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
  76. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  77. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  78. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
  79. "m520s150000"
  80. "m3000s3000m3000s4300"
  81. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
  82. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  83. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  84. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
  85. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  86. "m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
  87. "m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
  88. "m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
  89. "m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
  90. "m520s150000",
  91. irsend.outputStr());
  92. }
  93. // Tests for IRHaierAC class.
  94. TEST(TestHaierACClass, Command) {
  95. IRHaierAC haier(0);
  96. haier.begin();
  97. haier.setCommand(kHaierAcCmdOff);
  98. EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
  99. haier.setCommand(kHaierAcCmdOn);
  100. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  101. haier.setCommand(kHaierAcCmdMode);
  102. EXPECT_EQ(kHaierAcCmdMode, haier.getCommand());
  103. haier.setCommand(kHaierAcCmdFan);
  104. EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
  105. haier.setCommand(kHaierAcCmdTempUp);
  106. EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
  107. haier.setCommand(kHaierAcCmdTempDown);
  108. EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
  109. haier.setCommand(kHaierAcCmdSleep);
  110. EXPECT_EQ(kHaierAcCmdSleep, haier.getCommand());
  111. haier.setCommand(kHaierAcCmdTimerSet);
  112. EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
  113. haier.setCommand(kHaierAcCmdTimerCancel);
  114. EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
  115. haier.setCommand(kHaierAcCmdHealth);
  116. EXPECT_EQ(kHaierAcCmdHealth, haier.getCommand());
  117. haier.setCommand(kHaierAcCmdSwing);
  118. EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
  119. haier.setCommand(kHaierAcCmdOn);
  120. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  121. // Test unexpected values.
  122. haier.setCommand(0b00001110);
  123. EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
  124. haier.setCommand(0b00001111);
  125. EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
  126. haier.setCommand(0b00000100);
  127. EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
  128. }
  129. TEST(TestHaierACClass, OperatingMode) {
  130. IRHaierAC haier(0);
  131. haier.begin();
  132. haier.setMode(kHaierAcAuto);
  133. EXPECT_EQ(kHaierAcAuto, haier.getMode());
  134. haier.setMode(kHaierAcCool);
  135. EXPECT_EQ(kHaierAcCool, haier.getMode());
  136. haier.setMode(kHaierAcHeat);
  137. EXPECT_EQ(kHaierAcHeat, haier.getMode());
  138. haier.setMode(kHaierAcFan);
  139. EXPECT_EQ(kHaierAcFan, haier.getMode());
  140. haier.setMode(kHaierAcDry);
  141. EXPECT_EQ(kHaierAcDry, haier.getMode());
  142. haier.setMode(kHaierAcAuto - 1);
  143. EXPECT_EQ(kHaierAcAuto, haier.getMode());
  144. haier.setMode(kHaierAcCool);
  145. EXPECT_EQ(kHaierAcCool, haier.getMode());
  146. haier.setMode(kHaierAcFan + 1);
  147. EXPECT_EQ(kHaierAcAuto, haier.getMode());
  148. haier.setMode(255);
  149. EXPECT_EQ(kHaierAcAuto, haier.getMode());
  150. }
  151. TEST(TestHaierACClass, Temperature) {
  152. IRHaierAC haier(0);
  153. haier.begin();
  154. haier.setTemp(kHaierAcMinTemp);
  155. EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
  156. haier.setCommand(kHaierAcCmdOn);
  157. haier.setTemp(kHaierAcMinTemp + 1);
  158. EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
  159. EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
  160. haier.setTemp(kHaierAcMaxTemp);
  161. EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
  162. EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
  163. haier.setTemp(kHaierAcMinTemp - 1);
  164. EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
  165. EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
  166. haier.setTemp(kHaierAcMaxTemp + 1);
  167. EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
  168. EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
  169. haier.setTemp(23);
  170. EXPECT_EQ(23, haier.getTemp());
  171. EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
  172. haier.setCommand(kHaierAcCmdOn);
  173. haier.setTemp(23);
  174. EXPECT_EQ(23, haier.getTemp());
  175. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  176. haier.setTemp(0);
  177. EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
  178. EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
  179. haier.setTemp(255);
  180. EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
  181. EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
  182. }
  183. TEST(TestHaierACClass, FanSpeed) {
  184. IRHaierAC haier(0);
  185. haier.begin();
  186. haier.setFan(kHaierAcFanLow);
  187. haier.setCommand(kHaierAcCmdOn);
  188. haier.setFan(kHaierAcFanAuto);
  189. EXPECT_EQ(kHaierAcFanAuto, haier.getFan());
  190. EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
  191. haier.setFan(kHaierAcFanLow);
  192. EXPECT_EQ(kHaierAcFanLow, haier.getFan());
  193. haier.setFan(kHaierAcFanMed);
  194. EXPECT_EQ(kHaierAcFanMed, haier.getFan());
  195. haier.setFan(kHaierAcFanHigh);
  196. EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
  197. haier.setCommand(kHaierAcCmdOn);
  198. haier.setFan(kHaierAcFanHigh);
  199. EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
  200. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  201. }
  202. TEST(TestHaierACClass, Swing) {
  203. IRHaierAC haier(0);
  204. haier.begin();
  205. haier.setFan(kHaierAcFanLow);
  206. haier.setCommand(kHaierAcCmdOn);
  207. haier.setSwing(kHaierAcSwingOff);
  208. EXPECT_EQ(kHaierAcSwingOff, haier.getSwing());
  209. haier.setSwing(kHaierAcSwingUp);
  210. EXPECT_EQ(kHaierAcSwingUp, haier.getSwing());
  211. EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
  212. haier.setSwing(kHaierAcSwingDown);
  213. EXPECT_EQ(kHaierAcSwingDown, haier.getSwing());
  214. EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
  215. haier.setSwing(kHaierAcSwingChg);
  216. EXPECT_EQ(kHaierAcSwingChg, haier.getSwing());
  217. EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
  218. }
  219. TEST(TestHaierACClass, CurrentTime) {
  220. IRHaierAC haier(0);
  221. haier.begin();
  222. EXPECT_EQ(0, haier.getCurrTime());
  223. haier.setCurrTime(1);
  224. EXPECT_EQ(1, haier.getCurrTime());
  225. haier.setCurrTime(60);
  226. EXPECT_EQ(60, haier.getCurrTime());
  227. haier.setCurrTime(61);
  228. EXPECT_EQ(61, haier.getCurrTime());
  229. haier.setCurrTime(18 * 60 + 34); // 18:34
  230. EXPECT_EQ(1114, haier.getCurrTime());
  231. haier.setCurrTime(23 * 60 + 59); // 23:59
  232. EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
  233. haier.setCurrTime(23 * 60 + 59 + 1); // 24:00
  234. EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
  235. haier.setCurrTime(UINT16_MAX);
  236. EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
  237. }
  238. TEST(TestHaierACClass, Timers) {
  239. IRHaierAC haier(0);
  240. haier.begin();
  241. haier.setCommand(kHaierAcCmdOn);
  242. // Off by default.
  243. EXPECT_GT(0, haier.getOnTimer());
  244. EXPECT_GT(0, haier.getOffTimer());
  245. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  246. // On Timer.
  247. haier.setOnTimer(6 * 60); // 6am
  248. EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
  249. EXPECT_GT(0, haier.getOffTimer());
  250. EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
  251. haier.setCommand(kHaierAcCmdOn);
  252. EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
  253. EXPECT_GT(0, haier.getOffTimer());
  254. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  255. haier.cancelTimers();
  256. EXPECT_GT(0, haier.getOnTimer());
  257. EXPECT_GT(0, haier.getOffTimer());
  258. EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
  259. // Off Timer.
  260. haier.setOffTimer(18 * 60 + 30); // 6:30pm
  261. EXPECT_GT(0, haier.getOnTimer());
  262. EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
  263. EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
  264. haier.setCommand(kHaierAcCmdOn);
  265. EXPECT_GT(0, haier.getOnTimer());
  266. EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
  267. EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
  268. haier.cancelTimers();
  269. EXPECT_GT(0, haier.getOnTimer());
  270. EXPECT_GT(0, haier.getOffTimer());
  271. EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
  272. // Both Timers.
  273. haier.setOnTimer(6 * 60); // 6am
  274. EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
  275. haier.setOffTimer(18 * 60 + 30); // 6:30pm
  276. EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
  277. EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
  278. EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
  279. haier.cancelTimers();
  280. EXPECT_GT(0, haier.getOnTimer());
  281. EXPECT_GT(0, haier.getOffTimer());
  282. EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
  283. }
  284. TEST(TestHaierACClass, TimeToString) {
  285. EXPECT_EQ("00:00", IRHaierAC::timeToString(0));
  286. EXPECT_EQ("00:01", IRHaierAC::timeToString(1));
  287. EXPECT_EQ("00:10", IRHaierAC::timeToString(10));
  288. EXPECT_EQ("00:59", IRHaierAC::timeToString(59));
  289. EXPECT_EQ("01:00", IRHaierAC::timeToString(60));
  290. EXPECT_EQ("01:01", IRHaierAC::timeToString(61));
  291. EXPECT_EQ("01:59", IRHaierAC::timeToString(60 + 59));
  292. EXPECT_EQ("18:59", IRHaierAC::timeToString(18 * 60 + 59));
  293. EXPECT_EQ("23:59", IRHaierAC::timeToString(23 * 60 + 59));
  294. }
  295. TEST(TestHaierACClass, MessageConstuction) {
  296. IRHaierAC haier(0);
  297. EXPECT_EQ(
  298. "Command: 1 (On), Mode: 0 (AUTO), Temp: 25C, Fan: 0 (AUTO), "
  299. "Swing: 0 (Off), Sleep: Off, Health: Off, "
  300. "Current Time: 00:00, On Timer: Off, Off Timer: Off",
  301. haier.toString());
  302. haier.setMode(kHaierAcCool);
  303. haier.setTemp(21);
  304. haier.setFan(kHaierAcFanHigh);
  305. EXPECT_EQ(
  306. "Command: 3 (Fan), Mode: 1 (COOL), Temp: 21C, Fan: 3 (MAX), "
  307. "Swing: 0 (Off), Sleep: Off, Health: Off, "
  308. "Current Time: 00:00, On Timer: Off, Off Timer: Off",
  309. haier.toString());
  310. haier.setSwing(kHaierAcSwingChg);
  311. haier.setHealth(true);
  312. haier.setSleep(true);
  313. haier.setCurrTime(615); // 10:15am
  314. EXPECT_EQ(
  315. "Command: 8 (Sleep), Mode: 3 (HEAT), Temp: 21C, Fan: 3 (MAX), "
  316. "Swing: 3 (Chg), Sleep: On, Health: On, "
  317. "Current Time: 10:15, On Timer: Off, Off Timer: Off",
  318. haier.toString());
  319. haier.setOnTimer(800); // 1:20pm
  320. haier.setOffTimer(1125); // 6:45pm
  321. haier.setCommand(kHaierAcCmdOn);
  322. EXPECT_EQ(
  323. "Command: 1 (On), Mode: 2 (DRY), Temp: 21C, Fan: 2, "
  324. "Swing: 3 (Chg), Sleep: On, Health: On, "
  325. "Current Time: 10:15, On Timer: 13:20, Off Timer: 18:45",
  326. haier.toString());
  327. // Now change a few already set things.
  328. haier.setMode(kHaierAcHeat);
  329. EXPECT_EQ(
  330. "Command: 2 (Mode), Mode: 3 (HEAT), Temp: 21C, Fan: 2, "
  331. "Swing: 3 (Chg), Sleep: On, Health: On, "
  332. "Current Time: 10:15, On Timer: 13:52, Off Timer: 18:45",
  333. haier.toString());
  334. haier.setTemp(25);
  335. EXPECT_EQ(
  336. "Command: 6 (Temp Up), Mode: 3 (HEAT), Temp: 25C, Fan: 2, "
  337. "Swing: 3 (Chg), Sleep: On, Health: On, "
  338. "Current Time: 10:15, On Timer: 13:52, Off Timer: 18:45",
  339. haier.toString());
  340. uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x96, 0xEA, 0xCF, 0x32,
  341. 0x2D, 0x0D, 0x74, 0xD4};
  342. EXPECT_STATE_EQ(expectedState, haier.getRaw(), kHaierACBits);
  343. // Check that the checksum is valid.
  344. EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
  345. // Now load up some random data.
  346. uint8_t randomState[kHaierACStateLength] = {0x52, 0x49, 0x50, 0x20, 0x54,
  347. 0x61, 0x6C, 0x69, 0x61};
  348. EXPECT_FALSE(IRHaierAC::validChecksum(randomState));
  349. haier.setRaw(randomState);
  350. EXPECT_EQ(
  351. "Command: 9 (Timer Set), Mode: 3 (HEAT), Temp: 20C, Fan: 2, "
  352. "Swing: 1 (Up), Sleep: On, Health: Off, "
  353. "Current Time: 16:32, On Timer: Off, Off Timer: Off",
  354. haier.toString());
  355. // getRaw() should correct the checksum.
  356. EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
  357. }
  358. // Tests for the IRHaierACYRW02 class.
  359. TEST(TestHaierACYRW02Class, Button) {
  360. IRHaierACYRW02 haier(0);
  361. haier.begin();
  362. haier.setButton(kHaierAcYrw02ButtonPower);
  363. EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
  364. haier.setButton(kHaierAcYrw02ButtonMode);
  365. EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
  366. haier.setButton(kHaierAcYrw02ButtonSleep);
  367. EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
  368. haier.setButton(kHaierAcYrw02ButtonFan);
  369. // Test unexpected values.
  370. haier.setButton(0xFF);
  371. EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
  372. haier.setButton(0x10);
  373. EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
  374. }
  375. TEST(TestHaierACYRW02Class, OperatingMode) {
  376. IRHaierACYRW02 haier(0);
  377. haier.begin();
  378. haier.setButton(kHaierAcYrw02ButtonPower);
  379. haier.setMode(kHaierAcYrw02Auto);
  380. EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
  381. EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
  382. haier.setMode(kHaierAcYrw02Cool);
  383. EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
  384. haier.setMode(kHaierAcYrw02Heat);
  385. EXPECT_EQ(kHaierAcYrw02Heat, haier.getMode());
  386. haier.setMode(kHaierAcYrw02Fan);
  387. EXPECT_EQ(kHaierAcYrw02Fan, haier.getMode());
  388. haier.setMode(kHaierAcYrw02Dry);
  389. EXPECT_EQ(kHaierAcYrw02Dry, haier.getMode());
  390. haier.setMode(kHaierAcYrw02Auto - 1);
  391. EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
  392. haier.setMode(kHaierAcYrw02Cool);
  393. EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
  394. haier.setMode(kHaierAcYrw02Fan + 1);
  395. EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
  396. haier.setMode(255);
  397. EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
  398. }
  399. TEST(TestHaierACYRW02Class, Temperature) {
  400. IRHaierACYRW02 haier(0);
  401. haier.begin();
  402. haier.setTemp(kHaierAcMinTemp);
  403. EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
  404. haier.setButton(kHaierAcYrw02ButtonPower);
  405. haier.setTemp(kHaierAcMinTemp + 1);
  406. EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
  407. EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
  408. haier.setTemp(kHaierAcMaxTemp);
  409. EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
  410. EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
  411. haier.setTemp(kHaierAcMinTemp - 1);
  412. EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
  413. EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
  414. haier.setTemp(kHaierAcMaxTemp + 1);
  415. EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
  416. EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
  417. haier.setTemp(23);
  418. EXPECT_EQ(23, haier.getTemp());
  419. EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
  420. haier.setButton(kHaierAcYrw02ButtonPower);
  421. haier.setTemp(23);
  422. EXPECT_EQ(23, haier.getTemp());
  423. EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
  424. haier.setTemp(0);
  425. EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
  426. EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
  427. haier.setTemp(255);
  428. EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
  429. EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
  430. }
  431. TEST(TestHaierACYRW02Class, HealthMode) {
  432. IRHaierACYRW02 haier(0);
  433. haier.begin();
  434. haier.setHealth(true);
  435. EXPECT_TRUE(haier.getHealth());
  436. EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
  437. haier.setButton(kHaierAcYrw02ButtonTempUp);
  438. haier.setHealth(false);
  439. EXPECT_FALSE(haier.getHealth());
  440. EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
  441. haier.setHealth(true);
  442. EXPECT_TRUE(haier.getHealth());
  443. EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
  444. }
  445. TEST(TestHaierACYRW02Class, Power) {
  446. IRHaierACYRW02 haier(0);
  447. haier.begin();
  448. haier.setPower(true);
  449. EXPECT_TRUE(haier.getPower());
  450. EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
  451. haier.setButton(kHaierAcYrw02ButtonTempUp);
  452. haier.setPower(false);
  453. EXPECT_FALSE(haier.getPower());
  454. EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
  455. haier.setPower(true);
  456. EXPECT_TRUE(haier.getPower());
  457. EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
  458. haier.off();
  459. EXPECT_FALSE(haier.getPower());
  460. haier.on();
  461. EXPECT_TRUE(haier.getPower());
  462. }
  463. TEST(TestHaierACYRW02Class, SleepMode) {
  464. IRHaierACYRW02 haier(0);
  465. haier.begin();
  466. haier.setSleep(true);
  467. EXPECT_TRUE(haier.getSleep());
  468. EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
  469. haier.setButton(kHaierAcYrw02ButtonTempUp);
  470. haier.setSleep(false);
  471. EXPECT_FALSE(haier.getSleep());
  472. EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
  473. haier.setSleep(true);
  474. EXPECT_TRUE(haier.getSleep());
  475. EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
  476. }
  477. TEST(TestHaierACYRW02Class, TurboMode) {
  478. IRHaierACYRW02 haier(0);
  479. haier.begin();
  480. haier.setTurbo(kHaierAcYrw02TurboOff);
  481. EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
  482. EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
  483. haier.setButton(kHaierAcYrw02ButtonTempUp);
  484. haier.setTurbo(kHaierAcYrw02TurboLow);
  485. EXPECT_EQ(kHaierAcYrw02TurboLow, haier.getTurbo());
  486. EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
  487. haier.setTurbo(kHaierAcYrw02TurboHigh);
  488. EXPECT_EQ(kHaierAcYrw02TurboHigh, haier.getTurbo());
  489. EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
  490. haier.setTurbo(kHaierAcYrw02TurboOff);
  491. EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
  492. EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
  493. }
  494. TEST(TestHaierACYRW02Class, Fan) {
  495. IRHaierACYRW02 haier(0);
  496. haier.begin();
  497. haier.setFan(kHaierAcYrw02FanAuto);
  498. EXPECT_EQ(kHaierAcYrw02FanAuto, haier.getFan());
  499. EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
  500. haier.setButton(kHaierAcYrw02ButtonTempUp);
  501. haier.setFan(kHaierAcYrw02FanLow);
  502. EXPECT_EQ(kHaierAcYrw02FanLow, haier.getFan());
  503. EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
  504. haier.setFan(kHaierAcYrw02FanHigh);
  505. EXPECT_EQ(kHaierAcYrw02FanHigh, haier.getFan());
  506. EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
  507. haier.setFan(kHaierAcYrw02FanMed);
  508. EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
  509. EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
  510. // Test unexpected values.
  511. haier.setButton(kHaierAcYrw02ButtonTempUp);
  512. haier.setFan(0x00);
  513. EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
  514. EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
  515. }
  516. TEST(TestHaierACYRW02Class, Swing) {
  517. IRHaierACYRW02 haier(0);
  518. haier.begin();
  519. haier.setSwing(kHaierAcYrw02SwingOff);
  520. EXPECT_EQ(kHaierAcYrw02SwingOff, haier.getSwing());
  521. EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
  522. haier.setButton(kHaierAcYrw02ButtonTempUp);
  523. haier.setSwing(kHaierAcYrw02SwingAuto);
  524. EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
  525. EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
  526. haier.setSwing(kHaierAcYrw02SwingTop);
  527. EXPECT_EQ(kHaierAcYrw02SwingTop, haier.getSwing());
  528. EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
  529. haier.setSwing(kHaierAcYrw02SwingDown);
  530. EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
  531. EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
  532. // Test unexpected values.
  533. haier.setButton(kHaierAcYrw02ButtonTempUp);
  534. haier.setSwing(0xFF);
  535. EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
  536. EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
  537. // Test the mode-dependant positions.
  538. haier.setMode(kHaierAcYrw02Auto);
  539. haier.setSwing(kHaierAcYrw02SwingMiddle);
  540. EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
  541. EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
  542. haier.setMode(kHaierAcYrw02Heat);
  543. haier.setSwing(kHaierAcYrw02SwingMiddle);
  544. EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
  545. haier.setSwing(kHaierAcYrw02SwingAuto);
  546. EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
  547. haier.setSwing(kHaierAcYrw02SwingBottom);
  548. EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
  549. haier.setMode(kHaierAcYrw02Cool);
  550. haier.setSwing(kHaierAcYrw02SwingBottom);
  551. EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
  552. }
  553. TEST(TestHaierACYRW02Class, MessageConstuction) {
  554. IRHaierACYRW02 haier(0);
  555. EXPECT_EQ(
  556. "Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C,"
  557. " Fan: 10 (Auto), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
  558. " Health: On",
  559. haier.toString());
  560. haier.setMode(kHaierAcYrw02Cool);
  561. haier.setTemp(21);
  562. haier.setFan(kHaierAcYrw02FanHigh);
  563. EXPECT_EQ(
  564. "Power: On, Button: 4 (Fan), Mode: 2 (Cool), Temp: 21C,"
  565. " Fan: 2 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
  566. " Health: On",
  567. haier.toString());
  568. haier.setSwing(kHaierAcYrw02SwingMiddle);
  569. haier.setHealth(false);
  570. haier.setSleep(true);
  571. haier.setTurbo(kHaierAcYrw02TurboHigh);
  572. EXPECT_EQ(
  573. "Power: On, Button: 8 (Turbo), Mode: 2 (Cool), Temp: 21C,"
  574. " Fan: 2 (High), Turbo: 1 (High), Swing: 2 (Middle),"
  575. " Sleep: On, Health: Off",
  576. haier.toString());
  577. }
  578. // Decode "real" state messages.
  579. TEST(TestHaierACYRW02Class, RealStates) {
  580. uint8_t expectedState1[kHaierACYRW02StateLength] = {
  581. 0xA6, 0xE1, 0x00, 0x00, 0x40, 0x20, 0x00,
  582. 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6E};
  583. IRHaierACYRW02 haier(0);
  584. haier.setRaw(expectedState1);
  585. EXPECT_EQ(
  586. "Power: On, Button: 7 (Health), Mode: 8 (Heat), Temp: 30C,"
  587. " Fan: 2 (High), Turbo: 0 (Off), Swing: 1 (Top), Sleep: Off,"
  588. " Health: Off",
  589. haier.toString());
  590. uint8_t expectedState2[kHaierACYRW02StateLength] = {
  591. 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x00,
  592. 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x75};
  593. haier.setRaw(expectedState2);
  594. EXPECT_EQ(
  595. "Power: Off, Button: 5 (Power), Mode: 8 (Heat), Temp: 30C,"
  596. " Fan: 2 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
  597. " Health: Off",
  598. haier.toString());
  599. uint8_t expectedState3[kHaierACYRW02StateLength] = {
  600. 0xA6, 0x02, 0x00, 0x02, 0x40, 0x20, 0x00,
  601. 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2B};
  602. haier.setRaw(expectedState3);
  603. EXPECT_EQ(
  604. "Power: On, Button: 1 (Temp Down), Mode: 2 (Cool), Temp: 16C,"
  605. " Fan: 2 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
  606. " Health: On",
  607. haier.toString());
  608. // cool 25, health, fan auto, swing auto, sleep on
  609. uint8_t expectedState4[kHaierACYRW02StateLength] = {
  610. 0xA6, 0x9C, 0x00, 0x02, 0x40, 0xA8, 0x00,
  611. 0x20, 0x80, 0x00, 0x00, 0x00, 0x0B, 0xD7};
  612. haier.setRaw(expectedState4);
  613. EXPECT_EQ(
  614. "Power: On, Button: 11 (Sleep), Mode: 2 (Cool), Temp: 25C,"
  615. " Fan: 10 (Auto), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
  616. " Health: On",
  617. haier.toString());
  618. // cool 25, health, fan 3, swing auto, sleep on
  619. uint8_t expectedState5[kHaierACYRW02StateLength] = {
  620. 0xA6, 0x9C, 0x00, 0x02, 0x40, 0x27, 0x36,
  621. 0x20, 0x80, 0x00, 0x00, 0x00, 0x04, 0x85};
  622. haier.setRaw(expectedState5);
  623. EXPECT_EQ(
  624. "Power: On, Button: 4 (Fan), Mode: 2 (Cool), Temp: 25C,"
  625. " Fan: 2 (High), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
  626. " Health: On",
  627. haier.toString());
  628. }
  629. // Tests for decodeHaierAC().
  630. // Decode normal "synthetic" messages.
  631. TEST(TestDecodeHaierAC, NormalDecodeWithStrict) {
  632. IRsendTest irsend(0);
  633. IRrecv irrecv(0);
  634. irsend.begin();
  635. uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
  636. 0xC0, 0x20, 0x00, 0xA7};
  637. // With the specific decoder.
  638. irsend.reset();
  639. irsend.sendHaierAC(expectedState);
  640. irsend.makeDecodeResult();
  641. ASSERT_TRUE(irrecv.decodeHaierAC(&irsend.capture, kHaierACBits, true));
  642. EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
  643. EXPECT_EQ(kHaierACBits, irsend.capture.bits);
  644. EXPECT_FALSE(irsend.capture.repeat);
  645. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  646. // With the all the decoders.
  647. irsend.reset();
  648. irsend.sendHaierAC(expectedState);
  649. irsend.makeDecodeResult();
  650. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  651. EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
  652. EXPECT_EQ(kHaierACBits, irsend.capture.bits);
  653. EXPECT_FALSE(irsend.capture.repeat);
  654. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  655. }
  656. // Decode a "real" example message.
  657. TEST(TestDecodeHaierAC, RealExample1) {
  658. IRsendTest irsend(0);
  659. IRrecv irrecv(0);
  660. irsend.begin();
  661. irsend.reset();
  662. // Data from Issue #404 captured by kuzin2006
  663. uint16_t rawData[149] = {
  664. 3030, 3044, 3030, 4304, 576, 1694, 550, 582, 552, 1704, 552, 714, 550,
  665. 582, 550, 1706, 552, 582, 550, 1836, 552, 582, 578, 568, 550, 582,
  666. 550, 714, 550, 582, 550, 582, 552, 582, 550, 1836, 552, 582, 552,
  667. 580, 580, 1692, 550, 712, 552, 582, 550, 582, 552, 580, 550, 714,
  668. 552, 582, 550, 582, 552, 582, 578, 698, 552, 580, 552, 582, 552,
  669. 582, 552, 1836, 552, 580, 552, 582, 552, 582, 550, 714, 578, 568,
  670. 550, 582, 550, 582, 552, 714, 550, 1706, 550, 1706, 550, 582, 550,
  671. 714, 552, 582, 580, 566, 552, 582, 550, 714, 552, 580, 552, 580,
  672. 552, 1706, 550, 714, 550, 582, 552, 582, 578, 568, 552, 712, 552,
  673. 582, 550, 582, 550, 582, 550, 712, 552, 582, 550, 582, 552, 582,
  674. 578, 722, 552, 1704, 550, 582, 550, 1706, 550, 736, 550, 582, 550,
  675. 1706, 550, 1704, 552, 1704, 578};
  676. uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
  677. 0xC0, 0x20, 0x00, 0xA7};
  678. irsend.sendRaw(rawData, 149, 38000);
  679. irsend.makeDecodeResult();
  680. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  681. ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
  682. EXPECT_EQ(kHaierACBits, irsend.capture.bits);
  683. EXPECT_FALSE(irsend.capture.repeat);
  684. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  685. IRHaierAC haier(0);
  686. haier.setRaw(irsend.capture.state);
  687. EXPECT_EQ(
  688. "Command: 1 (On), Mode: 0 (AUTO), Temp: 16C, Fan: 0 (AUTO), "
  689. "Swing: 0 (Off), Sleep: Off, Health: Off, "
  690. "Current Time: 00:01, On Timer: Off, Off Timer: Off",
  691. haier.toString());
  692. }
  693. // Decode a "real" example message.
  694. TEST(TestDecodeHaierAC, RealExample2) {
  695. IRsendTest irsend(0);
  696. IRrecv irrecv(0);
  697. irsend.begin();
  698. irsend.reset();
  699. // Data from Issue #404 captured by kuzin2006
  700. uint16_t rawData[149] = {
  701. 3028, 3046, 3028, 4304, 576, 1694, 552, 582, 550, 1704, 552, 714,
  702. 550, 582, 552, 1704, 550, 582, 550, 1836, 552, 582, 578, 1690,
  703. 552, 1704, 552, 712, 550, 582, 550, 1706, 550, 1706, 552, 712,
  704. 550, 582, 552, 582, 578, 1690, 552, 714, 552, 580, 552, 582,
  705. 552, 582, 550, 712, 552, 582, 550, 582, 550, 582, 578, 698,
  706. 552, 582, 550, 584, 550, 582, 552, 1836, 550, 582, 550, 582,
  707. 550, 582, 550, 712, 578, 568, 550, 582, 550, 582, 550, 714,
  708. 552, 1706, 550, 1706, 552, 580, 550, 714, 550, 582, 580, 568,
  709. 550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 552, 712,
  710. 550, 582, 550, 582, 580, 568, 552, 712, 550, 584, 550, 582,
  711. 550, 584, 550, 712, 550, 582, 550, 582, 550, 582, 578, 722,
  712. 550, 582, 552, 580, 552, 582, 550, 738, 550, 1706, 550, 1704,
  713. 552, 582, 550, 582, 578};
  714. uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x66, 0x20, 0x01, 0x00,
  715. 0xC0, 0x20, 0x00, 0x0C};
  716. irsend.sendRaw(rawData, 149, 38000);
  717. irsend.makeDecodeResult();
  718. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  719. ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
  720. EXPECT_EQ(kHaierACBits, irsend.capture.bits);
  721. EXPECT_FALSE(irsend.capture.repeat);
  722. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  723. IRHaierAC haier(0);
  724. haier.setRaw(irsend.capture.state);
  725. EXPECT_EQ(
  726. "Command: 6 (Temp Up), Mode: 0 (AUTO), Temp: 22C, Fan: 0 (AUTO), "
  727. "Swing: 0 (Off), Sleep: Off, Health: Off, "
  728. "Current Time: 00:01, On Timer: Off, Off Timer: Off",
  729. haier.toString());
  730. }
  731. // Decode a "real" example message.
  732. TEST(TestDecodeHaierAC, RealExample3) {
  733. IRsendTest irsend(0);
  734. IRrecv irrecv(0);
  735. irsend.begin();
  736. irsend.reset();
  737. // Data from Issue #404 captured by kuzin2006
  738. uint16_t rawData[149] = {
  739. 3030, 3044, 3030, 4302, 578, 1692, 550, 582, 550, 1706, 550, 714,
  740. 550, 582, 552, 1706, 550, 582, 550, 1836, 552, 1706, 578, 1690,
  741. 552, 1704, 552, 714, 550, 1706, 552, 1706, 550, 582, 550, 714,
  742. 552, 582, 550, 582, 578, 1690, 550, 714, 552, 582, 552, 582,
  743. 550, 582, 550, 714, 550, 584, 550, 582, 550, 582, 578, 700,
  744. 552, 1706, 550, 582, 550, 582, 552, 1836, 550, 582, 550, 582,
  745. 552, 1706, 550, 714, 578, 568, 552, 582, 552, 582, 550, 714,
  746. 550, 1706, 550, 1706, 550, 582, 552, 712, 552, 582, 580, 568,
  747. 550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 550, 714,
  748. 550, 582, 550, 582, 578, 568, 552, 712, 552, 582, 550, 582,
  749. 550, 582, 550, 712, 550, 584, 550, 582, 552, 582, 578, 722,
  750. 552, 1704, 550, 582, 550, 1706, 550, 1862, 550, 1706, 550, 582,
  751. 550, 1704, 552, 582, 578};
  752. uint8_t expectedState[kHaierACStateLength] = {0xA5, 0xEC, 0x20, 0x09, 0x20,
  753. 0xC0, 0x20, 0x00, 0xBA};
  754. irsend.sendRaw(rawData, 149, 38000);
  755. irsend.makeDecodeResult();
  756. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  757. ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
  758. EXPECT_EQ(kHaierACBits, irsend.capture.bits);
  759. EXPECT_FALSE(irsend.capture.repeat);
  760. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  761. IRHaierAC haier(0);
  762. haier.setRaw(irsend.capture.state);
  763. EXPECT_EQ(
  764. "Command: 12 (Health), Mode: 0 (AUTO), Temp: 30C, Fan: 0 (AUTO), "
  765. "Swing: 0 (Off), Sleep: Off, Health: On, "
  766. "Current Time: 00:09, On Timer: Off, Off Timer: Off",
  767. haier.toString());
  768. }
  769. // Decode normal "synthetic" messages.
  770. TEST(TestDecodeHaierAC_YRW02, NormalDecode) {
  771. IRsendTest irsend(0);
  772. IRrecv irrecv(0);
  773. irsend.begin();
  774. uint8_t expectedState[kHaierACYRW02StateLength] = {
  775. 0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
  776. 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
  777. irsend.reset();
  778. irsend.sendHaierACYRW02(expectedState);
  779. irsend.makeDecodeResult();
  780. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  781. EXPECT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
  782. EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
  783. EXPECT_FALSE(irsend.capture.repeat);
  784. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  785. }
  786. // Decode a "real" example message.
  787. TEST(TestDecodeHaierAC_YRW02, RealExample) {
  788. IRsendTest irsend(0);
  789. IRrecv irrecv(0);
  790. irsend.begin();
  791. irsend.reset();
  792. // Data from Issue #485 captured by non7top
  793. uint16_t rawData[229] = {
  794. 2998, 3086, 2998, 4460, 568, 1640, 596, 492, 514, 1690, 590, 496,
  795. 566, 532, 592, 1596, 570, 1618, 518, 584, 590, 538, 524, 536,
  796. 568, 532, 590, 1596, 516, 612, 568, 538, 522, 1638, 586, 500,
  797. 512, 614, 568, 538, 520, 538, 586, 538, 566, 540, 520, 538,
  798. 586, 538, 522, 538, 588, 538, 568, 538, 520, 538, 586, 538,
  799. 566, 538, 520, 540, 588, 1596, 590, 536, 568, 538, 520, 1592,
  800. 640, 538, 520, 540, 588, 538, 568, 538, 516, 562, 566, 538,
  801. 518, 542, 586, 540, 566, 1596, 590, 538, 566, 538, 516, 544,
  802. 586, 538, 516, 542, 588, 540, 564, 540, 468, 590, 588, 538,
  803. 566, 540, 466, 590, 588, 538, 514, 544, 588, 538, 566, 538,
  804. 468, 1692, 606, 526, 466, 592, 588, 538, 568, 490, 588, 538,
  805. 566, 540, 466, 592, 588, 538, 566, 538, 466, 592, 588, 538,
  806. 568, 492, 586, 540, 566, 540, 468, 590, 588, 538, 568, 516,
  807. 488, 590, 588, 538, 568, 492, 588, 538, 566, 518, 488, 590,
  808. 588, 540, 564, 518, 490, 590, 588, 538, 562, 496, 588, 538,
  809. 566, 518, 488, 590, 588, 538, 562, 522, 488, 588, 590, 538,
  810. 560, 498, 588, 540, 564, 522, 486, 590, 590, 538, 560, 524,
  811. 488, 588, 588, 1598, 514, 608, 564, 1600, 548, 536, 586, 538,
  812. 568, 1594, 590, 1618, 578, 1606, 606, 1582, 590, 1596, 590, 1616,
  813. 580};
  814. uint8_t expectedState[kHaierACYRW02StateLength] = {
  815. 0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
  816. 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
  817. irsend.sendRaw(rawData, 229, 38000);
  818. irsend.makeDecodeResult();
  819. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  820. ASSERT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
  821. EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
  822. EXPECT_FALSE(irsend.capture.repeat);
  823. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  824. IRHaierACYRW02 haier(0);
  825. haier.setRaw(irsend.capture.state);
  826. EXPECT_EQ(
  827. "Power: On, Button: 5 (Power), Mode: 2 (Cool), Temp: 17C,"
  828. " Fan: 2 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
  829. " Health: On",
  830. haier.toString());
  831. }