mirror of https://github.com/arendst/Tasmota.git
323 lines
8.9 KiB
C++
323 lines
8.9 KiB
C++
|
// Copyright 2020 Quentin BRIOLLANT
|
||
|
|
||
|
#include "IRac.h"
|
||
|
#include "ir_Technibel.h"
|
||
|
#include "IRrecv.h"
|
||
|
#include "IRrecv_test.h"
|
||
|
#include "IRsend.h"
|
||
|
#include "IRsend_test.h"
|
||
|
#include "IRutils.h"
|
||
|
#include "gtest/gtest.h"
|
||
|
|
||
|
TEST(TestUtils, Housekeeping) {
|
||
|
ASSERT_EQ("TECHNIBEL_AC", typeToString(decode_type_t::TECHNIBEL_AC));
|
||
|
ASSERT_EQ(decode_type_t::TECHNIBEL_AC, strToDecodeType("TECHNIBEL_AC"));
|
||
|
ASSERT_FALSE(hasACState(decode_type_t::TECHNIBEL_AC));
|
||
|
ASSERT_TRUE(IRac::isProtocolSupported(decode_type_t::TECHNIBEL_AC));
|
||
|
ASSERT_EQ(kTechnibelAcBits, IRsend::defaultBits(decode_type_t::TECHNIBEL_AC));
|
||
|
ASSERT_EQ(kTechnibelAcDefaultRepeat,
|
||
|
IRsend::minRepeats(decode_type_t::TECHNIBEL_AC));
|
||
|
}
|
||
|
|
||
|
TEST(TestDecodeTechnibelAc, SyntheticSelfDecode) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
IRrecv irrecv(kGpioUnused);
|
||
|
|
||
|
irsend.begin();
|
||
|
irsend.reset();
|
||
|
irsend.sendTechnibelAc(0x1881221200004B);
|
||
|
irsend.makeDecodeResult();
|
||
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
EXPECT_EQ(TECHNIBEL_AC, irsend.capture.decode_type);
|
||
|
EXPECT_EQ(kTechnibelAcBits, irsend.capture.bits);
|
||
|
EXPECT_EQ(0x1881221200004B, irsend.capture.value);
|
||
|
EXPECT_EQ(0, irsend.capture.command);
|
||
|
EXPECT_EQ(0, irsend.capture.address);
|
||
|
}
|
||
|
|
||
|
TEST(TestDecodeTechnibelAc, RealExample) {
|
||
|
IRsendTest irsend(kGpioUnused);
|
||
|
IRrecv irrecv(kGpioUnused);
|
||
|
irsend.begin();
|
||
|
|
||
|
uint16_t rawData[115] = {
|
||
|
8812, 4376,
|
||
|
534, 560, 530, 562, 530, 562, 532, 1668, 532, 1634, 560, 560, 530, 562,
|
||
|
528, 566, 530, 1668, 532, 560, 504, 588, 526, 568, 530, 562, 530, 562,
|
||
|
528, 564, 530, 1670, 530, 562, 530, 564, 528, 1670, 530, 564, 532, 560,
|
||
|
530, 562, 532, 1636, 560, 564, 530, 562, 528, 564, 528, 564, 526, 1672,
|
||
|
528, 538, 554, 564, 528, 1640, 558, 564, 530, 562, 526, 564, 504, 586,
|
||
|
504, 592, 526, 564, 504, 588, 526, 564, 504, 592, 528, 562, 526, 566,
|
||
|
526, 564, 504, 592, 526, 566, 530, 562, 530, 562, 528, 568, 528, 564,
|
||
|
504, 1662, 558, 564, 528, 566, 528, 1668, 528, 562, 528, 1666, 532, 1664,
|
||
|
582};
|
||
|
|
||
|
irsend.reset();
|
||
|
irsend.sendRaw(rawData, 115, 38000);
|
||
|
irsend.makeDecodeResult();
|
||
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
||
|
EXPECT_EQ(TECHNIBEL_AC, irsend.capture.decode_type);
|
||
|
EXPECT_EQ(kTechnibelAcBits, irsend.capture.bits);
|
||
|
EXPECT_EQ(0x1881221200004B, irsend.capture.value);
|
||
|
EXPECT_EQ(0, irsend.capture.command);
|
||
|
EXPECT_EQ(0, irsend.capture.address);
|
||
|
EXPECT_EQ(
|
||
|
"Power: On, Mode: 1 (Cool), Fan: 2 (Medium), Temp: 18C, "
|
||
|
"Sleep: Off, Swing(V): On, Timer: Off",
|
||
|
IRAcUtils::resultAcToString(&irsend.capture));
|
||
|
stdAc::state_t r, p;
|
||
|
ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p));
|
||
|
}
|
||
|
|
||
|
// Tests for IRTechnibelAc class.
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, Power) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
|
||
|
ac.on();
|
||
|
EXPECT_TRUE(ac.getPower());
|
||
|
|
||
|
ac.off();
|
||
|
EXPECT_FALSE(ac.getPower());
|
||
|
|
||
|
ac.setPower(true);
|
||
|
EXPECT_TRUE(ac.getPower());
|
||
|
|
||
|
ac.setPower(false);
|
||
|
EXPECT_FALSE(ac.getPower());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, Temperature) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
|
||
|
// Celsius
|
||
|
ac.setTemp(0);
|
||
|
EXPECT_EQ(kTechnibelAcTempMinC, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(255);
|
||
|
EXPECT_EQ(kTechnibelAcTempMaxC, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMinC);
|
||
|
EXPECT_EQ(kTechnibelAcTempMinC, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMaxC);
|
||
|
EXPECT_EQ(kTechnibelAcTempMaxC, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMinC - 1);
|
||
|
EXPECT_EQ(kTechnibelAcTempMinC, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMaxC + 1);
|
||
|
EXPECT_EQ(kTechnibelAcTempMaxC, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(19);
|
||
|
EXPECT_EQ(19, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(21);
|
||
|
EXPECT_EQ(21, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(25);
|
||
|
EXPECT_EQ(25, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(29, false);
|
||
|
EXPECT_EQ(29, ac.getTemp());
|
||
|
EXPECT_FALSE(ac.getTempUnit());
|
||
|
|
||
|
// Fahrenheit
|
||
|
ac.setTemp(0, true);
|
||
|
EXPECT_EQ(kTechnibelAcTempMinF, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(255, true);
|
||
|
EXPECT_EQ(kTechnibelAcTempMaxF, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMinF, true);
|
||
|
EXPECT_EQ(kTechnibelAcTempMinF, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMaxF, true);
|
||
|
EXPECT_EQ(kTechnibelAcTempMaxF, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMinF - 1, true);
|
||
|
EXPECT_EQ(kTechnibelAcTempMinF, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(kTechnibelAcTempMaxF + 1, true);
|
||
|
EXPECT_EQ(kTechnibelAcTempMaxF, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(66, true);
|
||
|
EXPECT_EQ(66, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(75, true);
|
||
|
EXPECT_EQ(75, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(80, true);
|
||
|
EXPECT_EQ(80, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
|
||
|
ac.setTemp(88, true);
|
||
|
EXPECT_EQ(88, ac.getTemp());
|
||
|
EXPECT_TRUE(ac.getTempUnit());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, OperatingMode) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
|
||
|
ac.setMode(kTechnibelAcCool);
|
||
|
EXPECT_EQ(kTechnibelAcCool, ac.getMode());
|
||
|
|
||
|
ac.setMode(kTechnibelAcDry);
|
||
|
EXPECT_EQ(kTechnibelAcDry, ac.getMode());
|
||
|
EXPECT_EQ(kTechnibelAcFanLow, ac.getFan()); // Look for fan speed enforcement
|
||
|
|
||
|
ac.setMode(kTechnibelAcFan);
|
||
|
EXPECT_EQ(kTechnibelAcFan, ac.getMode());
|
||
|
|
||
|
ac.setMode(kTechnibelAcHeat);
|
||
|
EXPECT_EQ(kTechnibelAcHeat, ac.getMode());
|
||
|
|
||
|
ac.setMode(255);
|
||
|
EXPECT_EQ(kTechnibelAcCool, ac.getMode());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, FanSpeed) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
ac.setMode(kTechnibelAcCool); // All fan speeds available in this mode.
|
||
|
|
||
|
ac.setFan(kTechnibelAcFanLow);
|
||
|
EXPECT_EQ(kTechnibelAcFanLow, ac.getFan());
|
||
|
|
||
|
ac.setFan(kTechnibelAcFanMedium);
|
||
|
EXPECT_EQ(kTechnibelAcFanMedium, ac.getFan());
|
||
|
|
||
|
ac.setFan(kTechnibelAcFanHigh);
|
||
|
EXPECT_EQ(kTechnibelAcFanHigh, ac.getFan());
|
||
|
|
||
|
ac.setFan(0);
|
||
|
EXPECT_EQ(kTechnibelAcFanLow, ac.getFan());
|
||
|
|
||
|
ac.setFan(kTechnibelAcFanMedium);
|
||
|
ac.setFan(255);
|
||
|
EXPECT_EQ(kTechnibelAcFanLow, ac.getFan());
|
||
|
|
||
|
// Check fan speed enforcement for Dry mode.
|
||
|
ac.setFan(kTechnibelAcFanMedium);
|
||
|
ac.setMode(kTechnibelAcDry);
|
||
|
EXPECT_EQ(kTechnibelAcFanLow, ac.getFan());
|
||
|
EXPECT_EQ(kTechnibelAcDry, ac.getMode());
|
||
|
ac.setFan(kTechnibelAcFanHigh);
|
||
|
EXPECT_EQ(kTechnibelAcFanLow, ac.getFan());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, Swing) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
|
||
|
ac.setSwing(false);
|
||
|
EXPECT_FALSE(ac.getSwing());
|
||
|
ac.setSwing(true);
|
||
|
EXPECT_TRUE(ac.getSwing());
|
||
|
ac.setSwing(false);
|
||
|
EXPECT_FALSE(ac.getSwing());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, Sleep) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
|
||
|
ac.setSleep(false);
|
||
|
EXPECT_FALSE(ac.getSleep());
|
||
|
ac.setSleep(true);
|
||
|
EXPECT_TRUE(ac.getSleep());
|
||
|
ac.setSleep(false);
|
||
|
EXPECT_FALSE(ac.getSleep());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, Timer) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
|
||
|
ac.setTimerEnabled(false);
|
||
|
EXPECT_FALSE(ac.getTimerEnabled());
|
||
|
ac.setTimerEnabled(true);
|
||
|
EXPECT_TRUE(ac.getTimerEnabled());
|
||
|
ac.setTimerEnabled(false);
|
||
|
EXPECT_FALSE(ac.getTimerEnabled());
|
||
|
|
||
|
ac.setTimer(0);
|
||
|
EXPECT_FALSE(ac.getTimerEnabled());
|
||
|
EXPECT_EQ(0, ac.getTimer());
|
||
|
|
||
|
ac.setTimer(60);
|
||
|
EXPECT_TRUE(ac.getTimerEnabled());
|
||
|
EXPECT_EQ(60, ac.getTimer());
|
||
|
|
||
|
ac.setTimer(1200);
|
||
|
EXPECT_TRUE(ac.getTimerEnabled());
|
||
|
EXPECT_EQ(1200, ac.getTimer());
|
||
|
|
||
|
ac.setTimerEnabled(false);
|
||
|
ac.setTimer(1440);
|
||
|
EXPECT_TRUE(ac.getTimerEnabled());
|
||
|
EXPECT_EQ(1440, ac.getTimer());
|
||
|
|
||
|
ac.setTimerEnabled(false);
|
||
|
ac.setTimer(1500);
|
||
|
EXPECT_TRUE(ac.getTimerEnabled());
|
||
|
EXPECT_EQ(1440, ac.getTimer());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, ConstructKnownState) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
EXPECT_EQ(kTechnibelAcResetState, ac.getRaw());
|
||
|
ac.on();
|
||
|
ac.setMode(kTechnibelAcCool);
|
||
|
ac.setFan(kTechnibelAcFanMedium);
|
||
|
ac.setTemp(18); // 18C
|
||
|
ac.setSleep(false); // Off
|
||
|
ac.setSwing(true); // On
|
||
|
EXPECT_EQ(0x1881221200004B, ac.getRaw());
|
||
|
EXPECT_EQ(
|
||
|
"Power: On, Mode: 1 (Cool), Fan: 2 (Medium), Temp: 18C, "
|
||
|
"Sleep: Off, Swing(V): On, Timer: Off",
|
||
|
ac.toString());
|
||
|
}
|
||
|
|
||
|
TEST(TestIRTechnibelAcClass, HumanReadable) {
|
||
|
IRTechnibelAc ac(kGpioUnused);
|
||
|
ac.begin();
|
||
|
EXPECT_EQ(
|
||
|
"Power: Off, Mode: 1 (Cool), Fan: 1 (Low), Temp: 20C, Sleep: Off, "
|
||
|
"Swing(V): Off, Timer: Off", ac.toString());
|
||
|
ac.setPower(true);
|
||
|
ac.setTemp(72, true); // 72F
|
||
|
ac.setFan(kTechnibelAcFanMedium);
|
||
|
ac.setSleep(true);
|
||
|
ac.setSwing(true);
|
||
|
EXPECT_EQ(
|
||
|
"Power: On, Mode: 1 (Cool), Fan: 2 (Medium), Temp: 72F, Sleep: On, "
|
||
|
"Swing(V): On, Timer: Off", ac.toString());
|
||
|
ac.setMode(kTechnibelAcHeat);
|
||
|
ac.setTimer(23 * 60);
|
||
|
EXPECT_EQ(
|
||
|
"Power: On, Mode: 8 (Heat), Fan: 2 (Medium), Temp: 72F, Sleep: On, "
|
||
|
"Swing(V): On, Timer: 23:00", ac.toString());
|
||
|
}
|