mirror of https://github.com/arendst/Tasmota.git
1135 lines
40 KiB
C++
1135 lines
40 KiB
C++
// Copyright 2018 David Conran
|
|
|
|
#include "ir_Haier.h"
|
|
#include "IRac.h"
|
|
#include "IRrecv.h"
|
|
#include "IRrecv_test.h"
|
|
#include "IRsend.h"
|
|
#include "IRsend_test.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
// Tests for sendHaierAC()
|
|
|
|
// Test sending typical data only.
|
|
TEST(TestSendHaierAC, SendDataOnly) {
|
|
IRsendTest irsend(0);
|
|
irsend.begin();
|
|
uint8_t haier_zero[kHaierACStateLength] = {0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00};
|
|
|
|
irsend.reset();
|
|
irsend.sendHaierAC(haier_zero);
|
|
EXPECT_EQ(
|
|
"f38000d50"
|
|
"m3000s3000m3000s4300"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s150000",
|
|
irsend.outputStr());
|
|
|
|
uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
|
|
0xC0, 0x20, 0x00, 0xA7};
|
|
irsend.reset();
|
|
irsend.sendHaierAC(haier_test);
|
|
EXPECT_EQ(
|
|
"f38000d50"
|
|
"m3000s3000m3000s4300"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
|
|
"m520s150000",
|
|
irsend.outputStr());
|
|
}
|
|
|
|
// Test sending typical data with repeats.
|
|
TEST(TestSendHaierAC, SendWithRepeats) {
|
|
IRsendTest irsend(0);
|
|
irsend.begin();
|
|
|
|
irsend.reset();
|
|
uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
|
|
0xC0, 0x20, 0x00, 0xA7};
|
|
irsend.reset();
|
|
irsend.sendHaierAC(haier_test, kHaierACStateLength, 2); // two repeats.
|
|
EXPECT_EQ(
|
|
"f38000d50"
|
|
"m3000s3000m3000s4300"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
|
|
"m520s150000"
|
|
"m3000s3000m3000s4300"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
|
|
"m520s150000"
|
|
"m3000s3000m3000s4300"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
|
|
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
|
|
"m520s150000",
|
|
irsend.outputStr());
|
|
}
|
|
|
|
// Tests for IRHaierAC class.
|
|
|
|
TEST(TestHaierACClass, Command) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
|
|
haier.setCommand(kHaierAcCmdOff);
|
|
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdMode);
|
|
EXPECT_EQ(kHaierAcCmdMode, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdFan);
|
|
EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdTempUp);
|
|
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdTempDown);
|
|
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdSleep);
|
|
EXPECT_EQ(kHaierAcCmdSleep, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdTimerSet);
|
|
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdTimerCancel);
|
|
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdHealth);
|
|
EXPECT_EQ(kHaierAcCmdHealth, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdSwing);
|
|
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdOff);
|
|
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
|
|
|
|
// Test unexpected values.
|
|
haier.setCommand(0b00001110);
|
|
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
|
|
haier.setCommand(0b00001111);
|
|
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
|
|
haier.setCommand(0b00000100);
|
|
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
|
|
}
|
|
|
|
TEST(TestHaierACClass, OperatingMode) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
|
|
haier.setMode(kHaierAcAuto);
|
|
EXPECT_EQ(kHaierAcAuto, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcCool);
|
|
EXPECT_EQ(kHaierAcCool, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcHeat);
|
|
EXPECT_EQ(kHaierAcHeat, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcFan);
|
|
EXPECT_EQ(kHaierAcFan, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcDry);
|
|
EXPECT_EQ(kHaierAcDry, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcAuto - 1);
|
|
EXPECT_EQ(kHaierAcAuto, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcCool);
|
|
EXPECT_EQ(kHaierAcCool, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcFan + 1);
|
|
EXPECT_EQ(kHaierAcAuto, haier.getMode());
|
|
|
|
haier.setMode(255);
|
|
EXPECT_EQ(kHaierAcAuto, haier.getMode());
|
|
}
|
|
|
|
TEST(TestHaierACClass, Temperature) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
|
|
haier.setTemp(kHaierAcMinTemp);
|
|
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
|
|
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
haier.setTemp(kHaierAcMinTemp + 1);
|
|
EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
|
|
|
|
haier.setTemp(kHaierAcMaxTemp);
|
|
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
|
|
|
|
haier.setTemp(kHaierAcMinTemp - 1);
|
|
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
|
|
|
|
haier.setTemp(kHaierAcMaxTemp + 1);
|
|
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
|
|
|
|
haier.setTemp(23);
|
|
EXPECT_EQ(23, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
haier.setTemp(23);
|
|
EXPECT_EQ(23, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
|
|
haier.setTemp(0);
|
|
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
|
|
|
|
haier.setTemp(255);
|
|
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
|
|
}
|
|
|
|
TEST(TestHaierACClass, FanSpeed) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
haier.setFan(kHaierAcFanLow);
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
|
|
haier.setFan(kHaierAcFanAuto);
|
|
EXPECT_EQ(kHaierAcFanAuto, haier.getFan());
|
|
EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
|
|
|
|
haier.setFan(kHaierAcFanLow);
|
|
EXPECT_EQ(kHaierAcFanLow, haier.getFan());
|
|
haier.setFan(kHaierAcFanMed);
|
|
EXPECT_EQ(kHaierAcFanMed, haier.getFan());
|
|
haier.setFan(kHaierAcFanHigh);
|
|
EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
|
|
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
haier.setFan(kHaierAcFanHigh);
|
|
EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
}
|
|
|
|
TEST(TestHaierACClass, Swing) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
haier.setFan(kHaierAcFanLow);
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
|
|
haier.setSwing(kHaierAcSwingOff);
|
|
EXPECT_EQ(kHaierAcSwingOff, haier.getSwing());
|
|
|
|
haier.setSwing(kHaierAcSwingUp);
|
|
EXPECT_EQ(kHaierAcSwingUp, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
|
|
|
|
haier.setSwing(kHaierAcSwingDown);
|
|
EXPECT_EQ(kHaierAcSwingDown, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
|
|
|
|
haier.setSwing(kHaierAcSwingChg);
|
|
EXPECT_EQ(kHaierAcSwingChg, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
|
|
}
|
|
|
|
TEST(TestHaierACClass, CurrentTime) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
EXPECT_EQ(0, haier.getCurrTime());
|
|
|
|
haier.setCurrTime(1);
|
|
EXPECT_EQ(1, haier.getCurrTime());
|
|
|
|
haier.setCurrTime(60);
|
|
EXPECT_EQ(60, haier.getCurrTime());
|
|
|
|
haier.setCurrTime(61);
|
|
EXPECT_EQ(61, haier.getCurrTime());
|
|
|
|
haier.setCurrTime(18 * 60 + 34); // 18:34
|
|
EXPECT_EQ(1114, haier.getCurrTime());
|
|
|
|
haier.setCurrTime(23 * 60 + 59); // 23:59
|
|
EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
|
|
|
|
haier.setCurrTime(23 * 60 + 59 + 1); // 24:00
|
|
EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
|
|
|
|
haier.setCurrTime(UINT16_MAX);
|
|
EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
|
|
}
|
|
|
|
TEST(TestHaierACClass, Timers) {
|
|
IRHaierAC haier(0);
|
|
haier.begin();
|
|
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
|
|
// Off by default.
|
|
EXPECT_GT(0, haier.getOnTimer());
|
|
EXPECT_GT(0, haier.getOffTimer());
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
|
|
// On Timer.
|
|
haier.setOnTimer(6 * 60); // 6am
|
|
EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
|
|
EXPECT_GT(0, haier.getOffTimer());
|
|
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
|
|
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
|
|
EXPECT_GT(0, haier.getOffTimer());
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
|
|
haier.cancelTimers();
|
|
EXPECT_GT(0, haier.getOnTimer());
|
|
EXPECT_GT(0, haier.getOffTimer());
|
|
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
|
|
|
|
// Off Timer.
|
|
haier.setOffTimer(18 * 60 + 30); // 6:30pm
|
|
EXPECT_GT(0, haier.getOnTimer());
|
|
EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
|
|
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
|
|
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
EXPECT_GT(0, haier.getOnTimer());
|
|
EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
|
|
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
|
|
|
|
haier.cancelTimers();
|
|
EXPECT_GT(0, haier.getOnTimer());
|
|
EXPECT_GT(0, haier.getOffTimer());
|
|
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
|
|
|
|
// Both Timers.
|
|
haier.setOnTimer(6 * 60); // 6am
|
|
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
|
|
haier.setOffTimer(18 * 60 + 30); // 6:30pm
|
|
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
|
|
EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
|
|
EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
|
|
|
|
haier.cancelTimers();
|
|
EXPECT_GT(0, haier.getOnTimer());
|
|
EXPECT_GT(0, haier.getOffTimer());
|
|
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
|
|
}
|
|
|
|
TEST(TestHaierACClass, MessageConstuction) {
|
|
IRHaierAC haier(0);
|
|
|
|
EXPECT_EQ(
|
|
"Command: 1 (On), Mode: 0 (Auto), Temp: 25C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, "
|
|
"Clock: 00:00, On Timer: Off, Off Timer: Off",
|
|
haier.toString());
|
|
haier.setMode(kHaierAcCool);
|
|
haier.setTemp(21);
|
|
haier.setFan(kHaierAcFanHigh);
|
|
EXPECT_EQ(
|
|
"Command: 3 (Fan), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, "
|
|
"Clock: 00:00, On Timer: Off, Off Timer: Off",
|
|
haier.toString());
|
|
haier.setSwing(kHaierAcSwingChg);
|
|
haier.setHealth(true);
|
|
haier.setSleep(true);
|
|
haier.setCurrTime(615); // 10:15am
|
|
EXPECT_EQ(
|
|
"Command: 8 (Sleep), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), "
|
|
"Swing: 3 (Change), Sleep: On, Health: On, "
|
|
"Clock: 10:15, On Timer: Off, Off Timer: Off",
|
|
haier.toString());
|
|
haier.setOnTimer(800); // 1:20pm
|
|
haier.setOffTimer(1125); // 6:45pm
|
|
haier.setCommand(kHaierAcCmdOn);
|
|
|
|
EXPECT_EQ(
|
|
"Command: 1 (On), Mode: 1 (Cool), Temp: 21C, Fan: 2 (Medium), "
|
|
"Swing: 3 (Change), Sleep: On, Health: On, "
|
|
"Clock: 10:15, On Timer: 13:20, Off Timer: 18:45",
|
|
haier.toString());
|
|
|
|
// Now change a few already set things.
|
|
haier.setMode(kHaierAcHeat);
|
|
EXPECT_EQ(
|
|
"Command: 2 (Mode), Mode: 3 (Heat), Temp: 21C, Fan: 2 (Medium), "
|
|
"Swing: 3 (Change), Sleep: On, Health: On, "
|
|
"Clock: 10:15, On Timer: 13:20, Off Timer: 18:45",
|
|
haier.toString());
|
|
|
|
haier.setTemp(25);
|
|
EXPECT_EQ(
|
|
"Command: 6 (Temp Up), Mode: 3 (Heat), Temp: 25C, Fan: 2 (Medium), "
|
|
"Swing: 3 (Change), Sleep: On, Health: On, "
|
|
"Clock: 10:15, On Timer: 13:20, Off Timer: 18:45",
|
|
haier.toString());
|
|
|
|
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x96, 0xEA, 0xCF, 0x32,
|
|
0xED, 0x6D, 0x54, 0xD4};
|
|
EXPECT_STATE_EQ(expectedState, haier.getRaw(), kHaierACBits);
|
|
|
|
// Check that the checksum is valid.
|
|
EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
|
|
|
|
// Now load up some random data.
|
|
uint8_t randomState[kHaierACStateLength] = {0x52, 0x49, 0x50, 0x20, 0x54,
|
|
0x61, 0x6C, 0x69, 0x61};
|
|
EXPECT_FALSE(IRHaierAC::validChecksum(randomState));
|
|
haier.setRaw(randomState);
|
|
EXPECT_EQ(
|
|
"Command: 9 (Timer Set), Mode: 3 (Heat), Temp: 20C, Fan: 2 (Medium), "
|
|
"Swing: 1 (Up), Sleep: On, Health: Off, "
|
|
"Clock: 16:32, On Timer: Off, Off Timer: Off",
|
|
haier.toString());
|
|
// getRaw() should correct the checksum.
|
|
EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
|
|
}
|
|
|
|
// Tests for the IRHaierACYRW02 class.
|
|
|
|
TEST(TestHaierACYRW02Class, Button) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonPower);
|
|
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
|
|
haier.setButton(kHaierAcYrw02ButtonMode);
|
|
EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
|
|
haier.setButton(kHaierAcYrw02ButtonSleep);
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
|
|
haier.setButton(kHaierAcYrw02ButtonFan);
|
|
|
|
// Test unexpected values.
|
|
haier.setButton(0xFF);
|
|
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
|
|
haier.setButton(0x10);
|
|
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, OperatingMode) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonPower);
|
|
haier.setMode(kHaierAcYrw02Auto);
|
|
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
|
|
|
|
haier.setMode(kHaierAcYrw02Cool);
|
|
EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcYrw02Heat);
|
|
EXPECT_EQ(kHaierAcYrw02Heat, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcYrw02Fan);
|
|
EXPECT_EQ(kHaierAcYrw02Fan, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcYrw02Dry);
|
|
EXPECT_EQ(kHaierAcYrw02Dry, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcYrw02Auto - 1);
|
|
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcYrw02Cool);
|
|
EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
|
|
|
|
haier.setMode(kHaierAcYrw02Fan + 1);
|
|
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
|
|
|
|
haier.setMode(255);
|
|
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, Temperature) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setTemp(kHaierAcMinTemp);
|
|
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonPower);
|
|
haier.setTemp(kHaierAcMinTemp + 1);
|
|
EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
|
|
|
|
haier.setTemp(kHaierAcMaxTemp);
|
|
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
|
|
|
|
haier.setTemp(kHaierAcMinTemp - 1);
|
|
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
|
|
|
|
haier.setTemp(kHaierAcMaxTemp + 1);
|
|
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
|
|
|
|
haier.setTemp(23);
|
|
EXPECT_EQ(23, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
|
|
haier.setButton(kHaierAcYrw02ButtonPower);
|
|
haier.setTemp(23);
|
|
EXPECT_EQ(23, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
|
|
|
|
haier.setTemp(0);
|
|
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
|
|
|
|
haier.setTemp(255);
|
|
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, HealthMode) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setHealth(true);
|
|
EXPECT_TRUE(haier.getHealth());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
haier.setHealth(false);
|
|
EXPECT_FALSE(haier.getHealth());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
|
|
|
|
haier.setHealth(true);
|
|
EXPECT_TRUE(haier.getHealth());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, Power) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setPower(true);
|
|
EXPECT_TRUE(haier.getPower());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
haier.setPower(false);
|
|
EXPECT_FALSE(haier.getPower());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
|
|
|
|
haier.setPower(true);
|
|
EXPECT_TRUE(haier.getPower());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
|
|
|
|
haier.off();
|
|
EXPECT_FALSE(haier.getPower());
|
|
haier.on();
|
|
EXPECT_TRUE(haier.getPower());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, SleepMode) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setSleep(true);
|
|
EXPECT_TRUE(haier.getSleep());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
haier.setSleep(false);
|
|
EXPECT_FALSE(haier.getSleep());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
|
|
|
|
haier.setSleep(true);
|
|
EXPECT_TRUE(haier.getSleep());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, TurboMode) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setTurbo(kHaierAcYrw02TurboOff);
|
|
EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
|
|
haier.setTurbo(kHaierAcYrw02TurboLow);
|
|
EXPECT_EQ(kHaierAcYrw02TurboLow, haier.getTurbo());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
|
|
|
|
haier.setTurbo(kHaierAcYrw02TurboHigh);
|
|
EXPECT_EQ(kHaierAcYrw02TurboHigh, haier.getTurbo());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
|
|
|
|
haier.setTurbo(kHaierAcYrw02TurboOff);
|
|
EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, Fan) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setFan(kHaierAcYrw02FanAuto);
|
|
EXPECT_EQ(kHaierAcYrw02FanAuto, haier.getFan());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
|
|
haier.setFan(kHaierAcYrw02FanLow);
|
|
EXPECT_EQ(kHaierAcYrw02FanLow, haier.getFan());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
|
|
|
|
haier.setFan(kHaierAcYrw02FanHigh);
|
|
EXPECT_EQ(kHaierAcYrw02FanHigh, haier.getFan());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
|
|
|
|
haier.setFan(kHaierAcYrw02FanMed);
|
|
EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
|
|
|
|
// Test unexpected values.
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
haier.setFan(0x00);
|
|
EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, Swing) {
|
|
IRHaierACYRW02 haier(0);
|
|
haier.begin();
|
|
|
|
haier.setSwing(kHaierAcYrw02SwingOff);
|
|
EXPECT_EQ(kHaierAcYrw02SwingOff, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
|
|
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
|
|
haier.setSwing(kHaierAcYrw02SwingAuto);
|
|
EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
|
|
|
|
haier.setSwing(kHaierAcYrw02SwingTop);
|
|
EXPECT_EQ(kHaierAcYrw02SwingTop, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
|
|
|
|
haier.setSwing(kHaierAcYrw02SwingDown);
|
|
EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
|
|
|
|
// Test unexpected values.
|
|
haier.setButton(kHaierAcYrw02ButtonTempUp);
|
|
haier.setSwing(0xFF);
|
|
EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
|
|
|
|
// Test the mode-dependant positions.
|
|
haier.setMode(kHaierAcYrw02Auto);
|
|
haier.setSwing(kHaierAcYrw02SwingMiddle);
|
|
EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
|
|
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
|
|
haier.setMode(kHaierAcYrw02Heat);
|
|
haier.setSwing(kHaierAcYrw02SwingMiddle);
|
|
EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
|
|
haier.setSwing(kHaierAcYrw02SwingAuto);
|
|
EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
|
|
haier.setSwing(kHaierAcYrw02SwingBottom);
|
|
EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
|
|
haier.setMode(kHaierAcYrw02Cool);
|
|
haier.setSwing(kHaierAcYrw02SwingBottom);
|
|
EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, MessageConstuction) {
|
|
IRHaierACYRW02 haier(0);
|
|
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C,"
|
|
" Fan: 5 (Auto), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
|
|
" Health: On",
|
|
haier.toString());
|
|
haier.setMode(kHaierAcYrw02Cool);
|
|
haier.setTemp(21);
|
|
haier.setFan(kHaierAcYrw02FanHigh);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 21C,"
|
|
" Fan: 1 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
|
|
" Health: On",
|
|
haier.toString());
|
|
|
|
haier.setSwing(kHaierAcYrw02SwingMiddle);
|
|
haier.setHealth(false);
|
|
haier.setSleep(true);
|
|
haier.setTurbo(kHaierAcYrw02TurboHigh);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 8 (Turbo), Mode: 1 (Cool), Temp: 21C,"
|
|
" Fan: 1 (High), Turbo: 1 (High), Swing: 2 (Middle),"
|
|
" Sleep: On, Health: Off",
|
|
haier.toString());
|
|
}
|
|
|
|
// Decode "real" state messages.
|
|
TEST(TestHaierACYRW02Class, RealStates) {
|
|
uint8_t expectedState1[kHaierACYRW02StateLength] = {
|
|
0xA6, 0xE1, 0x00, 0x00, 0x40, 0x20, 0x00,
|
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6E};
|
|
|
|
IRHaierACYRW02 haier(0);
|
|
haier.setRaw(expectedState1);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 7 (Health), Mode: 4 (Heat), Temp: 30C,"
|
|
" Fan: 1 (High), Turbo: 0 (Off), Swing: 1 (Highest), Sleep: Off,"
|
|
" Health: Off",
|
|
haier.toString());
|
|
|
|
uint8_t expectedState2[kHaierACYRW02StateLength] = {
|
|
0xA6, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x00,
|
|
0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x75};
|
|
haier.setRaw(expectedState2);
|
|
EXPECT_EQ(
|
|
"Power: Off, Button: 5 (Power), Mode: 4 (Heat), Temp: 30C,"
|
|
" Fan: 1 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
|
|
" Health: Off",
|
|
haier.toString());
|
|
|
|
uint8_t expectedState3[kHaierACYRW02StateLength] = {
|
|
0xA6, 0x02, 0x00, 0x02, 0x40, 0x20, 0x00,
|
|
0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2B};
|
|
haier.setRaw(expectedState3);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 1 (Temp Down), Mode: 1 (Cool), Temp: 16C,"
|
|
" Fan: 1 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
|
|
" Health: On",
|
|
haier.toString());
|
|
|
|
// cool 25, health, fan auto, swing auto, sleep on
|
|
uint8_t expectedState4[kHaierACYRW02StateLength] = {
|
|
0xA6, 0x9C, 0x00, 0x02, 0x40, 0xA8, 0x00,
|
|
0x20, 0x80, 0x00, 0x00, 0x00, 0x0B, 0xD7};
|
|
haier.setRaw(expectedState4);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 11 (Sleep), Mode: 1 (Cool), Temp: 25C,"
|
|
" Fan: 5 (Auto), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
|
|
" Health: On",
|
|
haier.toString());
|
|
|
|
// cool 25, health, fan 3, swing auto, sleep on
|
|
uint8_t expectedState5[kHaierACYRW02StateLength] = {
|
|
0xA6, 0x9C, 0x00, 0x02, 0x40, 0x27, 0x36,
|
|
0x20, 0x80, 0x00, 0x00, 0x00, 0x04, 0x85};
|
|
haier.setRaw(expectedState5);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 25C,"
|
|
" Fan: 1 (High), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
|
|
" Health: On",
|
|
haier.toString());
|
|
}
|
|
|
|
// Tests for decodeHaierAC().
|
|
|
|
// Decode normal "synthetic" messages.
|
|
TEST(TestDecodeHaierAC, NormalDecodeWithStrict) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
|
|
0xC0, 0x20, 0x00, 0xA7};
|
|
|
|
// With the specific decoder.
|
|
irsend.reset();
|
|
irsend.sendHaierAC(expectedState);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decodeHaierAC(&irsend.capture, kStartOffset, kHaierACBits,
|
|
true));
|
|
EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
|
|
// With the all the decoders.
|
|
irsend.reset();
|
|
irsend.sendHaierAC(expectedState);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
}
|
|
|
|
// Decode a "real" example message.
|
|
TEST(TestDecodeHaierAC, RealExample1) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
irsend.reset();
|
|
// Data from Issue #404 captured by kuzin2006
|
|
uint16_t rawData[149] = {
|
|
3030, 3044, 3030, 4304, 576, 1694, 550, 582, 552, 1704, 552, 714, 550,
|
|
582, 550, 1706, 552, 582, 550, 1836, 552, 582, 578, 568, 550, 582,
|
|
550, 714, 550, 582, 550, 582, 552, 582, 550, 1836, 552, 582, 552,
|
|
580, 580, 1692, 550, 712, 552, 582, 550, 582, 552, 580, 550, 714,
|
|
552, 582, 550, 582, 552, 582, 578, 698, 552, 580, 552, 582, 552,
|
|
582, 552, 1836, 552, 580, 552, 582, 552, 582, 550, 714, 578, 568,
|
|
550, 582, 550, 582, 552, 714, 550, 1706, 550, 1706, 550, 582, 550,
|
|
714, 552, 582, 580, 566, 552, 582, 550, 714, 552, 580, 552, 580,
|
|
552, 1706, 550, 714, 550, 582, 552, 582, 578, 568, 552, 712, 552,
|
|
582, 550, 582, 550, 582, 550, 712, 552, 582, 550, 582, 552, 582,
|
|
578, 722, 552, 1704, 550, 582, 550, 1706, 550, 736, 550, 582, 550,
|
|
1706, 550, 1704, 552, 1704, 578};
|
|
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
|
|
0xC0, 0x20, 0x00, 0xA7};
|
|
|
|
irsend.sendRaw(rawData, 149, 38000);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
|
|
EXPECT_EQ(
|
|
"Command: 1 (On), Mode: 1 (Cool), Temp: 16C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, "
|
|
"Clock: 00:01, On Timer: Off, Off Timer: Off",
|
|
IRAcUtils::resultAcToString(&irsend.capture));
|
|
stdAc::state_t r, p;
|
|
ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p));
|
|
}
|
|
|
|
// Decode a "real" example message.
|
|
TEST(TestDecodeHaierAC, RealExample2) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
irsend.reset();
|
|
// Data from Issue #404 captured by kuzin2006
|
|
uint16_t rawData[149] = {
|
|
3028, 3046, 3028, 4304, 576, 1694, 552, 582, 550, 1704, 552, 714,
|
|
550, 582, 552, 1704, 550, 582, 550, 1836, 552, 582, 578, 1690,
|
|
552, 1704, 552, 712, 550, 582, 550, 1706, 550, 1706, 552, 712,
|
|
550, 582, 552, 582, 578, 1690, 552, 714, 552, 580, 552, 582,
|
|
552, 582, 550, 712, 552, 582, 550, 582, 550, 582, 578, 698,
|
|
552, 582, 550, 584, 550, 582, 552, 1836, 550, 582, 550, 582,
|
|
550, 582, 550, 712, 578, 568, 550, 582, 550, 582, 550, 714,
|
|
552, 1706, 550, 1706, 552, 580, 550, 714, 550, 582, 580, 568,
|
|
550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 552, 712,
|
|
550, 582, 550, 582, 580, 568, 552, 712, 550, 584, 550, 582,
|
|
550, 584, 550, 712, 550, 582, 550, 582, 550, 582, 578, 722,
|
|
550, 582, 552, 580, 552, 582, 550, 738, 550, 1706, 550, 1704,
|
|
552, 582, 550, 582, 578};
|
|
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x66, 0x20, 0x01, 0x00,
|
|
0xC0, 0x20, 0x00, 0x0C};
|
|
|
|
irsend.sendRaw(rawData, 149, 38000);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
|
|
IRHaierAC haier(0);
|
|
haier.setRaw(irsend.capture.state);
|
|
EXPECT_EQ(
|
|
"Command: 6 (Temp Up), Mode: 1 (Cool), Temp: 22C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, "
|
|
"Clock: 00:01, On Timer: Off, Off Timer: Off",
|
|
haier.toString());
|
|
}
|
|
|
|
// Decode a "real" example message.
|
|
TEST(TestDecodeHaierAC, RealExample3) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
irsend.reset();
|
|
// Data from Issue #404 captured by kuzin2006
|
|
uint16_t rawData[149] = {
|
|
3030, 3044, 3030, 4302, 578, 1692, 550, 582, 550, 1706, 550, 714,
|
|
550, 582, 552, 1706, 550, 582, 550, 1836, 552, 1706, 578, 1690,
|
|
552, 1704, 552, 714, 550, 1706, 552, 1706, 550, 582, 550, 714,
|
|
552, 582, 550, 582, 578, 1690, 550, 714, 552, 582, 552, 582,
|
|
550, 582, 550, 714, 550, 584, 550, 582, 550, 582, 578, 700,
|
|
552, 1706, 550, 582, 550, 582, 552, 1836, 550, 582, 550, 582,
|
|
552, 1706, 550, 714, 578, 568, 552, 582, 552, 582, 550, 714,
|
|
550, 1706, 550, 1706, 550, 582, 552, 712, 552, 582, 580, 568,
|
|
550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 550, 714,
|
|
550, 582, 550, 582, 578, 568, 552, 712, 552, 582, 550, 582,
|
|
550, 582, 550, 712, 550, 584, 550, 582, 552, 582, 578, 722,
|
|
552, 1704, 550, 582, 550, 1706, 550, 1862, 550, 1706, 550, 582,
|
|
550, 1704, 552, 582, 578};
|
|
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0xEC, 0x20, 0x09, 0x20,
|
|
0xC0, 0x20, 0x00, 0xBA};
|
|
|
|
irsend.sendRaw(rawData, 149, 38000);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
|
|
IRHaierAC haier(0);
|
|
haier.setRaw(irsend.capture.state);
|
|
EXPECT_EQ(
|
|
"Command: 12 (Health), Mode: 1 (Cool), Temp: 30C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: On, "
|
|
"Clock: 00:09, On Timer: Off, Off Timer: Off",
|
|
haier.toString());
|
|
}
|
|
|
|
// Decode normal "synthetic" messages.
|
|
TEST(TestDecodeHaierAC_YRW02, NormalDecode) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
uint8_t expectedState[kHaierACYRW02StateLength] = {
|
|
0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
|
|
0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
|
|
|
|
irsend.reset();
|
|
irsend.sendHaierACYRW02(expectedState);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
EXPECT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
}
|
|
|
|
// Decode a "real" example message.
|
|
TEST(TestDecodeHaierAC_YRW02, RealExample) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
irsend.reset();
|
|
// Data from Issue #485 captured by non7top
|
|
uint16_t rawData[229] = {
|
|
2998, 3086, 2998, 4460, 568, 1640, 596, 492, 514, 1690, 590, 496,
|
|
566, 532, 592, 1596, 570, 1618, 518, 584, 590, 538, 524, 536,
|
|
568, 532, 590, 1596, 516, 612, 568, 538, 522, 1638, 586, 500,
|
|
512, 614, 568, 538, 520, 538, 586, 538, 566, 540, 520, 538,
|
|
586, 538, 522, 538, 588, 538, 568, 538, 520, 538, 586, 538,
|
|
566, 538, 520, 540, 588, 1596, 590, 536, 568, 538, 520, 1592,
|
|
640, 538, 520, 540, 588, 538, 568, 538, 516, 562, 566, 538,
|
|
518, 542, 586, 540, 566, 1596, 590, 538, 566, 538, 516, 544,
|
|
586, 538, 516, 542, 588, 540, 564, 540, 468, 590, 588, 538,
|
|
566, 540, 466, 590, 588, 538, 514, 544, 588, 538, 566, 538,
|
|
468, 1692, 606, 526, 466, 592, 588, 538, 568, 490, 588, 538,
|
|
566, 540, 466, 592, 588, 538, 566, 538, 466, 592, 588, 538,
|
|
568, 492, 586, 540, 566, 540, 468, 590, 588, 538, 568, 516,
|
|
488, 590, 588, 538, 568, 492, 588, 538, 566, 518, 488, 590,
|
|
588, 540, 564, 518, 490, 590, 588, 538, 562, 496, 588, 538,
|
|
566, 518, 488, 590, 588, 538, 562, 522, 488, 588, 590, 538,
|
|
560, 498, 588, 540, 564, 522, 486, 590, 590, 538, 560, 524,
|
|
488, 588, 588, 1598, 514, 608, 564, 1600, 548, 536, 586, 538,
|
|
568, 1594, 590, 1618, 578, 1606, 606, 1582, 590, 1596, 590, 1616,
|
|
580};
|
|
uint8_t expectedState[kHaierACYRW02StateLength] = {
|
|
0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
|
|
0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
|
|
|
|
irsend.sendRaw(rawData, 229, 38000);
|
|
irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&irsend.capture));
|
|
ASSERT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
|
|
EXPECT_FALSE(irsend.capture.repeat);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
|
|
IRHaierACYRW02 haier(0);
|
|
haier.setRaw(irsend.capture.state);
|
|
EXPECT_EQ(
|
|
"Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 17C,"
|
|
" Fan: 1 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
|
|
" Health: On",
|
|
haier.toString());
|
|
}
|
|
|
|
// Default state of the remote needed to include hidden data.
|
|
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/668
|
|
TEST(TestHaierAcIssues, Issue668) {
|
|
IRHaierAC ac(0);
|
|
IRHaierAC acText(1);
|
|
IRrecv irrecv(0);
|
|
ac.begin();
|
|
|
|
// Turn on the AC.
|
|
ac._irsend.reset();
|
|
char expected_on[] =
|
|
"Command: 1 (On), Mode: 1 (Cool), Temp: 25C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, "
|
|
"On Timer: Off, Off Timer: Off";
|
|
// State taken from real capture:
|
|
// https://github.com/crankyoldgit/IRremoteESP8266/issues/668#issuecomment-483531895
|
|
uint8_t expected_on_state[9] = {
|
|
0xA5, 0x91, 0x20, 0x00, 0x0C, 0xC0, 0x20, 0x00, 0x42};
|
|
ac.setMode(kHaierAcCool);
|
|
ac.setCommand(kHaierAcCmdOn);
|
|
EXPECT_EQ(expected_on, ac.toString());
|
|
ac.send();
|
|
ac._irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
|
|
EXPECT_STATE_EQ(expected_on_state,
|
|
ac._irsend.capture.state, ac._irsend.capture.bits);
|
|
acText.setRaw(ac._irsend.capture.state);
|
|
EXPECT_EQ(expected_on, acText.toString());
|
|
|
|
// Set the temp to 25C
|
|
ac._irsend.reset();
|
|
ac.setTemp(25);
|
|
EXPECT_EQ(expected_on, ac.toString());
|
|
ASSERT_EQ(25, ac.getTemp());
|
|
ac.send();
|
|
ac._irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
|
|
EXPECT_STATE_EQ(expected_on_state,
|
|
ac._irsend.capture.state, ac._irsend.capture.bits);
|
|
acText.setRaw(ac._irsend.capture.state);
|
|
EXPECT_EQ(expected_on, acText.toString());
|
|
|
|
// Increase the temp by 1.
|
|
ac._irsend.reset();
|
|
char expected_temp_plus_one[] =
|
|
"Command: 6 (Temp Up), Mode: 1 (Cool), Temp: 26C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, "
|
|
"On Timer: Off, Off Timer: Off";
|
|
// State taken from real capture:
|
|
// https://github.com/crankyoldgit/IRremoteESP8266/issues/668#issuecomment-483531895
|
|
uint8_t expected_temp_plus_one_state[9] = {
|
|
0xA5, 0xA6, 0x20, 0x00, 0x0C, 0xC0, 0x20, 0x00, 0x57};
|
|
ASSERT_EQ(25, ac.getTemp());
|
|
ac.setTemp(ac.getTemp() + 1);
|
|
ASSERT_EQ(26, ac.getTemp());
|
|
EXPECT_EQ(expected_temp_plus_one, ac.toString());
|
|
ac.send();
|
|
ac._irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
|
|
EXPECT_STATE_EQ(expected_temp_plus_one_state,
|
|
ac._irsend.capture.state, ac._irsend.capture.bits);
|
|
acText.setRaw(ac._irsend.capture.state);
|
|
EXPECT_EQ(expected_temp_plus_one, acText.toString());
|
|
|
|
// Decrease the temp by 1.
|
|
ac._irsend.reset();
|
|
char expected_temp_minus_one[] =
|
|
"Command: 7 (Temp Down), Mode: 1 (Cool), Temp: 25C, Fan: 0 (Auto), "
|
|
"Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, "
|
|
"On Timer: Off, Off Timer: Off";
|
|
ASSERT_EQ(26, ac.getTemp());
|
|
ac.setTemp(ac.getTemp() - 1);
|
|
ASSERT_EQ(25, ac.getTemp());
|
|
EXPECT_EQ(expected_temp_minus_one, ac.toString());
|
|
ac.send();
|
|
ac._irsend.makeDecodeResult();
|
|
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
|
|
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
|
|
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
|
|
acText.setRaw(ac._irsend.capture.state);
|
|
EXPECT_EQ(expected_temp_minus_one, acText.toString());
|
|
}
|
|
|
|
TEST(TestHaierACClass, toCommon) {
|
|
IRHaierAC ac(0);
|
|
ac.setCommand(kHaierAcCmdOn);
|
|
ac.setMode(kHaierAcCool);
|
|
ac.setTemp(20);
|
|
ac.setFan(kHaierAcFanHigh);
|
|
ac.setSwing(kHaierAcSwingChg);
|
|
ac.setHealth(true);
|
|
ac.setSleep(true);
|
|
// Now test it.
|
|
ASSERT_EQ(decode_type_t::HAIER_AC, ac.toCommon().protocol);
|
|
ASSERT_EQ(-1, ac.toCommon().model);
|
|
ASSERT_TRUE(ac.toCommon().power);
|
|
ASSERT_TRUE(ac.toCommon().celsius);
|
|
ASSERT_EQ(20, ac.toCommon().degrees);
|
|
ASSERT_TRUE(ac.toCommon().filter);
|
|
ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
|
|
ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
|
|
ASSERT_EQ(stdAc::swingv_t::kAuto, ac.toCommon().swingv);
|
|
ASSERT_EQ(0, ac.toCommon().sleep);
|
|
// Unsupported.
|
|
ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
|
|
ASSERT_FALSE(ac.toCommon().turbo);
|
|
ASSERT_FALSE(ac.toCommon().light);
|
|
ASSERT_FALSE(ac.toCommon().quiet);
|
|
ASSERT_FALSE(ac.toCommon().econo);
|
|
ASSERT_FALSE(ac.toCommon().clean);
|
|
ASSERT_FALSE(ac.toCommon().beep);
|
|
ASSERT_EQ(-1, ac.toCommon().clock);
|
|
}
|
|
|
|
TEST(TestHaierACYRW02Class, toCommon) {
|
|
IRHaierACYRW02 ac(0);
|
|
ac.setPower(true);
|
|
ac.setMode(kHaierAcYrw02Cool);
|
|
ac.setTemp(20);
|
|
ac.setFan(kHaierAcYrw02FanHigh);
|
|
ac.setSwing(kHaierAcYrw02SwingTop);
|
|
ac.setHealth(true);
|
|
ac.setSleep(true);
|
|
// Now test it.
|
|
ASSERT_EQ(decode_type_t::HAIER_AC_YRW02, ac.toCommon().protocol);
|
|
ASSERT_EQ(-1, ac.toCommon().model);
|
|
ASSERT_TRUE(ac.toCommon().power);
|
|
ASSERT_TRUE(ac.toCommon().celsius);
|
|
ASSERT_EQ(20, ac.toCommon().degrees);
|
|
ASSERT_TRUE(ac.toCommon().filter);
|
|
ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
|
|
ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
|
|
ASSERT_EQ(stdAc::swingv_t::kHighest, ac.toCommon().swingv);
|
|
ASSERT_EQ(0, ac.toCommon().sleep);
|
|
// Unsupported.
|
|
ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
|
|
ASSERT_FALSE(ac.toCommon().turbo);
|
|
ASSERT_FALSE(ac.toCommon().light);
|
|
ASSERT_FALSE(ac.toCommon().quiet);
|
|
ASSERT_FALSE(ac.toCommon().econo);
|
|
ASSERT_FALSE(ac.toCommon().clean);
|
|
ASSERT_FALSE(ac.toCommon().beep);
|
|
ASSERT_EQ(-1, ac.toCommon().clock);
|
|
}
|