ir_Panasonic_test.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  1. // Copyright 2017, 2018 David Conran
  2. #include "ir_Panasonic.h"
  3. #include "IRrecv.h"
  4. #include "IRrecv_test.h"
  5. #include "IRsend.h"
  6. #include "IRsend_test.h"
  7. #include "IRutils.h"
  8. #include "gtest/gtest.h"
  9. // Tests for encodePanasonic().
  10. TEST(TestEncodePanasonic, General) {
  11. IRsendTest irsend(4);
  12. EXPECT_EQ(0x0, irsend.encodePanasonic(0, 0, 0, 0));
  13. EXPECT_EQ(0x101010101, irsend.encodePanasonic(1, 1, 1, 1));
  14. EXPECT_EQ(0xFFFF, irsend.encodePanasonic(0, 0, 0, 0xFF));
  15. EXPECT_EQ(0xFF00FF, irsend.encodePanasonic(0, 0, 0xFF, 0));
  16. EXPECT_EQ(0xFF0000FF, irsend.encodePanasonic(0, 0xFF, 0, 0));
  17. EXPECT_EQ(0xFFFF00000000, irsend.encodePanasonic(0xFFFF, 0, 0, 0));
  18. EXPECT_EQ(0xFFFFFFFFFFFF, irsend.encodePanasonic(0xFFFF, 0xFF, 0xFF, 0xFF));
  19. EXPECT_EQ(0x40040190ED7C, irsend.encodePanasonic(0x4004, 0x01, 0x90, 0xED));
  20. }
  21. // Tests for sendPanasonic64().
  22. // Test sending typical data only.
  23. TEST(TestSendPanasonic64, SendDataOnly) {
  24. IRsendTest irsend(4);
  25. irsend.begin();
  26. irsend.reset();
  27. irsend.sendPanasonic64(0x0);
  28. EXPECT_EQ(
  29. "m3456s1728"
  30. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  31. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  32. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  33. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  34. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  35. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  36. "m432s116208",
  37. irsend.outputStr());
  38. irsend.reset();
  39. irsend.sendPanasonic64(0x40040190ED7C);
  40. EXPECT_EQ(
  41. "m3456s1728"
  42. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  43. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  44. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  45. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  46. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  47. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  48. "m432s102384",
  49. irsend.outputStr());
  50. irsend.reset();
  51. irsend.sendPanasonic64(0xFFFFFFFFFFFF);
  52. EXPECT_EQ(
  53. "m3456s1728"
  54. "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
  55. "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
  56. "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
  57. "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
  58. "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
  59. "m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296m432s1296"
  60. "m432s74736",
  61. irsend.outputStr());
  62. }
  63. // Test sending with different repeats.
  64. TEST(TestSendPanasonic64, SendWithRepeats) {
  65. IRsendTest irsend(4);
  66. irsend.begin();
  67. irsend.reset();
  68. irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 0); // 0 repeats.
  69. EXPECT_EQ(
  70. "m3456s1728"
  71. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  72. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  73. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  74. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  75. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  76. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  77. "m432s102384",
  78. irsend.outputStr());
  79. irsend.reset();
  80. irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 1); // 1 repeat.
  81. EXPECT_EQ(
  82. "m3456s1728"
  83. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  84. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  85. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  86. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  87. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  88. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  89. "m432s102384"
  90. "m3456s1728"
  91. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  92. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  93. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  94. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  95. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  96. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  97. "m432s102384",
  98. irsend.outputStr());
  99. irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 2); // 2 repeats.
  100. EXPECT_EQ(
  101. "m3456s1728"
  102. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  103. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  104. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  105. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  106. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  107. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  108. "m432s102384"
  109. "m3456s1728"
  110. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  111. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  112. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  113. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  114. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  115. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  116. "m432s102384"
  117. "m3456s1728"
  118. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  119. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  120. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  121. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  122. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s432m432s1296"
  123. "m432s432m432s1296m432s1296m432s1296m432s1296m432s1296m432s432m432s432"
  124. "m432s102384",
  125. irsend.outputStr());
  126. }
  127. // Test sending an atypical data size.
  128. TEST(TestSendPanasonic64, SendUnusualSize) {
  129. IRsendTest irsend(4);
  130. irsend.begin();
  131. irsend.reset();
  132. irsend.sendPanasonic64(0x0, 8);
  133. EXPECT_EQ(
  134. "m3456s1728"
  135. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  136. "m432s150768",
  137. irsend.outputStr());
  138. irsend.reset();
  139. irsend.sendPanasonic64(0x1234567890ABCDEF, 64);
  140. EXPECT_EQ(
  141. "m3456s1728"
  142. "m432s432m432s432m432s432m432s1296m432s432m432s432m432s1296m432s432"
  143. "m432s432m432s432m432s1296m432s1296m432s432m432s1296m432s432m432s432"
  144. "m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296m432s432"
  145. "m432s432m432s1296m432s1296m432s1296m432s1296m432s432m432s432m432s432"
  146. "m432s1296m432s432m432s432m432s1296m432s432m432s432m432s432m432s432"
  147. "m432s1296m432s432m432s1296m432s432m432s1296m432s432m432s1296m432s1296"
  148. "m432s1296m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s1296"
  149. "m432s1296m432s1296m432s1296m432s432m432s1296m432s1296m432s1296m432s1296"
  150. "m432s74736",
  151. irsend.outputStr());
  152. }
  153. // Tests for sendPanasonic().
  154. TEST(TestSendPanasonic, CompareToSendPanasonic64) {
  155. IRsendTest panasonic(4);
  156. IRsendTest panasonic64(0);
  157. panasonic.begin();
  158. panasonic64.begin();
  159. panasonic.reset();
  160. panasonic64.reset();
  161. panasonic.sendPanasonic(0x4004, 0x0190ED7C);
  162. panasonic64.sendPanasonic64(0x40040190ED7C);
  163. EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
  164. panasonic.sendPanasonic(0x0, 0x0);
  165. panasonic64.sendPanasonic64(0x0);
  166. EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
  167. panasonic.sendPanasonic(0x0, 0x0, 8);
  168. panasonic64.sendPanasonic64(0x0, 8);
  169. EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
  170. panasonic.sendPanasonic(0x1234, 0x567890AB, 64);
  171. panasonic64.sendPanasonic64(0x1234567890AB, 64);
  172. EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
  173. panasonic.sendPanasonic(0x1234, 0x567890AB, kPanasonicBits, 2);
  174. panasonic64.sendPanasonic64(0x1234567890AB, kPanasonicBits, 2);
  175. EXPECT_EQ(panasonic64.outputStr(), panasonic.outputStr());
  176. }
  177. // Tests for decodePanasonic().
  178. // Decode normal Panasonic messages.
  179. TEST(TestDecodePanasonic, NormalDecodeWithStrict) {
  180. IRsendTest irsend(4);
  181. IRrecv irrecv(4);
  182. irsend.begin();
  183. // Normal Panasonic 48-bit message.
  184. irsend.reset();
  185. irsend.sendPanasonic64(0x40040190ED7C);
  186. irsend.makeDecodeResult();
  187. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  188. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  189. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  190. EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
  191. EXPECT_EQ(0x4004, irsend.capture.address);
  192. EXPECT_EQ(0x0190ED7C, irsend.capture.command);
  193. EXPECT_FALSE(irsend.capture.repeat);
  194. // Synthesised Normal Panasonic 48-bit message.
  195. irsend.reset();
  196. irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x12, 0x34, 0x56));
  197. irsend.makeDecodeResult();
  198. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  199. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  200. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  201. EXPECT_EQ(0x400412345670, irsend.capture.value);
  202. EXPECT_EQ(0x4004, irsend.capture.address);
  203. EXPECT_EQ(0x12345670, irsend.capture.command);
  204. EXPECT_FALSE(irsend.capture.repeat);
  205. // Synthesised Normal Panasonic 48-bit message.
  206. irsend.reset();
  207. irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 0x1, 0x1, 0x1));
  208. irsend.makeDecodeResult();
  209. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  210. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  211. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  212. EXPECT_EQ(0x400401010101, irsend.capture.value);
  213. EXPECT_EQ(0x4004, irsend.capture.address);
  214. EXPECT_EQ(0x1010101, irsend.capture.command);
  215. EXPECT_FALSE(irsend.capture.repeat);
  216. }
  217. // Decode normal repeated Panasonic messages.
  218. TEST(TestDecodePanasonic, NormalDecodeWithRepeatAndStrict) {
  219. IRsendTest irsend(4);
  220. IRrecv irrecv(4);
  221. irsend.begin();
  222. // Normal Panasonic 48-bit message with 2 repeats.
  223. irsend.reset();
  224. irsend.sendPanasonic64(0x40040190ED7C, kPanasonicBits, 2);
  225. irsend.makeDecodeResult();
  226. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  227. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  228. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  229. EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
  230. EXPECT_EQ(0x4004, irsend.capture.address);
  231. EXPECT_EQ(0x190ED7C, irsend.capture.command);
  232. EXPECT_FALSE(irsend.capture.repeat);
  233. irsend.makeDecodeResult(2 * kPanasonicBits + 4);
  234. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  235. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  236. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  237. EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
  238. irsend.makeDecodeResult(2 * (2 * kPanasonicBits + 4));
  239. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  240. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  241. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  242. EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
  243. }
  244. // Decode Panasonic messages with unsupported values.
  245. TEST(TestDecodePanasonic, DecodeWithNonStrictValues) {
  246. IRsendTest irsend(4);
  247. IRrecv irrecv(4);
  248. irsend.begin();
  249. irsend.reset();
  250. irsend.sendPanasonic64(0x0); // Illegal value Panasonic 48-bit message.
  251. irsend.makeDecodeResult();
  252. // Should fail with strict on.
  253. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  254. // Should pass if strict off.
  255. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
  256. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  257. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  258. EXPECT_EQ(0x0, irsend.capture.value);
  259. EXPECT_EQ(0x0, irsend.capture.address);
  260. EXPECT_EQ(0x0, irsend.capture.command);
  261. irsend.reset();
  262. // Illegal address/Manufacturer code. The rest is legal.
  263. irsend.sendPanasonic64(irsend.encodePanasonic(0, 1, 2, 3));
  264. irsend.makeDecodeResult();
  265. // Should fail with strict on.
  266. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  267. // Should pass if strict off.
  268. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
  269. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  270. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  271. EXPECT_EQ(0x1020300, irsend.capture.value);
  272. EXPECT_EQ(0x0, irsend.capture.address);
  273. EXPECT_EQ(0x1020300, irsend.capture.command);
  274. }
  275. // Decode Panasonic messages with unsupported size/lengths.
  276. TEST(TestDecodePanasonic, DecodeWithNonStrictSize) {
  277. IRsendTest irsend(4);
  278. IRrecv irrecv(4);
  279. irsend.begin();
  280. irsend.reset();
  281. irsend.sendPanasonic64(0x12345678, 32); // Illegal size Panasonic message.
  282. irsend.makeDecodeResult();
  283. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  284. irsend.makeDecodeResult();
  285. // Should fail with strict when we ask for the wrong bit size.
  286. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 32, true));
  287. // Should pass if strict off.
  288. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 32, false));
  289. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  290. EXPECT_EQ(32, irsend.capture.bits);
  291. EXPECT_EQ(0x12345678, irsend.capture.value);
  292. EXPECT_EQ(0x0, irsend.capture.address);
  293. EXPECT_EQ(0x12345678, irsend.capture.command);
  294. // Illegal over length (56-bit) message.
  295. irsend.reset();
  296. irsend.sendPanasonic64(irsend.encodePanasonic(0x4004, 1, 2, 3), 56);
  297. irsend.makeDecodeResult();
  298. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  299. // Shouldn't pass if strict off and wrong bit size.
  300. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
  301. // Re-decode with correct bit size.
  302. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 56, true));
  303. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 56, false));
  304. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  305. EXPECT_EQ(56, irsend.capture.bits);
  306. EXPECT_EQ(0x400401020300, irsend.capture.value);
  307. EXPECT_EQ(0x4004, irsend.capture.address);
  308. EXPECT_EQ(0x01020300, irsend.capture.command);
  309. }
  310. // Decode (non-standard) 64-bit messages.
  311. TEST(TestDecodePanasonic, Decode64BitMessages) {
  312. IRsendTest irsend(4);
  313. IRrecv irrecv(4);
  314. irsend.begin();
  315. irsend.reset();
  316. // Illegal value & size Panasonic 64-bit message.
  317. irsend.sendPanasonic64(0xFFFFFFFFFFFFFFFF, 64);
  318. irsend.makeDecodeResult();
  319. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, 64, true));
  320. // Should work with a 'normal' match (not strict)
  321. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, 64, false));
  322. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  323. EXPECT_EQ(64, irsend.capture.bits);
  324. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  325. EXPECT_EQ(0xFFFFFFFF, irsend.capture.address);
  326. EXPECT_EQ(0xFFFFFFFF, irsend.capture.command);
  327. }
  328. // Decode a 'real' example via GlobalCache
  329. TEST(TestDecodePanasonic, DecodeGlobalCacheExample) {
  330. IRsendTest irsend(4);
  331. IRrecv irrecv(4);
  332. irsend.begin();
  333. irsend.reset();
  334. // Panasonic code from Global Cache.
  335. uint16_t gc_test[103] = {
  336. 37000, 1, 1, 126, 64, 16, 17, 16, 49, 15, 16, 16, 16, 16, 16,
  337. 16, 17, 15, 17, 15, 17, 15, 17, 15, 16, 16, 16, 16, 16, 16,
  338. 17, 15, 49, 16, 16, 16, 16, 16, 17, 15, 17, 15, 17, 15, 17,
  339. 15, 16, 16, 16, 16, 16, 16, 49, 15, 49, 16, 17, 15, 17, 15,
  340. 49, 16, 16, 16, 17, 16, 17, 15, 17, 15, 49, 16, 49, 15, 49,
  341. 16, 17, 16, 49, 15, 49, 16, 17, 15, 48, 16, 16, 16, 49, 15,
  342. 48, 16, 49, 15, 49, 16, 49, 15, 17, 15, 16, 16, 2721};
  343. irsend.sendGC(gc_test, 103);
  344. irsend.makeDecodeResult();
  345. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, true));
  346. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  347. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  348. EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
  349. EXPECT_EQ(0x4004, irsend.capture.address);
  350. EXPECT_EQ(0x0190ED7C, irsend.capture.command);
  351. EXPECT_FALSE(irsend.capture.repeat);
  352. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture));
  353. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  354. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  355. EXPECT_EQ(0x40040190ED7C, irsend.capture.value);
  356. EXPECT_EQ(0x4004, irsend.capture.address);
  357. EXPECT_EQ(0x0190ED7C, irsend.capture.command);
  358. EXPECT_FALSE(irsend.capture.repeat);
  359. }
  360. // Fail to decode a non-Panasonic example via GlobalCache
  361. TEST(TestDecodePanasonic, FailToDecodeNonPanasonicExample) {
  362. IRsendTest irsend(4);
  363. IRrecv irrecv(4);
  364. irsend.begin();
  365. irsend.reset();
  366. // Modified a few entries to unexpected values, based on previous test case.
  367. uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
  368. 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
  369. 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
  370. 61, 20, 20, 20, 20, 20, 20, 20, 884};
  371. irsend.sendGC(gc_test, 39);
  372. irsend.makeDecodeResult();
  373. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture));
  374. ASSERT_FALSE(irrecv.decodePanasonic(&irsend.capture, kPanasonicBits, false));
  375. }
  376. // Failing to decode Panasonic in Issue #245
  377. TEST(TestDecodePanasonic, DecodeIssue245) {
  378. IRsendTest irsend(4);
  379. IRrecv irrecv(4);
  380. irsend.begin();
  381. irsend.reset();
  382. uint16_t rawData[100] = {
  383. 3550, 1750, 500, 450, 500, 1300, 500, 450, 500, 450, 500, 450,
  384. 500, 450, 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
  385. 500, 450, 500, 450, 500, 1300, 500, 450, 500, 450, 500, 450,
  386. 500, 450, 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
  387. 500, 1300, 500, 450, 500, 450, 500, 450, 500, 450, 500, 450,
  388. 500, 450, 500, 450, 500, 450, 500, 1300, 500, 450, 500, 1300,
  389. 500, 1300, 500, 1300, 500, 1300, 500, 450, 500, 450, 500, 1300,
  390. 500, 450, 500, 1300, 500, 1300, 500, 1300, 500, 1300, 500, 450,
  391. 500, 1300, 500, 5000};
  392. irsend.sendRaw(rawData, 100, 37);
  393. irsend.makeDecodeResult();
  394. ASSERT_TRUE(irrecv.decodePanasonic(&irsend.capture));
  395. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  396. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  397. EXPECT_EQ(0x40040100BCBD, irsend.capture.value);
  398. EXPECT_EQ(0x4004, irsend.capture.address);
  399. EXPECT_EQ(0x100BCBD, irsend.capture.command);
  400. EXPECT_FALSE(irsend.capture.repeat);
  401. irsend.reset();
  402. irsend.sendRaw(rawData, 99, 37);
  403. irsend.makeDecodeResult();
  404. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  405. EXPECT_EQ(PANASONIC, irsend.capture.decode_type);
  406. EXPECT_EQ(kPanasonicBits, irsend.capture.bits);
  407. EXPECT_EQ(0x40040100BCBD, irsend.capture.value);
  408. EXPECT_EQ(0x4004, irsend.capture.address);
  409. EXPECT_EQ(0x100BCBD, irsend.capture.command);
  410. EXPECT_FALSE(irsend.capture.repeat);
  411. }
  412. // Tests for sendPanasonicAC().
  413. // Test sending typical data only.
  414. TEST(TestSendPanasonicAC, SendDataOnly) {
  415. IRsendTest irsend(0);
  416. irsend.begin();
  417. irsend.reset();
  418. uint8_t state[kPanasonicAcStateLength] = {
  419. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  420. 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
  421. 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
  422. irsend.sendPanasonicAC(state);
  423. EXPECT_EQ(
  424. "m3456s1728"
  425. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  426. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  427. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s1296m432s1296"
  428. "m432s432m432s432m432s1296m432s432m432s432m432s432m432s432m432s432"
  429. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  430. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  431. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  432. "m432s432m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432"
  433. "m432s10000"
  434. "m3456s1728"
  435. "m432s432m432s1296m432s432m432s432m432s432m432s432m432s432m432s432"
  436. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s432m432s432"
  437. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s1296m432s1296"
  438. "m432s432m432s432m432s1296m432s432m432s432m432s432m432s432m432s432"
  439. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  440. "m432s432m432s432m432s432m432s432m432s1296m432s1296m432s432m432s432"
  441. "m432s432m432s1296m432s432m432s432m432s1296m432s1296m432s432m432s432"
  442. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  443. "m432s1296m432s1296m432s1296m432s1296m432s432m432s1296m432s432m432s1296"
  444. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  445. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  446. "m432s432m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432"
  447. "m432s432m432s432m432s432m432s432m432s432m432s1296m432s1296m432s432"
  448. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  449. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  450. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s1296"
  451. "m432s432m432s432m432s432m432s432m432s432m432s432m432s432m432s432"
  452. "m432s432m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432"
  453. "m432s1296m432s1296m432s432m432s432m432s432m432s432m432s432m432s1296"
  454. "m432s100000",
  455. irsend.outputStr());
  456. }
  457. // Tests for the IRPanasonicAc class.
  458. TEST(TestIRPanasonicAcClass, ChecksumCalculation) {
  459. IRPanasonicAc pana(0);
  460. const uint8_t originalstate[kPanasonicAcStateLength] = {
  461. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  462. 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
  463. 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
  464. uint8_t examplestate[kPanasonicAcStateLength] = {
  465. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  466. 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
  467. 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
  468. EXPECT_TRUE(IRPanasonicAc::validChecksum(examplestate));
  469. EXPECT_EQ(0x83, IRPanasonicAc::calcChecksum(examplestate));
  470. examplestate[kPanasonicAcStateLength - 1] = 0x0; // Set incoorect checksum.
  471. EXPECT_FALSE(IRPanasonicAc::validChecksum(examplestate));
  472. EXPECT_EQ(0x83, IRPanasonicAc::calcChecksum(examplestate));
  473. pana.setRaw(examplestate);
  474. // Extracting the state from the object should have a correct checksum.
  475. EXPECT_TRUE(IRPanasonicAc::validChecksum(pana.getRaw()));
  476. EXPECT_STATE_EQ(originalstate, pana.getRaw(), kPanasonicAcBits);
  477. examplestate[kPanasonicAcStateLength - 1] = 0x83; // Restore old checksum.
  478. // Change the state to force a different checksum.
  479. examplestate[6] = 0x01; // Should increase checksum by 1.
  480. EXPECT_FALSE(IRPanasonicAc::validChecksum(examplestate));
  481. EXPECT_EQ(0x84, IRPanasonicAc::calcChecksum(examplestate));
  482. }
  483. TEST(TestIRPanasonicAcClass, SetAndGetPower) {
  484. IRPanasonicAc pana(0);
  485. pana.on();
  486. EXPECT_TRUE(pana.getPower());
  487. pana.off();
  488. EXPECT_FALSE(pana.getPower());
  489. pana.setPower(true);
  490. EXPECT_TRUE(pana.getPower());
  491. pana.setPower(false);
  492. EXPECT_FALSE(pana.getPower());
  493. }
  494. TEST(TestIRPanasonicAcClass, SetAndGetModel) {
  495. IRPanasonicAc pana(0);
  496. EXPECT_EQ(kPanasonicJke, pana.getModel());
  497. pana.setModel(kPanasonicDke);
  498. EXPECT_EQ(kPanasonicDke, pana.getModel());
  499. pana.setModel(kPanasonicLke);
  500. EXPECT_EQ(kPanasonicLke, pana.getModel());
  501. pana.setModel(kPanasonicNke);
  502. EXPECT_EQ(kPanasonicNke, pana.getModel());
  503. pana.setModel(kPanasonicUnknown); // shouldn't change.
  504. EXPECT_EQ(kPanasonicNke, pana.getModel());
  505. pana.setModel((panasonic_ac_remote_model_t)255); // shouldn't change.
  506. EXPECT_EQ(kPanasonicNke, pana.getModel());
  507. pana.setModel(kPanasonicJke);
  508. EXPECT_EQ(kPanasonicJke, pana.getModel());
  509. // This state tickled a bug in getModel(). Should read as a JKE.
  510. uint8_t jkeState[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  511. 0x20, 0xE0, 0x04, 0x00, 0x32, 0x2E, 0x80, 0xA2, 0x00,
  512. 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x74};
  513. pana.setModel(kPanasonicDke); // Make sure it isn't somehow set to JKE
  514. pana.setRaw(jkeState);
  515. EXPECT_EQ(kPanasonicJke, pana.getModel());
  516. EXPECT_STATE_EQ(jkeState, pana.getRaw(), kPanasonicAcBits);
  517. // This state tickled a bug in getModel(). Should read as CKP.
  518. uint8_t ckpState[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  519. 0x20, 0xE0, 0x04, 0x00, 0x67, 0x2E, 0x80, 0xAF, 0x00,
  520. 0xC0, 0x6B, 0x98, 0x10, 0x00, 0x81, 0x64, 0x05, 0x87};
  521. pana.setModel(kPanasonicDke); // Make sure it isn't somehow set to CKP
  522. pana.setRaw(ckpState);
  523. EXPECT_EQ(kPanasonicCkp, pana.getModel());
  524. EXPECT_STATE_EQ(ckpState, pana.getRaw(), kPanasonicAcBits);
  525. }
  526. TEST(TestIRPanasonicAcClass, SetAndGetMode) {
  527. IRPanasonicAc pana(0);
  528. pana.setMode(kPanasonicAcCool);
  529. pana.setTemp(21);
  530. EXPECT_EQ(kPanasonicAcCool, pana.getMode());
  531. pana.setMode(kPanasonicAcHeat);
  532. EXPECT_EQ(kPanasonicAcHeat, pana.getMode());
  533. pana.setMode(kPanasonicAcAuto);
  534. EXPECT_EQ(kPanasonicAcAuto, pana.getMode());
  535. pana.setMode(kPanasonicAcDry);
  536. EXPECT_EQ(kPanasonicAcDry, pana.getMode());
  537. EXPECT_EQ(21, pana.getTemp()); // Temp should be unchanged.
  538. pana.setMode(kPanasonicAcFan);
  539. EXPECT_EQ(kPanasonicAcFan, pana.getMode());
  540. EXPECT_EQ(kPanasonicAcFanModeTemp, pana.getTemp()); // Temp should change.
  541. pana.setMode(kPanasonicAcCool);
  542. EXPECT_EQ(kPanasonicAcCool, pana.getMode());
  543. // Temp should be unchanged from the last manual change.
  544. EXPECT_EQ(21, pana.getTemp());
  545. }
  546. TEST(TestIRPanasonicAcClass, SetAndGetTemp) {
  547. IRPanasonicAc pana(0);
  548. pana.setTemp(25);
  549. EXPECT_EQ(25, pana.getTemp());
  550. pana.setTemp(kPanasonicAcMinTemp);
  551. EXPECT_EQ(kPanasonicAcMinTemp, pana.getTemp());
  552. pana.setTemp(kPanasonicAcMinTemp - 1);
  553. EXPECT_EQ(kPanasonicAcMinTemp, pana.getTemp());
  554. pana.setTemp(kPanasonicAcMaxTemp);
  555. EXPECT_EQ(kPanasonicAcMaxTemp, pana.getTemp());
  556. pana.setTemp(kPanasonicAcMaxTemp + 1);
  557. EXPECT_EQ(kPanasonicAcMaxTemp, pana.getTemp());
  558. }
  559. TEST(TestIRPanasonicAcClass, SetAndGetFan) {
  560. IRPanasonicAc pana(0);
  561. pana.setFan(kPanasonicAcFanAuto);
  562. EXPECT_EQ(kPanasonicAcFanAuto, pana.getFan());
  563. pana.setFan(kPanasonicAcFanMin);
  564. EXPECT_EQ(kPanasonicAcFanMin, pana.getFan());
  565. pana.setFan(kPanasonicAcFanMin - 1);
  566. EXPECT_EQ(kPanasonicAcFanMin, pana.getFan());
  567. pana.setFan(kPanasonicAcFanMin + 1);
  568. EXPECT_EQ(kPanasonicAcFanMin + 1, pana.getFan());
  569. pana.setFan(kPanasonicAcFanMax);
  570. EXPECT_EQ(kPanasonicAcFanMax, pana.getFan());
  571. pana.setFan(kPanasonicAcFanMax + 1);
  572. EXPECT_EQ(kPanasonicAcFanMax, pana.getFan());
  573. pana.setFan(kPanasonicAcFanMax - 1);
  574. EXPECT_EQ(kPanasonicAcFanMax - 1, pana.getFan());
  575. }
  576. TEST(TestIRPanasonicAcClass, SetAndGetSwings) {
  577. IRPanasonicAc pana(0);
  578. // Vertical
  579. pana.setSwingVertical(kPanasonicAcSwingVAuto);
  580. EXPECT_EQ(kPanasonicAcSwingVAuto, pana.getSwingVertical());
  581. pana.setSwingVertical(kPanasonicAcSwingVUp);
  582. EXPECT_EQ(kPanasonicAcSwingVUp, pana.getSwingVertical());
  583. pana.setSwingVertical(kPanasonicAcSwingVUp - 1);
  584. EXPECT_EQ(kPanasonicAcSwingVUp, pana.getSwingVertical());
  585. pana.setSwingVertical(kPanasonicAcSwingVUp + 1);
  586. EXPECT_EQ(kPanasonicAcSwingVUp + 1, pana.getSwingVertical());
  587. pana.setSwingVertical(kPanasonicAcSwingVDown);
  588. EXPECT_EQ(kPanasonicAcSwingVDown, pana.getSwingVertical());
  589. pana.setSwingVertical(kPanasonicAcSwingVDown + 1);
  590. EXPECT_EQ(kPanasonicAcSwingVDown, pana.getSwingVertical());
  591. pana.setSwingVertical(kPanasonicAcSwingVDown - 1);
  592. EXPECT_EQ(kPanasonicAcSwingVDown - 1, pana.getSwingVertical());
  593. pana.setSwingVertical(kPanasonicAcSwingVAuto);
  594. EXPECT_EQ(kPanasonicAcSwingVAuto, pana.getSwingVertical());
  595. // Horizontal is model dependant.
  596. pana.setModel(kPanasonicNke); // NKE is always fixed in the middle.
  597. EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
  598. pana.setSwingHorizontal(kPanasonicAcSwingHAuto);
  599. EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
  600. pana.setModel(kPanasonicJke); // JKE has no H swing.
  601. EXPECT_EQ(0, pana.getSwingHorizontal());
  602. pana.setSwingHorizontal(kPanasonicAcSwingHMiddle);
  603. EXPECT_EQ(0, pana.getSwingHorizontal());
  604. pana.setModel(kPanasonicLke); // LKE is always fixed in the middle.
  605. EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
  606. pana.setSwingHorizontal(kPanasonicAcSwingHAuto);
  607. EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
  608. pana.setModel(kPanasonicDke); // DKE has full control.
  609. ASSERT_EQ(kPanasonicDke, pana.getModel());
  610. // Auto was last requested.
  611. EXPECT_EQ(kPanasonicAcSwingHAuto, pana.getSwingHorizontal());
  612. pana.setSwingHorizontal(kPanasonicAcSwingHLeft);
  613. EXPECT_EQ(kPanasonicAcSwingHLeft, pana.getSwingHorizontal());
  614. // Changing models from DKE to something else, then back should not change
  615. // the intended swing.
  616. pana.setModel(kPanasonicLke);
  617. EXPECT_EQ(kPanasonicAcSwingHMiddle, pana.getSwingHorizontal());
  618. pana.setModel(kPanasonicDke);
  619. EXPECT_EQ(kPanasonicAcSwingHLeft, pana.getSwingHorizontal());
  620. }
  621. TEST(TestIRPanasonicAcClass, QuietAndPowerful) {
  622. IRPanasonicAc pana(0);
  623. pana.setQuiet(false);
  624. EXPECT_FALSE(pana.getQuiet());
  625. pana.setQuiet(true);
  626. EXPECT_TRUE(pana.getQuiet());
  627. EXPECT_FALSE(pana.getPowerful());
  628. pana.setPowerful(false);
  629. EXPECT_FALSE(pana.getPowerful());
  630. EXPECT_TRUE(pana.getQuiet());
  631. pana.setPowerful(true);
  632. EXPECT_TRUE(pana.getPowerful());
  633. EXPECT_FALSE(pana.getQuiet());
  634. pana.setPowerful(false);
  635. EXPECT_FALSE(pana.getPowerful());
  636. EXPECT_FALSE(pana.getQuiet());
  637. pana.setPowerful(true);
  638. pana.setQuiet(true);
  639. EXPECT_TRUE(pana.getQuiet());
  640. EXPECT_FALSE(pana.getPowerful());
  641. }
  642. TEST(TestIRPanasonicAcClass, HumanReadable) {
  643. IRPanasonicAc pana(0);
  644. EXPECT_EQ(
  645. "Model: 4 (JKE), Power: Off, Mode: 0 (AUTO), Temp: 0C, "
  646. "Fan: 253 (UNKNOWN), Swing (Vertical): 0 (UNKNOWN), Quiet: Off, "
  647. "Powerful: Off, Clock: 0:00, On Timer: Off, Off Timer: Off",
  648. pana.toString());
  649. pana.setPower(true);
  650. pana.setTemp(kPanasonicAcMaxTemp);
  651. pana.setMode(kPanasonicAcHeat);
  652. pana.setFan(kPanasonicAcFanMax);
  653. pana.setSwingVertical(kPanasonicAcSwingVAuto);
  654. pana.setPowerful(true);
  655. EXPECT_EQ(
  656. "Model: 4 (JKE), Power: On, Mode: 4 (HEAT), Temp: 30C, "
  657. "Fan: 4 (MAX), Swing (Vertical): 15 (AUTO), Quiet: Off, "
  658. "Powerful: On, Clock: 0:00, On Timer: Off, Off Timer: Off",
  659. pana.toString());
  660. pana.setQuiet(true);
  661. pana.setModel(kPanasonicLke);
  662. EXPECT_EQ(
  663. "Model: 1 (LKE), Power: Off, Mode: 4 (HEAT), Temp: 30C, "
  664. "Fan: 4 (MAX), Swing (Vertical): 15 (AUTO), "
  665. "Swing (Horizontal): 6 (Middle), Quiet: On, Powerful: Off, "
  666. "Clock: 0:00, On Timer: 0:00, Off Timer: Off",
  667. pana.toString());
  668. pana.setModel(kPanasonicDke);
  669. pana.setSwingHorizontal(kPanasonicAcSwingHRight);
  670. EXPECT_EQ(
  671. "Model: 3 (DKE), Power: Off, Mode: 4 (HEAT), Temp: 30C, "
  672. "Fan: 4 (MAX), Swing (Vertical): 15 (AUTO), "
  673. "Swing (Horizontal): 11 (Right), Quiet: On, Powerful: Off, "
  674. "Clock: 0:00, On Timer: Off, Off Timer: Off",
  675. pana.toString());
  676. }
  677. // Tests for decodePanasonicAC().
  678. // Decode normal Panasonic AC messages.
  679. TEST(TestDecodePanasonicAC, RealExample) {
  680. IRsendTest irsend(4);
  681. IRrecv irrecv(4);
  682. irsend.begin();
  683. // Data from Issue #525
  684. uint16_t rawData[439] = {
  685. 3582, 1686, 488, 378, 488, 1238, 488, 378, 488, 378, 488, 378,
  686. 488, 378, 488, 378, 488, 384, 488, 378, 488, 378, 488, 378,
  687. 488, 378, 488, 378, 488, 1242, 486, 378, 488, 384, 488, 378,
  688. 488, 378, 488, 380, 486, 382, 484, 382, 484, 1264, 464, 1266,
  689. 460, 1272, 462, 378, 488, 406, 460, 1266, 462, 380, 488, 382,
  690. 484, 388, 478, 406, 462, 410, 462, 404, 462, 406, 462, 396,
  691. 470, 406, 462, 404, 462, 406, 460, 404, 462, 410, 462, 404,
  692. 462, 404, 462, 406, 464, 406, 462, 404, 462, 406, 462, 404,
  693. 462, 410, 462, 404, 462, 406, 462, 404, 462, 404, 462, 404,
  694. 462, 406, 460, 406, 462, 410, 462, 404, 462, 1264, 484, 1244,
  695. 486, 382, 482, 382, 486, 382, 486, 378, 486, 382, 488, 9924,
  696. 3554, 1686, 488, 378, 490, 1240, 486, 378, 488, 378, 488, 378,
  697. 488, 378, 488, 382, 484, 386, 486, 378, 488, 382, 486, 378,
  698. 488, 382, 486, 382, 484, 1242, 486, 380, 488, 386, 484, 382,
  699. 486, 380, 486, 382, 486, 380, 486, 380, 486, 1242, 486, 1242,
  700. 484, 1248, 484, 380, 488, 382, 484, 1242, 486, 382, 484, 382,
  701. 484, 382, 484, 382, 486, 386, 484, 382, 486, 382, 484, 382,
  702. 486, 382, 486, 380, 484, 382, 486, 382, 488, 380, 486, 382,
  703. 484, 380, 462, 406, 488, 376, 484, 1246, 482, 1246, 460, 404,
  704. 480, 392, 484, 386, 482, 1244, 484, 382, 484, 382, 484, 1242,
  705. 482, 1244, 484, 382, 464, 410, 460, 404, 462, 406, 462, 404,
  706. 462, 404, 470, 396, 462, 406, 462, 404, 462, 1286, 460, 1268,
  707. 458, 1268, 460, 1266, 460, 1266, 460, 406, 460, 1266, 462, 406,
  708. 460, 1272, 462, 406, 460, 406, 460, 406, 460, 406, 462, 404,
  709. 462, 406, 460, 406, 462, 410, 462, 404, 462, 406, 460, 406,
  710. 460, 406, 462, 404, 462, 406, 460, 406, 460, 410, 462, 406,
  711. 460, 1268, 460, 1266, 460, 404, 460, 406, 462, 406, 460, 406,
  712. 460, 412, 456, 410, 460, 410, 438, 428, 460, 410, 456, 410,
  713. 456, 1272, 436, 1288, 438, 434, 438, 428, 438, 428, 438, 428,
  714. 438, 428, 438, 428, 438, 428, 438, 428, 438, 434, 438, 428,
  715. 438, 428, 438, 428, 438, 428, 438, 428, 440, 428, 438, 428,
  716. 438, 432, 438, 428, 438, 428, 438, 428, 438, 428, 438, 428,
  717. 438, 428, 438, 430, 438, 1294, 438, 428, 438, 428, 438, 428,
  718. 438, 428, 438, 428, 438, 428, 438, 428, 438, 434, 438, 428,
  719. 438, 1288, 438, 1290, 438, 428, 438, 428, 438, 428, 438, 428,
  720. 438, 432, 438, 1288, 438, 1290, 438, 430, 438, 428, 438, 428,
  721. 438, 428, 438, 428, 438, 1292, 438};
  722. uint8_t expectedState[kPanasonicAcStateLength] = {
  723. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  724. 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
  725. 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
  726. irsend.sendRaw(rawData, 439, kPanasonicFreq);
  727. irsend.makeDecodeResult();
  728. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  729. ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
  730. EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
  731. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  732. EXPECT_FALSE(irsend.capture.repeat);
  733. }
  734. // Decode synthetic Panasonic AC message.
  735. TEST(TestDecodePanasonicAC, SyntheticExample) {
  736. IRsendTest irsend(0);
  737. IRrecv irrecv(0);
  738. irsend.begin();
  739. // Data from Issue #525
  740. uint8_t expectedState[kPanasonicAcStateLength] = {
  741. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  742. 0x20, 0xE0, 0x04, 0x00, 0x30, 0x32, 0x80, 0xAF, 0x00,
  743. 0x00, 0x06, 0x60, 0x00, 0x00, 0x80, 0x00, 0x06, 0x83};
  744. irsend.sendPanasonicAC(expectedState);
  745. irsend.makeDecodeResult();
  746. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  747. ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
  748. EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
  749. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  750. EXPECT_FALSE(irsend.capture.repeat);
  751. IRPanasonicAc pana(0);
  752. pana.setRaw(irsend.capture.state);
  753. EXPECT_EQ(
  754. "Model: 4 (JKE), Power: Off, Mode: 3 (COOL), Temp: 25C, "
  755. "Fan: 7 (AUTO), Swing (Vertical): 15 (AUTO), Quiet: Off, "
  756. "Powerful: Off, Clock: 0:00, On Timer: Off, Off Timer: Off",
  757. pana.toString());
  758. }
  759. // Tests for general utility functions.
  760. TEST(TestGeneralPanasonic, hasACState) {
  761. EXPECT_TRUE(hasACState(PANASONIC_AC));
  762. ASSERT_FALSE(hasACState(PANASONIC));
  763. }
  764. TEST(TestGeneralPanasonic, typeToString) {
  765. EXPECT_EQ("PANASONIC_AC", typeToString(PANASONIC_AC));
  766. EXPECT_EQ("PANASONIC", typeToString(PANASONIC));
  767. }
  768. // Decode a problematic Panasonic AC message
  769. TEST(TestDecodePanasonicAC, Issue540) {
  770. IRsendTest irsend(0);
  771. IRrecv irrecv(0);
  772. irsend.begin();
  773. // Data from Issue #540
  774. uint16_t rawData[439] = {
  775. 3512, 1714, 466, 408, 466, 1280, 470, 408, 466, 412, 466, 408,
  776. 466, 412, 462, 412, 466, 414, 466, 408, 466, 412, 462, 412,
  777. 466, 412, 466, 408, 466, 1280, 466, 412, 462, 416, 462, 412,
  778. 466, 408, 466, 412, 462, 416, 462, 412, 462, 1282, 462, 1284,
  779. 462, 1288, 466, 412, 462, 412, 462, 1284, 462, 416, 440, 438,
  780. 462, 412, 462, 412, 462, 416, 466, 412, 462, 412, 462, 412,
  781. 440, 442, 462, 412, 462, 412, 460, 418, 462, 416, 462, 412,
  782. 462, 418, 462, 412, 462, 416, 462, 412, 436, 442, 462, 412,
  783. 460, 418, 462, 416, 462, 412, 460, 412, 462, 420, 436, 438,
  784. 462, 412, 462, 416, 432, 448, 436, 438, 436, 1310, 436, 1310,
  785. 462, 420, 432, 442, 436, 438, 462, 416, 432, 444, 432, 10008,
  786. 3480, 1744, 492, 382, 492, 1254, 492, 386, 488, 390, 492, 382,
  787. 492, 386, 488, 386, 492, 386, 492, 386, 488, 386, 488, 386,
  788. 492, 386, 492, 382, 492, 1258, 488, 386, 488, 390, 492, 386,
  789. 488, 386, 488, 386, 492, 390, 488, 386, 488, 1256, 488, 1258,
  790. 488, 1262, 488, 390, 488, 386, 488, 1258, 488, 390, 488, 392,
  791. 488, 386, 488, 386, 488, 394, 488, 386, 488, 386, 488, 390,
  792. 488, 390, 488, 386, 488, 390, 462, 412, 488, 390, 462, 1282,
  793. 488, 390, 456, 416, 458, 1292, 456, 1288, 488, 1258, 488, 392,
  794. 456, 422, 488, 390, 484, 392, 484, 1262, 458, 420, 484, 1262,
  795. 482, 1262, 488, 392, 484, 394, 484, 416, 436, 442, 458, 416,
  796. 458, 422, 430, 448, 432, 442, 458, 416, 458, 1296, 432, 1314,
  797. 458, 1288, 432, 1312, 432, 1322, 428, 446, 428, 1318, 432, 442,
  798. 432, 1318, 432, 1318, 428, 446, 428, 1318, 428, 1322, 430, 448,
  799. 426, 448, 428, 452, 426, 452, 426, 448, 428, 472, 400, 478,
  800. 402, 478, 402, 472, 402, 476, 402, 472, 402, 478, 402, 472,
  801. 402, 1348, 398, 1348, 398, 1352, 398, 508, 370, 478, 398, 476,
  802. 398, 512, 366, 508, 370, 502, 372, 508, 340, 538, 372, 504,
  803. 344, 1400, 344, 1400, 346, 1434, 314, 560, 316, 588, 290, 560,
  804. 314, 564, 396, 400, 474, 400, 480, 394, 480, 404, 474, 400,
  805. 454, 446, 454, 426, 448, 430, 424, 450, 428, 452, 448, 426,
  806. 426, 452, 424, 1322, 454, 426, 450, 424, 426, 452, 428, 452,
  807. 450, 424, 428, 446, 426, 1322, 454, 426, 422, 450, 454, 426,
  808. 448, 430, 454, 426, 448, 426, 428, 446, 454, 430, 454, 422,
  809. 452, 424, 424, 452, 452, 430, 424, 452, 452, 426, 448, 426,
  810. 426, 456, 448, 426, 448, 1296, 424, 1322, 426, 1326, 450, 1270,
  811. 478, 422, 454, 424, 424, 450, 454};
  812. uint8_t expectedState[kPanasonicAcStateLength] = {
  813. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  814. 0x20, 0xE0, 0x04, 0x00, 0x39, 0x34, 0x80, 0xAF, 0x0D,
  815. 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 0x00, 0x00, 0x1E};
  816. irsend.sendRaw(rawData, 439, kPanasonicFreq);
  817. irsend.makeDecodeResult();
  818. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  819. ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
  820. EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
  821. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  822. EXPECT_FALSE(irsend.capture.repeat);
  823. IRPanasonicAc pana(0);
  824. pana.setRaw(irsend.capture.state);
  825. // TODO(crankyoldgit): Try to figure out what model this should be.
  826. EXPECT_EQ(
  827. "Model: 0 (UNKNOWN), Power: On, Mode: 3 (COOL), Temp: 26C, "
  828. "Fan: 7 (AUTO), Swing (Vertical): 15 (AUTO), "
  829. "Swing (Horizontal): 13 (AUTO), Quiet: Off, Powerful: Off, "
  830. "Clock: 0:00, On Timer: Off, Off Timer: Off",
  831. pana.toString());
  832. }
  833. TEST(TestIRPanasonicAcClass, TimeBasics) {
  834. EXPECT_EQ(0x186, IRPanasonicAc::encodeTime(6, 30));
  835. EXPECT_EQ(0x3CA, IRPanasonicAc::encodeTime(16, 10));
  836. EXPECT_EQ(0x448, IRPanasonicAc::encodeTime(18, 16));
  837. EXPECT_EQ(0, IRPanasonicAc::encodeTime(0, 0));
  838. EXPECT_EQ(kPanasonicAcTimeMax, IRPanasonicAc::encodeTime(23, 59));
  839. EXPECT_EQ("16:10",
  840. IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(16, 10)));
  841. EXPECT_EQ("6:30",
  842. IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(6, 30)));
  843. EXPECT_EQ("18:16",
  844. IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(18, 16)));
  845. EXPECT_EQ("1:01",
  846. IRPanasonicAc::timeToString(IRPanasonicAc::encodeTime(1, 1)));
  847. EXPECT_EQ(kPanasonicAcTimeMax, IRPanasonicAc::encodeTime(23, 59));
  848. EXPECT_EQ(kPanasonicAcTimeMax, IRPanasonicAc::encodeTime(25, 72));
  849. EXPECT_EQ(59, IRPanasonicAc::encodeTime(0, 72));
  850. EXPECT_EQ(23 * 60, IRPanasonicAc::encodeTime(27, 0));
  851. EXPECT_EQ("0:00", IRPanasonicAc::timeToString(0));
  852. EXPECT_EQ("23:59", IRPanasonicAc::timeToString(kPanasonicAcTimeMax));
  853. }
  854. TEST(TestIRPanasonicAcClass, TimersAndClock) {
  855. IRPanasonicAc pana(0);
  856. // Data from Issue #544
  857. uint8_t state[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  858. 0x20, 0xE0, 0x04, 0x00, 0x4E, 0x2E, 0x80, 0xAF, 0x00,
  859. 0xCA, 0x6B, 0x98, 0x10, 0x00, 0x01, 0x48, 0x04, 0xDB};
  860. pana.setRaw(state);
  861. EXPECT_TRUE(pana.isOnTimerEnabled());
  862. EXPECT_EQ(0x3CA, pana.getOnTimer());
  863. EXPECT_TRUE(pana.isOffTimerEnabled());
  864. EXPECT_EQ(0x186, pana.getOffTimer());
  865. EXPECT_EQ(0x448, pana.getClock());
  866. pana.cancelOnTimer();
  867. EXPECT_FALSE(pana.isOnTimerEnabled());
  868. EXPECT_EQ(0, pana.getOnTimer());
  869. EXPECT_TRUE(pana.isOffTimerEnabled());
  870. EXPECT_EQ(0x186, pana.getOffTimer());
  871. EXPECT_EQ(0x448, pana.getClock());
  872. pana.cancelOffTimer();
  873. EXPECT_FALSE(pana.isOnTimerEnabled());
  874. EXPECT_EQ(0, pana.getOnTimer());
  875. EXPECT_FALSE(pana.isOffTimerEnabled());
  876. EXPECT_EQ(0, pana.getOffTimer());
  877. EXPECT_EQ(0x448, pana.getClock());
  878. pana.setOnTimer(7 * 60 + 50);
  879. EXPECT_TRUE(pana.isOnTimerEnabled());
  880. EXPECT_EQ(7 * 60 + 50, pana.getOnTimer());
  881. EXPECT_FALSE(pana.isOffTimerEnabled());
  882. EXPECT_EQ(0, pana.getOffTimer());
  883. EXPECT_EQ(0x448, pana.getClock());
  884. pana.setOnTimer(7 * 60 + 57); // It should round down.
  885. EXPECT_EQ(7 * 60 + 50, pana.getOnTimer());
  886. pana.setOnTimer(28 * 60); // It should round down.
  887. EXPECT_EQ(kPanasonicAcTimeMax - 9, pana.getOnTimer());
  888. pana.setOnTimer(kPanasonicAcTimeSpecial);
  889. EXPECT_EQ(0, pana.getOnTimer());
  890. pana.setOnTimer(7 * 60 + 50);
  891. pana.setOffTimer(19 * 60 + 30);
  892. EXPECT_TRUE(pana.isOnTimerEnabled());
  893. EXPECT_EQ(7 * 60 + 50, pana.getOnTimer());
  894. EXPECT_TRUE(pana.isOffTimerEnabled());
  895. EXPECT_EQ(19 * 60 + 30, pana.getOffTimer());
  896. EXPECT_EQ(0x448, pana.getClock());
  897. pana.setOffTimer(19 * 60 + 57); // It should round down.
  898. EXPECT_EQ(19 * 60 + 50, pana.getOffTimer());
  899. pana.setOffTimer(28 * 60); // It should round down.
  900. EXPECT_EQ(kPanasonicAcTimeMax - 9, pana.getOffTimer());
  901. pana.setOffTimer(kPanasonicAcTimeSpecial);
  902. EXPECT_EQ(0, pana.getOffTimer());
  903. pana.setClock(0);
  904. EXPECT_EQ(0, pana.getClock());
  905. pana.setClock(kPanasonicAcTimeMax);
  906. EXPECT_EQ(kPanasonicAcTimeMax, pana.getClock());
  907. pana.setClock(kPanasonicAcTimeMax - 1);
  908. EXPECT_EQ(kPanasonicAcTimeMax - 1, pana.getClock());
  909. pana.setClock(kPanasonicAcTimeMax + 1);
  910. EXPECT_EQ(kPanasonicAcTimeMax, pana.getClock());
  911. pana.setClock(kPanasonicAcTimeSpecial);
  912. EXPECT_EQ(0, pana.getClock());
  913. }
  914. // Decode a real short Panasonic AC message
  915. TEST(TestDecodePanasonicAC, RealExampleOfShortMessage) {
  916. IRsendTest irsend(0);
  917. IRrecv irrecv(0);
  918. irsend.begin();
  919. // Data from Issue #544 (Odour Wash)
  920. uint16_t rawData[263] = {
  921. 3496, 1734, 506, 366, 448, 1294, 504, 368, 498, 374, 452, 418,
  922. 448, 424, 444, 428, 450, 422, 446, 426, 450, 420, 448, 424,
  923. 452, 418, 448, 422, 444, 1300, 498, 374, 504, 368, 448, 424,
  924. 452, 418, 448, 424, 444, 428, 450, 422, 446, 1296, 500, 1242,
  925. 502, 1242, 504, 368, 498, 374, 452, 1292, 504, 366, 450, 422,
  926. 444, 426, 450, 420, 446, 424, 452, 418, 448, 424, 444, 428,
  927. 450, 422, 444, 426, 450, 420, 446, 424, 452, 418, 448, 422,
  928. 444, 428, 450, 422, 446, 426, 452, 420, 446, 426, 452, 418,
  929. 448, 424, 442, 428, 448, 422, 444, 426, 450, 420, 446, 426,
  930. 452, 418, 448, 424, 444, 428, 450, 422, 444, 1298, 500, 1244,
  931. 500, 372, 444, 428, 450, 422, 446, 426, 452, 418, 448, 10020,
  932. 3500, 1732, 498, 372, 452, 1290, 506, 366, 450, 422, 446, 426,
  933. 452, 420, 448, 424, 452, 418, 448, 422, 444, 426, 450, 420,
  934. 446, 426, 452, 420, 446, 1296, 500, 370, 444, 428, 450, 422,
  935. 446, 426, 452, 420, 446, 424, 442, 428, 448, 1294, 502, 1240,
  936. 504, 1238, 506, 366, 448, 422, 444, 1298, 498, 374, 452, 418,
  937. 448, 424, 444, 428, 450, 422, 446, 426, 450, 420, 446, 424,
  938. 452, 418, 448, 422, 444, 428, 450, 420, 446, 1298, 498, 1244,
  939. 500, 1242, 502, 368, 446, 1298, 500, 1244, 500, 372, 444, 428,
  940. 450, 1292, 504, 368, 446, 1296, 502, 370, 444, 426, 452, 1290,
  941. 504, 1238, 506, 366, 450, 422, 446, 1298, 498, 1246, 500, 372,
  942. 444, 428, 450, 1294, 452, 420, 446, 1296, 448, 422, 444}; // UNKNOWN
  943. // 1FB51F79
  944. uint8_t expectedState[kPanasonicAcStateShortLength] = {
  945. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06,
  946. 0x02, 0x20, 0xE0, 0x04, 0x80, 0x9B, 0x32, 0x53};
  947. irsend.sendRaw(rawData, 263, kPanasonicFreq);
  948. irsend.makeDecodeResult();
  949. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  950. ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
  951. EXPECT_EQ(kPanasonicAcShortBits, irsend.capture.bits);
  952. EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
  953. }
  954. // Create and decode a short Panasonic AC message
  955. TEST(TestDecodePanasonicAC, SyntheticShortMessage) {
  956. IRsendTest irsend(0);
  957. IRrecv irrecv(0);
  958. irsend.begin();
  959. uint8_t odourWash[kPanasonicAcStateShortLength] = {
  960. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06,
  961. 0x02, 0x20, 0xE0, 0x04, 0x80, 0x9B, 0x32, 0x53};
  962. irsend.sendPanasonicAC(odourWash, kPanasonicAcStateShortLength);
  963. irsend.makeDecodeResult();
  964. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  965. ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
  966. EXPECT_EQ(kPanasonicAcShortBits, irsend.capture.bits);
  967. EXPECT_STATE_EQ(odourWash, irsend.capture.state, irsend.capture.bits);
  968. }
  969. //
  970. // Test for CKP model / see issue #544
  971. TEST(TestDecodePanasonicAC, CkpModelSpecifics) {
  972. IRsendTest irsend(0);
  973. IRrecv irrecv(0);
  974. irsend.begin();
  975. // Data from Issue #544
  976. uint8_t ckpPowerfulOn[kPanasonicAcStateLength] = {
  977. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  978. 0x20, 0xE0, 0x04, 0x00, 0x4E, 0x2E, 0x80, 0xAF, 0x00,
  979. 0x00, 0x0E, 0xE0, 0x11, 0x00, 0x01, 0x00, 0x06, 0xB7};
  980. uint8_t ckpQuietOn[kPanasonicAcStateLength] = {
  981. 0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02,
  982. 0x20, 0xE0, 0x04, 0x00, 0x4E, 0x2E, 0x80, 0xAF, 0x00,
  983. 0x00, 0x0E, 0xE0, 0x30, 0x00, 0x01, 0x00, 0x06, 0xD6};
  984. irsend.sendPanasonicAC(ckpPowerfulOn);
  985. irsend.makeDecodeResult();
  986. ASSERT_TRUE(irrecv.decode(&irsend.capture));
  987. ASSERT_EQ(PANASONIC_AC, irsend.capture.decode_type);
  988. EXPECT_EQ(kPanasonicAcBits, irsend.capture.bits);
  989. EXPECT_STATE_EQ(ckpPowerfulOn, irsend.capture.state, irsend.capture.bits);
  990. EXPECT_FALSE(irsend.capture.repeat);
  991. IRPanasonicAc pana(0);
  992. pana.setRaw(irsend.capture.state);
  993. EXPECT_EQ(
  994. "Model: 5 (CKP), Power: Off, Mode: 4 (HEAT), Temp: 23C, "
  995. "Fan: 7 (AUTO), Swing (Vertical): 15 (AUTO), Quiet: Off, "
  996. "Powerful: On, Clock: 0:00, On Timer: 0:00, Off Timer: 0:00",
  997. pana.toString());
  998. pana.setQuiet(true);
  999. EXPECT_FALSE(pana.getPowerful());
  1000. EXPECT_TRUE(pana.getQuiet());
  1001. EXPECT_EQ(kPanasonicCkp, pana.getModel());
  1002. EXPECT_STATE_EQ(ckpQuietOn, pana.getRaw(), kPanasonicAcBits);
  1003. pana.setPowerful(true);
  1004. EXPECT_TRUE(pana.getPowerful());
  1005. EXPECT_FALSE(pana.getQuiet());
  1006. EXPECT_EQ(kPanasonicCkp, pana.getModel());
  1007. EXPECT_STATE_EQ(ckpPowerfulOn, pana.getRaw(), kPanasonicAcBits);
  1008. }