display control fixed

This commit is contained in:
GrKoR
2022-05-07 18:38:23 +03:00
parent e0d5be36c0
commit d8ae60ba84
2 changed files with 35 additions and 33 deletions

View File

@@ -13,7 +13,7 @@ namespace aux_ac {
public: public:
explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {} explicit AirConDisplayOffAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->displaySequence(AC_DISPLAY_OFF); } void play(Ts... x) override { this->ac_->displayOffSequence(); }
protected: protected:
AirCon *ac_; AirCon *ac_;
@@ -25,7 +25,7 @@ namespace aux_ac {
public: public:
explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {} explicit AirConDisplayOnAction(AirCon *ac) : ac_(ac) {}
void play(Ts... x) override { this->ac_->displaySequence(AC_DISPLAY_ON); } void play(Ts... x) override { this->ac_->displayOnSequence(); }
protected: protected:
AirCon *ac_; AirCon *ac_;

View File

@@ -581,7 +581,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
return true; return true;
} }
// додбавляет в последовательность шаг с задержкой // добавляет в последовательность шаг с задержкой
bool _addSequenceDelayStep(uint16_t timeout){ bool _addSequenceDelayStep(uint16_t timeout){
return this->_addSequenceStep(AC_SIT_DELAY, nullptr, nullptr, timeout); return this->_addSequenceStep(AC_SIT_DELAY, nullptr, nullptr, timeout);
} }
@@ -723,9 +723,9 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
} }
// копирует пакет из одной структуры в другую с корректным переносом указателей на заголовки и т.п. // копирует пакет из одной структуры в другую с корректным переносом указателей на заголовки и т.п.
void _copyPacket(packet_t *dest, packet_t *src){ bool _copyPacket(packet_t *dest, packet_t *src){
if (dest == nullptr) return; if (dest == nullptr) return false;
if (src == nullptr) return; if (src == nullptr) return false;
dest->msec = src->msec; dest->msec = src->msec;
dest->bytesLoaded = src->bytesLoaded; dest->bytesLoaded = src->bytesLoaded;
@@ -733,6 +733,8 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
dest->header = (packet_header_t *)&dest->data; dest->header = (packet_header_t *)&dest->data;
if (dest->header->body_length > 0) dest->body = &dest->data[AC_HEADER_SIZE]; if (dest->header->body_length > 0) dest->body = &dest->data[AC_HEADER_SIZE];
dest->crc = (packet_crc_t *)&dest->data[AC_HEADER_SIZE + dest->header->body_length]; dest->crc = (packet_crc_t *)&dest->data[AC_HEADER_SIZE + dest->header->body_length];
return true;
} }
// устанавливает состояние конечного автомата // устанавливает состояние конечного автомата
@@ -782,7 +784,6 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
return; return;
}; };
if (this->peek() == AC_PACKET_START_BYTE) { if (this->peek() == AC_PACKET_START_BYTE) {
// если во входящий пакет что-то уже загружено, значит это какие-то ошибочные данные или неизвестные пакеты // если во входящий пакет что-то уже загружено, значит это какие-то ошибочные данные или неизвестные пакеты
// надо эту инфу вывалить в лог // надо эту инфу вывалить в лог
@@ -1584,6 +1585,27 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
// бинарный сенсор, отображающий состояние дисплея // бинарный сенсор, отображающий состояние дисплея
esphome::binary_sensor::BinarySensor *sensor_display_ = nullptr; esphome::binary_sensor::BinarySensor *sensor_display_ = nullptr;
// загружает на выполнение последовательность команд на включение/выключение табло с температурой
bool _displaySequence(ac_display dsp = AC_DISPLAY_ON){
// нет смысла в последовательности, если нет коннекта с кондиционером
if (!get_has_connection()) {
_debugMsg(F("displaySequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
return false;
}
if (dsp == AC_DISPLAY_UNTOUCHED) return false; // выходим, чтобы не тратить время
// формируем команду
ac_command_t cmd;
_clearCommand(&cmd); // не забываем очищать, а то будет мусор
cmd.display = dsp;
// добавляем команду в последовательность
if (!commandSequence(&cmd)) return false;
_debugMsg(F("displaySequence: loaded (display = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, dsp);
return true;
}
public: public:
// инициализация объекта // инициализация объекта
void initAC(esphome::uart::UARTComponent *parent = nullptr){ void initAC(esphome::uart::UARTComponent *parent = nullptr){
@@ -2273,12 +2295,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
/*************************************** getBigInfo request ***********************************************/ /*************************************** getBigInfo request ***********************************************/
if (!_addSequenceFuncStep(&AirCon::sq_requestBigStatus)) { if (!_addSequenceFuncStep(&AirCon::sq_requestBigStatus)) {
_debugMsg(F("getStatusSmall: getBigInfo request sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__); _debugMsg(F("getStatusBig: getBigInfo request sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
return false; return false;
} }
/*************************************** getBigInfo control ***********************************************/ /*************************************** getBigInfo control ***********************************************/
if (!_addSequenceFuncStep(&AirCon::sq_controlBigStatus)) { if (!_addSequenceFuncStep(&AirCon::sq_controlBigStatus)) {
_debugMsg(F("getStatusSmall: getBigInfo control sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__); _debugMsg(F("getStatusBig: getBigInfo control sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
return false; return false;
} }
/**************************************************************************************/ /**************************************************************************************/
@@ -2359,12 +2381,12 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
/*************************************** set params request ***********************************************/ /*************************************** set params request ***********************************************/
if (!_addSequenceFuncStep(&AirCon::sq_requestDoCommand, cmd)) { if (!_addSequenceFuncStep(&AirCon::sq_requestDoCommand, cmd)) {
_debugMsg(F("getStatusSmall: getBigInfo request sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__); _debugMsg(F("commandSequence: getBigInfo request sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
return false; return false;
} }
/*************************************** set params control ***********************************************/ /*************************************** set params control ***********************************************/
if (!_addSequenceFuncStep(&AirCon::sq_controlDoCommand)) { if (!_addSequenceFuncStep(&AirCon::sq_controlDoCommand)) {
_debugMsg(F("getStatusSmall: getBigInfo control sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__); _debugMsg(F("commandSequence: getBigInfo control sequence step fail."), ESPHOME_LOG_LEVEL_WARN, __LINE__);
return false; return false;
} }
/**************************************************************************************/ /**************************************************************************************/
@@ -2399,38 +2421,18 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
return true; return true;
} }
// загружает на выполнение последовательность команд на включение/выключение табло с температурой
bool displaySequence(ac_display dsp = AC_DISPLAY_ON){
// нет смысла в последовательности, если нет коннекта с кондиционером
if (!get_has_connection()) {
_debugMsg(F("displaySequence: no pings from HVAC. It seems like no AC connected."), ESPHOME_LOG_LEVEL_ERROR, __LINE__);
return false;
}
if (dsp == AC_DISPLAY_UNTOUCHED) return false; // выходим, чтобы не тратить время
// формируем команду
ac_command_t cmd;
_clearCommand(&cmd); // не забываем очищать, а то будет мусор
cmd.display = dsp;
// добавляем команду в последовательность
if (!commandSequence(&cmd)) return false;
_debugMsg(F("displaySequence: loaded (display = %02X)"), ESPHOME_LOG_LEVEL_VERBOSE, __LINE__, dsp);
return true;
}
// выключает экран // выключает экран
bool displayOffSequence(){ bool displayOffSequence(){
ac_display dsp = AC_DISPLAY_OFF; ac_display dsp = AC_DISPLAY_OFF;
if (this->get_display_inverted()) dsp = AC_DISPLAY_ON; if (this->get_display_inverted()) dsp = AC_DISPLAY_ON;
return displaySequence(dsp); return _displaySequence(dsp);
} }
// включает экран // включает экран
bool displayOnSequence(){ bool displayOnSequence(){
ac_display dsp = AC_DISPLAY_ON; ac_display dsp = AC_DISPLAY_ON;
if (this->get_display_inverted()) dsp = AC_DISPLAY_OFF; if (this->get_display_inverted()) dsp = AC_DISPLAY_OFF;
return displaySequence(dsp); return _displaySequence(dsp);
} }
void set_period(uint32_t ms) { this->_update_period = ms; } void set_period(uint32_t ms) { this->_update_period = ms; }