From 17b13e35d50a8e4a5ce7603a8d5d1676fda7440b Mon Sep 17 00:00:00 2001 From: Sean Date: Thu, 22 Jun 2023 01:41:29 -0700 Subject: [PATCH] Improve cpicker in two ways \#1. Add support for `mode` as an enum of `hue`, `saturation`, and `value`. \#2. Add support for `mode_fixed` attribute. Enable to prevent a long press from cycling through the modes. \#3. Have MQTT status responses include `h`, `s`, and `v` attributes from `cpicker`. --- src/hasp/hasp_attribute.cpp | 32 +++++++++++++++++++++++++++++++- src/hasp/hasp_attribute.h | 1 + src/hasp/hasp_event.cpp | 11 +++++++---- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index 085fdf7c..ce316079 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -293,6 +293,31 @@ static hasp_attribute_type_t hasp_process_label_long_mode(lv_obj_t* obj, const c return HASP_ATTR_TYPE_NOT_FOUND; } +static hasp_attribute_type_t hasp_process_cpicker_mode(lv_obj_t* obj, const char* payload, char** text, bool update) +{ + const char* arr[] = {PSTR("hue"), PSTR("saturation"), PSTR("value")}; + uint8_t count = sizeof(arr) / sizeof(arr[0]); + uint8_t i = 0; + + if(update) { + for(i = 0; i < count; i++) { + if(!strcasecmp_P(payload, arr[i])) { + lv_cpicker_set_color_mode(obj, (lv_cpicker_color_mode_t)i); + break; + } + } + } else { + i = lv_cpicker_get_color_mode(obj); + } + + if(i < count) { + strcpy_P(*text, arr[i]); + return HASP_ATTR_TYPE_STR; + } + + return HASP_ATTR_TYPE_NOT_FOUND; +} + size_t hasp_attribute_split_payload(const char* payload) { size_t pos = 0; @@ -1602,6 +1627,9 @@ static hasp_attribute_type_t attribute_common_mode(lv_obj_t* obj, const char* pa } return HASP_ATTR_TYPE_INT; + case LV_HASP_CPICKER: + return hasp_process_cpicker_mode(obj, payload, text, update); + default: break; // not found } @@ -1821,7 +1849,8 @@ static hasp_attribute_type_t specific_bool_attribute(lv_obj_t* obj, uint16_t att { // bool but obj is not const hasp_attr_update_bool_t list[] = { {LV_HASP_DROPDOWN, ATTR_SHOW_SELECTED, lv_dropdown_set_show_selected, lv_dropdown_get_show_selected}, - {LV_HASP_IMAGE, ATTR_ANTIALIAS, lv_img_set_antialias, lv_img_get_antialias}}; + {LV_HASP_IMAGE, ATTR_ANTIALIAS, lv_img_set_antialias, lv_img_get_antialias}, + {LV_HASP_CPICKER, ATTR_MODE_FIXED, lv_cpicker_set_color_mode_fixed, lv_cpicker_get_color_mode_fixed}}; if(do_attribute(list, obj, attr_hash, val, update)) return HASP_ATTR_TYPE_BOOL; } @@ -2744,6 +2773,7 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attribute, const char case ATTR_SHOW_SELECTED: case ATTR_Y_INVERT: case ATTR_ANTIALIAS: + case ATTR_MODE_FIXED: val = Parser::is_true(payload); ret = specific_bool_attribute(obj, attr_hash, val, update); break; diff --git a/src/hasp/hasp_attribute.h b/src/hasp/hasp_attribute.h index 7b7c5778..c5c1b742 100644 --- a/src/hasp/hasp_attribute.h +++ b/src/hasp/hasp_attribute.h @@ -433,6 +433,7 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t) #define ATTR_COMMENT 62559 #define ATTR_TAG 7866 #define ATTR_JSONL 61604 +#define ATTR_MODE_FIXED 35736 // methods #define ATTR_DELETE 50027 diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index 62c579a6..686e9d5f 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -836,6 +836,7 @@ void cpicker_event_handler(lv_obj_t* obj, lv_event_t event) /* Get the new value */ lv_color_t color = lv_cpicker_get_color(obj); + lv_cpicker_color_mode_t mode = lv_cpicker_get_color_mode(obj); if(hasp_event_id == HASP_EVENT_CHANGED && last_color_sent.full == color.full) return; // same value as before @@ -845,17 +846,19 @@ void cpicker_event_handler(lv_obj_t* obj, lv_event_t event) Parser::get_event_name(hasp_event_id, eventname, sizeof(eventname)); lv_color32_t c32; + lv_color_hsv_t hsv; c32.full = lv_color_to32(color); + hsv = lv_color_rgb_to_hsv(c32.ch.red, c32.ch.green, c32.ch.blue); last_color_sent = color; if(const char* tag = my_obj_get_tag(obj)) snprintf_P(data, sizeof(data), - PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"tag\":%s}"), - eventname, c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, tag); + PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"h\":%d,\"s\":%d,\"v\":%d,\"tag\":%s}"), + eventname, c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, hsv.h, hsv.s, hsv.v, tag); else snprintf_P(data, sizeof(data), - PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d}"), eventname, - c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue); + PSTR("{\"event\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d,\"h\":%d,\"s\":%d,\"v\":%d}"), eventname, + c32.ch.red, c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue, hsv.h, hsv.s, hsv.v); } event_send_object_data(obj, data);