From 33be51aab9cff58cf05b45481cf13d82c50962d3 Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Mon, 18 Mar 2024 02:18:13 +0700 Subject: [PATCH] logic for display --- src/cud_display.cpp | 89 +++++++++++++++++++++++++++++++++++++++++--- src/cud_display.hpp | 24 ++++++++++++ src/lcd_elements.hpp | 23 ++++++++++++ 3 files changed, 131 insertions(+), 5 deletions(-) diff --git a/src/cud_display.cpp b/src/cud_display.cpp index 041dc38..2fc851c 100644 --- a/src/cud_display.cpp +++ b/src/cud_display.cpp @@ -3,6 +3,23 @@ CUDDisplay::CUDDisplay(cud_display_conf_t *conf) : ESPMegaDisplay(conf->uart, conf->communication_baudrate, conf->ota_baudrate, conf->tx, conf->rx) { this->conf = conf; + // Initialize Light Group and Fan Group + this->light_group = { + .element_id = {LCD_DASHBOARD_ELEMENT_LIGHT_1, LCD_DASHBOARD_ELEMENT_LIGHT_2, LCD_DASHBOARD_ELEMENT_LIGHT_3, LCD_DASHBOARD_ELEMENT_LIGHT_4}, + .element_name = {LCD_DASHBOARD_ELEMENT_NAME_LIGHT_1, LCD_DASHBOARD_ELEMENT_NAME_LIGHT_2, LCD_DASHBOARD_ELEMENT_NAME_LIGHT_3, LCD_DASHBOARD_ELEMENT_NAME_LIGHT_4}, + .picture_on = {LCD_DASHBOARD_PIC_LIGHT_1_ON, LCD_DASHBOARD_PIC_LIGHT_2_ON, LCD_DASHBOARD_PIC_LIGHT_3_ON, LCD_DASHBOARD_PIC_LIGHT_4_ON}, + .picture_on_pressed = {LCD_DASHBOARD_PIC_LIGHT_1_ON_PRESSED, LCD_DASHBOARD_PIC_LIGHT_2_ON_PRESSED, LCD_DASHBOARD_PIC_LIGHT_3_ON_PRESSED, LCD_DASHBOARD_PIC_LIGHT_4_ON_PRESSED}, + .picture_off = {LCD_DASHBOARD_PIC_LIGHT_1_OFF, LCD_DASHBOARD_PIC_LIGHT_2_OFF, LCD_DASHBOARD_PIC_LIGHT_3_OFF, LCD_DASHBOARD_PIC_LIGHT_4_OFF}, + .picture_off_pressed = {LCD_DASHBOARD_PIC_LIGHT_1_OFF_PRESSED, LCD_DASHBOARD_PIC_LIGHT_2_OFF_PRESSED, LCD_DASHBOARD_PIC_LIGHT_3_OFF_PRESSED, LCD_DASHBOARD_PIC_LIGHT_4_OFF_PRESSED} + }; + this->fan_group = { + .element_id = {LCD_DASHBOARD_ELEMENT_FAN_1, LCD_DASHBOARD_ELEMENT_FAN_2, LCD_DASHBOARD_ELEMENT_FAN_3}, + .element_name = {LCD_DASHBOARD_ELEMENT_NAME_FAN_1, LCD_DASHBOARD_ELEMENT_NAME_FAN_2, LCD_DASHBOARD_ELEMENT_NAME_FAN_3}, + .picture_on = {LCD_DASHBOARD_PIC_FAN_1_ON, LCD_DASHBOARD_PIC_FAN_2_ON, LCD_DASHBOARD_PIC_FAN_3_ON}, + .picture_on_pressed = {LCD_DASHBOARD_PIC_FAN_1_ON_PRESSED, LCD_DASHBOARD_PIC_FAN_2_ON_PRESSED, LCD_DASHBOARD_PIC_FAN_3_ON_PRESSED}, + .picture_off = {LCD_DASHBOARD_PIC_FAN_1_OFF, LCD_DASHBOARD_PIC_FAN_2_OFF, LCD_DASHBOARD_PIC_FAN_3_OFF}, + .picture_off_pressed = {LCD_DASHBOARD_PIC_FAN_1_OFF_PRESSED, LCD_DASHBOARD_PIC_FAN_2_OFF_PRESSED, LCD_DASHBOARD_PIC_FAN_3_OFF_PRESSED} + }; } void CUDDisplay::begin() @@ -101,7 +118,35 @@ void CUDDisplay::handle_aqi_change(char *value) { // Update the AQI value on the display float aqi = atof(value); - // TODO - Update the AQI value on the display + this->takeSerialMutex(); + this->displayAdapter->printf("%s.txt=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, (int)aqi); + this->sendStopBytes(); + // Update the AQI picture on the display + if (aqi <= 50) + { + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, LCD_DASHBOARD_PIC_AQI_GOOD); + } + else if (aqi <= 100) + { + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, LCD_DASHBOARD_PIC_AQI_MODERATE); + } + else if (aqi <= 150) + { + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, LCD_DASHBOARD_PIC_AQI_UNHEALTHY_FOR_SENSITIVE_GROUPS); + } + else if (aqi <= 200) + { + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, LCD_DASHBOARD_PIC_AQI_UNHEALTHY); + } + else if (aqi <= 300) + { + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, LCD_DASHBOARD_PIC_AQI_VERY_UNHEALTHY); + } + else + { + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT, LCD_DASHBOARD_PIC_AQI_HAZARDOUS); + } + this->giveSerialMutex(); } /** @@ -123,20 +168,54 @@ void CUDDisplay::handle_payload(uint8_t type, uint8_t *payload, uint8_t length) void CUDDisplay::set_display_light_state(uint8_t row, bool state) { - // set_display_light_state implementation + this->takeSerialMutex(); + this->displayAdapter->printf("%s.pic=%d", this->light_group.element_name[row], state ? this->light_group.picture_on[row] : this->light_group.picture_off[row]); + this->displayAdapter->printf("%s.pic2=%d", this->light_group.element_name[row], state ? this->light_group.picture_on_pressed[row] : this->light_group.picture_off_pressed[row]); + this->sendStopBytes(); + this->giveSerialMutex(); +} + +void CUDDisplay::set_display_light_all_state() +{ + bool light_on = this->get_lights_state(); + this->takeSerialMutex(); + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_LIGHT_ALL, light_on ? LCD_DASHBOARD_PIC_LIGHT_ALL_ON : LCD_DASHBOARD_PIC_LIGHT_ALL_OFF); + this->displayAdapter->printf("%s.pic2=%d", LCD_DASHBOARD_ELEMENT_NAME_LIGHT_ALL, light_on ? LCD_DASHBOARD_PIC_LIGHT_ALL_ON_PRESSED : LCD_DASHBOARD_PIC_LIGHT_ALL_OFF_PRESSED); + this->sendStopBytes(); + this->giveSerialMutex(); } void CUDDisplay::set_display_fan_state(uint8_t row, bool state) { - // set_display_fan_state implementation + this->takeSerialMutex(); + this->displayAdapter->printf("%s.pic=%d", this->fan_group.element_name[row], state ? this->fan_group.picture_on[row] : this->fan_group.picture_off[row]); + this->displayAdapter->printf("%s.pic2=%d", this->fan_group.element_name[row], state ? this->fan_group.picture_on_pressed[row] : this->fan_group.picture_off_pressed[row]); + this->sendStopBytes(); + this->giveSerialMutex(); +} + +void CUDDisplay::set_display_fan_all_state() +{ + bool fan_on = this->get_fans_state(); + this->takeSerialMutex(); + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_FAN_ALL, fan_on ? LCD_DASHBOARD_PIC_FAN_ALL_ON : LCD_DASHBOARD_PIC_FAN_ALL_OFF); + this->displayAdapter->printf("%s.pic2=%d", LCD_DASHBOARD_ELEMENT_NAME_FAN_ALL, fan_on ? LCD_DASHBOARD_PIC_FAN_ALL_ON_PRESSED : LCD_DASHBOARD_PIC_FAN_ALL_OFF_PRESSED); + this->sendStopBytes(); + } void CUDDisplay::set_display_mosquito_zapper_state(bool state) { - // set_display_mosquito_zapper_state implementation + this->takeSerialMutex(); + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_MOSQUITO_ZAPPER, state ? LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_ON : LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_OFF); + this->displayAdapter->printf("%s.pic2=%d", LCD_DASHBOARD_ELEMENT_NAME_MOSQUITO_ZAPPER, state ? LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_ON_PRESSED : LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_OFF_PRESSED); + this->sendStopBytes(); } void CUDDisplay::set_display_air_purifier_state(bool state) { - // set_display_air_purifier_state implementation + this->takeSerialMutex(); + this->displayAdapter->printf("%s.pic=%d", LCD_DASHBOARD_ELEMENT_NAME_AIR_PURIFIER, state ? LCD_DASHBOARD_PIC_AIR_PURIFIER_ON : LCD_DASHBOARD_PIC_AIR_PURIFIER_OFF); + this->displayAdapter->printf("%s.pic2=%d", LCD_DASHBOARD_ELEMENT_NAME_AIR_PURIFIER, state ? LCD_DASHBOARD_PIC_AIR_PURIFIER_ON_PRESSED : LCD_DASHBOARD_PIC_AIR_PURIFIER_OFF_PRESSED); + this->sendStopBytes(); } \ No newline at end of file diff --git a/src/cud_display.hpp b/src/cud_display.hpp index a9ecf19..3dbbe04 100644 --- a/src/cud_display.hpp +++ b/src/cud_display.hpp @@ -22,6 +22,26 @@ struct cud_display_conf_t uint8_t mosquito_zapper_pin; }; +struct cud_display_light_group_t +{ + uint8_t element_id[4]; + const char *element_name[20]; + uint8_t picture_on[4]; + uint8_t picture_on_pressed[4]; + uint8_t picture_off[4]; + uint8_t picture_off_pressed[4]; +}; + +struct cud_display_fan_group_t +{ + uint8_t element_id[3]; + const char *element_name[20]; + uint8_t picture_on[3]; + uint8_t picture_on_pressed[3]; + uint8_t picture_off[3]; + uint8_t picture_off_pressed[3]; +}; + class CUDDisplay : public ESPMegaDisplay { public: @@ -39,9 +59,13 @@ class CUDDisplay : public ESPMegaDisplay void handle_payload(uint8_t type, uint8_t* payload, uint8_t length); // Change Display Elements void set_display_light_state(uint8_t row, bool state); + void set_display_light_all_state(); void set_display_fan_state(uint8_t row, bool state); + void set_display_fan_all_state(); void set_display_mosquito_zapper_state(bool state); void set_display_air_purifier_state(bool state); // Local Variables cud_display_conf_t *conf; + cud_display_light_group_t light_group; + cud_display_fan_group_t fan_group; }; \ No newline at end of file diff --git a/src/lcd_elements.hpp b/src/lcd_elements.hpp index 2ae84c1..0490dc8 100644 --- a/src/lcd_elements.hpp +++ b/src/lcd_elements.hpp @@ -9,30 +9,35 @@ * ***************************************/ // Lights #define LCD_DASHBOARD_ELEMENT_LIGHT_ALL 0 +#define LCD_DASHBOARD_ELEMENT_NAME_LIGHT_ALL "light_all" #define LCD_DASHBOARD_PIC_LIGHT_ALL_ON 0 #define LCD_DASHBOARD_PIC_LIGHT_ALL_ON_PRESSED 1 #define LCD_DASHBOARD_PIC_LIGHT_ALL_OFF 1 #define LCD_DASHBOARD_PIC_LIGHT_ALL_OFF_PRESSED 0 #define LCD_DASHBOARD_ELEMENT_LIGHT_1 0 +#define LCD_DASHBOARD_ELEMENT_NAME_LIGHT_1 "light_1" #define LCD_DASHBOARD_PIC_LIGHT_1_ON 2 #define LCD_DASHBOARD_PIC_LIGHT_1_ON_PRESSED 3 #define LCD_DASHBOARD_PIC_LIGHT_1_OFF 3 #define LCD_DASHBOARD_PIC_LIGHT_1_OFF_PRESSED 2 #define LCD_DASHBOARD_ELEMENT_LIGHT_2 1 +#define LCD_DASHBOARD_ELEMENT_NAME_LIGHT_2 "light_2" #define LCD_DASHBOARD_PIC_LIGHT_2_ON 4 #define LCD_DASHBOARD_PIC_LIGHT_2_ON_PRESSED 5 #define LCD_DASHBOARD_PIC_LIGHT_2_OFF 5 #define LCD_DASHBOARD_PIC_LIGHT_2_OFF_PRESSED 4 #define LCD_DASHBOARD_ELEMENT_LIGHT_3 2 +#define LCD_DASHBOARD_ELEMENT_NAME_LIGHT_3 "light_3" #define LCD_DASHBOARD_PIC_LIGHT_3_ON 6 #define LCD_DASHBOARD_PIC_LIGHT_3_ON_PRESSED 7 #define LCD_DASHBOARD_PIC_LIGHT_3_OFF 7 #define LCD_DASHBOARD_PIC_LIGHT_3_OFF_PRESSED 6 #define LCD_DASHBOARD_ELEMENT_LIGHT_4 3 +#define LCD_DASHBOARD_ELEMENT_NAME_LIGHT_4 "light_4" #define LCD_DASHBOARD_PIC_LIGHT_4_ON 8 #define LCD_DASHBOARD_PIC_LIGHT_4_ON_PRESSED 9 #define LCD_DASHBOARD_PIC_LIGHT_4_OFF 9 @@ -40,24 +45,28 @@ // Fans #define LCD_DASHBOARD_ELEMENT_FAN_ALL 4 +#define LCD_DASHBOARD_ELEMENT_NAME_FAN_ALL "fan_all" #define LCD_DASHBOARD_PIC_FAN_ALL_ON 10 #define LCD_DASHBOARD_PIC_FAN_ALL_ON_PRESSED 11 #define LCD_DASHBOARD_PIC_FAN_ALL_OFF 11 #define LCD_DASHBOARD_PIC_FAN_ALL_OFF_PRESSED 10 #define LCD_DASHBOARD_ELEMENT_FAN_1 4 +#define LCD_DASHBOARD_ELEMENT_NAME_FAN_1 "fan_1" #define LCD_DASHBOARD_PIC_FAN_1_ON 12 #define LCD_DASHBOARD_PIC_FAN_1_ON_PRESSED 13 #define LCD_DASHBOARD_PIC_FAN_1_OFF 13 #define LCD_DASHBOARD_PIC_FAN_1_OFF_PRESSED 12 #define LCD_DASHBOARD_ELEMENT_FAN_2 5 +#define LCD_DASHBOARD_ELEMENT_NAME_FAN_2 "fan_2" #define LCD_DASHBOARD_PIC_FAN_2_ON 14 #define LCD_DASHBOARD_PIC_FAN_2_ON_PRESSED 15 #define LCD_DASHBOARD_PIC_FAN_2_OFF 15 #define LCD_DASHBOARD_PIC_FAN_2_OFF_PRESSED 14 #define LCD_DASHBOARD_ELEMENT_FAN_3 6 +#define LCD_DASHBOARD_ELEMENT_NAME_FAN_3 "fan_3" #define LCD_DASHBOARD_PIC_FAN_3_ON 16 #define LCD_DASHBOARD_PIC_FAN_3_ON_PRESSED 17 #define LCD_DASHBOARD_PIC_FAN_3_OFF 17 @@ -65,6 +74,7 @@ // Air Purifier #define LCD_DASHBOARD_ELEMENT_AIR_PURIFIER 7 +#define LCD_DASHBOARD_ELEMENT_NAME_AIR_PURIFIER "purifier" #define LCD_DASHBOARD_PIC_AIR_PURIFIER_ON 18 #define LCD_DASHBOARD_PIC_AIR_PURIFIER_ON_PRESSED 19 #define LCD_DASHBOARD_PIC_AIR_PURIFIER_OFF 19 @@ -72,6 +82,7 @@ // Mosquito Zapper #define LCD_DASHBOARD_ELEMENT_MOSQUITO_ZAPPER 8 +#define LCD_DASHBOARD_ELEMENT_NAME_MOSQUITO_ZAPPER "zapper" #define LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_ON 20 #define LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_ON_PRESSED 21 #define LCD_DASHBOARD_PIC_MOSQUITO_ZAPPER_OFF 21 @@ -79,7 +90,9 @@ // AQI #define LCD_DASHBOARD_ELEMENT_AQI_TEXT 9 +#define LCD_DASHBOARD_ELEMENT_NAME_AQI_TEXT "aqi_txt" #define LCD_DASHBOARD_ELEMENT_AQI_PICTURE 10 +#define LCD_DASHBOARD_ELEMENT_NAME_AQI_PICTURE "aqi_pic" #define LCD_DASHBOARD_PIC_AQI_GOOD 22 #define LCD_DASHBOARD_PIC_AQI_MODERATE 23 #define LCD_DASHBOARD_PIC_AQI_UNHEALTHY_FOR_SENSITIVE_GROUPS 24 @@ -89,11 +102,13 @@ // Socket Power #define LCD_DASHBOARD_ELEMENT_SOCKET_POWER 11 +#define LCD_DASHBOARD_ELEMENT_NAME_SOCKET_POWER "socket" #define LCD_DASHBOARD_PIC_SOCKET_POWER_ON 28 #define LCD_DASHBOARD_PIC_SOCKET_POWER_OFF 29 // Air Conditioner #define LCD_DASHBOARD_ELEMENT_AC_STATE 12 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_STATE "ac_state" #define LCD_DASHBOARD_PIC_AC_STATE_OFF 30 #define LCD_DASHBOARD_PIC_AC_STATE_OFF_PRESSED 31 #define LCD_DASHBOARD_PIC_AC_STATE_OFF_LOCKED 31 @@ -102,45 +117,53 @@ #define LCD_DASHBOARD_PIC_AC_STATE_ON_LOCKED 33 #define LCD_DASHBOARD_ELEMENT_AC_MODE_FAN 13 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_MODE_FAN "ac_mode_fan" #define LCD_DASHBOARD_PIC_AC_MODE_FAN_ACTIVE 34 #define LCD_DASHBOARD_PIC_AC_MODE_FAN_ACTIVE_PRESS 35 #define LCD_DASHBOARD_PIC_AC_MODE_FAN_INACTIVE 35 #define LCD_DASHBOARD_PIC_AC_MODE_FAN_INACTIVE_PRESS 34 #define LCD_DASHBOARD_ELEMENT_AC_MODE_COOL 14 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_MODE_COOL "ac_mode_cool" #define LCD_DASHBOARD_PIC_AC_MODE_COOL_ACTIVE 36 #define LCD_DASHBOARD_PIC_AC_MODE_COOL_ACTIVE_PRESS 37 #define LCD_DASHBOARD_PIC_AC_MODE_COOL_INACTIVE 37 #define LCD_DASHBOARD_PIC_AC_MODE_COOL_INACTIVE_PRESS 36 #define LCD_DASHBOARD_ELEMENT_AC_FAN_SPEED_AUTO 15 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_FAN_SPEED_AUTO "ac_fan_auto" #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_AUTO_ACTIVE 38 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_AUTO_ACTIVE_PRESS 39 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_AUTO_INACTIVE 39 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_AUTO_INACTIVE_PRESS 38 #define LCD_DASHBOARD_ELEMENT_AC_FAN_SPEED_HIGH 16 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_FAN_SPEED_HIGH "ac_fan_high" #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_HIGH_ACTIVE 40 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_HIGH_ACTIVE_PRESS 41 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_HIGH_INACTIVE 41 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_HIGH_INACTIVE_PRESS 40 #define LCD_DASHBOARD_ELEMENT_AC_FAN_SPEED_MEDIUM 17 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_FAN_SPEED_MEDIUM "ac_fan_medium" #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_MEDIUM_ACTIVE 42 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_MEDIUM_ACTIVE_PRESS 43 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_MEDIUM_INACTIVE 43 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_MEDIUM_INACTIVE_PRESS 42 #define LCD_DASHBOARD_ELEMENT_AC_FAN_SPEED_LOW 18 +#define LCD_DASHBOARD_ELEMENT_NAME_AC_FAN_SPEED_LOW "ac_fan_low" #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_LOW_ACTIVE 44 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_LOW_ACTIVE_PRESS 45 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_LOW_INACTIVE 45 #define LCD_DASHBOARD_PIC_AC_FAN_SPEED_LOW_INACTIVE_PRESS 44 #define LCD_DASHBOARD_ELEMENT_ROOM_TEMPERATURE 19 +#define LCD_DASHBOARD_ELEMENT_NAME_ROOM_TEMPERATURE "room_temp" // All System Button #define LCD_DASHBOARD_ELEMENT_ALL_SYSTEM_TOGGLE 20 +#define LCD_DASHBOARD_ELEMENT_NAME_ALL_SYSTEM_TOGGLE "all_toggle" #define LCD_DASHBOARD_PIC_ALL_SYSTEM_TOGGLE_ON 46 #define LCD_DASHBOARD_PIC_ALL_SYSTEM_TOGGLE_ON_PRESSED 47 #define LCD_DASHBOARD_PIC_ALL_SYSTEM_TOGGLE_OFF 47