From 245709870b8f140967544d602c704efe42dc8251 Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Sat, 23 Mar 2024 14:44:56 +0700 Subject: [PATCH] delay sending A/C when Rapid Button Press is detected --- src/config.hpp | 2 +- src/display.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++---- src/display.hpp | 4 ++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/config.hpp b/src/config.hpp index 6b24579..0cd93b2 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -46,6 +46,7 @@ #define DISPLAY_OTA_BAUDRATE 921600 #define DEFAULT_TEMP_LOWER_BOUND 18 #define DEFAULT_TEMP_UPPER_BOUND 30 +#define AC_TEMP_PRESS_DELAY 500 // ms /*********************************************** * Persistent Storage Configuration * @@ -56,7 +57,6 @@ #define AC_DISPLAY_TEMP_LOWER_BOUND_ADDR 10030 // 6 byte #define AC_DISPLAY_TEMP_UPPER_BOUND_ADDR 10040 // 6 byte - /*********************************************** * Remote Variables & Smart Variables * ***********************************************/ diff --git a/src/display.cpp b/src/display.cpp index 8b9b9b0..5022f86 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -155,6 +155,23 @@ void CUDDisplay::begin(cud_display_cards_t cards) this->display_init(); } +void CUDDisplay::loop() { + ESPMegaDisplay::loop(); + // Check if the AC button press is pending + if (this->ac_button_press_pending) + { + // Check if the delay has passed + if (millis() - this->last_ac_button_press > AC_TEMP_PRESS_DELAY) + { + ESP_LOGV("CUD Display", "Sending pending temperature"); + // Send the pending temperature + this->cards.ac->setTemperature(this->pending_temperature); + // Reset the pending flag + this->ac_button_press_pending = false; + } + } +} + void CUDDisplay::display_init() { // Perform a reset on the display @@ -387,7 +404,13 @@ void CUDDisplay::handle_touch(uint8_t page_id, uint8_t element_id, uint8_t touch // Is the control locked? If it is, we can ignore the touch if (this->get_ac_lock()) return; - uint8_t newTemp = this->cards.ac->getTemperature() + 1; + uint8_t newTemp = this->cards.ac->getTemperature(); + if (this->ac_button_press_pending) + { + // If the button press is pending, use the pending temperature as base + newTemp = this->pending_temperature; + } + newTemp++; // Does the temperature exceed the upper bound?, if it does, bound it ESP_LOGD("CUD Display", "Requested Temp: %d, Lower Bound: %d", newTemp, this->ac_temp_lower_bound.getIntValue()); if (newTemp > this->ac_temp_upper_bound.getIntValue()) @@ -396,7 +419,14 @@ void CUDDisplay::handle_touch(uint8_t page_id, uint8_t element_id, uint8_t touch } ESP_LOGD("CUD Display", "New Temp: %d", newTemp); // Increase the AC temperature - this->cards.ac->setTemperature(newTemp); + pending_temperature = newTemp; + ac_button_press_pending = true; + last_ac_button_press = millis(); + // Send the new temperature to the Display + this->takeSerialMutex(); + this->displayAdapter->printf("%s.txt=%d", LCD_DASHBOARD_ELEMENT_NAME_AC_TEMPERATURE, newTemp); + this->sendStopBytes(); + this->giveSerialMutex(); return; } // Check if element_id is the AC temperature down button @@ -405,7 +435,12 @@ void CUDDisplay::handle_touch(uint8_t page_id, uint8_t element_id, uint8_t touch // Is the control locked? If it is, we can ignore the touch if (this->get_ac_lock()) return; - uint8_t newTemp = this->cards.ac->getTemperature() - 1; + uint8_t newTemp = this->cards.ac->getTemperature(); + if (this->ac_button_press_pending) + { + // If the button press is pending, use the pending temperature as base + newTemp = this->pending_temperature; + } // Does the temperature exceed the lower bound?, if it does, bound it ESP_LOGD("CUD Display", "Requested Temp: %d, Lower Bound: %d", newTemp, this->ac_temp_lower_bound.getIntValue()); if (newTemp < this->ac_temp_lower_bound.getIntValue()) @@ -414,7 +449,14 @@ void CUDDisplay::handle_touch(uint8_t page_id, uint8_t element_id, uint8_t touch } ESP_LOGD("CUD Display", "New Temp: %d", newTemp); // Decrease the AC temperature - this->cards.ac->setTemperature(newTemp); + pending_temperature = newTemp; + ac_button_press_pending = true; + last_ac_button_press = millis(); + // Send the new temperature to the Display + this->takeSerialMutex(); + this->displayAdapter->printf("%s.txt=%d", LCD_DASHBOARD_ELEMENT_NAME_AC_TEMPERATURE, newTemp); + this->sendStopBytes(); + this->giveSerialMutex(); return; } if (element_id == LCD_DASHBOARD_ELEMENT_ALL_SYSTEM_TOGGLE) diff --git a/src/display.hpp b/src/display.hpp index 0879080..3e7e50e 100644 --- a/src/display.hpp +++ b/src/display.hpp @@ -72,6 +72,7 @@ public: void display_init(); void set_ac_lock(bool state); bool get_ac_lock(); + void loop(); private: // States Calculation @@ -102,6 +103,9 @@ private: void system_toggle(); // AC Functions and Variables uint8_t previous_mode; // Used to store mode prior to turning off + uint32_t last_ac_button_press; + uint8_t pending_temperature; + bool ac_button_press_pending; // Local Variables cud_display_conf_t *conf; cud_display_cards_t cards;