mirror of https://github.com/arendst/Tasmota.git
211 lines
6.9 KiB
C++
211 lines
6.9 KiB
C++
// Copyright 2020 crankyoldgit
|
|
|
|
#include "IRac.h"
|
|
#include "IRrecv.h"
|
|
#include "IRrecv_test.h"
|
|
#include "IRsend.h"
|
|
#include "IRsend_test.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
// Tests for decodeTranscold().
|
|
|
|
TEST(TestDecodeTranscold, RealExample) {
|
|
IRsendTest irsend(kGpioUnused);
|
|
IRrecv irrecv(kGpioUnused);
|
|
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/1256#issuecomment-683608224
|
|
const uint16_t rawData[101] = {
|
|
5944, 7612,
|
|
558, 3556, 556, 3556, 556, 3556, 556, 1526, 554, 3556, 556, 1528,
|
|
554, 1526, 556, 3558, 554, 1524, 556, 1528, 556, 1526, 556, 3556,
|
|
554, 1528, 556, 3556, 554, 3556, 556, 1528, 554, 1526, 556, 3556,
|
|
556, 3556, 554, 1528, 554, 1526, 554, 3558, 554, 1528, 554, 3556,
|
|
556, 3556, 556, 1526, 554, 1526, 556, 3556, 554, 3556, 554, 1526,
|
|
554, 3556, 556, 1526, 556, 1526, 554, 3558, 554, 1526, 556, 3556,
|
|
556, 1526, 556, 3554, 556, 1524, 556, 1526, 556, 3556, 556, 1526,
|
|
554, 3556, 556, 1524, 558, 3556, 554, 1526, 556, 3556, 554, 3556,
|
|
556, 7514,
|
|
556}; // UNKNOWN C38A8243
|
|
|
|
irsend.begin();
|
|
irsend.reset();
|
|
irsend.sendRaw(rawData, 101, 38);
|
|
irsend.makeDecodeResult();
|
|
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
ASSERT_EQ(decode_type_t::TRANSCOLD, irsend.capture.decode_type);
|
|
ASSERT_EQ(kTranscoldBits, irsend.capture.bits);
|
|
EXPECT_EQ(0xE96554, irsend.capture.value);
|
|
EXPECT_EQ(0x0, irsend.capture.command);
|
|
EXPECT_EQ(0x0, irsend.capture.address);
|
|
EXPECT_EQ(
|
|
"Power: On, Mode: 6 (Cool), Fan: 9 (Min), Temp: 22C",
|
|
IRAcUtils::resultAcToString(&irsend.capture));
|
|
stdAc::state_t r, p;
|
|
ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p));
|
|
}
|
|
|
|
TEST(TestDecodeTranscold, SyntheticExample) {
|
|
IRsendTest irsend(kGpioUnused);
|
|
IRrecv irrecv(kGpioUnused);
|
|
irsend.begin();
|
|
irsend.reset();
|
|
irsend.sendTranscold(0xE96554);
|
|
irsend.makeDecodeResult();
|
|
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
EXPECT_EQ(decode_type_t::TRANSCOLD, irsend.capture.decode_type);
|
|
EXPECT_EQ(kTranscoldBits, irsend.capture.bits);
|
|
EXPECT_EQ(0xE96554, irsend.capture.value);
|
|
EXPECT_EQ(0x0, irsend.capture.command);
|
|
EXPECT_EQ(0x0, irsend.capture.address);
|
|
|
|
EXPECT_EQ(
|
|
"f38000d50"
|
|
"m5944s7563"
|
|
"m555s3556m555s3556m555s3556m555s1526m555s3556m555s1526m555s1526m555s3556"
|
|
"m555s1526m555s1526m555s1526m555s3556m555s1526m555s3556m555s3556m555s1526"
|
|
"m555s1526m555s3556m555s3556m555s1526m555s1526m555s3556m555s1526m555s3556"
|
|
"m555s3556m555s1526m555s1526m555s3556m555s3556m555s1526m555s3556m555s1526"
|
|
"m555s1526m555s3556m555s1526m555s3556m555s1526m555s3556m555s1526m555s1526"
|
|
"m555s3556m555s1526m555s3556m555s1526m555s3556m555s1526m555s3556m555s3556"
|
|
"m555s7563"
|
|
"m555s100000",
|
|
irsend.outputStr());
|
|
}
|
|
|
|
TEST(TestUtils, Housekeeping) {
|
|
ASSERT_EQ("TRANSCOLD", typeToString(decode_type_t::TRANSCOLD));
|
|
ASSERT_EQ(decode_type_t::TRANSCOLD, strToDecodeType("TRANSCOLD"));
|
|
ASSERT_FALSE(hasACState(decode_type_t::TRANSCOLD));
|
|
ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::TRANSCOLD));
|
|
ASSERT_EQ(kTranscoldBits, IRsend::defaultBits(decode_type_t::TRANSCOLD));
|
|
ASSERT_EQ(kTranscoldDefaultRepeat,
|
|
IRsend::minRepeats(decode_type_t::TRANSCOLD));
|
|
}
|
|
|
|
// Tests for the IRTranscoldAc class.
|
|
TEST(TestTranscoldAcClass, SetAndGetRaw) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
|
|
ac.setRaw(0xB21F28);
|
|
EXPECT_EQ(0xB21F28, ac.getRaw());
|
|
ac.setRaw(kTranscoldKnownGoodState);
|
|
EXPECT_EQ(kTranscoldKnownGoodState, ac.getRaw());
|
|
}
|
|
|
|
TEST(TestTranscoldAcClass, SetAndGetTemp) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
|
|
ac.setTemp(25);
|
|
EXPECT_EQ(25, ac.getTemp());
|
|
ac.setTemp(kTranscoldTempMin);
|
|
EXPECT_EQ(kTranscoldTempMin, ac.getTemp());
|
|
ac.setTemp(kTranscoldTempMax);
|
|
EXPECT_EQ(kTranscoldTempMax, ac.getTemp());
|
|
ac.setTemp(kTranscoldTempMin - 1);
|
|
EXPECT_EQ(kTranscoldTempMin, ac.getTemp());
|
|
ac.setTemp(kTranscoldTempMax + 1);
|
|
EXPECT_EQ(kTranscoldTempMax, ac.getTemp());
|
|
}
|
|
|
|
TEST(TestTranscoldAcClass, SetAndGetMode) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
|
|
ac.setMode(kTranscoldHeat);
|
|
EXPECT_EQ(kTranscoldHeat, ac.getMode());
|
|
ac.setMode(kTranscoldCool);
|
|
EXPECT_EQ(kTranscoldCool, ac.getMode());
|
|
ac.setMode(kTranscoldDry);
|
|
EXPECT_EQ(kTranscoldDry, ac.getMode());
|
|
ac.setMode(kTranscoldAuto);
|
|
EXPECT_EQ(kTranscoldAuto, ac.getMode());
|
|
ac.setMode(kTranscoldFan);
|
|
EXPECT_EQ(kTranscoldFan, ac.getMode());
|
|
}
|
|
|
|
TEST(TestTranscoldAcClass, SetAndGetFan) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
|
|
// This mode allows pretty much everything except Auto0 speed.
|
|
ac.setMode(kTranscoldCool);
|
|
ac.setFan(kTranscoldFanMax);
|
|
EXPECT_EQ(kTranscoldFanMax, ac.getFan());
|
|
ac.setFan(kTranscoldFanMin);
|
|
EXPECT_EQ(kTranscoldFanMin, ac.getFan());
|
|
ac.setFan(kTranscoldFanZoneFollow);
|
|
EXPECT_EQ(kTranscoldFanZoneFollow, ac.getFan());
|
|
ac.setFan(kTranscoldFanAuto);
|
|
EXPECT_EQ(kTranscoldFanAuto, ac.getFan());
|
|
ac.setFan(kTranscoldFanAuto0);
|
|
EXPECT_EQ(kTranscoldFanAuto, ac.getFan());
|
|
ac.setFan(kTranscoldFanMax);
|
|
EXPECT_EQ(kTranscoldFanMax, ac.getFan());
|
|
ASSERT_NE(3, kTranscoldFanAuto);
|
|
// Now try some unexpected value.
|
|
ac.setFan(3);
|
|
EXPECT_EQ(kTranscoldFanAuto, ac.getFan());
|
|
|
|
// These modes allows pretty much everything except Auto speed.
|
|
ac.setMode(kTranscoldDry);
|
|
EXPECT_EQ(kTranscoldFanAuto0, ac.getFan());
|
|
ac.setFan(kTranscoldFanMax);
|
|
EXPECT_EQ(kTranscoldFanMax, ac.getFan());
|
|
ac.setFan(kTranscoldFanAuto);
|
|
EXPECT_EQ(kTranscoldFanAuto0, ac.getFan());
|
|
|
|
ac.setMode(kTranscoldAuto);
|
|
EXPECT_EQ(kTranscoldFanAuto0, ac.getFan());
|
|
ac.setFan(kTranscoldFanMax);
|
|
EXPECT_EQ(kTranscoldFanMax, ac.getFan());
|
|
ac.setFan(kTranscoldFanAuto0);
|
|
EXPECT_EQ(kTranscoldFanAuto0, ac.getFan());
|
|
}
|
|
|
|
TEST(TestTranscoldAcClass, SpecialModesAndReset) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
ASSERT_NE(kTranscoldSwing, ac.getRaw());
|
|
ac.setSwing();
|
|
ASSERT_EQ(kTranscoldSwing, ac.getRaw());
|
|
ac.stateReset();
|
|
ASSERT_NE(kTranscoldSwing, ac.getRaw());
|
|
}
|
|
|
|
TEST(TestTranscoldAcClass, HumanReadable) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
ac.begin();
|
|
|
|
// Initial starting point.
|
|
EXPECT_EQ(
|
|
"Power: Off", ac.toString());
|
|
ac.setPower(true);
|
|
EXPECT_EQ(
|
|
"Power: On, Mode: 6 (Cool), Fan: 9 (Min), Temp: 22C",
|
|
ac.toString());
|
|
ac.setMode(kTranscoldHeat);
|
|
ac.setFan(kTranscoldFanMin);
|
|
ac.setTemp(22);
|
|
EXPECT_EQ(
|
|
"Power: On, Mode: 10 (Heat), Fan: 9 (Min), Temp: 22C",
|
|
ac.toString());
|
|
ac.setSwing();
|
|
EXPECT_EQ("Power: On, Swing: Toggle", ac.toString());
|
|
ac.setPower(false);
|
|
EXPECT_EQ("Power: Off", ac.toString());
|
|
}
|
|
|
|
TEST(TestTranscoldAcClass, BuildKnownState) {
|
|
IRTranscoldAc ac(kGpioUnused);
|
|
// "temp down, 19, Auto, cool, close (right)"
|
|
// Data from:
|
|
// https://docs.google.com/spreadsheets/d/1qdoyB0FyJm85HPP9oXcfui0n4ztXBFlik6kiNlkO2IM/edit#gid=694351627&range=A25:F25
|
|
const uint32_t state = 0xEF6B54;
|
|
ac.stateReset();
|
|
ac.on();
|
|
ac.setMode(kTranscoldCool);
|
|
ac.setFan(kTranscoldFanAuto);
|
|
ac.setTemp(19);
|
|
EXPECT_EQ("Power: On, Mode: 6 (Cool), Fan: 15 (Auto), Temp: 19C",
|
|
ac.toString());
|
|
ASSERT_EQ(state, ac.getRaw());
|
|
}
|