mirror of https://github.com/arendst/Tasmota.git
160 lines
6.1 KiB
C++
160 lines
6.1 KiB
C++
|
// Copyright 2020 David Conran
|
||
|
|
||
|
#include "IRac.h"
|
||
|
#include "IRrecv.h"
|
||
|
#include "IRrecv_test.h"
|
||
|
#include "IRsend.h"
|
||
|
#include "IRsend_test.h"
|
||
|
#include "gtest/gtest.h"
|
||
|
|
||
|
// Tests for sendEpson().
|
||
|
|
||
|
// Test sending typical data only.
|
||
|
TEST(TestSendEpson, SendDataOnly) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
irsend.begin();
|
||
|
irsend.sendEpson(0xC1AA09F6);
|
||
|
EXPECT_EQ(
|
||
|
"f38000d33"
|
||
|
"m8960s4480"
|
||
|
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s1680"
|
||
|
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
|
||
|
"m560s560m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680"
|
||
|
"m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
|
||
|
"m560s41440"
|
||
|
"m8960s4480"
|
||
|
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s1680"
|
||
|
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
|
||
|
"m560s560m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680"
|
||
|
"m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
|
||
|
"m560s41440"
|
||
|
"m8960s4480"
|
||
|
"m560s1680m560s1680m560s560m560s560m560s560m560s560m560s560m560s1680"
|
||
|
"m560s1680m560s560m560s1680m560s560m560s1680m560s560m560s1680m560s560"
|
||
|
"m560s560m560s560m560s560m560s560m560s1680m560s560m560s560m560s1680"
|
||
|
"m560s1680m560s1680m560s1680m560s1680m560s560m560s1680m560s1680m560s560"
|
||
|
"m560s41440",
|
||
|
irsend.outputStr());
|
||
|
}
|
||
|
|
||
|
// Tests for decodeEpson().
|
||
|
|
||
|
// Decode normal Epson messages.
|
||
|
TEST(TestDecodeEpson, SyntheticSelfDecode) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
IRrecv irrecv(kGpioUnused);
|
||
|
irsend.begin();
|
||
|
|
||
|
// Real-life Epson code from an actual capture/decode.
|
||
|
irsend.reset();
|
||
|
irsend.sendEpson(0xC1AA09F6);
|
||
|
irsend.makeDecodeResult();
|
||
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
EXPECT_EQ(EPSON, irsend.capture.decode_type);
|
||
|
EXPECT_EQ(kEpsonBits, irsend.capture.bits);
|
||
|
EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
|
||
|
EXPECT_EQ(0x5583, irsend.capture.address);
|
||
|
EXPECT_EQ(0x90, irsend.capture.command);
|
||
|
EXPECT_TRUE(irsend.capture.repeat);
|
||
|
}
|
||
|
|
||
|
// Decode a real Epson message.
|
||
|
TEST(TestDecodeEpson, RealMessageDecode) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
IRrecv irrecv(kGpioUnused);
|
||
|
irsend.begin();
|
||
|
|
||
|
// Real-life Epson code from an actual capture/decode.
|
||
|
irsend.reset();
|
||
|
const uint16_t rawData_0[203] = {
|
||
|
8976, 4496, 542, 1690, 542, 1688, 542, 588, 518, 612, 542, 586, 518, 610,
|
||
|
518, 610, 542, 1688, 516, 1714, 542, 614, 516, 1688, 542, 612, 516, 1690,
|
||
|
540, 614, 514, 1690, 520, 638, 516, 584, 518, 612, 542, 586, 540, 588,
|
||
|
542, 1688, 520, 610, 540, 586, 520, 1712, 540, 1692, 542, 1688, 542, 1690,
|
||
|
520, 1710, 518, 610, 518, 1712, 518, 1716, 544, 584, 544, 40870,
|
||
|
8978, 4496, 542, 1690, 542, 1688, 520, 610, 542, 584, 516, 638, 514, 588,
|
||
|
540, 588, 540, 1690, 516, 1716, 516, 614, 542, 1688, 518, 612, 542, 1688,
|
||
|
540, 614, 514, 1692, 542, 588, 538, 590, 542, 586, 542, 612, 516, 612,
|
||
|
514, 1692, 516, 612, 540, 586, 520, 1712, 518, 1714, 542, 1688, 518, 1716,
|
||
|
542, 1688, 516, 614, 542, 1686, 518, 1714, 516, 612, 532, 40882,
|
||
|
8976, 4498, 516, 1716, 542, 1690, 540, 614, 516, 614, 516, 614, 514, 588,
|
||
|
540, 588, 544, 1688, 522, 1710, 518, 638, 516, 1688, 520, 636, 492, 1714,
|
||
|
542, 586, 542, 1690, 542, 588, 542, 584, 542, 612, 516, 612, 514, 614,
|
||
|
516, 1690, 542, 586, 542, 586, 540, 1690, 518, 1712, 518, 1716, 518, 1714,
|
||
|
542, 1690, 542, 586, 540, 1690, 542, 1690, 542, 588, 540};
|
||
|
irsend.sendRaw(rawData_0, 203, 38000);
|
||
|
irsend.makeDecodeResult();
|
||
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
EXPECT_EQ(EPSON, irsend.capture.decode_type);
|
||
|
EXPECT_EQ(kEpsonBits, irsend.capture.bits);
|
||
|
EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
|
||
|
EXPECT_EQ(0x5583, irsend.capture.address);
|
||
|
EXPECT_EQ(0x90, irsend.capture.command);
|
||
|
EXPECT_TRUE(irsend.capture.repeat);
|
||
|
}
|
||
|
|
||
|
TEST(TestDecodeEpson, RequiresARepeat) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
IRrecv irrecv(kGpioUnused);
|
||
|
irsend.begin();
|
||
|
|
||
|
// Simulate sending only two messages (mesg + repeat)
|
||
|
irsend.reset();
|
||
|
irsend.sendEpson(0xC1AA09F6, kEpsonBits, 1);
|
||
|
irsend.makeDecodeResult();
|
||
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
EXPECT_EQ(EPSON, irsend.capture.decode_type);
|
||
|
EXPECT_EQ(kEpsonBits, irsend.capture.bits);
|
||
|
EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
|
||
|
EXPECT_EQ(0x5583, irsend.capture.address);
|
||
|
EXPECT_EQ(0x90, irsend.capture.command);
|
||
|
EXPECT_TRUE(irsend.capture.repeat);
|
||
|
|
||
|
// Simulate sending no repeats (just 1 message) which should fail to be
|
||
|
// detected as Epson.
|
||
|
irsend.reset();
|
||
|
irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0);
|
||
|
irsend.makeDecodeResult();
|
||
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
ASSERT_NE(EPSON, irsend.capture.decode_type);
|
||
|
}
|
||
|
|
||
|
TEST(TestDecodeEpson, DecodeOnlyIfRepeatIsTheSame) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
IRrecv irrecv(kGpioUnused);
|
||
|
irsend.begin();
|
||
|
|
||
|
// Simulate sending only two identical messages.
|
||
|
// This should succeed.
|
||
|
irsend.reset();
|
||
|
irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0);
|
||
|
irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0);
|
||
|
|
||
|
irsend.makeDecodeResult();
|
||
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
EXPECT_EQ(EPSON, irsend.capture.decode_type);
|
||
|
EXPECT_EQ(kEpsonBits, irsend.capture.bits);
|
||
|
EXPECT_EQ(0xC1AA09F6, irsend.capture.value);
|
||
|
EXPECT_EQ(0x5583, irsend.capture.address);
|
||
|
EXPECT_EQ(0x90, irsend.capture.command);
|
||
|
EXPECT_TRUE(irsend.capture.repeat);
|
||
|
|
||
|
// Simulate sending a repeat but with a different code.
|
||
|
// This should fail.
|
||
|
irsend.reset();
|
||
|
irsend.sendEpson(0xC1AA09F6, kEpsonBits, 0); // Valid code.
|
||
|
irsend.sendEpson(0x4BB640BF, kEpsonBits, 0); // Valid code but different.
|
||
|
irsend.makeDecodeResult();
|
||
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
ASSERT_NE(EPSON, irsend.capture.decode_type);
|
||
|
}
|
||
|
|
||
|
TEST(TestUtils, Housekeeping) {
|
||
|
ASSERT_EQ("EPSON", typeToString(decode_type_t::EPSON));
|
||
|
ASSERT_EQ(decode_type_t::EPSON, strToDecodeType("EPSON"));
|
||
|
ASSERT_FALSE(hasACState(decode_type_t::EPSON));
|
||
|
ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::EPSON));
|
||
|
ASSERT_EQ(kEpsonBits, IRsendTest::defaultBits(decode_type_t::EPSON));
|
||
|
ASSERT_EQ(kEpsonMinRepeat, IRsendTest::minRepeats(decode_type_t::EPSON));
|
||
|
}
|