ir_Toshiba_test.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. // Copyright 2017 David Conran
  2. #include "ir_Toshiba.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 Toshiba A/C methods.
  9. // Test sending typical data only.
  10. TEST(TestSendToshibaAC, SendDataOnly) {
  11. IRsendTest irsend(4);
  12. irsend.begin();
  13. uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  14. 0x00, 0x00, 0x00, 0x00};
  15. irsend.reset();
  16. irsend.sendToshibaAC(toshiba_code);
  17. EXPECT_EQ(
  18. "m4400s4300"
  19. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  20. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  21. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  22. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  23. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  24. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  25. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  26. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  27. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  28. "m543s7048"
  29. "m4400s4300"
  30. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  31. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  32. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  33. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  34. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  35. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  36. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  37. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  38. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  39. "m543s7048",
  40. irsend.outputStr());
  41. }
  42. // Test sending with repeats.
  43. TEST(TestSendToshibaAC, SendWithRepeats) {
  44. IRsendTest irsend(4);
  45. irsend.begin();
  46. irsend.reset();
  47. uint8_t toshiba_code[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  48. 0x00, 0x00, 0x00, 0x00};
  49. irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 0);
  50. EXPECT_EQ(
  51. "m4400s4300"
  52. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  53. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  54. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  55. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  56. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  57. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  58. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  59. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  60. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  61. "m543s7048",
  62. irsend.outputStr());
  63. irsend.reset();
  64. irsend.sendToshibaAC(toshiba_code, kToshibaACStateLength, 2);
  65. EXPECT_EQ(
  66. "m4400s4300"
  67. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  68. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  69. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  70. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  71. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  72. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  73. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  74. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  75. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  76. "m543s7048"
  77. "m4400s4300"
  78. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  79. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  80. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  81. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  82. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  83. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  84. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  85. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  86. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  87. "m543s7048"
  88. "m4400s4300"
  89. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  90. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  91. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  92. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  93. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  94. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  95. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  96. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  97. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  98. "m543s7048",
  99. irsend.outputStr());
  100. }
  101. // Test sending atypical sizes.
  102. TEST(TestSendToshibaAC, SendUnexpectedSizes) {
  103. IRsendTest irsend(4);
  104. irsend.begin();
  105. uint8_t toshiba_short_code[8] = {0x01, 0x02, 0x03, 0x04,
  106. 0x05, 0x06, 0x07, 0x08};
  107. uint8_t toshiba_long_code[10] = {0x01, 0x02, 0x03, 0x04, 0x05,
  108. 0x06, 0x07, 0x08, 0x09, 0x0A};
  109. irsend.reset();
  110. irsend.sendToshibaAC(toshiba_short_code, kToshibaACStateLength - 1);
  111. ASSERT_EQ("", irsend.outputStr());
  112. irsend.reset();
  113. irsend.sendToshibaAC(toshiba_long_code, kToshibaACStateLength + 1);
  114. ASSERT_EQ(
  115. "m4400s4300"
  116. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  117. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s472"
  118. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  119. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s472"
  120. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623"
  121. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472"
  122. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s1623"
  123. "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s472"
  124. "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s1623"
  125. "m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623m543s472"
  126. "m543s7048"
  127. "m4400s4300"
  128. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  129. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s472"
  130. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  131. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s472"
  132. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623"
  133. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472"
  134. "m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623m543s1623"
  135. "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s472"
  136. "m543s472m543s472m543s472m543s472m543s1623m543s472m543s472m543s1623"
  137. "m543s472m543s472m543s472m543s472m543s1623m543s472m543s1623m543s472"
  138. "m543s7048",
  139. irsend.outputStr());
  140. }
  141. // Tests for IRToshibaAC class.
  142. TEST(TestToshibaACClass, Power) {
  143. IRToshibaAC toshiba(0);
  144. toshiba.begin();
  145. toshiba.on();
  146. EXPECT_TRUE(toshiba.getPower());
  147. toshiba.off();
  148. EXPECT_FALSE(toshiba.getPower());
  149. toshiba.setPower(true);
  150. EXPECT_TRUE(toshiba.getPower());
  151. toshiba.setPower(false);
  152. EXPECT_FALSE(toshiba.getPower());
  153. }
  154. TEST(TestToshibaACClass, Temperature) {
  155. IRToshibaAC toshiba(0);
  156. toshiba.begin();
  157. toshiba.setTemp(0);
  158. EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
  159. toshiba.setTemp(255);
  160. EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp());
  161. toshiba.setTemp(kToshibaAcMinTemp);
  162. EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
  163. toshiba.setTemp(kToshibaAcMaxTemp);
  164. EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp());
  165. toshiba.setTemp(kToshibaAcMinTemp - 1);
  166. EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
  167. toshiba.setTemp(kToshibaAcMaxTemp + 1);
  168. EXPECT_EQ(kToshibaAcMaxTemp, toshiba.getTemp());
  169. toshiba.setTemp(17);
  170. EXPECT_EQ(17, toshiba.getTemp());
  171. toshiba.setTemp(21);
  172. EXPECT_EQ(21, toshiba.getTemp());
  173. toshiba.setTemp(25);
  174. EXPECT_EQ(25, toshiba.getTemp());
  175. toshiba.setTemp(30);
  176. EXPECT_EQ(30, toshiba.getTemp());
  177. }
  178. TEST(TestToshibaACClass, OperatingMode) {
  179. IRToshibaAC toshiba(0);
  180. toshiba.begin();
  181. toshiba.setMode(kToshibaAcAuto);
  182. EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
  183. toshiba.setMode(kToshibaAcCool);
  184. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  185. toshiba.setMode(kToshibaAcHeat);
  186. EXPECT_EQ(kToshibaAcHeat, toshiba.getMode());
  187. toshiba.setMode(kToshibaAcDry);
  188. EXPECT_EQ(kToshibaAcDry, toshiba.getMode());
  189. toshiba.setMode(kToshibaAcHeat + 1);
  190. EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
  191. toshiba.setMode(255);
  192. EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
  193. // Setting the power off changes the underlying mode in the state to heat.
  194. toshiba.setPower(true);
  195. toshiba.setMode(kToshibaAcCool);
  196. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  197. EXPECT_EQ(kToshibaAcCool, toshiba.getMode(true));
  198. toshiba.setPower(false);
  199. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  200. EXPECT_EQ(kToshibaAcHeat, toshiba.getMode(true));
  201. }
  202. TEST(TestToshibaACClass, FanSpeed) {
  203. IRToshibaAC toshiba(0);
  204. toshiba.begin();
  205. toshiba.setFan(kToshibaAcFanAuto);
  206. EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
  207. toshiba.setFan(255);
  208. EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
  209. toshiba.setFan(kToshibaAcFanMax);
  210. EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
  211. toshiba.setFan(kToshibaAcFanMax - 1);
  212. EXPECT_EQ(kToshibaAcFanMax - 1, toshiba.getFan());
  213. toshiba.setFan(1);
  214. EXPECT_EQ(1, toshiba.getFan());
  215. toshiba.setFan(2);
  216. EXPECT_EQ(2, toshiba.getFan());
  217. toshiba.setFan(3);
  218. EXPECT_EQ(3, toshiba.getFan());
  219. toshiba.setFan(4);
  220. EXPECT_EQ(4, toshiba.getFan());
  221. toshiba.setFan(kToshibaAcFanMax + 1);
  222. EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
  223. }
  224. TEST(TestToshibaACClass, RawState) {
  225. IRToshibaAC toshiba(0);
  226. toshiba.begin();
  227. uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  228. 0x00, 0x00, 0x00, 0x01};
  229. uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  230. 0x00, 0xC1, 0x00, 0xC0};
  231. // Verify the starting state.
  232. EXPECT_STATE_EQ(initial_state, toshiba.getRaw(), kToshibaACBits);
  233. EXPECT_TRUE(toshiba.getPower());
  234. EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
  235. EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
  236. // Change some settings.
  237. toshiba.setMode(kToshibaAcCool);
  238. toshiba.setFan(kToshibaAcFanMax);
  239. toshiba.setTemp(kToshibaAcMinTemp);
  240. // Verify those were set.
  241. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  242. EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
  243. EXPECT_EQ(kToshibaAcMinTemp, toshiba.getTemp());
  244. // Retrieve the modified state.
  245. EXPECT_STATE_EQ(modified_state, toshiba.getRaw(), kToshibaACBits);
  246. // Set it back to the initial state.
  247. toshiba.setRaw(initial_state);
  248. // Check the new state was set correctly.
  249. EXPECT_TRUE(toshiba.getPower());
  250. EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
  251. EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
  252. EXPECT_STATE_EQ(initial_state, toshiba.getRaw(), kToshibaACBits);
  253. }
  254. TEST(TestToshibaACClass, Checksums) {
  255. IRToshibaAC toshiba(0);
  256. toshiba.begin();
  257. uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  258. 0x00, 0x00, 0x00, 0x01};
  259. uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  260. 0x00, 0xC1, 0x00, 0xC0};
  261. uint8_t invalid_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  262. 0x00, 0x00, 0x00, 0x00};
  263. EXPECT_EQ(0x01, toshiba.calcChecksum(initial_state));
  264. EXPECT_EQ(0xC0, toshiba.calcChecksum(modified_state));
  265. // Check we can call it without instantiating the object.
  266. EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state));
  267. // Use different lengths.
  268. EXPECT_EQ(0x01, IRToshibaAC::calcChecksum(initial_state,
  269. kToshibaACStateLength - 1));
  270. EXPECT_EQ(0xFF, IRToshibaAC::calcChecksum(initial_state, 3));
  271. // Minimum length that actually means anything.
  272. EXPECT_EQ(0xF2, IRToshibaAC::calcChecksum(initial_state, 2));
  273. // Technically, there is no such thing as a checksum for a length of < 2
  274. // But test it anyway
  275. EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 1));
  276. EXPECT_EQ(0x00, IRToshibaAC::calcChecksum(initial_state, 0));
  277. // Validity tests.
  278. EXPECT_TRUE(IRToshibaAC::validChecksum(initial_state));
  279. EXPECT_TRUE(IRToshibaAC::validChecksum(modified_state));
  280. EXPECT_FALSE(IRToshibaAC::validChecksum(invalid_state));
  281. EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 0));
  282. EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 1));
  283. EXPECT_FALSE(IRToshibaAC::validChecksum(initial_state, 2));
  284. }
  285. TEST(TestToshibaACClass, HumanReadableOutput) {
  286. IRToshibaAC toshiba(0);
  287. toshiba.begin();
  288. uint8_t initial_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  289. 0x00, 0x00, 0x00, 0x01};
  290. uint8_t modified_state[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  291. 0x00, 0xC1, 0x00, 0xC0};
  292. toshiba.setRaw(initial_state);
  293. EXPECT_EQ("Power: On, Mode: 0 (AUTO), Temp: 17C, Fan: 0 (AUTO)",
  294. toshiba.toString());
  295. toshiba.setRaw(modified_state);
  296. EXPECT_EQ("Power: On, Mode: 1 (COOL), Temp: 17C, Fan: 5 (MAX)",
  297. toshiba.toString());
  298. toshiba.off();
  299. toshiba.setTemp(25);
  300. toshiba.setFan(3);
  301. toshiba.setMode(kToshibaAcDry);
  302. EXPECT_EQ("Power: Off, Mode: 2 (DRY), Temp: 25C, Fan: 3", toshiba.toString());
  303. }
  304. TEST(TestToshibaACClass, MessageConstuction) {
  305. IRToshibaAC toshiba(0);
  306. IRsendTest irsend(4);
  307. toshiba.begin();
  308. irsend.begin();
  309. toshiba.setFan(1);
  310. toshiba.setMode(kToshibaAcCool);
  311. toshiba.setTemp(27);
  312. toshiba.on();
  313. // Check everything for kicks.
  314. EXPECT_EQ(1, toshiba.getFan());
  315. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  316. EXPECT_EQ(27, toshiba.getTemp());
  317. EXPECT_TRUE(toshiba.getPower());
  318. irsend.reset();
  319. irsend.sendToshibaAC(toshiba.getRaw());
  320. EXPECT_EQ(
  321. "m4400s4300"
  322. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  323. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  324. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  325. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  326. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  327. "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
  328. "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
  329. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  330. "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
  331. "m543s7048"
  332. "m4400s4300"
  333. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  334. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  335. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  336. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  337. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  338. "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
  339. "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
  340. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  341. "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
  342. "m543s7048",
  343. irsend.outputStr());
  344. // Turn off the power and re-check.
  345. toshiba.setPower(false);
  346. // Check everything for kicks.
  347. EXPECT_EQ(1, toshiba.getFan());
  348. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  349. EXPECT_EQ(27, toshiba.getTemp());
  350. EXPECT_FALSE(toshiba.getPower());
  351. irsend.reset();
  352. irsend.sendToshibaAC(toshiba.getRaw());
  353. EXPECT_EQ(
  354. "m4400s4300"
  355. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  356. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  357. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  358. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  359. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  360. "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
  361. "m543s472m543s1623m543s472m543s472m543s472m543s1623m543s1623m543s1623"
  362. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  363. "m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s1623m543s472"
  364. "m543s7048"
  365. "m4400s4300"
  366. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  367. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  368. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  369. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  370. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  371. "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
  372. "m543s472m543s1623m543s472m543s472m543s472m543s1623m543s1623m543s1623"
  373. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  374. "m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s1623m543s472"
  375. "m543s7048",
  376. irsend.outputStr());
  377. // Turn the power back on, and check nothing changed.
  378. toshiba.on();
  379. EXPECT_EQ(1, toshiba.getFan());
  380. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  381. EXPECT_EQ(27, toshiba.getTemp());
  382. EXPECT_TRUE(toshiba.getPower());
  383. irsend.reset();
  384. irsend.sendToshibaAC(toshiba.getRaw());
  385. EXPECT_EQ(
  386. "m4400s4300"
  387. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  388. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  389. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  390. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  391. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  392. "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
  393. "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
  394. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  395. "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
  396. "m543s7048"
  397. "m4400s4300"
  398. "m543s1623m543s1623m543s1623m543s1623m543s472m543s472m543s1623m543s472"
  399. "m543s472m543s472m543s472m543s472m543s1623m543s1623m543s472m543s1623"
  400. "m543s472m543s472m543s472m543s472m543s472m543s472m543s1623m543s1623"
  401. "m543s1623m543s1623m543s1623m543s1623m543s1623m543s1623m543s472m543s472"
  402. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s1623"
  403. "m543s1623m543s472m543s1623m543s472m543s472m543s472m543s472m543s472"
  404. "m543s472m543s1623m543s472m543s472m543s472m543s472m543s472m543s1623"
  405. "m543s472m543s472m543s472m543s472m543s472m543s472m543s472m543s472"
  406. "m543s1623m543s1623m543s1623m543s472m543s472m543s472m543s472m543s472"
  407. "m543s7048",
  408. irsend.outputStr());
  409. }
  410. // Decoding a message we entirely constructed based solely on a given state.
  411. TEST(TestDecodeToshibaAC, SyntheticExample) {
  412. IRsendTest irsend(4);
  413. IRrecv irrecv(4);
  414. irsend.begin();
  415. uint8_t expectedState[kToshibaACStateLength] = {0xF2, 0x0D, 0x03, 0xFC, 0x01,
  416. 0x00, 0x00, 0x00, 0x01};
  417. irsend.reset();
  418. irsend.sendToshibaAC(expectedState);
  419. irsend.makeDecodeResult();
  420. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  421. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  422. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  423. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  424. }
  425. // Test decoding against captures from a real Toshiba A/C remote.
  426. // Recorded by @mwildbolz
  427. TEST(TestDecodeToshibaAC, RealExamples) {
  428. IRToshibaAC toshiba(0);
  429. IRsendTest irsend(4);
  430. IRrecv irrecv(4);
  431. irsend.begin();
  432. uint16_t rawData1[295] = {
  433. 4442, 4292, 612, 1544, 616, 1544, 616, 1544, 612, 1548, 610, 468,
  434. 612, 468, 662, 1494, 640, 438, 616, 464, 614, 464, 616, 464,
  435. 612, 468, 610, 1544, 616, 1544, 616, 468, 612, 1544, 616, 464,
  436. 694, 386, 616, 464, 612, 468, 612, 468, 636, 444, 610, 1546,
  437. 616, 1544, 612, 1546, 614, 1546, 616, 1546, 740, 1420, 612, 1544,
  438. 616, 1546, 616, 464, 610, 468, 610, 470, 612, 468, 610, 468,
  439. 610, 470, 636, 438, 616, 464, 616, 464, 616, 1546, 636, 442,
  440. 612, 1546, 614, 1544, 616, 464, 614, 464, 610, 468, 612, 468,
  441. 612, 468, 612, 468, 636, 440, 614, 464, 616, 464, 616, 464,
  442. 612, 468, 636, 442, 638, 442, 662, 418, 610, 464, 616, 464,
  443. 616, 464, 610, 468, 612, 468, 636, 444, 610, 468, 638, 438,
  444. 614, 1546, 612, 1548, 612, 470, 610, 468, 636, 442, 612, 468,
  445. 612, 1544, 612, 7396, 4442, 4292, 610, 1546, 616, 1544, 612, 1548,
  446. 612, 1546, 616, 464, 616, 464, 616, 1544, 612, 468, 662, 418,
  447. 610, 468, 638, 442, 638, 438, 616, 1546, 616, 1544, 612, 468,
  448. 610, 1546, 616, 464, 616, 464, 642, 438, 616, 464, 612, 468,
  449. 610, 470, 610, 1546, 616, 1544, 612, 1546, 616, 1546, 614, 1546,
  450. 612, 1550, 610, 1544, 616, 1546, 614, 464, 642, 438, 610, 468,
  451. 612, 468, 612, 468, 612, 468, 610, 468, 638, 438, 614, 464,
  452. 616, 1544, 636, 444, 636, 1520, 616, 1544, 616, 464, 616, 464,
  453. 612, 468, 612, 468, 612, 468, 612, 468, 612, 464, 612, 470,
  454. 636, 442, 638, 442, 612, 470, 692, 384, 614, 464, 616, 464,
  455. 612, 468, 610, 468, 612, 468, 610, 470, 610, 464, 616, 464,
  456. 616, 464, 616, 464, 610, 1550, 610, 1546, 640, 444, 688, 386,
  457. 616, 464, 612, 468, 612, 1544, 642};
  458. irsend.reset();
  459. irsend.sendRaw(rawData1, 295, 38000);
  460. irsend.makeDecodeResult();
  461. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  462. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  463. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  464. toshiba.setRaw(irsend.capture.state);
  465. EXPECT_TRUE(toshiba.getPower());
  466. EXPECT_EQ(23, toshiba.getTemp());
  467. EXPECT_EQ(kToshibaAcFanAuto, toshiba.getFan());
  468. EXPECT_EQ(kToshibaAcAuto, toshiba.getMode());
  469. uint16_t rawData2[295] = {
  470. 4500, 4236, 636, 1520, 642, 1520, 640, 1520, 664, 1492, 642, 440,
  471. 668, 412, 642, 1518, 638, 438, 666, 414, 640, 438, 642, 438,
  472. 638, 442, 642, 1516, 640, 1520, 642, 438, 642, 1520, 636, 438,
  473. 668, 412, 640, 440, 666, 412, 642, 438, 668, 412, 640, 1516,
  474. 668, 1492, 642, 1520, 666, 1494, 638, 1520, 642, 1520, 668, 1490,
  475. 666, 1494, 642, 438, 638, 438, 668, 412, 668, 412, 642, 438,
  476. 642, 438, 664, 412, 642, 438, 642, 438, 642, 1518, 642, 434,
  477. 668, 412, 642, 438, 668, 412, 692, 388, 666, 412, 642, 434,
  478. 642, 438, 642, 1518, 668, 412, 668, 412, 640, 438, 638, 438,
  479. 642, 438, 640, 438, 668, 1492, 642, 440, 666, 412, 640, 438,
  480. 642, 438, 642, 434, 668, 412, 668, 412, 666, 414, 666, 1494,
  481. 640, 438, 642, 434, 668, 412, 642, 438, 642, 438, 668, 412,
  482. 668, 414, 640, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520,
  483. 668, 1494, 640, 434, 642, 438, 640, 1520, 642, 438, 642, 438,
  484. 642, 438, 642, 438, 642, 434, 668, 1494, 642, 1518, 638, 442,
  485. 638, 1520, 642, 438, 642, 438, 668, 414, 664, 408, 642, 438,
  486. 668, 412, 642, 1520, 666, 1494, 642, 1514, 642, 1518, 642, 1520,
  487. 636, 1520, 668, 1494, 666, 1494, 638, 438, 666, 414, 640, 440,
  488. 666, 412, 668, 412, 668, 412, 642, 434, 668, 412, 668, 412,
  489. 668, 1494, 642, 438, 642, 434, 642, 438, 642, 438, 642, 438,
  490. 642, 438, 642, 434, 646, 434, 642, 1518, 668, 412, 642, 438,
  491. 642, 434, 666, 414, 640, 438, 642, 438, 642, 1518, 642, 438,
  492. 642, 434, 668, 412, 642, 438, 642, 438, 642, 438, 642, 438,
  493. 642, 438, 640, 1520, 636, 438, 642, 438, 642, 438, 666, 414,
  494. 668, 412, 642, 440, 640, 438, 640};
  495. irsend.reset();
  496. irsend.sendRaw(rawData2, 295, 38000);
  497. irsend.makeDecodeResult();
  498. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  499. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  500. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  501. toshiba.setRaw(irsend.capture.state);
  502. EXPECT_TRUE(toshiba.getPower());
  503. EXPECT_EQ(17, toshiba.getTemp());
  504. EXPECT_EQ(3, toshiba.getFan());
  505. EXPECT_EQ(kToshibaAcCool, toshiba.getMode());
  506. uint16_t rawData3[295] = {
  507. 4474, 4262, 642, 1514, 642, 1520, 642, 1520, 642, 1514, 642, 438,
  508. 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438,
  509. 642, 438, 640, 1520, 638, 1520, 642, 438, 640, 1520, 642, 438,
  510. 642, 434, 642, 438, 642, 438, 642, 438, 668, 414, 636, 1520,
  511. 642, 1520, 642, 1514, 642, 1520, 642, 1520, 640, 1518, 638, 1520,
  512. 666, 1494, 642, 438, 642, 434, 642, 438, 640, 438, 642, 438,
  513. 642, 440, 640, 434, 642, 438, 642, 438, 642, 1520, 642, 438,
  514. 642, 1514, 642, 1520, 640, 1520, 636, 438, 642, 438, 642, 438,
  515. 666, 414, 642, 1520, 636, 1520, 642, 438, 642, 438, 640, 438,
  516. 642, 434, 642, 1518, 642, 1520, 642, 438, 642, 434, 640, 438,
  517. 642, 438, 642, 438, 642, 440, 642, 438, 668, 408, 642, 1520,
  518. 642, 438, 642, 1520, 638, 1518, 642, 438, 642, 438, 640, 1520,
  519. 640, 438, 642, 7362, 4474, 4262, 642, 1518, 638, 1520, 640, 1520,
  520. 642, 1520, 638, 438, 642, 438, 642, 1518, 642, 438, 638, 438,
  521. 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438,
  522. 666, 1490, 642, 438, 642, 438, 642, 440, 640, 438, 642, 434,
  523. 640, 438, 642, 1520, 642, 1520, 636, 1520, 642, 1520, 642, 1514,
  524. 642, 1518, 642, 1518, 640, 1516, 642, 438, 642, 438, 642, 438,
  525. 640, 438, 638, 442, 642, 434, 642, 440, 640, 438, 642, 438,
  526. 642, 1518, 642, 438, 642, 1514, 642, 1520, 642, 1518, 642, 438,
  527. 642, 432, 642, 438, 642, 438, 642, 1520, 642, 1514, 642, 438,
  528. 642, 438, 642, 438, 642, 438, 642, 1514, 642, 1520, 642, 438,
  529. 642, 438, 638, 438, 642, 438, 642, 438, 640, 440, 642, 438,
  530. 640, 434, 642, 1520, 642, 438, 640, 1520, 668, 1490, 666, 414,
  531. 640, 438, 642, 1520, 642, 438, 636};
  532. irsend.reset();
  533. irsend.sendRaw(rawData3, 295, 38000);
  534. irsend.makeDecodeResult();
  535. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  536. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  537. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  538. toshiba.setRaw(irsend.capture.state);
  539. EXPECT_TRUE(toshiba.getPower());
  540. EXPECT_EQ(24, toshiba.getTemp());
  541. EXPECT_EQ(kToshibaAcFanMax, toshiba.getFan());
  542. EXPECT_EQ(kToshibaAcHeat, toshiba.getMode());
  543. uint16_t rawData4[295] = {
  544. 4474, 4262, 636, 1520, 640, 1520, 640, 1520, 638, 1518, 642, 438,
  545. 642, 438, 642, 1520, 636, 438, 642, 438, 642, 438, 642, 438,
  546. 636, 444, 636, 1520, 640, 1520, 642, 438, 638, 1524, 638, 438,
  547. 640, 438, 642, 438, 640, 438, 642, 438, 638, 438, 642, 1518,
  548. 642, 1520, 666, 1494, 636, 1520, 640, 1520, 640, 1520, 636, 1524,
  549. 638, 1520, 640, 440, 640, 438, 642, 438, 636, 444, 636, 438,
  550. 642, 438, 640, 440, 640, 438, 642, 438, 642, 1518, 638, 438,
  551. 642, 1518, 642, 438, 640, 1520, 636, 444, 636, 438, 640, 438,
  552. 642, 438, 668, 1494, 640, 438, 642, 1518, 636, 444, 636, 438,
  553. 640, 1520, 642, 1518, 642, 1520, 636, 444, 636, 438, 642, 438,
  554. 642, 438, 640, 440, 640, 438, 640, 440, 640, 438, 640, 1518,
  555. 642, 1520, 636, 1524, 636, 1518, 642, 438, 642, 1518, 642, 1518,
  556. 640, 438, 642, 7364, 4472, 4262, 642, 1518, 642, 1518, 638, 1518,
  557. 642, 1520, 642, 438, 642, 438, 640, 1520, 636, 440, 640, 438,
  558. 642, 438, 640, 438, 642, 438, 642, 1518, 636, 1524, 636, 438,
  559. 640, 1520, 642, 438, 642, 438, 640, 438, 636, 444, 636, 438,
  560. 668, 412, 642, 1518, 642, 1520, 642, 1520, 636, 1518, 642, 1518,
  561. 642, 1520, 636, 1520, 668, 1494, 642, 438, 636, 444, 664, 412,
  562. 642, 438, 668, 412, 642, 438, 636, 442, 638, 442, 638, 438,
  563. 642, 1518, 642, 438, 642, 1518, 638, 438, 642, 1518, 642, 440,
  564. 640, 438, 636, 444, 636, 444, 636, 1520, 642, 438, 642, 1520,
  565. 636, 444, 636, 438, 642, 1520, 640, 1520, 636, 1520, 668, 412,
  566. 642, 438, 642, 438, 642, 438, 638, 442, 636, 438, 642, 438,
  567. 668, 412, 640, 1520, 638, 1524, 636, 1520, 642, 1520, 636, 444,
  568. 638, 1522, 638, 1518, 640, 438, 642};
  569. irsend.reset();
  570. irsend.sendRaw(rawData4, 295, 38000);
  571. irsend.makeDecodeResult();
  572. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  573. ASSERT_EQ(TOSHIBA_AC, irsend.capture.decode_type);
  574. ASSERT_EQ(kToshibaACBits, irsend.capture.bits);
  575. toshiba.setRaw(irsend.capture.state);
  576. EXPECT_FALSE(toshiba.getPower());
  577. EXPECT_EQ(22, toshiba.getTemp());
  578. EXPECT_EQ(4, toshiba.getFan());
  579. // Confirming the quirky behaviour that the 'Power OFF' signal
  580. // sets the mode to heat.
  581. // The previous state the remote was in was 'AUTO' just prior to
  582. // sending the power off message.
  583. EXPECT_EQ(kToshibaAcHeat, toshiba.getMode());
  584. }