Files
IRremoteESP8266/test/ir_Arris_test.cpp
David Conran aef67af9a7 Support for Arris protocol. (#1598)
* Add `sendArris()` & `decodeArris()`.
  - Uses Manchester Encoding.
  - Checksum validation on decode.
  - provide release status (via `address`) and the likely `command`.
* Add helper routines:
  - `toggleArrisRelease()` for changing mesg status between a press & a release of a button.
  - `encodeArris()` to construct a valid ARRIS mesg from a `command` and a `release` status.
* Add & update unit tests.
2021-09-09 10:57:08 +10:00

190 lines
5.8 KiB
C++

// Copyright 2021 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 decodeArris().
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1595
// Data from:
// https://github.com/crankyoldgit/IRremoteESP8266/files/7100289/raw_data.txt
TEST(TestDecodeArris, RealExample) {
IRsendTest irsend(kGpioUnused);
IRrecv irrecv(kGpioUnused);
const uint16_t rawData_1[59] = {
2584, 1896, 666, 306, 338, 300, 336, 304, 668, 610, 332, 306, 338, 300,
334, 304, 332, 312, 332, 306, 340, 300, 334, 304, 330, 308, 338, 302, 334,
304, 330, 308, 336, 308, 336, 302, 332, 306, 330, 310, 674, 606, 336, 302,
332, 306, 338, 306, 668, 612, 668, 306, 338, 304, 332, 308, 336, 608,
334}; // UNKNOWN EDF1C0D0
irsend.begin();
irsend.reset();
irsend.sendRaw(rawData_1, 59, 38);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(decode_type_t::ARRIS, irsend.capture.decode_type);
EXPECT_EQ(kArrisBits, irsend.capture.bits);
EXPECT_EQ(0x1000085E, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x85, irsend.capture.command);
irsend.reset();
const uint16_t rawData_2[115] = {
2584, 1898, 664, 308, 338, 302, 332, 306, 668, 614, 330, 308, 336, 302,
332, 306, 340, 304, 330, 310, 336, 304, 332, 306, 338, 300, 334, 304, 330,
308, 336, 302, 332, 312, 334, 306, 330, 308, 336, 302, 670, 610, 332, 306,
330, 310, 336, 308, 674, 606, 664, 312, 334, 306, 338, 302, 334, 612, 330,
5930,
2584, 1898, 664, 308, 336, 302, 332, 306, 666, 614, 338, 300, 336, 304,
332, 310, 674, 610, 332, 334, 312, 328, 308, 332, 304, 336, 310, 330, 306,
332, 302, 314, 330, 336, 308, 330, 306, 334, 640, 612, 330, 308, 336, 302,
332, 312, 672, 608, 672, 608, 672, 304, 330, 614, 330
}; // UNKNOWN E6A77D83
irsend.sendRaw(rawData_2, 115, 38);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(decode_type_t::ARRIS, irsend.capture.decode_type);
EXPECT_EQ(kArrisBits, irsend.capture.bits);
EXPECT_EQ(0x1000085E, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x85, irsend.capture.command);
const uint16_t rawData_3[51] = {
2584, 1896, 666, 308, 338, 328, 306, 332, 640, 612, 332, 336, 310, 300,
334, 304, 678, 606, 336, 330, 306, 334, 310, 300, 334, 304, 332, 308, 338,
302, 334, 310, 672, 304, 332, 614, 668, 612, 330, 336, 638, 620, 670, 610,
670, 304, 330, 310, 336, 610, 672}; // UNKNOWN 4CA048A1
irsend.reset();
irsend.sendRaw(rawData_3, 51, 38);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(decode_type_t::ARRIS, irsend.capture.decode_type);
EXPECT_EQ(kArrisBits, irsend.capture.bits);
EXPECT_EQ(0x1080695D, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x695, irsend.capture.command);
}
TEST(TestDecodeArris, SyntheticExample) {
IRsendTest irsend(kGpioUnused);
IRrecv irrecv(kGpioUnused);
irsend.begin();
irsend.reset();
irsend.sendArris(0x1000085E);
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(decode_type_t::ARRIS, irsend.capture.decode_type);
EXPECT_EQ(kArrisBits, irsend.capture.bits);
EXPECT_EQ(0x1000085E, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x85, irsend.capture.command);
EXPECT_EQ(
"f38000d50"
// const uint16_t rawData_1[59] = {
// 2584, 1896,
"m2560s1920"
// 666, 306,
"m640s320"
// 338, 300,
"m320s320"
// 336, 304,
"m320s320"
// 668, 610,
"m640s640"
// 332, 306,
"m320s320"
// 338, 300,
"m320s320"
// 334, 304,
"m320s320"
// 332, 312,
"m320s320"
// 332, 306,
"m320s320"
// 340, 300,
"m320s320"
// 334, 304,
"m320s320"
// 330, 308,
"m320s320"
// 338, 302,
"m320s320"
// 334, 304,
"m320s320"
// 330, 308,
"m320s320"
// 336, 308,
"m320s320"
// 336, 302,
"m320s320"
// 332, 306,
"m320s320"
// 330, 310,
"m320s320"
// 674, 606,
"m640s640"
// 336, 302,
"m320s320"
// 332, 306,
"m320s320"
// 338, 306,
"m320s320"
// 668, 612,
"m640s640"
// 668, 306,
"m640s320"
// 338, 304,
"m320s320"
// 332, 308,
"m320s320"
// 336, 608,
"m320s640"
// 334}; // UNKNOWN EDF1C0D0
"m320s77184", irsend.outputStr());
irsend.reset();
irsend.sendArris(0x1080695D);
irsend.makeDecodeResult();
EXPECT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(decode_type_t::ARRIS, irsend.capture.decode_type);
EXPECT_EQ(kArrisBits, irsend.capture.bits);
EXPECT_EQ(0x1080695D, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x695, irsend.capture.command);
}
TEST(TestUtils, Housekeeping) {
ASSERT_EQ("ARRIS", typeToString(decode_type_t::ARRIS));
ASSERT_EQ(decode_type_t::ARRIS, strToDecodeType("ARRIS"));
ASSERT_FALSE(hasACState(decode_type_t::ARRIS));
ASSERT_FALSE(IRac::isProtocolSupported(decode_type_t::ARRIS));
ASSERT_EQ(kArrisBits, IRsend::defaultBits(decode_type_t::ARRIS));
ASSERT_EQ(kNoRepeat, IRsend::minRepeats(decode_type_t::ARRIS));
}
TEST(TestSendArris, ReleaseToggle) {
EXPECT_EQ(0x10800F5D, IRsend::toggleArrisRelease(0x10000F55));
EXPECT_EQ(0x10000F55, IRsend::toggleArrisRelease(0x10800F5D));
EXPECT_EQ(
0x10800F5D,
IRsend::toggleArrisRelease(IRsend::toggleArrisRelease(0x10800F5D)));
}
TEST(TestSendArris, encodeArris) {
EXPECT_EQ(0x10800F5D, IRsend::encodeArris(0xF5, true));
EXPECT_EQ(0x10000F55, IRsend::encodeArris(0xF5, false));
EXPECT_EQ(0x1080695D, IRsend::encodeArris(0x695, true));
}