Files
IRremoteESP8266/test/ir_Magiquest_test.cpp
David Conran 54f5a02ba9 Add options to decode() to aid detection. (#1046)
* Add options to `decode()` to aid detection.
* All decoding protocols updated to use a starting offset when decoding.
* `irrecv::decode()` now has two additional optional arguments.
  - `max_skip`: Skip over entries at the start of a capture to aggressively look for protocols to decode.
     Warning: Very CPU expensive!
  - `noise_filter`: Try to remove entries from the raw data that are smaller than this value.
     Danger: This will cook the raw data and potentially break some protocol decoders.

* Unit tests updated to use starting offset.
* New unit tests to confirm the new options work as expected.
* Improve detection of NEC repeat codes.
  - Tweak NEC repeat detection to make it more strict. i.e. Require a trailing gap.
* Add more Unit Tests based on real-world data/conditions.

Fixes #1042

Ref:
https://github.com/crankyoldgit/IRremoteESP8266/issues/1042#issuecomment-583874095

Co-Authored-By: Enrico Gueli <enrico.gueli@gmail.com>
2020-02-16 08:06:42 +10:00

169 lines
7.2 KiB
C++

// Copyright 2017 David Conran
#include "ir_Magiquest.h"
#include "IRrecv.h"
#include "IRsend.h"
#include "IRsend_test.h"
#include "gtest/gtest.h"
// Tests for encodeMagiQuest()
TEST(TestEncodeMagiQuest, General) {
IRsendTest irsend(0);
EXPECT_EQ(0x0, irsend.encodeMagiQuest(0x0, 0x0));
EXPECT_EQ(0x10001, irsend.encodeMagiQuest(0x1, 0x1));
EXPECT_EQ(0x20003, irsend.encodeMagiQuest(0x2, 0x3));
EXPECT_EQ(0x123456781234, irsend.encodeMagiQuest(0x12345678, 0x1234));
EXPECT_EQ(0xFFFFFFFFFFFF, irsend.encodeMagiQuest(0xFFFFFFFF, 0xFFFF));
}
// Tests for sendMagiQuest()
// Test sending typical data only.
TEST(TestSendMagiQuest, SendDataOnly) {
IRsendTest irsend(0);
irsend.begin();
irsend.reset();
irsend.sendMagiQuest(0x0);
EXPECT_EQ(
"f36000d50"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s100850",
irsend.outputStr());
irsend.reset();
irsend.sendMagiQuest(0x123456789ABC);
EXPECT_EQ(
"f36000d50"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
"m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
"m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
"m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
"m580s600m280s850m280s850m580s600m580s600m280s850m580s600m280s850"
"m580s600m280s850m580s600m580s600m580s600m580s600m280s850m280s100850",
irsend.outputStr());
}
// Test sending typical data only.
TEST(TestSendMagiQuest, SendWithRepeats) {
IRsendTest irsend(0);
irsend.begin();
irsend.reset();
irsend.sendMagiQuest(0x12345678ABCD, kMagiquestBits, 2); // two repeats.
EXPECT_EQ(
"f36000d50"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
"m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
"m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
"m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
"m580s600m280s850m580s600m280s850m580s600m280s850m580s600m580s600"
"m580s600m580s600m280s850m280s850m580s600m580s600m280s850m580s100600"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
"m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
"m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
"m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
"m580s600m280s850m580s600m280s850m580s600m280s850m580s600m580s600"
"m580s600m580s600m280s850m280s850m580s600m580s600m280s850m580s100600"
"m280s850m280s850m280s850m280s850m280s850m280s850m280s850m280s850"
"m280s850m280s850m280s850m580s600m280s850m280s850m580s600m280s850"
"m280s850m280s850m580s600m580s600m280s850m580s600m280s850m280s850"
"m280s850m580s600m280s850m580s600m280s850m580s600m580s600m280s850"
"m280s850m580s600m580s600m580s600m580s600m280s850m280s850m280s850"
"m580s600m280s850m580s600m280s850m580s600m280s850m580s600m580s600"
"m580s600m580s600m280s850m280s850m580s600m580s600m280s850m580s100600",
irsend.outputStr());
}
// Tests for decodeMagiQuest().
// Decode normal "synthetic" messages.
TEST(TestDecodeMagiQuest, NormalDecodeWithStrict) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
irsend.reset();
irsend.sendMagiQuest(0x0);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kStartOffset,
kMagiquestBits, true));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x0, irsend.capture.value);
EXPECT_EQ(0x0, irsend.capture.address);
EXPECT_EQ(0x0, irsend.capture.command);
EXPECT_FALSE(irsend.capture.repeat);
irsend.reset();
irsend.sendMagiQuest(irsend.encodeMagiQuest(0x1, 0x1));
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kStartOffset,
kMagiquestBits, true));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x10001, irsend.capture.value);
EXPECT_EQ(0x1, irsend.capture.address);
EXPECT_EQ(0x1, irsend.capture.command);
EXPECT_FALSE(irsend.capture.repeat);
irsend.reset();
irsend.sendMagiQuest(irsend.encodeMagiQuest(0x12345678, 0xABCD));
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeMagiQuest(&irsend.capture, kStartOffset,
kMagiquestBits, true));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x12345678ABCD, irsend.capture.value);
EXPECT_EQ(0x12345678, irsend.capture.address);
EXPECT_EQ(0xABCD, irsend.capture.command);
EXPECT_FALSE(irsend.capture.repeat);
// Do the last one again, & use the full decoder, not just protocol specific.
irsend.reset();
irsend.sendMagiQuest(irsend.encodeMagiQuest(0x12345678, 0xABCD));
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x12345678ABCD, irsend.capture.value);
}
// Decode a "real" example message.
TEST(TestDecodeMagiQuest, RealExamples) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
irsend.reset();
uint16_t rawData[111] = {262, 842, 298, 858, 238, 866, 240, 890, 238, 866,
240, 862, 244, 886, 242, 860, 246, 858, 554, 604,
264, 840, 560, 622, 266, 836, 552, 604, 556, 626,
262, 866, 240, 864, 264, 838, 268, 862, 244, 886,
536, 620, 530, 628, 554, 628, 532, 624, 244, 858,
552, 604, 264, 840, 268, 862, 266, 838, 268, 888,
240, 864, 242, 860, 268, 862, 244, 860, 236, 868,
272, 832, 264, 866, 240, 890, 532, 598, 268, 834,
294, 836, 270, 834, 262, 866, 272, 858, 238, 866,
534, 622, 268, 836, 270, 860, 268, 862, 526, 604,
264, 892, 530, 600, 268, 836, 586, 598, 270, 834,
556}; // Data from PR #365 captured by coolacid
irsend.sendRaw(rawData, 111, 36000);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(MAGIQUEST, irsend.capture.decode_type);
EXPECT_EQ(kMagiquestBits, irsend.capture.bits);
EXPECT_EQ(0x560F40020455, irsend.capture.value);
EXPECT_EQ(0x560F4002, irsend.capture.address); // Wand ID
EXPECT_EQ(0x0455, irsend.capture.command); // Magnitude
EXPECT_FALSE(irsend.capture.repeat);
}