ir_Midea_test.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. // Copyright 2017 David Conran
  2. #include "ir_Midea.h"
  3. #include "IRsend.h"
  4. #include "IRsend_test.h"
  5. #include "gtest/gtest.h"
  6. // Tests for sendMidea().
  7. // Test sending typical data only.
  8. TEST(TestSendMidea, SendDataOnly) {
  9. IRsendTest irsend(4);
  10. irsend.begin();
  11. irsend.reset();
  12. irsend.sendMidea(0x0);
  13. EXPECT_EQ(
  14. "m4480s4480"
  15. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  16. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  17. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  18. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  19. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  20. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  21. "m560s5600"
  22. "m4480s4480"
  23. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  24. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  25. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  26. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  27. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  28. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  29. "m560s5600",
  30. irsend.outputStr());
  31. irsend.reset();
  32. irsend.sendMidea(0x55AA55AA55AA);
  33. EXPECT_EQ(
  34. "m4480s4480"
  35. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  36. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  37. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  38. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  39. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  40. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  41. "m560s5600"
  42. "m4480s4480"
  43. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  44. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  45. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  46. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  47. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  48. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  49. "m560s5600",
  50. irsend.outputStr());
  51. irsend.reset();
  52. irsend.sendMidea(0xFFFFFFFFFFFF);
  53. EXPECT_EQ(
  54. "m4480s4480"
  55. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  56. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  57. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  58. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  59. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  60. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  61. "m560s5600"
  62. "m4480s4480"
  63. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  64. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  65. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  66. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  67. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  68. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  69. "m560s5600",
  70. irsend.outputStr());
  71. }
  72. // Test sending with different repeats.
  73. TEST(TestSendMidea, SendWithRepeats) {
  74. IRsendTest irsend(4);
  75. irsend.begin();
  76. irsend.reset();
  77. irsend.sendMidea(0x55AA55AA55AA, kMideaBits, 1); // 1 repeat.
  78. EXPECT_EQ(
  79. "m4480s4480"
  80. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  81. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  82. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  83. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  84. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  85. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  86. "m560s5600"
  87. "m4480s4480"
  88. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  89. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  90. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  91. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  92. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  93. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  94. "m560s5600"
  95. "m4480s4480"
  96. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  97. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  98. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  99. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  100. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  101. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  102. "m560s5600"
  103. "m4480s4480"
  104. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  105. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  106. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  107. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  108. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  109. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  110. "m560s5600",
  111. irsend.outputStr());
  112. irsend.sendMidea(0x55AA55AA55AA, kMideaBits, 2); // 2 repeats.
  113. EXPECT_EQ(
  114. "m4480s4480"
  115. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  116. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  117. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  118. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  119. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  120. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  121. "m560s5600"
  122. "m4480s4480"
  123. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  124. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  125. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  126. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  127. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  128. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  129. "m560s5600"
  130. "m4480s4480"
  131. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  132. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  133. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  134. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  135. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  136. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  137. "m560s5600"
  138. "m4480s4480"
  139. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  140. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  141. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  142. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  143. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  144. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  145. "m560s5600"
  146. "m4480s4480"
  147. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  148. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  149. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  150. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  151. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  152. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  153. "m560s5600"
  154. "m4480s4480"
  155. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  156. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  157. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  158. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  159. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
  160. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680"
  161. "m560s5600",
  162. irsend.outputStr());
  163. }
  164. // Test sending an atypical data size.
  165. TEST(TestSendMidea, SendUnusualSize) {
  166. IRsendTest irsend(4);
  167. irsend.begin();
  168. irsend.reset();
  169. irsend.sendMidea(0x0, 8);
  170. EXPECT_EQ(
  171. "m4480s4480"
  172. "m560s560m560s560m560s560m560s560m560s560m560s560m560s560m560s560"
  173. "m560s5600"
  174. "m4480s4480"
  175. "m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680m560s1680"
  176. "m560s5600",
  177. irsend.outputStr());
  178. irsend.reset();
  179. irsend.sendMidea(0x1234567890ABCDEF, 64);
  180. EXPECT_EQ(
  181. "m4480s4480"
  182. "m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680m560s560"
  183. "m560s560m560s560m560s1680m560s1680m560s560m560s1680m560s560m560s560"
  184. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  185. "m560s560m560s1680m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  186. "m560s1680m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
  187. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s1680"
  188. "m560s1680m560s1680m560s560m560s560m560s1680m560s1680m560s560m560s1680"
  189. "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
  190. "m560s5600"
  191. "m4480s4480"
  192. "m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560m560s1680"
  193. "m560s1680m560s1680m560s560m560s560m560s1680m560s560m560s1680m560s1680"
  194. "m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560m560s1680"
  195. "m560s1680m560s560m560s560m560s560m560s560m560s1680m560s1680m560s1680"
  196. "m560s560m560s1680m560s1680m560s560m560s1680m560s1680m560s1680m560s1680"
  197. "m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s560"
  198. "m560s560m560s560m560s1680m560s1680m560s560m560s560m560s1680m560s560"
  199. "m560s560m560s560m560s560m560s1680m560s560m560s560m560s560m560s560"
  200. "m560s5600",
  201. irsend.outputStr());
  202. // Bit sizes must be a multiple of 8.
  203. irsend.reset();
  204. irsend.sendMidea(0x0, 17);
  205. EXPECT_EQ("", irsend.outputStr());
  206. }
  207. // Tests for IRMideaAC class.
  208. // Tests for controlling the power state.
  209. TEST(TestMideaACClass, Power) {
  210. IRMideaAC midea(0);
  211. midea.begin();
  212. midea.setRaw(0xA1026FFFFFE2); // Power off.
  213. midea.on();
  214. EXPECT_TRUE(midea.getPower());
  215. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  216. midea.off();
  217. EXPECT_FALSE(midea.getPower());
  218. EXPECT_EQ(0xA1026FFFFFE2, midea.getRaw());
  219. midea.setPower(true);
  220. EXPECT_TRUE(midea.getPower());
  221. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  222. midea.setPower(false);
  223. EXPECT_FALSE(midea.getPower());
  224. EXPECT_EQ(0xA1026FFFFFE2, midea.getRaw());
  225. }
  226. // Tests for the various Checksum routines.
  227. TEST(TestMideaACClass, Checksums) {
  228. IRMideaAC midea(0);
  229. midea.begin();
  230. // Known good states
  231. EXPECT_EQ(0x62, IRMideaAC::calcChecksum(0xA1826FFFFF62));
  232. EXPECT_EQ(0x70, IRMideaAC::calcChecksum(0xA18177FFFF70));
  233. // Now without the checksum part.
  234. EXPECT_EQ(0x62, IRMideaAC::calcChecksum(0xA1826FFFFF00));
  235. EXPECT_EQ(0x70, IRMideaAC::calcChecksum(0xA18177FFFF00));
  236. // Made up values.
  237. EXPECT_EQ(0x00, IRMideaAC::calcChecksum(0x000000000000));
  238. EXPECT_EQ(0xDF, IRMideaAC::calcChecksum(0x1234567890AB));
  239. EXPECT_EQ(0xA0, IRMideaAC::calcChecksum(0xFFFFFFFFFFFF));
  240. // Larger than expected value (full 64bit)
  241. EXPECT_EQ(0xDF, IRMideaAC::calcChecksum(0xFF1234567890AB));
  242. EXPECT_EQ(0xDF, IRMideaAC::calcChecksum(0x551234567890AB));
  243. // Validity tests.
  244. EXPECT_TRUE(IRMideaAC::validChecksum(0xA1826FFFFF62));
  245. EXPECT_TRUE(IRMideaAC::validChecksum(0xA18177FFFF70));
  246. EXPECT_FALSE(IRMideaAC::validChecksum(0x1234567890AB));
  247. // Doing a setRaw() with a bad state should make a valid checksum on getRaw().
  248. midea.setRaw(0xA1826FFFFF00);
  249. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  250. }
  251. TEST(TestMideaACClass, OperatingMode) {
  252. IRMideaAC midea(0);
  253. midea.begin();
  254. midea.setRaw(0xA1826FFFFF62); // Auto mode already set.
  255. midea.setMode(kMideaACAuto);
  256. EXPECT_EQ(kMideaACAuto, midea.getMode());
  257. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw()); // State shouldn't have changed.
  258. midea.setMode(kMideaACCool);
  259. EXPECT_EQ(kMideaACCool, midea.getMode());
  260. EXPECT_EQ(0xA1806FFFFF61, midea.getRaw());
  261. midea.setMode(kMideaACAuto);
  262. EXPECT_EQ(kMideaACAuto, midea.getMode());
  263. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  264. midea.setMode(kMideaACHeat);
  265. EXPECT_EQ(kMideaACHeat, midea.getMode());
  266. EXPECT_EQ(0xA1836FFFFF63, midea.getRaw());
  267. midea.setMode(kMideaACDry);
  268. EXPECT_EQ(kMideaACDry, midea.getMode());
  269. EXPECT_EQ(0xA1816FFFFF60, midea.getRaw());
  270. midea.setMode(kMideaACFan);
  271. EXPECT_EQ(kMideaACFan, midea.getMode());
  272. EXPECT_EQ(0xA1846FFFFF66, midea.getRaw());
  273. midea.setMode(255);
  274. EXPECT_EQ(kMideaACAuto, midea.getMode());
  275. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  276. }
  277. TEST(TestMideaACClass, FanSpeed) {
  278. IRMideaAC midea(0);
  279. midea.begin();
  280. midea.setRaw(0xA1826FFFFF62); // Auto mode already set.
  281. EXPECT_EQ(kMideaACFanAuto, midea.getFan());
  282. midea.setFan(kMideaACFanLow);
  283. EXPECT_EQ(kMideaACFanLow, midea.getFan());
  284. EXPECT_EQ(0xA18A6FFFFF6C, midea.getRaw());
  285. midea.setFan(255); // Setting an unexpected value defaults to auto.
  286. EXPECT_EQ(kMideaACFanAuto, midea.getFan());
  287. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  288. midea.setFan(kMideaACFanMed);
  289. EXPECT_EQ(kMideaACFanMed, midea.getFan());
  290. EXPECT_EQ(0xA1926FFFFF7C, midea.getRaw());
  291. midea.setFan(kMideaACFanHigh);
  292. EXPECT_EQ(kMideaACFanHigh, midea.getFan());
  293. EXPECT_EQ(0xA19A6FFFFF74, midea.getRaw());
  294. midea.setFan(kMideaACFanAuto);
  295. EXPECT_EQ(kMideaACFanAuto, midea.getFan());
  296. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  297. }
  298. TEST(TestMideaACClass, Temperature) {
  299. IRMideaAC midea(0);
  300. midea.begin();
  301. midea.setRaw(0xA1826FFFFF62); // 77F / 25C
  302. EXPECT_EQ(77, midea.getTemp()); // F
  303. EXPECT_EQ(77, midea.getTemp(false)); // F
  304. EXPECT_EQ(25, midea.getTemp(true)); // F
  305. midea.setTemp(0);
  306. EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
  307. EXPECT_EQ(0xA18260FFFF6C, midea.getRaw());
  308. midea.setTemp(255);
  309. EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
  310. EXPECT_EQ(0xA18278FFFF78, midea.getRaw());
  311. midea.setTemp(0, true);
  312. EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
  313. EXPECT_EQ(0xA18260FFFF6C, midea.getRaw());
  314. midea.setTemp(255, true);
  315. EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
  316. EXPECT_EQ(0xA18278FFFF78, midea.getRaw());
  317. // fahrenheit min/max etc.
  318. midea.setTemp(kMideaACMinTempF);
  319. EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
  320. midea.setTemp(kMideaACMaxTempF);
  321. EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
  322. midea.setTemp(kMideaACMinTempF - 1);
  323. EXPECT_EQ(kMideaACMinTempF, midea.getTemp());
  324. midea.setTemp(kMideaACMaxTempF + 1);
  325. EXPECT_EQ(kMideaACMaxTempF, midea.getTemp());
  326. // celsius min/max etc.
  327. midea.setTemp(kMideaACMinTempC, true);
  328. EXPECT_EQ(kMideaACMinTempC, midea.getTemp(true));
  329. EXPECT_EQ(kMideaACMinTempF, midea.getTemp(false));
  330. midea.setTemp(kMideaACMaxTempC, true);
  331. EXPECT_EQ(kMideaACMaxTempC, midea.getTemp(true));
  332. EXPECT_EQ(kMideaACMaxTempF, midea.getTemp(false));
  333. midea.setTemp(kMideaACMinTempC - 1, true);
  334. EXPECT_EQ(kMideaACMinTempC, midea.getTemp(true));
  335. midea.setTemp(kMideaACMaxTempC + 1, true);
  336. EXPECT_EQ(kMideaACMaxTempC, midea.getTemp(true));
  337. EXPECT_EQ(kMideaACMaxTempF, midea.getTemp(false));
  338. // General changes.
  339. midea.setTemp(17, true); // C
  340. EXPECT_EQ(17, midea.getTemp(true)); // C
  341. EXPECT_EQ(63, midea.getTemp(false)); // F
  342. midea.setTemp(21, true); // C
  343. EXPECT_EQ(21, midea.getTemp(true)); // C
  344. EXPECT_EQ(70, midea.getTemp(false)); // F
  345. midea.setTemp(25, true); // C
  346. EXPECT_EQ(25, midea.getTemp(true)); // C
  347. EXPECT_EQ(77, midea.getTemp(false)); // F
  348. midea.setTemp(30, true); // C
  349. EXPECT_EQ(30, midea.getTemp(true)); // C
  350. EXPECT_EQ(86, midea.getTemp(false)); // F
  351. midea.setTemp(80, false); // F
  352. EXPECT_EQ(26, midea.getTemp(true)); // C
  353. EXPECT_EQ(80, midea.getTemp(false)); // F
  354. midea.setTemp(70); // F
  355. EXPECT_EQ(21, midea.getTemp(true)); // C
  356. EXPECT_EQ(70, midea.getTemp(false)); // F
  357. EXPECT_EQ(70, midea.getTemp()); // F
  358. }
  359. // Tests for controlling the sleep state.
  360. TEST(TestMideaACClass, Sleep) {
  361. IRMideaAC midea(0);
  362. midea.begin();
  363. midea.setRaw(0xA1826FFFFF62); // Sleep off.
  364. EXPECT_FALSE(midea.getSleep());
  365. midea.setSleep(true);
  366. EXPECT_TRUE(midea.getSleep());
  367. EXPECT_EQ(0xA1C26FFFFF22, midea.getRaw());
  368. midea.setSleep(false);
  369. EXPECT_FALSE(midea.getSleep());
  370. EXPECT_EQ(0xA1826FFFFF62, midea.getRaw());
  371. }
  372. TEST(TestMideaACClass, HumanReadableOutput) {
  373. IRMideaAC midea(0);
  374. midea.begin();
  375. midea.setRaw(0xA1826FFFFF62);
  376. EXPECT_EQ(
  377. "Power: On, Mode: 2 (AUTO), Temp: 25C/77F, Fan: 0 (AUTO), "
  378. "Sleep: Off",
  379. midea.toString());
  380. midea.off();
  381. midea.setTemp(25);
  382. midea.setFan(kMideaACFanHigh);
  383. midea.setMode(kMideaACDry);
  384. midea.setSleep(true);
  385. EXPECT_EQ("Power: Off, Mode: 1 (DRY), Temp: 16C/62F, Fan: 3 (HI), Sleep: On",
  386. midea.toString());
  387. midea.setRaw(0xA19867FFFF7E);
  388. EXPECT_EQ("Power: On, Mode: 0 (COOL), Temp: 20C/69F, Fan: 3 (HI), Sleep: Off",
  389. midea.toString());
  390. }
  391. // Tests for decodeMidea().
  392. // Decode normal Midea messages with strict set.
  393. TEST(TestDecodeMidea, NormalDecodeWithStrict) {
  394. IRsendTest irsend(4);
  395. IRrecv irrecv(4);
  396. irsend.begin();
  397. // Normal Midea 48-bit message.
  398. irsend.reset();
  399. irsend.sendMidea(0x1234567890DF);
  400. irsend.makeDecodeResult();
  401. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  402. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  403. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  404. EXPECT_EQ(0x1234567890DF, irsend.capture.value);
  405. EXPECT_EQ(0x0, irsend.capture.address);
  406. EXPECT_EQ(0x0, irsend.capture.command);
  407. EXPECT_FALSE(irsend.capture.repeat);
  408. // Normal Midea 48-bit message.
  409. irsend.reset();
  410. irsend.sendMidea(0x0);
  411. irsend.makeDecodeResult();
  412. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  413. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  414. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  415. EXPECT_EQ(0x0, irsend.capture.value);
  416. EXPECT_EQ(0x0, irsend.capture.address);
  417. EXPECT_EQ(0x0, irsend.capture.command);
  418. EXPECT_FALSE(irsend.capture.repeat);
  419. // Normal Midea 48-bit message.
  420. irsend.reset();
  421. irsend.sendMidea(0xFFFFFFFFFFA0);
  422. irsend.makeDecodeResult();
  423. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  424. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  425. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  426. EXPECT_EQ(0xFFFFFFFFFFA0, irsend.capture.value);
  427. EXPECT_EQ(0x0, irsend.capture.address);
  428. EXPECT_EQ(0x0, irsend.capture.command);
  429. EXPECT_FALSE(irsend.capture.repeat);
  430. // Real Midea 48-bit message via just decode().
  431. // i.e. No conficts with other decoders.
  432. irsend.reset();
  433. irsend.sendMidea(0xA18263FFFF6E);
  434. irsend.makeDecodeResult();
  435. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  436. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  437. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  438. EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
  439. EXPECT_EQ(0x0, irsend.capture.address);
  440. EXPECT_EQ(0x0, irsend.capture.command);
  441. EXPECT_FALSE(irsend.capture.repeat);
  442. }
  443. // Decode normal repeated Midea messages.
  444. TEST(TestDecodeMidea, NormalDecodeWithRepeatAndStrict) {
  445. IRsendTest irsend(4);
  446. IRrecv irrecv(4);
  447. irsend.begin();
  448. // Normal Midea 48-bit message with 2 repeats.
  449. irsend.reset();
  450. irsend.sendMidea(0xA18263FFFF6E, kMideaBits, 2);
  451. irsend.makeDecodeResult();
  452. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  453. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  454. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  455. EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
  456. EXPECT_FALSE(irsend.capture.repeat);
  457. irsend.makeDecodeResult(2 * (2 * kMideaBits + 4));
  458. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  459. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  460. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  461. EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
  462. irsend.makeDecodeResult(4 * (2 * kMideaBits + 4));
  463. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  464. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  465. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  466. EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
  467. }
  468. // Decode unsupported Midea messages.
  469. TEST(TestDecodeMidea, DecodeWithNonStrictSizes) {
  470. IRsendTest irsend(4);
  471. IRrecv irrecv(4);
  472. irsend.begin();
  473. irsend.reset();
  474. irsend.sendMidea(0x12, 8); // Illegal value Midea 8-bit message.
  475. irsend.makeDecodeResult();
  476. // Should fail with strict on.
  477. ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  478. // Should pass if strict off.
  479. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 8, false));
  480. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  481. EXPECT_EQ(8, irsend.capture.bits);
  482. EXPECT_EQ(0x12, irsend.capture.value);
  483. irsend.reset();
  484. irsend.sendMidea(0x12345678, 32); // Illegal value Midea 32-bit message.
  485. irsend.makeDecodeResult();
  486. // Shouldn't pass with strict when we ask for less bits than we got.
  487. ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, true));
  488. irsend.makeDecodeResult();
  489. // Should fail with strict when we ask for the wrong bit size.
  490. ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, 32, true));
  491. // Should pass if strict off.
  492. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 32, false));
  493. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  494. EXPECT_EQ(32, irsend.capture.bits);
  495. EXPECT_EQ(0x12345678, irsend.capture.value);
  496. // Decode should fail if asked to decode non-multiples of 8 bits.
  497. irsend.reset();
  498. irsend.sendMidea(0x123456, kMideaBits, 2);
  499. irsend.makeDecodeResult();
  500. ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, 9, false));
  501. }
  502. // Decode (non-standard) 64-bit messages.
  503. TEST(TestDecodeMidea, Decode64BitMessages) {
  504. IRsendTest irsend(4);
  505. IRrecv irrecv(4);
  506. irsend.begin();
  507. irsend.reset();
  508. // Illegal size Midea 64-bit message.
  509. irsend.sendMidea(0xFFFFFFFFFFFFFFFF, 64);
  510. irsend.makeDecodeResult();
  511. // Should work with a 'normal' match (not strict)
  512. ASSERT_TRUE(irrecv.decodeMidea(&irsend.capture, 64, false));
  513. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  514. EXPECT_EQ(64, irsend.capture.bits);
  515. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  516. }
  517. // Fail to decode a non-Midea example via GlobalCache
  518. TEST(TestDecodeMidea, FailToDecodeNonMideaExample) {
  519. IRsendTest irsend(4);
  520. IRrecv irrecv(4);
  521. irsend.begin();
  522. irsend.reset();
  523. // Modified a few entries to unexpected values, based on previous test case.
  524. uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
  525. 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
  526. 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
  527. 61, 20, 20, 20, 20, 20, 20, 20, 884};
  528. irsend.sendGC(gc_test, 39);
  529. irsend.makeDecodeResult();
  530. ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture));
  531. ASSERT_FALSE(irrecv.decodeMidea(&irsend.capture, kMideaBits, false));
  532. }
  533. // Decode against a real capture reported by a user. See issue #354
  534. TEST(TestDecodeMidea, DecodeRealExample) {
  535. IRsendTest irsend(4);
  536. IRrecv irrecv(4);
  537. irsend.begin();
  538. irsend.reset();
  539. uint16_t rawData[199] = {
  540. 4366, 4470, 498, 1658, 522, 554, 498, 1658, 496, 580, 498, 580,
  541. 498, 578, 498, 580, 498, 1658, 498, 1658, 498, 578, 498, 578,
  542. 498, 580, 496, 582, 496, 578, 498, 1658, 498, 580, 498, 580,
  543. 498, 1656, 498, 1656, 500, 580, 498, 578, 502, 576, 500, 1656,
  544. 498, 1656, 500, 1654, 500, 1656, 500, 1656, 498, 1658, 498, 1656,
  545. 500, 1658, 498, 1656, 498, 1656, 500, 1656, 500, 1654, 500, 1578,
  546. 578, 1658, 498, 1656, 500, 1658, 498, 1656, 498, 1656, 500, 578,
  547. 498, 1638, 516, 1656, 500, 578, 500, 1656, 500, 1656, 498, 1658,
  548. 522, 554, 500, 5258, 4366, 4472, 498, 580, 498, 1658, 498, 580,
  549. 498, 1656, 500, 1600, 556, 1658, 500, 1656, 500, 578, 498, 578,
  550. 522, 1634, 498, 1588, 568, 1658, 498, 1656, 500, 1654, 498, 580,
  551. 498, 1658, 498, 1658, 498, 580, 496, 578, 500, 1654, 500, 1636,
  552. 518, 1656, 500, 578, 520, 558, 498, 578, 498, 580, 498, 576,
  553. 500, 578, 498, 580, 498, 578, 498, 578, 498, 580, 498, 578,
  554. 498, 580, 498, 580, 520, 556, 498, 580, 496, 580, 498, 578,
  555. 500, 578, 498, 1658, 498, 580, 498, 578, 498, 1656, 500, 578,
  556. 498, 580, 498, 580, 498, 1656, 522};
  557. irsend.sendRaw(rawData, 199, 38000);
  558. irsend.makeDecodeResult();
  559. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  560. EXPECT_EQ(MIDEA, irsend.capture.decode_type);
  561. EXPECT_EQ(kMideaBits, irsend.capture.bits);
  562. EXPECT_EQ(0xA18263FFFF6E, irsend.capture.value);
  563. }