ir_Samsung_test.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. // Copyright 2017 David Conran
  2. #include "ir_Samsung.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 sendSAMSUNG().
  9. // Test sending typical data only.
  10. TEST(TestSendSamsung, SendDataOnly) {
  11. IRsendTest irsend(4);
  12. irsend.begin();
  13. irsend.reset();
  14. irsend.sendSAMSUNG(0xE0E09966); // Samsung TV Power On.
  15. EXPECT_EQ(
  16. "m4480s4480"
  17. "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
  18. "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  19. "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
  20. "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  21. "m560s560m560s1680m560s1680m560s560m560s47040",
  22. irsend.outputStr());
  23. irsend.reset();
  24. }
  25. // Test sending with different repeats.
  26. TEST(TestSendSamsung, SendWithRepeats) {
  27. IRsendTest irsend(4);
  28. irsend.begin();
  29. irsend.reset();
  30. irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 1); // 1 repeat.
  31. EXPECT_EQ(
  32. "m4480s4480"
  33. "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
  34. "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  35. "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
  36. "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  37. "m560s560m560s1680m560s1680m560s560m560s47040"
  38. "m4480s4480"
  39. "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
  40. "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  41. "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
  42. "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  43. "m560s560m560s1680m560s1680m560s560m560s47040",
  44. irsend.outputStr());
  45. irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 2); // 2 repeats.
  46. EXPECT_EQ(
  47. "m4480s4480"
  48. "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
  49. "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  50. "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
  51. "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  52. "m560s560m560s1680m560s1680m560s560m560s47040"
  53. "m4480s4480"
  54. "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
  55. "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  56. "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
  57. "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  58. "m560s560m560s1680m560s1680m560s560m560s47040"
  59. "m4480s4480"
  60. "m560s1680m560s1680m560s1680m560s560m560s560m560s560m560s560"
  61. "m560s560m560s1680m560s1680m560s1680m560s560m560s560m560s560"
  62. "m560s560m560s560m560s1680m560s560m560s560m560s1680m560s1680"
  63. "m560s560m560s560m560s1680m560s560m560s1680m560s1680m560s560"
  64. "m560s560m560s1680m560s1680m560s560m560s47040",
  65. irsend.outputStr());
  66. }
  67. // Tests for encodeSAMSUNG().
  68. TEST(TestEncodeSamsung, NormalEncoding) {
  69. IRsendTest irsend(4);
  70. EXPECT_EQ(0xFF, irsend.encodeSAMSUNG(0, 0));
  71. EXPECT_EQ(0x8080807F, irsend.encodeSAMSUNG(1, 1));
  72. EXPECT_EQ(0xF8F805FA, irsend.encodeSAMSUNG(0x1F, 0xA0));
  73. EXPECT_EQ(0xA0A0CC33, irsend.encodeSAMSUNG(0x05, 0x33));
  74. EXPECT_EQ(0xFFFFFF00, irsend.encodeSAMSUNG(0xFF, 0xFF));
  75. EXPECT_EQ(0xE0E09966, irsend.encodeSAMSUNG(0x07, 0x99));
  76. }
  77. // Tests for decodeSAMSUNG().
  78. // Decode normal Samsung messages.
  79. TEST(TestDecodeSamsung, NormalDecodeWithStrict) {
  80. IRsendTest irsend(4);
  81. IRrecv irrecv(4);
  82. irsend.begin();
  83. // Normal Samsung 32-bit message.
  84. irsend.reset();
  85. irsend.sendSAMSUNG(0xE0E09966);
  86. irsend.makeDecodeResult();
  87. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  88. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  89. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  90. EXPECT_EQ(0xE0E09966, irsend.capture.value);
  91. EXPECT_EQ(0x07, irsend.capture.address);
  92. EXPECT_EQ(0x99, irsend.capture.command);
  93. // Synthesised Normal Samsung 32-bit message.
  94. irsend.reset();
  95. irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x07, 0x99));
  96. irsend.makeDecodeResult();
  97. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  98. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  99. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  100. EXPECT_EQ(0xE0E09966, irsend.capture.value);
  101. EXPECT_EQ(0x07, irsend.capture.address);
  102. EXPECT_EQ(0x99, irsend.capture.command);
  103. // Synthesised Normal Samsung 32-bit message.
  104. irsend.reset();
  105. irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x1, 0x1));
  106. irsend.makeDecodeResult();
  107. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  108. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  109. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  110. EXPECT_EQ(0x8080807F, irsend.capture.value);
  111. EXPECT_EQ(0x1, irsend.capture.address);
  112. EXPECT_EQ(0x1, irsend.capture.command);
  113. }
  114. // Decode normal repeated Samsung messages.
  115. TEST(TestDecodeSamsung, NormalDecodeWithRepeatAndStrict) {
  116. IRsendTest irsend(4);
  117. IRrecv irrecv(4);
  118. irsend.begin();
  119. // Normal Samsung 32-bit message.
  120. irsend.reset();
  121. irsend.sendSAMSUNG(0xE0E09966, kSamsungBits, 2);
  122. irsend.makeDecodeResult();
  123. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  124. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  125. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  126. EXPECT_EQ(0xE0E09966, irsend.capture.value);
  127. EXPECT_EQ(0x07, irsend.capture.address);
  128. EXPECT_EQ(0x99, irsend.capture.command);
  129. }
  130. // Decode unsupported Samsung messages.
  131. TEST(TestDecodeSamsung, DecodeWithNonStrictValues) {
  132. IRsendTest irsend(4);
  133. IRrecv irrecv(4);
  134. irsend.begin();
  135. irsend.reset();
  136. irsend.sendSAMSUNG(0x0); // Illegal value Samsung 32-bit message.
  137. irsend.makeDecodeResult();
  138. // Should fail with strict on.
  139. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  140. // Should pass if strict off.
  141. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
  142. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  143. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  144. EXPECT_EQ(0x0, irsend.capture.value);
  145. EXPECT_EQ(0x0, irsend.capture.address);
  146. EXPECT_EQ(0x0, irsend.capture.command);
  147. irsend.reset();
  148. irsend.sendSAMSUNG(0x12345678); // Illegal value Samsung 32-bit message.
  149. irsend.makeDecodeResult();
  150. // Should fail with strict on.
  151. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  152. // Should pass if strict off.
  153. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
  154. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  155. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  156. EXPECT_EQ(0x12345678, irsend.capture.value);
  157. EXPECT_EQ(0x48, irsend.capture.address);
  158. EXPECT_EQ(0x6A, irsend.capture.command);
  159. // Illegal over length (36-bit) message.
  160. irsend.reset();
  161. irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0, 0), 36);
  162. irsend.makeDecodeResult();
  163. // Should fail with strict on.
  164. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  165. // Shouldn't pass if strict off and wrong expected bit size.
  166. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
  167. // Re-decode with correct bit size.
  168. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 36, true));
  169. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 36, false));
  170. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  171. EXPECT_EQ(36, irsend.capture.bits);
  172. EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 8 bits less.
  173. EXPECT_EQ(0x00, irsend.capture.address);
  174. EXPECT_EQ(0x00, irsend.capture.command);
  175. // Illegal under length (16-bit) message
  176. irsend.reset();
  177. irsend.sendSAMSUNG(irsend.encodeSAMSUNG(0x0, 0x0), 16);
  178. irsend.makeDecodeResult();
  179. // Should fail with strict on.
  180. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  181. // And it should fail when we expect more bits.
  182. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
  183. // Should pass if strict off if we ask for correct nr. of bits sent.
  184. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 16, false));
  185. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  186. EXPECT_EQ(16, irsend.capture.bits);
  187. EXPECT_EQ(0xFF, irsend.capture.value); // We told it to expect 4 bits less.
  188. EXPECT_EQ(0x00, irsend.capture.address);
  189. EXPECT_EQ(0x00, irsend.capture.command);
  190. // Should fail as we are expecting less bits than there are.
  191. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, 12, false));
  192. }
  193. // Decode (non-standard) 64-bit messages.
  194. // Decode unsupported Samsung messages.
  195. TEST(TestDecodeSamsung, Decode64BitMessages) {
  196. IRsendTest irsend(4);
  197. IRrecv irrecv(4);
  198. irsend.begin();
  199. irsend.reset();
  200. // Illegal value & size Samsung 64-bit message.
  201. irsend.sendSAMSUNG(0xFFFFFFFFFFFFFFFF, 64);
  202. irsend.makeDecodeResult();
  203. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, true));
  204. // Should work with a 'normal' match (not strict)
  205. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture, 64, false));
  206. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  207. EXPECT_EQ(64, irsend.capture.bits);
  208. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  209. EXPECT_EQ(0xFF, irsend.capture.address);
  210. EXPECT_EQ(0xFF, irsend.capture.command);
  211. }
  212. // Decode a 'real' example via GlobalCache
  213. TEST(TestDecodeSamsung, DecodeGlobalCacheExample) {
  214. IRsendTest irsend(4);
  215. IRrecv irrecv(4);
  216. irsend.begin();
  217. irsend.reset();
  218. // Samsung TV Power On from Global Cache.
  219. uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22,
  220. 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 64, 22,
  221. 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22,
  222. 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22,
  223. 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22,
  224. 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820};
  225. irsend.sendGC(gc_test, 71);
  226. irsend.makeDecodeResult();
  227. ASSERT_TRUE(irrecv.decodeSAMSUNG(&irsend.capture));
  228. EXPECT_EQ(SAMSUNG, irsend.capture.decode_type);
  229. EXPECT_EQ(kSamsungBits, irsend.capture.bits);
  230. EXPECT_EQ(0xE0E09966, irsend.capture.value);
  231. EXPECT_EQ(0x07, irsend.capture.address);
  232. EXPECT_EQ(0x99, irsend.capture.command);
  233. }
  234. // Fail to decode a non-Samsung example via GlobalCache
  235. TEST(TestDecodeSamsung, FailToDecodeNonSamsungExample) {
  236. IRsendTest irsend(4);
  237. IRrecv irrecv(4);
  238. irsend.begin();
  239. irsend.reset();
  240. // Modified a few entries to unexpected values, based on previous test case.
  241. uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22,
  242. 21, 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22,
  243. 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22,
  244. 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22,
  245. 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22,
  246. 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820};
  247. irsend.sendGC(gc_test, 71);
  248. irsend.makeDecodeResult();
  249. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture));
  250. ASSERT_FALSE(irrecv.decodeSAMSUNG(&irsend.capture, kSamsungBits, false));
  251. }
  252. // Tests for sendSamsungAC().
  253. // Test sending typical data only.
  254. TEST(TestSendSamsungAC, SendDataOnly) {
  255. IRsendTest irsend(0);
  256. irsend.begin();
  257. uint8_t data[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  258. 0x00, 0xF0, 0x01, 0x02, 0xAF,
  259. 0x71, 0x00, 0x15, 0xF0};
  260. irsend.sendSamsungAC(data);
  261. EXPECT_EQ(
  262. "m690s17844"
  263. "m3086s8864"
  264. "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
  265. "m586s436m586s1432m586s436m586s436m586s1432m586s436m586s436m586s1432"
  266. "m586s1432m586s1432m586s1432m586s1432m586s436m586s436m586s436m586s436"
  267. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  268. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  269. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  270. "m586s436m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s1432"
  271. "m586s2886"
  272. "m3086s8864"
  273. "m586s1432m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  274. "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
  275. "m586s1432m586s1432m586s1432m586s1432m586s436m586s1432m586s436m586s1432"
  276. "m586s1432m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s436"
  277. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  278. "m586s1432m586s436m586s1432m586s436m586s1432m586s436m586s436m586s436"
  279. "m586s436m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s1432"
  280. "m586s100000",
  281. irsend.outputStr());
  282. }
  283. // Test sending extended data.
  284. TEST(TestSendSamsungAC, SendExtendedData) {
  285. IRsendTest irsend(0);
  286. irsend.begin();
  287. // "Off" message.
  288. uint8_t data[kSamsungAcExtendedStateLength] = {
  289. 0x02, 0xB2, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xD2, 0x0F, 0x00,
  290. 0x00, 0x00, 0x00, 0x01, 0x02, 0xFF, 0x71, 0x80, 0x11, 0xC0};
  291. irsend.sendSamsungAC(data, kSamsungAcExtendedStateLength);
  292. EXPECT_EQ(
  293. "m690s17844"
  294. "m3086s8864"
  295. "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
  296. "m586s436m586s1432m586s436m586s436m586s1432m586s1432m586s436m586s1432"
  297. "m586s1432m586s1432m586s1432m586s1432m586s436m586s436m586s436m586s436"
  298. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  299. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  300. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  301. "m586s436m586s436m586s436m586s436m586s436m586s436m586s1432m586s1432"
  302. "m586s2886"
  303. "m3086s8864"
  304. "m586s1432m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  305. "m586s436m586s1432m586s436m586s436m586s1432m586s436m586s1432m586s1432"
  306. "m586s1432m586s1432m586s1432m586s1432m586s436m586s436m586s436m586s436"
  307. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  308. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  309. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  310. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  311. "m586s2886"
  312. "m3086s8864"
  313. "m586s1432m586s436m586s436m586s436m586s436m586s436m586s436m586s436"
  314. "m586s436m586s1432m586s436m586s436m586s436m586s436m586s436m586s436"
  315. "m586s1432m586s1432m586s1432m586s1432m586s1432m586s1432m586s1432m586s1432"
  316. "m586s1432m586s436m586s436m586s436m586s1432m586s1432m586s1432m586s436"
  317. "m586s436m586s436m586s436m586s436m586s436m586s436m586s436m586s1432"
  318. "m586s1432m586s436m586s436m586s436m586s1432m586s436m586s436m586s436"
  319. "m586s436m586s436m586s436m586s436m586s436m586s436m586s1432m586s1432"
  320. "m586s100000",
  321. irsend.outputStr());
  322. }
  323. // Tests for IRSamsungAc class.
  324. TEST(TestIRSamsungAcClass, SetAndGetRaw) {
  325. uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  326. 0x00, 0xF0, 0x01, 0xE2, 0xFE,
  327. 0x71, 0x40, 0x11, 0xF0};
  328. IRSamsungAc samsung(0);
  329. samsung.setRaw(expectedState);
  330. EXPECT_STATE_EQ(expectedState, samsung.getRaw(), kSamsungAcBits);
  331. uint8_t extendedState[kSamsungAcExtendedStateLength] = {
  332. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x01, 0xD2, 0x0F, 0x00,
  333. 0x00, 0x00, 0x00, 0x01, 0xE2, 0xFE, 0x71, 0x40, 0x11, 0xF0};
  334. samsung.setRaw(extendedState, kSamsungAcExtendedStateLength);
  335. // We should NOT get the extended state back.
  336. EXPECT_STATE_EQ(expectedState, samsung.getRaw(), kSamsungAcBits);
  337. }
  338. TEST(TestIRSamsungAcClass, SetAndGetPower) {
  339. IRSamsungAc samsung(0);
  340. samsung.on();
  341. EXPECT_TRUE(samsung.getPower());
  342. samsung.off();
  343. EXPECT_FALSE(samsung.getPower());
  344. samsung.setPower(true);
  345. EXPECT_TRUE(samsung.getPower());
  346. samsung.setPower(false);
  347. EXPECT_FALSE(samsung.getPower());
  348. }
  349. TEST(TestIRSamsungAcClass, SetAndGetSwing) {
  350. IRSamsungAc samsung(0);
  351. samsung.setSwing(true);
  352. EXPECT_TRUE(samsung.getSwing());
  353. samsung.setSwing(false);
  354. EXPECT_FALSE(samsung.getSwing());
  355. samsung.setSwing(true);
  356. EXPECT_TRUE(samsung.getSwing());
  357. // Real examples from:
  358. // https://github.com/markszabo/IRremoteESP8266/issues/505#issuecomment-424036602
  359. // TODO(Hollako): Explain why state[9] lowest bit changes between on and off.
  360. const uint8_t expected_off[kSamsungAcStateLength] = {
  361. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
  362. 0x01, 0xE2, 0xFE, 0x71, 0x80, 0x11, 0xF0};
  363. samsung.setRaw(expected_off);
  364. EXPECT_FALSE(samsung.getSwing());
  365. const uint8_t expected_on[kSamsungAcStateLength] = {
  366. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
  367. 0x01, 0x02, 0xAF, 0x71, 0x80, 0x11, 0xF0};
  368. samsung.setRaw(expected_on);
  369. EXPECT_TRUE(samsung.getSwing());
  370. }
  371. TEST(TestIRSamsungAcClass, SetAndGetClean) {
  372. IRSamsungAc samsung(0);
  373. samsung.setClean(true);
  374. EXPECT_TRUE(samsung.getClean());
  375. samsung.setClean(false);
  376. EXPECT_FALSE(samsung.getClean());
  377. samsung.setClean(true);
  378. EXPECT_TRUE(samsung.getClean());
  379. }
  380. TEST(TestIRSamsungAcClass, SetAndGetBeep) {
  381. IRSamsungAc samsung(0);
  382. samsung.setBeep(false);
  383. EXPECT_FALSE(samsung.getBeep());
  384. samsung.setBeep(true);
  385. EXPECT_TRUE(samsung.getBeep());
  386. samsung.setBeep(false);
  387. EXPECT_FALSE(samsung.getBeep());
  388. samsung.setBeep(true);
  389. EXPECT_TRUE(samsung.getBeep());
  390. }
  391. TEST(TestIRSamsungAcClass, SetAndGetTemp) {
  392. IRSamsungAc samsung(0);
  393. samsung.setTemp(25);
  394. EXPECT_EQ(25, samsung.getTemp());
  395. samsung.setTemp(kSamsungAcMinTemp);
  396. EXPECT_EQ(kSamsungAcMinTemp, samsung.getTemp());
  397. samsung.setTemp(kSamsungAcMinTemp - 1);
  398. EXPECT_EQ(kSamsungAcMinTemp, samsung.getTemp());
  399. samsung.setTemp(kSamsungAcMaxTemp);
  400. EXPECT_EQ(kSamsungAcMaxTemp, samsung.getTemp());
  401. samsung.setTemp(kSamsungAcMaxTemp + 1);
  402. EXPECT_EQ(kSamsungAcMaxTemp, samsung.getTemp());
  403. }
  404. TEST(TestIRSamsungAcClass, SetAndGetMode) {
  405. IRSamsungAc samsung(0);
  406. samsung.setMode(kSamsungAcCool);
  407. EXPECT_EQ(kSamsungAcCool, samsung.getMode());
  408. EXPECT_NE(kSamsungAcFanAuto2, samsung.getFan());
  409. samsung.setMode(kSamsungAcHeat);
  410. EXPECT_EQ(kSamsungAcHeat, samsung.getMode());
  411. EXPECT_NE(kSamsungAcFanAuto2, samsung.getFan());
  412. samsung.setMode(kSamsungAcAuto);
  413. EXPECT_EQ(kSamsungAcAuto, samsung.getMode());
  414. EXPECT_EQ(kSamsungAcFanAuto2, samsung.getFan());
  415. samsung.setMode(kSamsungAcDry);
  416. EXPECT_EQ(kSamsungAcDry, samsung.getMode());
  417. EXPECT_NE(kSamsungAcFanAuto2, samsung.getFan());
  418. }
  419. TEST(TestIRSamsungAcClass, SetAndGetFan) {
  420. IRSamsungAc samsung(0);
  421. samsung.setMode(kSamsungAcCool); // Most fan modes avail in this setting.
  422. samsung.setFan(kSamsungAcFanAuto);
  423. EXPECT_EQ(kSamsungAcFanAuto, samsung.getFan());
  424. samsung.setFan(kSamsungAcFanLow);
  425. EXPECT_EQ(kSamsungAcFanLow, samsung.getFan());
  426. samsung.setFan(kSamsungAcFanAuto2); // Not available in Cool mode.
  427. EXPECT_EQ(kSamsungAcFanLow, samsung.getFan()); // Shouldn't change.
  428. samsung.setMode(kSamsungAcAuto); // Has special fan setting.
  429. EXPECT_EQ(kSamsungAcFanAuto2, samsung.getFan());
  430. samsung.setFan(kSamsungAcFanLow); // Shouldn't be available in Auto mode.
  431. EXPECT_EQ(kSamsungAcFanAuto2, samsung.getFan());
  432. samsung.setMode(kSamsungAcHeat); // Most fan modes avail in this setting.
  433. samsung.setFan(kSamsungAcFanHigh);
  434. EXPECT_EQ(kSamsungAcFanHigh, samsung.getFan());
  435. }
  436. TEST(TestIRSamsungAcClass, SetAndGetQuiet) {
  437. IRSamsungAc samsung(0);
  438. samsung.setQuiet(false);
  439. EXPECT_FALSE(samsung.getQuiet());
  440. samsung.setFan(kSamsungAcFanHigh);
  441. samsung.setQuiet(true);
  442. EXPECT_TRUE(samsung.getQuiet());
  443. EXPECT_EQ(kSamsungAcFanAuto, samsung.getFan());
  444. samsung.setQuiet(false);
  445. EXPECT_FALSE(samsung.getQuiet());
  446. }
  447. TEST(TestIRSamsungAcClass, ChecksumCalculation) {
  448. IRSamsungAc samsung(0);
  449. const uint8_t originalstate[kSamsungAcStateLength] = {
  450. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
  451. 0x01, 0x02, 0xAF, 0x71, 0x00, 0x15, 0xF0};
  452. uint8_t examplestate[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  453. 0x00, 0xF0, 0x01, 0x02, 0xAF,
  454. 0x71, 0x00, 0x15, 0xF0};
  455. EXPECT_TRUE(IRSamsungAc::validChecksum(examplestate));
  456. EXPECT_EQ(0, IRSamsungAc::calcChecksum(examplestate));
  457. examplestate[8] = 0x12; // Set an incoorect checksum.
  458. EXPECT_FALSE(IRSamsungAc::validChecksum(examplestate));
  459. EXPECT_EQ(0, IRSamsungAc::calcChecksum(examplestate));
  460. samsung.setRaw(examplestate);
  461. // Extracting the state from the object should have a correct checksum.
  462. EXPECT_TRUE(IRSamsungAc::validChecksum(samsung.getRaw()));
  463. EXPECT_STATE_EQ(originalstate, samsung.getRaw(), kSamsungAcBits);
  464. examplestate[8] = 0x02; // Restore old checksum value.
  465. // Change the state to force a different checksum.
  466. examplestate[11] = 0x01;
  467. EXPECT_FALSE(IRSamsungAc::validChecksum(examplestate));
  468. EXPECT_EQ(0xF, IRSamsungAc::calcChecksum(examplestate));
  469. }
  470. TEST(TestIRSamsungAcClass, HumanReadable) {
  471. IRSamsungAc samsung(0);
  472. EXPECT_EQ(
  473. "Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 2 (LOW), Swing: On, "
  474. "Beep: Off, Clean: Off, Quiet: Off",
  475. samsung.toString());
  476. samsung.setTemp(kSamsungAcMaxTemp);
  477. samsung.setMode(kSamsungAcHeat);
  478. samsung.off();
  479. samsung.setFan(kSamsungAcFanHigh);
  480. samsung.setSwing(false);
  481. samsung.setBeep(true);
  482. samsung.setClean(true);
  483. EXPECT_EQ(
  484. "Power: Off, Mode: 4 (HEAT), Temp: 30C, Fan: 5 (HIGH), Swing: Off, "
  485. "Beep: On, Clean: On, Quiet: Off",
  486. samsung.toString());
  487. samsung.setQuiet(true);
  488. EXPECT_EQ(
  489. "Power: Off, Mode: 4 (HEAT), Temp: 30C, Fan: 0 (AUTO), Swing: Off, "
  490. "Beep: On, Clean: On, Quiet: On",
  491. samsung.toString());
  492. }
  493. TEST(TestIRSamsungAcClass, GeneralConstruction) {
  494. IRSamsungAc samsung(0);
  495. uint8_t OnCoolFAutoBOffCOffQOffT20Soff[kSamsungAcStateLength] = {
  496. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
  497. 0x01, 0xE2, 0xFE, 0x71, 0x40, 0x11, 0xF0};
  498. samsung.setPower(true);
  499. samsung.setMode(kSamsungAcCool);
  500. samsung.setFan(kSamsungAcFanAuto);
  501. samsung.setSwing(false);
  502. samsung.setBeep(false);
  503. samsung.setClean(false);
  504. samsung.setQuiet(false);
  505. samsung.setTemp(20);
  506. EXPECT_STATE_EQ(OnCoolFAutoBOffCOffQOffT20Soff, samsung.getRaw(),
  507. kSamsungAcBits);
  508. /* Disabled until we understand why LSB bit of the swing byte changes.
  509. // TODO(Hollako): Explain why sometimes the LSB of state[9] is a 1.
  510. // e.g. 0xAE or 0XAF for swing move.
  511. uint8_t OnHeatFAutoBOffCOffQOffT17Son[kSamsungAcStateLength] = {
  512. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
  513. 0x01, 0x02, 0xAF, 0x71, 0x10, 0x41, 0xF0};
  514. samsung.setPower(true);
  515. samsung.setMode(kSamsungAcHeat);
  516. samsung.setFan(kSamsungAcFanAuto);
  517. samsung.setSwing(true);
  518. samsung.setBeep(false);
  519. samsung.setClean(false);
  520. samsung.setQuiet(false);
  521. samsung.setTemp(17);
  522. EXPECT_STATE_EQ(OnHeatFAutoBOffCOffQOffT17Son, samsung.getRaw(),
  523. kSamsungAcBits);
  524. */
  525. }
  526. // Tests for decodeSamsungAC().
  527. // Decode normal SamsungAC messages.
  528. TEST(TestDecodeSamsungAC, SyntheticDecode) {
  529. IRsendTest irsend(0);
  530. IRrecv irrecv(0);
  531. irsend.begin();
  532. irsend.reset();
  533. uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  534. 0x00, 0xF0, 0x01, 0x02, 0xAF,
  535. 0x71, 0x00, 0x15, 0xF0};
  536. // Synthesised Normal Samsung A/C message.
  537. irsend.sendSamsungAC(expectedState);
  538. irsend.makeDecodeResult();
  539. EXPECT_TRUE(irrecv.decode(&irsend.capture));
  540. EXPECT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  541. EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
  542. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  543. }
  544. // Decode a real Samsung A/C example from Issue #505
  545. TEST(TestDecodeSamsungAC, DecodeRealExample) {
  546. IRsendTest irsend(4);
  547. IRrecv irrecv(4);
  548. irsend.begin();
  549. irsend.reset();
  550. // Samsung A/C example from Issue #505
  551. uint16_t rawData[233] = {
  552. 690, 17844, 3084, 8864, 606, 406, 586, 1410, 580, 436, 570, 424,
  553. 570, 426, 570, 404, 596, 418, 580, 416, 584, 410, 586, 1402,
  554. 588, 408, 586, 410, 584, 1380, 610, 408, 586, 408, 586, 1404,
  555. 586, 1404, 586, 1408, 594, 1396, 596, 1394, 602, 418, 582, 410,
  556. 586, 408, 584, 408, 586, 408, 586, 410, 586, 408, 586, 410,
  557. 586, 408, 586, 408, 586, 408, 586, 408, 586, 410, 584, 436,
  558. 558, 436, 570, 424, 570, 424, 574, 420, 578, 416, 582, 412,
  559. 586, 410, 586, 408, 584, 410, 586, 408, 586, 410, 584, 410,
  560. 584, 408, 586, 408, 586, 410, 586, 408, 586, 412, 584, 436,
  561. 556, 1410, 592, 1396, 602, 1390, 608, 1384, 608, 2886, 3086, 8858,
  562. 610, 1380, 610, 410, 586, 408, 586, 410, 586, 408, 586, 410,
  563. 586, 408, 586, 436, 558, 436, 554, 1410, 594, 426, 572, 422,
  564. 578, 418, 582, 412, 586, 410, 584, 410, 586, 1380, 610, 1382,
  565. 608, 1404, 586, 1404, 586, 408, 586, 1432, 558, 436, 554, 1414,
  566. 590, 1398, 602, 418, 580, 414, 586, 410, 584, 1382, 606, 1382,
  567. 608, 1382, 608, 408, 586, 408, 586, 408, 586, 408, 586, 410,
  568. 584, 436, 560, 434, 570, 426, 566, 430, 568, 1400, 600, 416,
  569. 584, 1406, 586, 410, 584, 1384, 606, 410, 586, 410, 584, 408,
  570. 586, 408, 586, 408, 586, 408, 588, 410, 584, 1408, 590, 1400,
  571. 592, 1398, 602, 1388, 612};
  572. uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  573. 0x00, 0xF0, 0x01, 0x02, 0xAF,
  574. 0x71, 0x00, 0x15, 0xF0};
  575. irsend.sendRaw(rawData, 233, 38000);
  576. irsend.makeDecodeResult();
  577. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  578. ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  579. EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
  580. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  581. IRSamsungAc samsung(0);
  582. samsung.setRaw(irsend.capture.state);
  583. EXPECT_EQ(
  584. "Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 2 (LOW), Swing: On, "
  585. "Beep: Off, Clean: Off, Quiet: Off",
  586. samsung.toString());
  587. }
  588. // Decode a real Samsung A/C example from Issue #505
  589. TEST(TestDecodeSamsungAC, DecodeRealExample2) {
  590. IRsendTest irsend(4);
  591. IRrecv irrecv(4);
  592. irsend.begin();
  593. irsend.reset();
  594. // Samsung A/C example from Issue #505
  595. uint16_t rawData[233] = {
  596. 668, 17834, 3092, 8862, 608, 410, 586, 1378, 612, 410, 584, 410,
  597. 586, 410, 584, 410, 586, 408, 586, 408, 586, 410, 586, 1404,
  598. 588, 436, 558, 436, 570, 1398, 592, 424, 576, 420, 578, 1388,
  599. 608, 1382, 610, 1382, 608, 1380, 610, 1384, 606, 408, 586, 408,
  600. 588, 408, 588, 408, 586, 436, 558, 436, 570, 424, 570, 426,
  601. 572, 422, 578, 418, 582, 412, 586, 408, 586, 410, 584, 410,
  602. 584, 410, 584, 410, 586, 410, 586, 408, 586, 408, 586, 408,
  603. 586, 408, 586, 408, 586, 438, 558, 436, 568, 426, 570, 424,
  604. 574, 422, 576, 418, 582, 414, 584, 410, 586, 410, 584, 410,
  605. 586, 1380, 610, 1382, 608, 1404, 586, 1404, 602, 2872, 3096, 8878,
  606. 582, 1432, 570, 426, 568, 426, 574, 420, 578, 416, 582, 412,
  607. 586, 410, 584, 410, 586, 410, 586, 1382, 608, 410, 586, 410,
  608. 586, 408, 586, 1404, 586, 1408, 582, 1410, 590, 428, 568, 1400,
  609. 598, 1394, 606, 1382, 610, 1382, 608, 1378, 612, 1382, 608, 1384,
  610. 606, 1404, 586, 408, 586, 414, 582, 436, 558, 1410, 590, 1422,
  611. 576, 1390, 608, 410, 586, 410, 586, 410, 584, 410, 584, 410,
  612. 586, 410, 586, 410, 584, 410, 586, 1404, 586, 1404, 588, 436,
  613. 560, 436, 486, 510, 566, 1400, 598, 420, 576, 418, 582, 414,
  614. 586, 410, 584, 410, 584, 410, 586, 410, 584, 1382, 608, 1384,
  615. 606, 1384, 606, 1408, 600};
  616. uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  617. 0x00, 0xF0, 0x01, 0xE2, 0xFE,
  618. 0x71, 0x80, 0x11, 0xF0};
  619. irsend.sendRaw(rawData, 233, 38000);
  620. irsend.makeDecodeResult();
  621. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  622. ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  623. EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
  624. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  625. IRSamsungAc samsung(0);
  626. samsung.setRaw(irsend.capture.state);
  627. EXPECT_EQ(
  628. "Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 0 (AUTO), Swing: Off, "
  629. "Beep: Off, Clean: Off, Quiet: Off",
  630. samsung.toString());
  631. }
  632. // Decode a real Samsung A/C example from:
  633. // https://github.com/markszabo/IRremoteESP8266/issues/505#issuecomment-424036602
  634. TEST(TestDecodeSamsungAC, DecodePowerOnSample) {
  635. IRsendTest irsend(0);
  636. IRrecv irrecv(0);
  637. irsend.begin();
  638. irsend.reset();
  639. uint16_t rawData[349] = {
  640. 662, 17870, 3026, 8966, 540, 484, 514, 1482, 518, 482, 514, 482,
  641. 518, 482, 516, 510, 490, 508, 490, 508, 572, 428, 576, 1398,
  642. 542, 482, 514, 484, 514, 1460, 540, 482, 518, 482, 516, 1456,
  643. 544, 1480, 518, 1480, 518, 1480, 518, 1484, 514, 510, 566, 432,
  644. 576, 424, 574, 426, 540, 458, 516, 482, 516, 482, 516, 482,
  645. 518, 480, 518, 482, 518, 482, 518, 482, 516, 482, 518, 482,
  646. 516, 482, 518, 480, 516, 508, 492, 508, 490, 508, 572, 428,
  647. 576, 422, 572, 428, 542, 456, 514, 484, 518, 480, 518, 480,
  648. 518, 480, 516, 482, 516, 482, 520, 478, 518, 482, 518, 480,
  649. 518, 1480, 518, 1480, 516, 1484, 594, 1428, 518, 2964, 3032, 8964,
  650. 540, 1458, 542, 480, 518, 480, 520, 480, 518, 482, 520, 480,
  651. 520, 478, 518, 480, 520, 478, 520, 1478, 522, 478, 518, 506,
  652. 494, 1484, 594, 426, 574, 1400, 564, 1434, 540, 1454, 544, 1478,
  653. 520, 1454, 544, 1458, 540, 480, 520, 480, 518, 480, 520, 480,
  654. 518, 508, 490, 506, 568, 432, 572, 426, 576, 424, 544, 454,
  655. 518, 480, 516, 482, 520, 478, 520, 478, 522, 478, 518, 480,
  656. 520, 478, 520, 478, 520, 478, 520, 478, 520, 478, 518, 478,
  657. 522, 506, 494, 504, 566, 432, 576, 424, 576, 424, 570, 428,
  658. 518, 482, 518, 480, 518, 482, 520, 478, 520, 478, 520, 480,
  659. 520, 478, 520, 478, 520, 2964, 3032, 8986, 520, 1478, 520, 506,
  660. 492, 506, 492, 506, 568, 430, 574, 424, 546, 454, 516, 482,
  661. 518, 482, 518, 1456, 544, 478, 546, 452, 520, 478, 544, 1432,
  662. 542, 1478, 520, 1478, 520, 478, 520, 1482, 586, 1412, 598, 1400,
  663. 564, 1432, 540, 1458, 544, 1454, 544, 1454, 544, 1456, 542, 480,
  664. 518, 480, 520, 480, 520, 1462, 536, 1482, 588, 1410, 598, 424,
  665. 572, 426, 542, 456, 518, 482, 520, 478, 520, 478, 522, 478,
  666. 520, 478, 520, 1456, 542, 1458, 540, 478, 520, 478, 520, 478,
  667. 520, 1482, 540, 482, 568, 430, 576, 424, 570, 428, 542, 458,
  668. 518, 480, 520, 480, 520, 1454, 568, 1430, 566, 1432, 566, 1454,
  669. 594};
  670. uint8_t expectedState[kSamsungAcExtendedStateLength] = {
  671. 0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0x01, 0xD2, 0x0F, 0x00,
  672. 0x00, 0x00, 0x00, 0x01, 0xE2, 0xFE, 0x71, 0x80, 0x11, 0xF0};
  673. irsend.sendRaw(rawData, 349, 38000);
  674. irsend.makeDecodeResult();
  675. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  676. ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  677. EXPECT_EQ(kSamsungAcExtendedBits, irsend.capture.bits);
  678. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  679. IRSamsungAc samsung(0);
  680. samsung.setRaw(irsend.capture.state, kSamsungAcExtendedStateLength);
  681. EXPECT_EQ(
  682. "Power: On, Mode: 1 (COOL), Temp: 24C, Fan: 0 (AUTO), Swing: Off, "
  683. "Beep: Off, Clean: Off, Quiet: Off",
  684. samsung.toString());
  685. }
  686. // Decode a real Samsung A/C example from:
  687. // https://github.com/markszabo/IRremoteESP8266/issues/505#issuecomment-424036602
  688. TEST(TestDecodeSamsungAC, DecodePowerOffSample) {
  689. IRsendTest irsend(0);
  690. IRrecv irrecv(0);
  691. irsend.begin();
  692. irsend.reset();
  693. uint16_t rawData[349] = {
  694. 670, 17802, 3096, 8898, 602, 420, 580, 1418, 582, 418, 582, 416,
  695. 582, 416, 584, 442, 550, 448, 568, 430, 570, 430, 576, 1396,
  696. 600, 424, 546, 452, 578, 1394, 604, 1396, 600, 420, 580, 1398,
  697. 602, 1416, 586, 1412, 582, 1420, 576, 1422, 592, 428, 574, 424,
  698. 576, 422, 578, 420, 548, 452, 578, 420, 578, 420, 584, 416,
  699. 580, 418, 580, 418, 582, 418, 580, 418, 582, 414, 584, 414,
  700. 584, 416, 582, 418, 584, 442, 558, 442, 568, 430, 576, 424,
  701. 578, 420, 576, 424, 576, 422, 580, 420, 584, 414, 584, 416,
  702. 584, 414, 582, 418, 580, 418, 582, 416, 582, 416, 584, 414,
  703. 584, 414, 586, 442, 554, 1420, 570, 1452, 578, 2884, 3120, 8898,
  704. 596, 1400, 602, 422, 582, 418, 584, 414, 582, 416, 584, 414,
  705. 584, 416, 582, 416, 584, 416, 584, 1410, 586, 414, 582, 444,
  706. 556, 1420, 590, 432, 572, 1402, 602, 1396, 600, 1398, 606, 1414,
  707. 582, 1394, 604, 1394, 604, 414, 584, 414, 586, 412, 586, 410,
  708. 586, 442, 556, 440, 544, 456, 568, 430, 576, 424, 578, 420,
  709. 578, 420, 576, 424, 584, 412, 586, 412, 586, 412, 584, 414,
  710. 586, 412, 584, 414, 586, 412, 586, 412, 586, 414, 586, 412,
  711. 584, 442, 558, 442, 558, 440, 566, 432, 574, 424, 578, 422,
  712. 576, 422, 578, 420, 586, 414, 586, 414, 586, 412, 584, 414,
  713. 586, 414, 586, 414, 586, 2902, 3096, 8900, 600, 1416, 586, 442,
  714. 556, 442, 558, 440, 564, 434, 572, 428, 578, 420, 580, 420,
  715. 578, 420, 584, 1392, 608, 414, 586, 414, 582, 414, 586, 412,
  716. 586, 412, 586, 414, 584, 1394, 606, 1416, 580, 1418, 568, 1432,
  717. 594, 1402, 602, 1398, 606, 1392, 606, 1390, 608, 1390, 608, 414,
  718. 584, 414, 586, 414, 584, 1412, 586, 1398, 600, 1418, 590, 430,
  719. 566, 432, 576, 422, 578, 420, 578, 422, 582, 416, 586, 414,
  720. 586, 412, 584, 1390, 606, 1392, 608, 414, 586, 412, 584, 412,
  721. 588, 1410, 586, 442, 558, 440, 568, 430, 566, 434, 574, 426,
  722. 578, 420, 578, 420, 582, 416, 586, 412, 586, 1390, 608, 1390,
  723. 608};
  724. uint8_t expectedState[kSamsungAcExtendedStateLength] = {
  725. 0x02, 0xB2, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xD2, 0x0F, 0x00,
  726. 0x00, 0x00, 0x00, 0x01, 0x02, 0xFF, 0x71, 0x80, 0x11, 0xC0};
  727. irsend.sendRaw(rawData, 349, 38000);
  728. irsend.makeDecodeResult();
  729. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  730. ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  731. EXPECT_EQ(kSamsungAcExtendedBits, irsend.capture.bits);
  732. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  733. IRSamsungAc samsung(0);
  734. samsung.setRaw(irsend.capture.state, kSamsungAcExtendedStateLength);
  735. EXPECT_EQ(
  736. "Power: Off, Mode: 1 (COOL), Temp: 24C, Fan: 0 (AUTO), Swing: Off, "
  737. "Beep: Off, Clean: Off, Quiet: Off",
  738. samsung.toString());
  739. }
  740. TEST(TestDecodeSamsungAC, DecodeHeatSample) {
  741. IRsendTest irsend(0);
  742. IRrecv irrecv(0);
  743. irsend.begin();
  744. irsend.reset();
  745. uint16_t rawData[233] = {
  746. 650, 16260, 3014, 8934, 534, 486, 508, 1478, 514, 484, 510, 486,
  747. 508, 512, 484, 510, 562, 432, 572, 422, 540, 454, 514, 1452,
  748. 534, 486, 510, 484, 510, 1456, 536, 484, 510, 484, 510, 1454,
  749. 536, 1478, 512, 1476, 514, 1482, 508, 1482, 592, 428, 570, 424,
  750. 538, 456, 508, 486, 510, 484, 512, 484, 510, 486, 510, 484,
  751. 510, 484, 510, 486, 510, 484, 510, 484, 510, 484, 510, 484,
  752. 510, 484, 510, 486, 508, 510, 484, 510, 568, 428, 570, 424,
  753. 538, 458, 512, 482, 510, 486, 510, 484, 510, 484, 510, 484,
  754. 510, 484, 510, 484, 510, 484, 510, 484, 510, 484, 510, 484,
  755. 510, 1474, 516, 1502, 534, 1432, 594, 1398, 536, 2954, 3018, 8932,
  756. 536, 1458, 532, 484, 510, 484, 512, 484, 510, 484, 510, 484,
  757. 510, 484, 512, 484, 510, 484, 510, 1480, 508, 510, 530, 464,
  758. 568, 426, 568, 426, 514, 480, 508, 486, 508, 1456, 534, 1478,
  759. 514, 1452, 538, 1478, 512, 484, 510, 1456, 534, 486, 510, 1478,
  760. 512, 1480, 570, 450, 570, 424, 540, 454, 512, 1452, 534, 1458,
  761. 534, 1454, 536, 484, 512, 482, 512, 484, 512, 484, 512, 482,
  762. 512, 1474, 514, 484, 512, 510, 486, 508, 534, 1430, 594, 426,
  763. 512, 482, 512, 482, 510, 484, 512, 482, 512, 1452, 538, 482,
  764. 512, 482, 512, 482, 510, 484, 510, 484, 510, 1478, 512, 1504,
  765. 488, 1480, 560, 1454, 514};
  766. uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  767. 0x00, 0xF0, 0x01, 0x02, 0xAF,
  768. 0x71, 0x10, 0x41, 0xF0};
  769. irsend.sendRaw(rawData, 233, 38000);
  770. irsend.makeDecodeResult();
  771. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  772. ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  773. EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
  774. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  775. IRSamsungAc samsung(0);
  776. samsung.setRaw(irsend.capture.state);
  777. EXPECT_EQ(
  778. "Power: On, Mode: 4 (HEAT), Temp: 17C, Fan: 0 (AUTO), Swing: On, "
  779. "Beep: Off, Clean: Off, Quiet: Off",
  780. samsung.toString());
  781. }
  782. TEST(TestDecodeSamsungAC, DecodeCoolSample) {
  783. IRsendTest irsend(0);
  784. IRrecv irrecv(0);
  785. irsend.begin();
  786. irsend.reset();
  787. uint16_t rawData[233] = {
  788. 690, 17854, 3086, 8862, 610, 410, 584, 1382, 610, 410, 586, 408,
  789. 586, 408, 586, 408, 588, 410, 584, 436, 558, 436, 570, 1396,
  790. 598, 422, 576, 418, 580, 1384, 612, 410, 586, 410, 584, 1380,
  791. 612, 1382, 608, 1384, 606, 1404, 586, 1404, 586, 436, 558, 438,
  792. 566, 428, 568, 426, 570, 424, 576, 418, 578, 416, 584, 410,
  793. 586, 408, 584, 410, 586, 408, 586, 408, 586, 410, 586, 408,
  794. 586, 408, 588, 408, 586, 408, 588, 408, 586, 438, 558, 436,
  795. 568, 426, 568, 428, 568, 426, 576, 418, 578, 416, 584, 412,
  796. 584, 410, 586, 408, 586, 410, 586, 410, 584, 410, 586, 408,
  797. 586, 1384, 606, 1402, 588, 1410, 580, 1410, 608, 2864, 3108, 8864,
  798. 594, 1394, 604, 416, 584, 410, 586, 410, 586, 410, 586, 410,
  799. 584, 410, 586, 410, 586, 408, 586, 1404, 588, 408, 586, 408,
  800. 586, 436, 560, 1408, 592, 1400, 596, 1396, 600, 416, 584, 1382,
  801. 608, 1380, 610, 1404, 586, 1384, 608, 1384, 606, 1402, 588, 1408,
  802. 582, 1410, 564, 452, 568, 428, 572, 424, 576, 1414, 582, 1386,
  803. 608, 1382, 608, 410, 584, 410, 584, 410, 586, 408, 586, 408,
  804. 586, 408, 586, 408, 588, 1408, 582, 436, 540, 1426, 590, 428,
  805. 574, 420, 578, 418, 580, 1384, 610, 410, 584, 410, 584, 410,
  806. 584, 412, 584, 408, 586, 410, 586, 408, 586, 1404, 586, 1408,
  807. 582, 1410, 562, 1426, 610};
  808. uint8_t expectedState[kSamsungAcStateLength] = {0x02, 0x92, 0x0F, 0x00, 0x00,
  809. 0x00, 0xF0, 0x01, 0xE2, 0xFE,
  810. 0x71, 0x40, 0x11, 0xF0};
  811. irsend.sendRaw(rawData, 233, 38000);
  812. irsend.makeDecodeResult();
  813. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  814. ASSERT_EQ(SAMSUNG_AC, irsend.capture.decode_type);
  815. EXPECT_EQ(kSamsungAcBits, irsend.capture.bits);
  816. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  817. IRSamsungAc samsung(0);
  818. samsung.setRaw(irsend.capture.state);
  819. EXPECT_EQ(
  820. "Power: On, Mode: 1 (COOL), Temp: 20C, Fan: 0 (AUTO), Swing: Off, "
  821. "Beep: Off, Clean: Off, Quiet: Off",
  822. samsung.toString());
  823. }