// Copyright 2017 David Conran #include "IRsend.h" #include "IRsend_test.h" #include "gtest/gtest.h" // Tests for sendNikai(). // Test sending typical data only. TEST(TestSendNikai, SendDataOnly) { IRsendTest irsend(4); irsend.begin(); irsend.reset(); irsend.sendNikai(0xD5F2A); // Nikai TV Power Off. EXPECT_EQ( "f38000d33" "m4000s4000" "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000" "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000" "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000" "m500s2000m500s1000m500s2000m500s8500", irsend.outputStr()); irsend.reset(); } // Test sending with different repeats. TEST(TestSendNikai, SendWithRepeats) { IRsendTest irsend(4); irsend.begin(); irsend.reset(); irsend.sendNikai(0xD5F2A, kNikaiBits, 1); // 1 repeat. EXPECT_EQ( "f38000d33" "m4000s4000" "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000" "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000" "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000" "m500s2000m500s1000m500s2000m500s8500" "m4000s4000" "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000" "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000" "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000" "m500s2000m500s1000m500s2000m500s8500", irsend.outputStr()); irsend.sendNikai(0xD5F2A, kNikaiBits, 2); // 2 repeat. EXPECT_EQ( "f38000d33" "m4000s4000" "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000" "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000" "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000" "m500s2000m500s1000m500s2000m500s8500" "m4000s4000" "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000" "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000" "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000" "m500s2000m500s1000m500s2000m500s8500" "m4000s4000" "m500s2000m500s2000m500s2000m500s2000m500s1000m500s1000m500s2000" "m500s1000m500s2000m500s1000m500s2000m500s1000m500s1000m500s1000" "m500s1000m500s1000m500s2000m500s2000m500s1000m500s2000m500s1000" "m500s2000m500s1000m500s2000m500s8500", irsend.outputStr()); } // Tests for decodeNikai(). // Decode normal Nikai messages. TEST(TestDecodeNikai, NormalDecodeWithStrict) { IRsendTest irsend(4); IRrecv irrecv(4); irsend.begin(); // Normal Nikai 24-bit message. irsend.reset(); irsend.sendNikai(0x123456); irsend.makeDecodeResult(); ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, true)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(kNikaiBits, irsend.capture.bits); EXPECT_EQ(0x123456, irsend.capture.value); irsend.reset(); irsend.sendNikai(0x101); irsend.makeDecodeResult(); ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, true)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(kNikaiBits, irsend.capture.bits); EXPECT_EQ(0x101, irsend.capture.value); } // Decode normal repeated Nikai messages. TEST(TestDecodeNikai, NormalDecodeWithRepeatAndStrict) { IRsendTest irsend(4); IRrecv irrecv(4); irsend.begin(); // Normal Nikai 24-bit message. irsend.reset(); irsend.sendNikai(0xD5F2A, kNikaiBits, 2); irsend.makeDecodeResult(); ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, true)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(kNikaiBits, irsend.capture.bits); EXPECT_EQ(0xD5F2A, irsend.capture.value); } TEST(TestDecodeNikai, NormalDecodeWithNonStrict) { IRsendTest irsend(4); IRrecv irrecv(4); irsend.begin(); // Illegal under length (16-bit) message irsend.reset(); irsend.sendNikai(0x0, 16); irsend.makeDecodeResult(); // Should fail with strict on. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, true)); // And it should fail when we expect more bits. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, false)); // Should pass if strict off if we ask for correct nr. of bits sent. ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, 16, false)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(16, irsend.capture.bits); EXPECT_EQ(0x0, irsend.capture.value); // Should fail as we are expecting less bits than there are. ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, 12, false)); } // Decode (non-standard) 64-bit messages. // Decode unsupported Nikai messages. TEST(TestDecodeNikai, Decode64BitMessages) { IRsendTest irsend(4); IRrecv irrecv(4); irsend.begin(); irsend.reset(); // Illegal size Nikai 64-bit message. irsend.sendNikai(0xFFFFFFFFFFFFFFFF, 64); irsend.makeDecodeResult(); ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, true)); // Should work with a 'normal' match (not strict) ASSERT_TRUE(irrecv.decodeNikai(&irsend.capture, kStartOffset, 64, false)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(64, irsend.capture.bits); EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value); } // Decode real example via Issue #309 TEST(TestDecodeNikai, DecodeExamples) { IRsendTest irsend(4); IRrecv irrecv(4); irsend.begin(); irsend.reset(); // Nikai TV Power Off from Issue #309 uint16_t rawdata_off[100] = { 4060, 3918, 508, 2004, 508, 2002, 510, 2002, 508, 2004, 506, 1050, 508, 1048, 510, 2004, 508, 1048, 508, 2002, 510, 1050, 508, 2004, 510, 1048, 508, 1050, 508, 1048, 508, 1050, 508, 1050, 508, 2004, 508, 2002, 510, 1048, 508, 2004, 508, 1050, 506, 2004, 508, 1048, 510, 2002, 456, 8446, 3956, 3998, 508, 2004, 508, 2002, 508, 2004, 508, 1978, 532, 1050, 508, 1050, 508, 2002, 508, 1050, 508, 2004, 508, 1050, 508, 2002, 510, 1050, 508, 1050, 508, 1048, 508, 1050, 508, 1050, 508, 2002, 510, 2002, 508, 1050, 508, 2002, 510, 1050, 508, 2002, 508}; irsend.sendRaw(rawdata_off, 100, 38); irsend.makeDecodeResult(); ASSERT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(kNikaiBits, irsend.capture.bits); EXPECT_EQ(0xD5F2A, irsend.capture.value); // Nikai TV Volume Up from Issue #309 uint16_t rawdata_volup[52] = { 3972, 4002, 504, 1982, 526, 2010, 502, 2010, 502, 2010, 500, 1056, 502, 1056, 502, 2010, 500, 1056, 502, 2010, 502, 2010, 500, 2010, 502, 2010, 502, 1056, 502, 1056, 502, 1056, 500, 1056, 502, 2010, 502, 2010, 500, 1056, 502, 2008, 502, 1054, 504, 1054, 504, 1054, 500, 1056, 450}; irsend.reset(); irsend.sendRaw(rawdata_volup, 52, 38); irsend.makeDecodeResult(); ASSERT_TRUE(irrecv.decode(&irsend.capture)); EXPECT_EQ(NIKAI, irsend.capture.decode_type); EXPECT_EQ(kNikaiBits, irsend.capture.bits); EXPECT_EQ(0xD0F2F, irsend.capture.value); } // Fail to decode a non-Nikai example via GlobalCache TEST(TestDecodeNikai, FailToDecodeNonNikaiExample) { IRsendTest irsend(4); IRrecv irrecv(4); irsend.begin(); irsend.reset(); uint16_t gc_test[71] = {38000, 1, 1, 172, 172, 22, 64, 22, 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 11, 22, 21, 22, 128, 22, 64, 22, 64, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22, 64, 22, 21, 22, 64, 22, 64, 22, 21, 22, 21, 22, 64, 22, 64, 22, 21, 22, 1820}; irsend.sendGC(gc_test, 71); irsend.makeDecodeResult(); ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture)); ASSERT_FALSE(irrecv.decodeNikai(&irsend.capture, kStartOffset, kNikaiBits, false)); }