Skip to content

Commit

Permalink
PanasonicAc: Add better SwingV support for common a/c framework. (cra…
Browse files Browse the repository at this point in the history
  • Loading branch information
crankyoldgit authored Sep 18, 2019
1 parent 9c24e08 commit 9a5e442
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 36 deletions.
4 changes: 2 additions & 2 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2197,8 +2197,8 @@ kPanasonicAcSwingHLeft LITERAL1
kPanasonicAcSwingHMiddle LITERAL1
kPanasonicAcSwingHRight LITERAL1
kPanasonicAcSwingVAuto LITERAL1
kPanasonicAcSwingVDown LITERAL1
kPanasonicAcSwingVUp LITERAL1
kPanasonicAcSwingVLowest LITERAL1
kPanasonicAcSwingVHighest LITERAL1
kPanasonicAcTimeMax LITERAL1
kPanasonicAcTimeSpecial LITERAL1
kPanasonicAcTolerance LITERAL1
Expand Down
24 changes: 10 additions & 14 deletions src/ir_Panasonic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -410,8 +410,8 @@ uint8_t IRPanasonicAc::getSwingVertical(void) {
void IRPanasonicAc::setSwingVertical(const uint8_t desired_elevation) {
uint8_t elevation = desired_elevation;
if (elevation != kPanasonicAcSwingVAuto) {
elevation = std::max(elevation, kPanasonicAcSwingVUp);
elevation = std::min(elevation, kPanasonicAcSwingVDown);
elevation = std::max(elevation, kPanasonicAcSwingVHighest);
elevation = std::min(elevation, kPanasonicAcSwingVLowest);
}
remote_state[16] &= 0xF0;
remote_state[16] |= elevation;
Expand Down Expand Up @@ -636,12 +636,9 @@ uint8_t IRPanasonicAc::convertSwingV(const stdAc::swingv_t position) {
case stdAc::swingv_t::kHighest:
case stdAc::swingv_t::kHigh:
case stdAc::swingv_t::kMiddle:
return kPanasonicAcSwingVUp;
case stdAc::swingv_t::kLow:
case stdAc::swingv_t::kLowest:
return kPanasonicAcSwingVDown;
default:
return kPanasonicAcSwingVAuto;
case stdAc::swingv_t::kLowest: return (uint8_t)position;
default: return kPanasonicAcSwingVAuto;
}
}

Expand Down Expand Up @@ -700,11 +697,10 @@ stdAc::swingh_t IRPanasonicAc::toCommonSwingH(const uint8_t pos) {

// Convert a native vertical swing to it's common equivalent.
stdAc::swingv_t IRPanasonicAc::toCommonSwingV(const uint8_t pos) {
switch (pos) {
case kPanasonicAcSwingVUp: return stdAc::swingv_t::kHighest;
case kPanasonicAcSwingVDown: return stdAc::swingv_t::kLowest;
default: return stdAc::swingv_t::kAuto;
}
if (pos >= kPanasonicAcSwingVHighest && pos <= kPanasonicAcSwingVLowest)
return (stdAc::swingv_t)pos;
else
return stdAc::swingv_t::kAuto;
}

// Convert the A/C state to it's common equivalent.
Expand Down Expand Up @@ -772,10 +768,10 @@ String IRPanasonicAc::toString(void) {
case kPanasonicAcSwingVAuto:
result += F(" (AUTO)");
break;
case kPanasonicAcSwingVUp:
case kPanasonicAcSwingVHighest:
result += F(" (Full Up)");
break;
case kPanasonicAcSwingVDown:
case kPanasonicAcSwingVLowest:
result += F(" (Full Down)");
break;
case 2:
Expand Down
15 changes: 9 additions & 6 deletions src/ir_Panasonic.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,11 @@ const uint8_t kPanasonicAcPowerful = 0x20; // 0b100000
const uint8_t kPanasonicAcQuietCkp = 0x20; // 0b100000
const uint8_t kPanasonicAcPowerfulCkp = 1; // 0b1
const uint8_t kPanasonicAcSwingVAuto = 0xF;
const uint8_t kPanasonicAcSwingVUp = 0x1;
const uint8_t kPanasonicAcSwingVDown = 0x5;
const uint8_t kPanasonicAcSwingVHighest = 0x1;
const uint8_t kPanasonicAcSwingVHigh = 0x2;
const uint8_t kPanasonicAcSwingVMiddle = 0x3;
const uint8_t kPanasonicAcSwingVLow = 0x4;
const uint8_t kPanasonicAcSwingVLowest = 0x5;
const uint8_t kPanasonicAcSwingHAuto = 0xD;
const uint8_t kPanasonicAcSwingHMiddle = 0x6;
const uint8_t kPanasonicAcSwingHFullLeft = 0x9;
Expand Down Expand Up @@ -140,10 +143,10 @@ class IRPanasonicAc {
const bool enable = true);
void cancelOffTimer(void);
bool isOffTimerEnabled(void);
uint8_t convertMode(const stdAc::opmode_t mode);
uint8_t convertFan(const stdAc::fanspeed_t speed);
uint8_t convertSwingV(const stdAc::swingv_t position);
uint8_t convertSwingH(const stdAc::swingh_t position);
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);
Expand Down
2 changes: 1 addition & 1 deletion test/IRac_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -766,7 +766,7 @@ TEST(TestIRac, Panasonic) {

char expected_dke[] =
"Model: 3 (DKE), Power: On, Mode: 3 (COOL), Temp: 18C, Fan: 4 (High), "
"Swing (Vertical): 1 (Full Up), Swing (Horizontal): 6 (Middle), "
"Swing (Vertical): 2, Swing (Horizontal): 6 (Middle), "
"Quiet: Off, Powerful: On, Clock: 19:17, On Timer: Off, Off Timer: Off";
ac._irsend.reset();
irac.panasonic(&ac,
Expand Down
39 changes: 26 additions & 13 deletions test/ir_Panasonic_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -665,19 +665,19 @@ TEST(TestIRPanasonicAcClass, SetAndGetSwings) {
pana.setSwingVertical(kPanasonicAcSwingVAuto);
EXPECT_EQ(kPanasonicAcSwingVAuto, pana.getSwingVertical());

pana.setSwingVertical(kPanasonicAcSwingVUp);
EXPECT_EQ(kPanasonicAcSwingVUp, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVUp - 1);
EXPECT_EQ(kPanasonicAcSwingVUp, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVUp + 1);
EXPECT_EQ(kPanasonicAcSwingVUp + 1, pana.getSwingVertical());

pana.setSwingVertical(kPanasonicAcSwingVDown);
EXPECT_EQ(kPanasonicAcSwingVDown, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVDown + 1);
EXPECT_EQ(kPanasonicAcSwingVDown, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVDown - 1);
EXPECT_EQ(kPanasonicAcSwingVDown - 1, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVHighest);
EXPECT_EQ(kPanasonicAcSwingVHighest, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVHighest - 1);
EXPECT_EQ(kPanasonicAcSwingVHighest, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVHighest + 1);
EXPECT_EQ(kPanasonicAcSwingVHighest + 1, pana.getSwingVertical());

pana.setSwingVertical(kPanasonicAcSwingVLowest);
EXPECT_EQ(kPanasonicAcSwingVLowest, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVLowest + 1);
EXPECT_EQ(kPanasonicAcSwingVLowest, pana.getSwingVertical());
pana.setSwingVertical(kPanasonicAcSwingVLowest - 1);
EXPECT_EQ(kPanasonicAcSwingVLowest - 1, pana.getSwingVertical());

pana.setSwingVertical(kPanasonicAcSwingVAuto);
EXPECT_EQ(kPanasonicAcSwingVAuto, pana.getSwingVertical());
Expand Down Expand Up @@ -1164,4 +1164,17 @@ TEST(TestIRPanasonicAcClass, toCommon) {
ASSERT_FALSE(ac.toCommon().beep);
ASSERT_EQ(-1, ac.toCommon().sleep);
ASSERT_EQ(-1, ac.toCommon().clock);

// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/921#issuecomment-532267240
ac.setSwingVertical(kPanasonicAcSwingVLow);
ASSERT_EQ(stdAc::swingv_t::kLow, ac.toCommon().swingv);
// Real data.
uint8_t swingVMiddle[27] = {
0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x20, 0xE0, 0x04,
0x00, 0x39, 0x32, 0x80, 0x73, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x89,
0x00, 0x00, 0xDB};
ac.setRaw(swingVMiddle);
ASSERT_EQ(stdAc::swingv_t::kMiddle, ac.toCommon().swingv);
ASSERT_EQ(kPanasonicAcSwingVMiddle,
IRPanasonicAc::convertSwingV(stdAc::swingv_t::kMiddle));
}

0 comments on commit 9a5e442

Please sign in to comment.