diff --git a/src/IRac.cpp b/src/IRac.cpp index e3e0874ba..8ce4a2a15 100644 --- a/src/IRac.cpp +++ b/src/IRac.cpp @@ -1086,7 +1086,7 @@ void IRac::haier(IRHaierAC *ac, ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); ac->setFan(ac->convertFan(fan)); - ac->setSwing(ac->convertSwingV(swingv)); + ac->setSwingV(ac->convertSwingV(swingv)); // No Horizontal Swing setting available. // No Quiet setting available. // No Turbo setting available. @@ -1112,6 +1112,7 @@ void IRac::haier(IRHaierAC *ac, /// @param[in] degrees The temperature setting in degrees. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] swingh The horizontal swing setting. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] quiet Run the device in quiet mode. /// @param[in] filter Turn on the (ion/pollen/etc) filter mode. @@ -1119,14 +1120,15 @@ void IRac::haier(IRHaierAC *ac, void IRac::haier176(IRHaierAC176 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, const bool turbo, - const bool quiet, const bool filter, const int16_t sleep) { + const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, + const bool turbo, const bool quiet, const bool filter, + const int16_t sleep) { ac->begin(); ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); ac->setFan(ac->convertFan(fan)); - ac->setSwing(ac->convertSwingV(swingv)); - // No Horizontal Swing setting available. + ac->setSwingV(ac->convertSwingV(swingv)); + ac->setSwingH(ac->convertSwingH(swingh)); ac->setQuiet(quiet); ac->setTurbo(turbo); // No Light setting available. @@ -1147,6 +1149,7 @@ void IRac::haier176(IRHaierAC176 *ac, /// @param[in] degrees The temperature setting in degrees. /// @param[in] fan The speed setting for the fan. /// @param[in] swingv The vertical swing setting. +/// @param[in] swingh The horizontal swing setting. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] quiet Run the device in quiet mode. /// @param[in] filter Turn on the (ion/pollen/etc) filter mode. @@ -1154,15 +1157,16 @@ void IRac::haier176(IRHaierAC176 *ac, void IRac::haierYrwo2(IRHaierACYRW02 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, const bool turbo, - const bool quiet, const bool filter, + const stdAc::swingv_t swingv, + const stdAc::swingh_t swingh, + const bool turbo, const bool quiet, const bool filter, const int16_t sleep) { ac->begin(); ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); ac->setFan(ac->convertFan(fan)); - ac->setSwing(ac->convertSwingV(swingv)); - // No Horizontal Swing setting available. + ac->setSwingV(ac->convertSwingV(swingv)); + ac->setSwingH(ac->convertSwingH(swingh)); ac->setQuiet(quiet); ac->setTurbo(turbo); // No Light setting available. @@ -2751,7 +2755,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { { IRHaierAC176 ac(_pin, _inverted, _modulation); haier176(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, - send.turbo, send.filter, send.sleep); + send.swingh, send.turbo, send.filter, send.sleep); break; } #endif // SEND_HAIER_AC176 @@ -2760,7 +2764,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { { IRHaierACYRW02 ac(_pin, _inverted, _modulation); haierYrwo2(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, - send.turbo, send.filter, send.sleep); + send.swingh, send.turbo, send.filter, send.sleep); break; } #endif // SEND_HAIER_AC_YRW02 diff --git a/src/IRac.h b/src/IRac.h index 7ef3adf4a..4db18dbf6 100644 --- a/src/IRac.h +++ b/src/IRac.h @@ -261,7 +261,7 @@ void electra(IRElectraAc *ac, void haier176(IRHaierAC176 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, + const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool quiet, const bool filter, const int16_t sleep = -1); #endif // SEND_HAIER_AC176 @@ -269,7 +269,7 @@ void electra(IRElectraAc *ac, void haierYrwo2(IRHaierACYRW02 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, - const stdAc::swingv_t swingv, + const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool quiet, const bool filter, const int16_t sleep = -1); #endif // SEND_HAIER_AC_YRW02 diff --git a/src/ir_Haier.cpp b/src/ir_Haier.cpp index 41e40541a..9ec79a72a 100644 --- a/src/ir_Haier.cpp +++ b/src/ir_Haier.cpp @@ -32,6 +32,7 @@ using irutils::addBoolToString; using irutils::addIntToString; using irutils::addLabeledString; using irutils::addModeToString; +using irutils::addSwingHToString; using irutils::addFanToString; using irutils::addTempToString; using irutils::minsToString; @@ -322,22 +323,22 @@ void IRHaierAC::setCurrTime(const uint16_t nr_mins) { } /// Get the Vertical Swing position setting of the A/C. -/// @return The native swing mode. -uint8_t IRHaierAC::getSwing(void) const { - return _.Swing; +/// @return The native vertical swing mode. +uint8_t IRHaierAC::getSwingV(void) const { + return _.SwingV; } /// Set the Vertical Swing mode of the A/C. /// @param[in] state The mode to set the vanes to. -void IRHaierAC::setSwing(const uint8_t state) { - if (state == _.Swing) return; // Nothing to do. +void IRHaierAC::setSwingV(const uint8_t state) { + if (state == _.SwingV) return; // Nothing to do. switch (state) { - case kHaierAcSwingOff: - case kHaierAcSwingUp: - case kHaierAcSwingDown: - case kHaierAcSwingChg: + case kHaierAcSwingVOff: + case kHaierAcSwingVUp: + case kHaierAcSwingVDown: + case kHaierAcSwingVChg: _.Command = kHaierAcCmdSwing; - _.Swing = state; + _.SwingV = state; break; } } @@ -376,11 +377,11 @@ uint8_t IRHaierAC::convertSwingV(const stdAc::swingv_t position) { switch (position) { case stdAc::swingv_t::kHighest: case stdAc::swingv_t::kHigh: - case stdAc::swingv_t::kMiddle: return kHaierAcSwingUp; + case stdAc::swingv_t::kMiddle: return kHaierAcSwingVUp; case stdAc::swingv_t::kLow: - case stdAc::swingv_t::kLowest: return kHaierAcSwingDown; - case stdAc::swingv_t::kOff: return kHaierAcSwingOff; - default: return kHaierAcSwingChg; + case stdAc::swingv_t::kLowest: return kHaierAcSwingVDown; + case stdAc::swingv_t::kOff: return kHaierAcSwingVOff; + default: return kHaierAcSwingVChg; } } @@ -414,10 +415,10 @@ stdAc::fanspeed_t IRHaierAC::toCommonFanSpeed(const uint8_t speed) { /// @return The native equivalent of the enum. stdAc::swingv_t IRHaierAC::toCommonSwingV(const uint8_t pos) { switch (pos) { - case kHaierAcSwingUp: return stdAc::swingv_t::kHighest; - case kHaierAcSwingDown: return stdAc::swingv_t::kLowest; - case kHaierAcSwingOff: return stdAc::swingv_t::kOff; - default: return stdAc::swingv_t::kAuto; + case kHaierAcSwingVUp: return stdAc::swingv_t::kHighest; + case kHaierAcSwingVDown: return stdAc::swingv_t::kLowest; + case kHaierAcSwingVOff: return stdAc::swingv_t::kOff; + default: return stdAc::swingv_t::kAuto; } } @@ -433,7 +434,7 @@ stdAc::state_t IRHaierAC::toCommon(void) const { result.celsius = true; result.degrees = getTemp(); result.fanspeed = toCommonFanSpeed(getFan()); - result.swingv = toCommonSwingV(_.Swing); + result.swingv = toCommonSwingV(_.SwingV); result.filter = _.Health; result.sleep = _.Sleep ? 0 : -1; // Not supported. @@ -452,7 +453,7 @@ stdAc::state_t IRHaierAC::toCommon(void) const { /// @return A human readable string. String IRHaierAC::toString(void) const { String result = ""; - result.reserve(150); // Reserve some heap for the string to reduce fragging. + result.reserve(170); // Reserve some heap for the string to reduce fragging. uint8_t cmd = _.Command; result += addIntToString(cmd, kCommandStr, false); result += kSpaceLBraceStr; @@ -492,7 +493,7 @@ String IRHaierAC::toString(void) const { result += kHealthStr; break; case kHaierAcCmdSwing: - result += kSwingStr; + result += kSwingVStr; break; default: result += kUnknownStr; @@ -503,19 +504,19 @@ String IRHaierAC::toString(void) const { result += addTempToString(getTemp()); result += addFanToString(getFan(), kHaierAcFanHigh, kHaierAcFanLow, kHaierAcFanAuto, kHaierAcFanAuto, kHaierAcFanMed); - result += addIntToString(_.Swing, kSwingStr); + result += addIntToString(_.SwingV, kSwingVStr); result += kSpaceLBraceStr; - switch (_.Swing) { - case kHaierAcSwingOff: + switch (_.SwingV) { + case kHaierAcSwingVOff: result += kOffStr; break; - case kHaierAcSwingUp: + case kHaierAcSwingVUp: result += kUpStr; break; - case kHaierAcSwingDown: + case kHaierAcSwingVDown: result += kDownStr; break; - case kHaierAcSwingChg: + case kHaierAcSwingVChg: result += kChangeStr; break; default: @@ -609,7 +610,8 @@ void IRHaierAC176::setButton(uint8_t button) { switch (button) { case kHaierAcYrw02ButtonTempUp: case kHaierAcYrw02ButtonTempDown: - case kHaierAcYrw02ButtonSwing: + case kHaierAcYrw02ButtonSwingV: + case kHaierAcYrw02ButtonSwingH: case kHaierAcYrw02ButtonFan: case kHaierAcYrw02ButtonPower: case kHaierAcYrw02ButtonMode: @@ -764,30 +766,61 @@ void IRHaierAC176::setFan(uint8_t speed) { } } +/// For backward compatibility. Use getSwingV() instead. /// Get the Vertical Swing position setting of the A/C. /// @return The native position/mode. -uint8_t IRHaierAC176::getSwing(void) const { return _.Swing; } +uint8_t IRHaierAC176::getSwing(void) const { + return IRHaierAC176::getSwingV(); +} + +/// For backward compatibility. Use setSwingV() instead. +/// Set the Vertical Swing mode of the A/C. +/// @param[in] pos The position/mode to set the vanes to. +void IRHaierAC176::setSwing(uint8_t pos) { setSwingV(pos); } + +/// Get the Vertical Swing position setting of the A/C. +/// @return The native position/mode. +uint8_t IRHaierAC176::getSwingV(void) const { return _.SwingV; } /// Set the Vertical Swing mode of the A/C. /// @param[in] pos The position/mode to set the vanes to. -void IRHaierAC176::setSwing(uint8_t pos) { +void IRHaierAC176::setSwingV(uint8_t pos) { uint8_t newpos = pos; switch (pos) { - case kHaierAcYrw02SwingOff: - case kHaierAcYrw02SwingAuto: - case kHaierAcYrw02SwingTop: - case kHaierAcYrw02SwingMiddle: - case kHaierAcYrw02SwingBottom: - case kHaierAcYrw02SwingDown: _.Button = kHaierAcYrw02ButtonSwing; break; + case kHaierAcYrw02SwingVOff: + case kHaierAcYrw02SwingVAuto: + case kHaierAcYrw02SwingVTop: + case kHaierAcYrw02SwingVMiddle: + case kHaierAcYrw02SwingVBottom: + case kHaierAcYrw02SwingVDown: _.Button = kHaierAcYrw02ButtonSwingV; break; default: return; // Unexpected value so don't do anything. } // Heat mode has no MIDDLE setting, use BOTTOM instead. - if (pos == kHaierAcYrw02SwingMiddle && _.Mode == kHaierAcYrw02Heat) - newpos = kHaierAcYrw02SwingBottom; + if (pos == kHaierAcYrw02SwingVMiddle && _.Mode == kHaierAcYrw02Heat) + newpos = kHaierAcYrw02SwingVBottom; // BOTTOM is only allowed if we are in Heat mode, otherwise MIDDLE. - if (pos == kHaierAcYrw02SwingBottom && _.Mode != kHaierAcYrw02Heat) - newpos = kHaierAcYrw02SwingMiddle; - _.Swing = newpos; + if (pos == kHaierAcYrw02SwingVBottom && _.Mode != kHaierAcYrw02Heat) + newpos = kHaierAcYrw02SwingVMiddle; + _.SwingV = newpos; +} + +/// Get the Horizontal Swing position setting of the A/C. +/// @return The native position/mode. +uint8_t IRHaierAC176::getSwingH(void) const { return _.SwingH; } + +/// Set the Horizontal Swing mode of the A/C. +/// @param[in] pos The position/mode to set the vanes to. +void IRHaierAC176::setSwingH(uint8_t pos) { + switch (pos) { + case kHaierAcYrw02SwingHMiddle: + case kHaierAcYrw02SwingHLeftMax: + case kHaierAcYrw02SwingHLeft: + case kHaierAcYrw02SwingHRight: + case kHaierAcYrw02SwingHRightMax: + case kHaierAcYrw02SwingHAuto: _.Button = kHaierAcYrw02ButtonSwingH; break; + default: return; // Unexpected value so don't do anything. + } + _.SwingH = pos; } @@ -907,12 +940,27 @@ uint8_t IRHaierAC176::convertFan(const stdAc::fanspeed_t speed) { uint8_t IRHaierAC176::convertSwingV(const stdAc::swingv_t position) { switch (position) { case stdAc::swingv_t::kHighest: - case stdAc::swingv_t::kHigh: return kHaierAcYrw02SwingTop; - case stdAc::swingv_t::kMiddle: return kHaierAcYrw02SwingMiddle; - case stdAc::swingv_t::kLow: return kHaierAcYrw02SwingDown; - case stdAc::swingv_t::kLowest: return kHaierAcYrw02SwingBottom; - case stdAc::swingv_t::kOff: return kHaierAcYrw02SwingOff; - default: return kHaierAcYrw02SwingAuto; + case stdAc::swingv_t::kHigh: return kHaierAcYrw02SwingVTop; + case stdAc::swingv_t::kMiddle: return kHaierAcYrw02SwingVMiddle; + case stdAc::swingv_t::kLow: return kHaierAcYrw02SwingVDown; + case stdAc::swingv_t::kLowest: return kHaierAcYrw02SwingVBottom; + case stdAc::swingv_t::kOff: return kHaierAcYrw02SwingVOff; + default: return kHaierAcYrw02SwingVAuto; + } +} + +/// Convert a stdAc::swingh_t enum into it's native setting. +/// @param[in] position The enum to be converted. +/// @return The native equivalent of the enum. +uint8_t IRHaierAC176::convertSwingH(const stdAc::swingh_t position) { + switch (position) { + case stdAc::swingh_t::kMiddle: return kHaierAcYrw02SwingHMiddle; + case stdAc::swingh_t::kLeftMax: return kHaierAcYrw02SwingHLeftMax; + case stdAc::swingh_t::kLeft: return kHaierAcYrw02SwingHLeft; + case stdAc::swingh_t::kRight: return kHaierAcYrw02SwingHRight; + case stdAc::swingh_t::kRightMax: return kHaierAcYrw02SwingHRightMax; + case stdAc::swingh_t::kAuto: return kHaierAcYrw02SwingHAuto; + default: return kHaierAcYrw02SwingHMiddle; } } @@ -946,12 +994,27 @@ stdAc::fanspeed_t IRHaierAC176::toCommonFanSpeed(const uint8_t speed) { /// @return The native equivalent of the enum. stdAc::swingv_t IRHaierAC176::toCommonSwingV(const uint8_t pos) { switch (pos) { - case kHaierAcYrw02SwingTop: return stdAc::swingv_t::kHighest; - case kHaierAcYrw02SwingMiddle: return stdAc::swingv_t::kMiddle; - case kHaierAcYrw02SwingDown: return stdAc::swingv_t::kLow; - case kHaierAcYrw02SwingBottom: return stdAc::swingv_t::kLowest; - case kHaierAcYrw02SwingOff: return stdAc::swingv_t::kOff; - default: return stdAc::swingv_t::kAuto; + case kHaierAcYrw02SwingVTop: return stdAc::swingv_t::kHighest; + case kHaierAcYrw02SwingVMiddle: return stdAc::swingv_t::kMiddle; + case kHaierAcYrw02SwingVDown: return stdAc::swingv_t::kLow; + case kHaierAcYrw02SwingVBottom: return stdAc::swingv_t::kLowest; + case kHaierAcYrw02SwingVOff: return stdAc::swingv_t::kOff; + default: return stdAc::swingv_t::kAuto; + } +} + +/// Convert a stdAc::swingh_t enum into it's native setting. +/// @param[in] pos The enum to be converted. +/// @return The native equivalent of the enum. +stdAc::swingh_t IRHaierAC176::toCommonSwingH(const uint8_t pos) { + switch (pos) { + case kHaierAcYrw02SwingHMiddle: return stdAc::swingh_t::kMiddle; + case kHaierAcYrw02SwingHLeftMax: return stdAc::swingh_t::kLeftMax; + case kHaierAcYrw02SwingHLeft: return stdAc::swingh_t::kLeft; + case kHaierAcYrw02SwingHRight: return stdAc::swingh_t::kRight; + case kHaierAcYrw02SwingHRightMax: return stdAc::swingh_t::kRightMax; + case kHaierAcYrw02SwingHAuto: return stdAc::swingh_t::kAuto; + default: return stdAc::swingh_t::kOff; } } @@ -966,13 +1029,13 @@ stdAc::state_t IRHaierAC176::toCommon(void) const { result.celsius = true; result.degrees = getTemp(); result.fanspeed = toCommonFanSpeed(_.Fan); - result.swingv = toCommonSwingV(_.Swing); + result.swingv = toCommonSwingV(_.SwingV); + result.swingh = toCommonSwingH(_.SwingH); result.filter = _.Health; result.sleep = _.Sleep ? 0 : -1; result.turbo = _.Turbo; result.quiet = _.Quiet; // Not supported. - result.swingh = stdAc::swingh_t::kOff; result.econo = false; result.light = false; result.clean = false; @@ -985,7 +1048,7 @@ stdAc::state_t IRHaierAC176::toCommon(void) const { /// @return A human readable string. String IRHaierAC176::toString(void) const { String result = ""; - result.reserve(130); // Reserve some heap for the string to reduce fragging. + result.reserve(250); // Reserve some heap for the string to reduce fragging. result += addBoolToString(_.Power, kPowerStr, false); uint8_t cmd = _.Button; result += addIntToString(cmd, kButtonStr); @@ -1012,8 +1075,11 @@ String IRHaierAC176::toString(void) const { case kHaierAcYrw02ButtonHealth: result += kHealthStr; break; - case kHaierAcYrw02ButtonSwing: - result += kSwingStr; + case kHaierAcYrw02ButtonSwingV: + result += kSwingVStr; + break; + case kHaierAcYrw02ButtonSwingH: + result += kSwingHStr; break; case kHaierAcYrw02ButtonTurbo: result += kTurboStr; @@ -1031,31 +1097,43 @@ String IRHaierAC176::toString(void) const { kHaierAcYrw02FanMed); result += addBoolToString(_.Turbo, kTurboStr); result += addBoolToString(_.Quiet, kQuietStr); - result += addIntToString(_.Swing, kSwingStr); + result += addIntToString(_.SwingV, kSwingVStr); result += kSpaceLBraceStr; - switch (_.Swing) { - case kHaierAcYrw02SwingOff: + switch (_.SwingV) { + case kHaierAcYrw02SwingVOff: result += kOffStr; break; - case kHaierAcYrw02SwingAuto: + case kHaierAcYrw02SwingVAuto: result += kAutoStr; break; - case kHaierAcYrw02SwingBottom: + case kHaierAcYrw02SwingVBottom: result += kLowestStr; break; - case kHaierAcYrw02SwingDown: + case kHaierAcYrw02SwingVDown: result += kLowStr; break; - case kHaierAcYrw02SwingTop: + case kHaierAcYrw02SwingVTop: result += kHighestStr; break; - case kHaierAcYrw02SwingMiddle: + case kHaierAcYrw02SwingVMiddle: result += kMiddleStr; break; default: result += kUnknownStr; } result += ')'; + result += addSwingHToString(_.SwingH, kHaierAcYrw02SwingHAuto, + kHaierAcYrw02SwingHLeftMax, + kHaierAcYrw02SwingHLeft, + kHaierAcYrw02SwingHMiddle, + kHaierAcYrw02SwingHRight, + kHaierAcYrw02SwingHRightMax, + // Below are unused. + kHaierAcYrw02SwingHMiddle, + kHaierAcYrw02SwingHMiddle, + kHaierAcYrw02SwingHMiddle, + kHaierAcYrw02SwingHMiddle, + kHaierAcYrw02SwingHMiddle); result += addBoolToString(_.Sleep, kSleepStr); result += addBoolToString(_.Health, kHealthStr); const uint8_t tmode = getTimerMode(); diff --git a/src/ir_Haier.h b/src/ir_Haier.h index 6cc31b890..e534790e7 100644 --- a/src/ir_Haier.h +++ b/src/ir_Haier.h @@ -41,7 +41,7 @@ union HaierProtocol{ // Byte 2 uint8_t CurrHours:5; uint8_t unknown :1; // value=1 - uint8_t Swing :2; + uint8_t SwingV :2; // Byte 3 uint8_t CurrMins:6; uint8_t OffTimer:1; @@ -84,10 +84,10 @@ const uint8_t kHaierAcCmdTimerCancel = 0b1010; const uint8_t kHaierAcCmdHealth = 0b1100; const uint8_t kHaierAcCmdSwing = 0b1101; -const uint8_t kHaierAcSwingOff = 0b00; -const uint8_t kHaierAcSwingUp = 0b01; -const uint8_t kHaierAcSwingDown = 0b10; -const uint8_t kHaierAcSwingChg = 0b11; +const uint8_t kHaierAcSwingVOff = 0b00; +const uint8_t kHaierAcSwingVUp = 0b01; +const uint8_t kHaierAcSwingVDown = 0b10; +const uint8_t kHaierAcSwingVChg = 0b11; const uint8_t kHaierAcAuto = 0; const uint8_t kHaierAcCool = 1; @@ -118,11 +118,11 @@ const uint8_t kHaierAcSleepBit = 0b01000000; #define HAIER_AC_CMD_TIMER_SET kHaierAcCmdTimerSet #define HAIER_AC_CMD_TIMER_CANCEL kHaierAcCmdTimerCancel #define HAIER_AC_CMD_HEALTH kHaierAcCmdHealth -#define HAIER_AC_CMD_SWING kHaierAcCmdSwing -#define HAIER_AC_SWING_OFF kHaierAcSwingOff -#define HAIER_AC_SWING_UP kHaierAcSwingUp -#define HAIER_AC_SWING_DOWN kHaierAcSwingDown -#define HAIER_AC_SWING_CHG kHaierAcSwingChg +#define HAIER_AC_CMD_SWINGV kHaierAcCmdSwing +#define HAIER_AC_SWINGV_OFF kHaierAcSwingVOff +#define HAIER_AC_SWINGV_UP kHaierAcSwingVUp +#define HAIER_AC_SWINGV_DOWN kHaierAcSwingVDown +#define HAIER_AC_SWINGV_CHG kHaierAcSwingVChg #define HAIER_AC_AUTO kHaierAcAuto #define HAIER_AC_COOL kHaierAcCool #define HAIER_AC_DRY kHaierAcDry @@ -136,12 +136,19 @@ const uint8_t kHaierAcSleepBit = 0b01000000; const uint8_t kHaierAcYrw02Prefix = 0xA6; const uint8_t kHaierAc176Prefix = 0xB7; -const uint8_t kHaierAcYrw02SwingOff = 0x0; -const uint8_t kHaierAcYrw02SwingTop = 0x1; -const uint8_t kHaierAcYrw02SwingMiddle = 0x2; // Not available in heat mode. -const uint8_t kHaierAcYrw02SwingBottom = 0x3; // Only available in heat mode. -const uint8_t kHaierAcYrw02SwingDown = 0xA; -const uint8_t kHaierAcYrw02SwingAuto = 0xC; // Airflow +const uint8_t kHaierAcYrw02SwingVOff = 0x0; +const uint8_t kHaierAcYrw02SwingVTop = 0x1; +const uint8_t kHaierAcYrw02SwingVMiddle = 0x2; // Not available in heat mode. +const uint8_t kHaierAcYrw02SwingVBottom = 0x3; // Only available in heat mode. +const uint8_t kHaierAcYrw02SwingVDown = 0xA; +const uint8_t kHaierAcYrw02SwingVAuto = 0xC; // Airflow + +const uint8_t kHaierAcYrw02SwingHMiddle = 0x0; +const uint8_t kHaierAcYrw02SwingHLeftMax = 0x3; +const uint8_t kHaierAcYrw02SwingHLeft = 0x4; +const uint8_t kHaierAcYrw02SwingHRight = 0x5; +const uint8_t kHaierAcYrw02SwingHRightMax = 0x6; +const uint8_t kHaierAcYrw02SwingHAuto = 0x7; const uint8_t kHaierAcYrw02FanHigh = 0b001; const uint8_t kHaierAcYrw02FanMed = 0b010; @@ -156,7 +163,8 @@ const uint8_t kHaierAcYrw02Fan = 0b110; // 5 const uint8_t kHaierAcYrw02ButtonTempUp = 0x0; const uint8_t kHaierAcYrw02ButtonTempDown = 0x1; -const uint8_t kHaierAcYrw02ButtonSwing = 0x2; +const uint8_t kHaierAcYrw02ButtonSwingV = 0x2; +const uint8_t kHaierAcYrw02ButtonSwingH = 0x3; const uint8_t kHaierAcYrw02ButtonFan = 0x4; const uint8_t kHaierAcYrw02ButtonPower = 0x5; const uint8_t kHaierAcYrw02ButtonMode = 0x6; @@ -177,10 +185,11 @@ union HaierAc176Protocol{ // Byte 0 uint8_t Prefix :8; // Byte 1 - uint8_t Swing :4; + uint8_t SwingV :4; uint8_t Temp :4; // 16C~30C // Byte 2 - uint8_t :8; + uint8_t :5; + uint8_t SwingH :3; // Byte 3 uint8_t :1; uint8_t Health :1; @@ -305,8 +314,8 @@ class IRHaierAC { uint16_t getCurrTime(void) const; void setCurrTime(const uint16_t mins); - uint8_t getSwing(void) const; - void setSwing(const uint8_t state); + uint8_t getSwingV(void) const; + void setSwingV(const uint8_t state); uint8_t* getRaw(void); void setRaw(const uint8_t new_code[]); @@ -377,6 +386,13 @@ class IRHaierAC176 { bool getQuiet(void) const; void setQuiet(const bool on); + uint8_t getSwingV(void) const; + void setSwingV(const uint8_t pos); + uint8_t getSwingH(void) const; + void setSwingH(const uint8_t pos); + + /// These functions are for backward compatibility. + /// Use getSwingV() and setSwingV() instead. uint8_t getSwing(void) const; void setSwing(const uint8_t pos); @@ -394,9 +410,11 @@ class IRHaierAC176 { static uint8_t convertMode(const stdAc::opmode_t mode); static uint8_t convertFan(const stdAc::fanspeed_t speed); static uint8_t convertSwingV(const stdAc::swingv_t position); + static uint8_t convertSwingH(const stdAc::swingh_t position); static stdAc::opmode_t toCommonMode(const uint8_t mode); static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); static stdAc::swingv_t toCommonSwingV(const uint8_t pos); + static stdAc::swingh_t toCommonSwingH(const uint8_t pos); static bool toCommonTurbo(const uint8_t speed); static bool toCommonQuiet(const uint8_t speed); stdAc::state_t toCommon(void) const; diff --git a/test/IRac_test.cpp b/test/IRac_test.cpp index b2eff6efa..7ff512e28 100644 --- a/test/IRac_test.cpp +++ b/test/IRac_test.cpp @@ -760,7 +760,7 @@ TEST(TestIRac, Haier) { IRrecv capture(kGpioUnused); char expected[] = "Command: 1 (On), Mode: 1 (Cool), Temp: 24C, Fan: 2 (Medium), " - "Swing: 1 (Up), Sleep: On, Health: On, Clock: 13:45, " + "Swing(V): 1 (Up), Sleep: On, Health: On, Clock: 13:45, " "On Timer: Off, Off Timer: Off"; ac.begin(); @@ -789,8 +789,9 @@ TEST(TestIRac, Haier176) { IRrecv capture(kGpioUnused); const char expected[] = "Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 23C, " - "Fan: 2 (Medium), Turbo: On, Quiet: Off, Swing: 1 (Highest), Sleep: On, " - "Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off"; + "Fan: 2 (Medium), Turbo: On, Quiet: Off, Swing(V): 1 (Highest), " + "Swing(H): 0 (Middle), Sleep: On, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off"; ac.begin(); irac.haier176(&ac, true, // Power @@ -798,6 +799,7 @@ TEST(TestIRac, Haier176) { 23, // Celsius stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kHigh, // Vertical swing + stdAc::swingh_t::kOff, // Horizontal swing true, // Turbo false, // Quiet true, // Filter @@ -818,8 +820,9 @@ TEST(TestIRac, HaierYrwo2) { IRrecv capture(kGpioUnused); char expected[] = "Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 23C, " - "Fan: 2 (Medium), Turbo: Off, Quiet: On, Swing: 1 (Highest), Sleep: On, " - "Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off"; + "Fan: 2 (Medium), Turbo: Off, Quiet: On, Swing(V): 1 (Highest), " + "Swing(H): 7 (Auto), Sleep: On, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off"; ac.begin(); irac.haierYrwo2(&ac, @@ -828,6 +831,7 @@ TEST(TestIRac, HaierYrwo2) { 23, // Celsius stdAc::fanspeed_t::kMedium, // Fan speed stdAc::swingv_t::kHigh, // Vertical swing + stdAc::swingh_t::kAuto, // Vertical swing false, // Turbo true, // Quiet true, // Filter diff --git a/test/ir_Haier_test.cpp b/test/ir_Haier_test.cpp index 0c63b089f..baf46096a 100644 --- a/test/ir_Haier_test.cpp +++ b/test/ir_Haier_test.cpp @@ -240,25 +240,25 @@ TEST(TestHaierACClass, FanSpeed) { EXPECT_EQ(kHaierAcCmdOn, ac.getCommand()); } -TEST(TestHaierACClass, Swing) { +TEST(TestHaierACClass, SwingV) { IRHaierAC ac(kGpioUnused); ac.begin(); ac.setFan(kHaierAcFanLow); ac.setCommand(kHaierAcCmdOn); - ac.setSwing(kHaierAcSwingOff); - EXPECT_EQ(kHaierAcSwingOff, ac.getSwing()); + ac.setSwingV(kHaierAcSwingVOff); + EXPECT_EQ(kHaierAcSwingVOff, ac.getSwingV()); - ac.setSwing(kHaierAcSwingUp); - EXPECT_EQ(kHaierAcSwingUp, ac.getSwing()); + ac.setSwingV(kHaierAcSwingVUp); + EXPECT_EQ(kHaierAcSwingVUp, ac.getSwingV()); EXPECT_EQ(kHaierAcCmdSwing, ac.getCommand()); - ac.setSwing(kHaierAcSwingDown); - EXPECT_EQ(kHaierAcSwingDown, ac.getSwing()); + ac.setSwingV(kHaierAcSwingVDown); + EXPECT_EQ(kHaierAcSwingVDown, ac.getSwingV()); EXPECT_EQ(kHaierAcCmdSwing, ac.getCommand()); - ac.setSwing(kHaierAcSwingChg); - EXPECT_EQ(kHaierAcSwingChg, ac.getSwing()); + ac.setSwingV(kHaierAcSwingVChg); + EXPECT_EQ(kHaierAcSwingVChg, ac.getSwingV()); EXPECT_EQ(kHaierAcCmdSwing, ac.getCommand()); } @@ -351,7 +351,7 @@ TEST(TestHaierACClass, MessageConstuction) { EXPECT_EQ( "Command: 1 (On), Mode: 0 (Auto), Temp: 25C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: Off, " + "Swing(V): 0 (Off), Sleep: Off, Health: Off, " "Clock: 00:00, On Timer: Off, Off Timer: Off", ac.toString()); ac.setMode(kHaierAcCool); @@ -359,16 +359,16 @@ TEST(TestHaierACClass, MessageConstuction) { ac.setFan(kHaierAcFanHigh); EXPECT_EQ( "Command: 3 (Fan), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), " - "Swing: 0 (Off), Sleep: Off, Health: Off, " + "Swing(V): 0 (Off), Sleep: Off, Health: Off, " "Clock: 00:00, On Timer: Off, Off Timer: Off", ac.toString()); - ac.setSwing(kHaierAcSwingChg); + ac.setSwingV(kHaierAcSwingVChg); ac.setHealth(true); ac.setSleep(true); ac.setCurrTime(615); // 10:15am EXPECT_EQ( "Command: 8 (Sleep), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), " - "Swing: 3 (Change), Sleep: On, Health: On, " + "Swing(V): 3 (Change), Sleep: On, Health: On, " "Clock: 10:15, On Timer: Off, Off Timer: Off", ac.toString()); ac.setOnTimer(800); // 1:20pm @@ -377,7 +377,7 @@ TEST(TestHaierACClass, MessageConstuction) { EXPECT_EQ( "Command: 1 (On), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), " - "Swing: 3 (Change), Sleep: On, Health: On, " + "Swing(V): 3 (Change), Sleep: On, Health: On, " "Clock: 10:15, On Timer: 13:20, Off Timer: 18:45", ac.toString()); @@ -385,14 +385,14 @@ TEST(TestHaierACClass, MessageConstuction) { ac.setMode(kHaierAcHeat); EXPECT_EQ( "Command: 2 (Mode), Mode: 3 (Heat), Temp: 21C, Fan: 3 (High), " - "Swing: 3 (Change), Sleep: On, Health: On, " + "Swing(V): 3 (Change), Sleep: On, Health: On, " "Clock: 10:15, On Timer: 13:20, Off Timer: 18:45", ac.toString()); ac.setTemp(25); EXPECT_EQ( "Command: 6 (Temp Up), Mode: 3 (Heat), Temp: 25C, Fan: 3 (High), " - "Swing: 3 (Change), Sleep: On, Health: On, " + "Swing(V): 3 (Change), Sleep: On, Health: On, " "Clock: 10:15, On Timer: 13:20, Off Timer: 18:45", ac.toString()); @@ -410,7 +410,7 @@ TEST(TestHaierACClass, MessageConstuction) { ac.setRaw(randomState); EXPECT_EQ( "Command: 9 (Timer Set), Mode: 3 (Heat), Temp: 20C, Fan: 3 (High), " - "Swing: 1 (Up), Sleep: On, Health: Off, " + "Swing(V): 1 (Up), Sleep: On, Health: Off, " "Clock: 16:32, On Timer: Off, Off Timer: Off", ac.toString()); // getRaw() should correct the checksum. @@ -641,76 +641,115 @@ TEST(TestHaierACYRW02Class, Fan) { EXPECT_EQ(kHaierAcYrw02ButtonTempUp, ac.getButton()); } -TEST(TestHaierACYRW02Class, Swing) { +TEST(TestHaierACYRW02Class, SwingV) { IRHaierACYRW02 ac(kGpioUnused); ac.begin(); - ac.setSwing(kHaierAcYrw02SwingOff); - EXPECT_EQ(kHaierAcYrw02SwingOff, ac.getSwing()); - EXPECT_EQ(kHaierAcYrw02ButtonSwing, ac.getButton()); + ac.setSwingV(kHaierAcYrw02SwingVOff); + EXPECT_EQ(kHaierAcYrw02SwingVOff, ac.getSwingV()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingV, ac.getButton()); ac.setButton(kHaierAcYrw02ButtonTempUp); - ac.setSwing(kHaierAcYrw02SwingAuto); - EXPECT_EQ(kHaierAcYrw02SwingAuto, ac.getSwing()); - EXPECT_EQ(kHaierAcYrw02ButtonSwing, ac.getButton()); + ac.setSwingV(kHaierAcYrw02SwingVAuto); + EXPECT_EQ(kHaierAcYrw02SwingVAuto, ac.getSwingV()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingV, ac.getButton()); - ac.setSwing(kHaierAcYrw02SwingTop); - EXPECT_EQ(kHaierAcYrw02SwingTop, ac.getSwing()); - EXPECT_EQ(kHaierAcYrw02ButtonSwing, ac.getButton()); + ac.setSwingV(kHaierAcYrw02SwingVTop); + EXPECT_EQ(kHaierAcYrw02SwingVTop, ac.getSwingV()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingV, ac.getButton()); - ac.setSwing(kHaierAcYrw02SwingDown); - EXPECT_EQ(kHaierAcYrw02SwingDown, ac.getSwing()); - EXPECT_EQ(kHaierAcYrw02ButtonSwing, ac.getButton()); + ac.setSwingV(kHaierAcYrw02SwingVDown); + EXPECT_EQ(kHaierAcYrw02SwingVDown, ac.getSwingV()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingV, ac.getButton()); // Test unexpected values. ac.setButton(kHaierAcYrw02ButtonTempUp); - ac.setSwing(0xFF); - EXPECT_EQ(kHaierAcYrw02SwingDown, ac.getSwing()); + ac.setSwingV(0xFF); + EXPECT_EQ(kHaierAcYrw02SwingVDown, ac.getSwingV()); EXPECT_EQ(kHaierAcYrw02ButtonTempUp, ac.getButton()); // Test the mode-dependant positions. ac.setMode(kHaierAcYrw02Auto); - ac.setSwing(kHaierAcYrw02SwingMiddle); - EXPECT_EQ(kHaierAcYrw02SwingMiddle, ac.getSwing()); - EXPECT_EQ(kHaierAcYrw02ButtonSwing, ac.getButton()); + ac.setSwingV(kHaierAcYrw02SwingVMiddle); + EXPECT_EQ(kHaierAcYrw02SwingVMiddle, ac.getSwingV()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingV, ac.getButton()); ac.setMode(kHaierAcYrw02Heat); - ac.setSwing(kHaierAcYrw02SwingMiddle); - EXPECT_EQ(kHaierAcYrw02SwingBottom, ac.getSwing()); - ac.setSwing(kHaierAcYrw02SwingAuto); - EXPECT_EQ(kHaierAcYrw02SwingAuto, ac.getSwing()); - ac.setSwing(kHaierAcYrw02SwingBottom); - EXPECT_EQ(kHaierAcYrw02SwingBottom, ac.getSwing()); + ac.setSwingV(kHaierAcYrw02SwingVMiddle); + EXPECT_EQ(kHaierAcYrw02SwingVBottom, ac.getSwingV()); + ac.setSwingV(kHaierAcYrw02SwingVAuto); + EXPECT_EQ(kHaierAcYrw02SwingVAuto, ac.getSwingV()); + ac.setSwingV(kHaierAcYrw02SwingVBottom); + EXPECT_EQ(kHaierAcYrw02SwingVBottom, ac.getSwingV()); ac.setMode(kHaierAcYrw02Cool); - ac.setSwing(kHaierAcYrw02SwingBottom); - EXPECT_EQ(kHaierAcYrw02SwingMiddle, ac.getSwing()); + ac.setSwingV(kHaierAcYrw02SwingVBottom); + EXPECT_EQ(kHaierAcYrw02SwingVMiddle, ac.getSwingV()); +} + +TEST(TestHaierACYRW02Class, SwingH) { + IRHaierACYRW02 ac(kGpioUnused); + ac.begin(); + + ac.setSwingH(kHaierAcYrw02SwingVOff); + EXPECT_EQ(kHaierAcYrw02SwingHMiddle, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingH, ac.getButton()); + + ac.setButton(kHaierAcYrw02ButtonTempUp); + + ac.setSwingH(kHaierAcYrw02SwingHLeftMax); + EXPECT_EQ(kHaierAcYrw02SwingHLeftMax, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingH, ac.getButton()); + + ac.setSwingH(kHaierAcYrw02SwingHLeft); + EXPECT_EQ(kHaierAcYrw02SwingHLeft, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingH, ac.getButton()); + + ac.setSwingH(kHaierAcYrw02SwingHRight); + EXPECT_EQ(kHaierAcYrw02SwingHRight, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingH, ac.getButton()); + + ac.setSwingH(kHaierAcYrw02SwingHRightMax); + EXPECT_EQ(kHaierAcYrw02SwingHRightMax, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingH, ac.getButton()); + + ac.setSwingH(kHaierAcYrw02SwingHAuto); + EXPECT_EQ(kHaierAcYrw02SwingHAuto, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonSwingH, ac.getButton()); + + // Test unexpected values. + ac.setButton(kHaierAcYrw02ButtonTempUp); + ac.setSwingH(0xFF); + EXPECT_EQ(kHaierAcYrw02SwingHAuto, ac.getSwingH()); + EXPECT_EQ(kHaierAcYrw02ButtonTempUp, ac.getButton()); } TEST(TestHaierACYRW02Class, MessageConstuction) { IRHaierACYRW02 ac(kGpioUnused); EXPECT_EQ( - "Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C," - " Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 0 (Off), Sleep: Off," - " Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C, " + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), " + "Swing(H): 0 (Middle), Sleep: Off, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); ac.setMode(kHaierAcYrw02Cool); ac.setTemp(21); ac.setFan(kHaierAcYrw02FanHigh); EXPECT_EQ( - "Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 21C," - " Fan: 1 (High), Turbo: Off, Quiet: Off, Swing: 0 (Off), Sleep: Off," - " Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 21C, " + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), " + "Swing(H): 0 (Middle), Sleep: Off, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); - ac.setSwing(kHaierAcYrw02SwingMiddle); + ac.setSwingV(kHaierAcYrw02SwingVMiddle); ac.setHealth(false); ac.setSleep(true); ac.setTurbo(true); EXPECT_EQ( "Power: On, Button: 8 (Turbo), Mode: 1 (Cool), Temp: 21C, " - "Fan: 1 (High), Turbo: On, Quiet: Off, Swing: 2 (Middle), " - "Sleep: On, Health: Off, " + "Fan: 1 (High), Turbo: On, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: On, Health: Off, " "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); } @@ -725,8 +764,9 @@ TEST(TestHaierACYRW02Class, RealStates) { ac.setRaw(expectedState1); EXPECT_EQ( "Power: On, Button: 7 (Health), Mode: 4 (Heat), Temp: 30C, " - "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing: 1 (Highest), Sleep: Off, " - "Health: Off, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 1 (Highest), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); uint8_t expectedState2[kHaierACYRW02StateLength] = { @@ -735,8 +775,9 @@ TEST(TestHaierACYRW02Class, RealStates) { ac.setRaw(expectedState2); EXPECT_EQ( "Power: Off, Button: 5 (Power), Mode: 4 (Heat), Temp: 30C, " - "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing: 0 (Off), Sleep: Off, " - "Health: Off, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); uint8_t expectedState3[kHaierACYRW02StateLength] = { @@ -745,30 +786,33 @@ TEST(TestHaierACYRW02Class, RealStates) { ac.setRaw(expectedState3); EXPECT_EQ( "Power: On, Button: 1 (Temp Down), Mode: 1 (Cool), Temp: 16C, " - "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); - // cool 25, health, fan auto, swing auto, sleep on + // cool 25, health, fan auto, vertical swing auto, sleep on uint8_t expectedState4[kHaierACYRW02StateLength] = { 0xA6, 0x9C, 0x00, 0x02, 0x40, 0xA8, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x0B, 0xD7}; ac.setRaw(expectedState4); EXPECT_EQ( "Power: On, Button: 11 (Sleep), Mode: 1 (Cool), Temp: 25C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 12 (Auto), Sleep: On, " - "Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 12 (Auto), " + "Swing(H): 0 (Middle), Sleep: On, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); - // cool 25, health, fan 3, swing auto, sleep on + // cool 25, health, fan 3, vertical swing auto, sleep on uint8_t expectedState5[kHaierACYRW02StateLength] = { 0xA6, 0x9C, 0x00, 0x02, 0x40, 0x27, 0x36, 0x20, 0x80, 0x00, 0x00, 0x00, 0x04, 0x85}; ac.setRaw(expectedState5); EXPECT_EQ( "Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 25C, " - "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing: 12 (Auto), Sleep: On, " - "Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 12 (Auto), " + "Swing(H): 0 (Middle), Sleep: On, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); } @@ -840,7 +884,7 @@ TEST(TestDecodeHaierAC, RealExample1) { EXPECT_EQ( "Command: 1 (On), Mode: 1 (Cool), Temp: 16C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: Off, " + "Swing(V): 0 (Off), Sleep: Off, Health: Off, " "Clock: 00:01, On Timer: Off, Off Timer: Off", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; @@ -885,7 +929,7 @@ TEST(TestDecodeHaierAC, RealExample2) { ac.setRaw(irsend.capture.state); EXPECT_EQ( "Command: 6 (Temp Up), Mode: 1 (Cool), Temp: 22C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: Off, " + "Swing(V): 0 (Off), Sleep: Off, Health: Off, " "Clock: 00:01, On Timer: Off, Off Timer: Off", ac.toString()); } @@ -928,7 +972,7 @@ TEST(TestDecodeHaierAC, RealExample3) { ac.setRaw(irsend.capture.state); EXPECT_EQ( "Command: 12 (Health), Mode: 1 (Cool), Temp: 30C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: On, " + "Swing(V): 0 (Off), Sleep: Off, Health: On, " "Clock: 00:09, On Timer: Off, Off Timer: Off", ac.toString()); } @@ -998,8 +1042,9 @@ TEST(TestDecodeHaierAC_YRW02, RealExample) { ac.setRaw(irsend.capture.state); EXPECT_EQ( "Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 17C, " - "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: On, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: On, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); } @@ -1015,7 +1060,7 @@ TEST(TestHaierAcIssues, Issue668) { ac._irsend.reset(); char expected_on[] = "Command: 1 (On), Mode: 1 (Cool), Temp: 25C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, " + "Swing(V): 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 @@ -1053,7 +1098,7 @@ TEST(TestHaierAcIssues, Issue668) { ac._irsend.reset(); char expected_temp_plus_one[] = "Command: 6 (Temp Up), Mode: 1 (Cool), Temp: 26C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, " + "Swing(V): 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 @@ -1077,7 +1122,7 @@ TEST(TestHaierAcIssues, Issue668) { ac._irsend.reset(); char expected_temp_minus_one[] = "Command: 7 (Temp Down), Mode: 1 (Cool), Temp: 25C, Fan: 1 (Low), " - "Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, " + "Swing(V): 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); @@ -1098,7 +1143,7 @@ TEST(TestHaierACClass, toCommon) { ac.setMode(kHaierAcCool); ac.setTemp(20); ac.setFan(kHaierAcFanHigh); - ac.setSwing(kHaierAcSwingChg); + ac.setSwingV(kHaierAcSwingVChg); ac.setHealth(true); ac.setSleep(true); // Now test it. @@ -1129,7 +1174,8 @@ TEST(TestHaierACYRW02Class, toCommon) { ac.setMode(kHaierAcYrw02Cool); ac.setTemp(20); ac.setFan(kHaierAcYrw02FanHigh); - ac.setSwing(kHaierAcYrw02SwingTop); + ac.setSwingV(kHaierAcYrw02SwingVTop); + ac.setSwingH(kHaierAcYrw02SwingHRightMax); ac.setHealth(true); ac.setSleep(true); // Now test it. @@ -1142,9 +1188,9 @@ TEST(TestHaierACYRW02Class, toCommon) { 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(stdAc::swingh_t::kRightMax, ac.toCommon().swingh); 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); @@ -1221,8 +1267,9 @@ TEST(TestDecodeHaierAC176, SyntheticDecode) { EXPECT_FALSE(irsend.capture.repeat); EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits); EXPECT_EQ( - "Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 24C, Fan: 5 (Auto), " - "Turbo: Off, Quiet: Off, Swing: 6 (UNKNOWN), Sleep: Off, Health: Off, " + "Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 24C, " + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 6 (UNKNOWN), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t result, prev; @@ -1262,8 +1309,9 @@ TEST(TestHaierAC176Class, BuildKnownState) { ac.setFan(kHaierAcYrw02FanHigh); EXPECT_TRUE(ac.validChecksum(ac.getRaw())); EXPECT_EQ( - "Power: On, Button: 4 (Fan), Mode: 4 (Heat), Temp: 24C, Fan: 1 (High), " - "Turbo: Off, Quiet: Off, Swing: 0 (Off), Sleep: Off, Health: On, " + "Power: On, Button: 4 (Fan), Mode: 4 (Heat), Temp: 24C, " + "Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), " + "Swing(H): 0 (Middle), Sleep: Off, Health: On, " "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); /* Disabled pending: @@ -1354,42 +1402,48 @@ TEST(TestHaierAC176Class, Timers) { EXPECT_EQ(kHaierAcYrw02OnTimer, ac.getTimerMode()); EXPECT_EQ( "Power: Off, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: Off, Timer Mode: 2 (On), On Timer: 00:30, Off Timer: Off", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 2 (On), On Timer: 00:30, Off Timer: Off", ac.toString()); ac.setRaw(timeroff); EXPECT_EQ(kHaierAcYrw02NoTimers, ac.getTimerMode()); EXPECT_EQ( "Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: Off, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); ac.setRaw(timeroffthenon); EXPECT_EQ( "Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: Off, Timer Mode: 5 (Off-On), On Timer: 08:00, Off Timer: 00:30", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 5 (Off-On), On Timer: 08:00, Off Timer: 00:30", ac.toString()); ac.setTimerMode(kHaierAcYrw02OnThenOffTimer); EXPECT_EQ( "Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: Off, Timer Mode: 4 (On-Off), On Timer: 08:00, Off Timer: 00:30", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 4 (On-Off), On Timer: 08:00, Off Timer: 00:30", ac.toString()); ac.setTimerMode(kHaierAcYrw02OffTimer); EXPECT_EQ(0, ac.getOnTimer()); EXPECT_EQ(30, ac.getOffTimer()); EXPECT_EQ( "Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: Off, Timer Mode: 1 (Off), On Timer: Off, Off Timer: 00:30", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 1 (Off), On Timer: Off, Off Timer: 00:30", ac.toString()); ac.setTimerMode(kHaierAcYrw02NoTimers); EXPECT_EQ(0, ac.getOnTimer()); EXPECT_EQ(0, ac.getOffTimer()); EXPECT_EQ( "Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, " - "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing: 2 (Middle), Sleep: Off, " - "Health: Off, Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", + "Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), " + "Swing(H): 0 (Middle), Sleep: Off, Health: Off, " + "Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off", ac.toString()); }