diff --git a/esp32_partition_app1300k_spiffs1216k.csv b/esp32_partition_app1300k_spiffs1216k.csv new file mode 100644 index 00000000..d361047a --- /dev/null +++ b/esp32_partition_app1300k_spiffs1216k.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x160000, +app1, app, ota_1, 0x170000, 0x160000, +spiffs, data, spiffs, 0x2D0000, 0x130000, diff --git a/include/hasp_conf.h b/include/hasp_conf.h index 28260cbd..32eba200 100644 --- a/include/hasp_conf.h +++ b/include/hasp_conf.h @@ -94,7 +94,7 @@ #include "hasp_spiffs.h" #if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) -//#include "lv_zifont.h" +#include "lv_zifont.h" #endif #endif // SPIFFS diff --git a/lib/lv_lib_zifont/lv_zifont.cpp b/lib/lv_lib_zifont/lv_zifont.cpp index 829ae752..fb1f08d0 100644 --- a/lib/lv_lib_zifont/lv_zifont.cpp +++ b/lib/lv_lib_zifont/lv_zifont.cpp @@ -78,15 +78,15 @@ static inline bool openFont(File & file, const char * filename) file = SPIFFS.open(filename, "r"); if(!file) { - // Log.error(F("FONT: %sOpening font: %s"), filename); - // return false; + Log.error(F("FONT: %sOpening font: %s"), filename); + return false; } return file; } static inline void initCharacterFrame(size_t size) { - if(size > lv_mem_get_size(charBitmap_p)) { + if(size > _lv_mem_get_size(charBitmap_p)) { if(charBitmap_p) lv_mem_free(charBitmap_p); charBitmap_p = (uint8_t *)lv_mem_alloc(size); } @@ -100,14 +100,14 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size if(!*font) { *font = (lv_font_t *)lv_mem_alloc(sizeof(lv_font_t)); LV_ASSERT_MEM(*font); - lv_memset(*font, 0x00, sizeof(lv_font_t)); // lv_mem_alloc might be dirty + memset(*font, 0x00, sizeof(lv_font_t)); // lv_mem_alloc might be dirty } lv_font_fmt_zifont_dsc_t * dsc; if(!(*font)->dsc) { dsc = (lv_font_fmt_zifont_dsc_t *)lv_mem_alloc(sizeof(lv_font_fmt_zifont_dsc_t)); LV_ASSERT_MEM(dsc); - lv_memset(dsc, 0x00, sizeof(lv_font_fmt_zifont_dsc_t)); // lv_mem_alloc might be dirty + memset(dsc, 0x00, sizeof(lv_font_fmt_zifont_dsc_t)); // lv_mem_alloc might be dirty } else { dsc = (lv_font_fmt_zifont_dsc_t *)(*font)->dsc; } @@ -116,7 +116,7 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size /* Initialize Last Glyph DSC */ dsc->last_glyph_dsc = (lv_zifont_char_t *)lv_mem_alloc(sizeof(lv_zifont_char_t)); - lv_memset(dsc->last_glyph_dsc, 0x00, sizeof(lv_zifont_char_t)); // lv_mem_alloc might be dirty + memset(dsc->last_glyph_dsc, 0x00, sizeof(lv_zifont_char_t)); // lv_mem_alloc might be dirty if(dsc->last_glyph_dsc == NULL) return ZIFONT_ERROR_OUT_OF_MEMORY; dsc->last_glyph_dsc->width = 0; @@ -155,8 +155,8 @@ int lv_zifont_font_init(lv_font_t ** font, const char * font_path, uint16_t size if(!dsc->ascii_glyph_dsc) { dsc->ascii_glyph_dsc = (lv_zifont_char_t *)lv_mem_alloc(sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE); LV_ASSERT_MEM(dsc->ascii_glyph_dsc); - lv_memset(dsc->ascii_glyph_dsc, 0x00, - sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE); // lv_mem_alloc might be dirty + memset(dsc->ascii_glyph_dsc, 0x00, + sizeof(lv_zifont_char_t) * CHAR_CACHE_SIZE); // lv_mem_alloc might be dirty } if(dsc->ascii_glyph_dsc == NULL) { file.close(); @@ -406,8 +406,10 @@ bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_ uint32_t unicode_letter, uint32_t unicode_letter_next) { /* Only ascii characteres supported for now */ - if(unicode_letter < 0x20) return false; - if(unicode_letter > 0xff && unicode_letter < 0xf000) return false; + // returning true with a box_h of 0 does not display an error + dsc_out->box_w = dsc_out->box_h = 0; // Prevents glyph not found error messages when true is returned + if(unicode_letter < 0x20) return true; + if(unicode_letter > 0xff && unicode_letter < 0xf000) return true; // if(unicode_letter > 0xff) Serial.printf("Char# %u\n", unicode_letter); // ulong startMillis = millis(); @@ -438,7 +440,7 @@ bool IRAM_ATTR lv_font_get_glyph_dsc_fmt_zifont(const lv_font_t * font, lv_font_ if(unicode_letter >= 0xF000) { char filename[32]; sprintf_P(filename, PSTR("/fontawesome%u.zi"), fdsc->CharHeight); - if(!openFont(file, filename)) return false; + if(!openFont(file, filename)) return true; // suppress glyph not found errors for icon font } else { if(!openFont(file, (char *)font->user_data)) return false; } diff --git a/lib/lvgl b/lib/lvgl index ecd0d4fb..d01d1357 160000 --- a/lib/lvgl +++ b/lib/lvgl @@ -1 +1 @@ -Subproject commit ecd0d4fb0907d73e07788283c16e5a4ab1e829b6 +Subproject commit d01d1357ad28e10c606b9e426f7fdf0c23b1e5ac diff --git a/platformio.ini b/platformio.ini index 8a971a18..51a553a0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -48,11 +48,11 @@ lib_deps = https://github.com/netwizeBE/TFT_eSPI.git ;TFT_eSPI@^2.2.2 ; Tft SPI drivers ;TFT_eSPI@^1.4.20 ; Tft SPI drivers - PubSubClient@^2.7.0 ; MQTT client - ArduinoJson@^6.15.1,>6.15.0 ; needs at least 6.15.0 + PubSubClient@^2.8.0 ; MQTT client + ArduinoJson@^6.16.1 ; JSON Parser StreamUtils@^1.4.0 Syslog@^2.0.0 - AceButton@^1.4.0 + AceButton@^1.6.1 ;AsyncTCP ;https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip ;https://github.com/me-no-dev/ESPAsyncTCP/archive/master.zip @@ -129,27 +129,6 @@ hspi32 = ; 7 - mirror content, and rotate 90 deg anti-clockwise -;*************************************************** -; D1 Mini ESP32 with Lolin TFT 2.4" -;*************************************************** -[env:d1mini32-lolintft24] -platform = espressif32@^1.12.0 -board = wemos_d1_mini32 -upload_port = COM5 ; To change the port, use platform_override.ini -monitor_port = COM5 ; To change the port, use platform_override.ini -board_build.partitions = default.csv -build_flags = - ${flags.esp32_flags} -; -- TFT_eSPI build options ------------------------ - ${lcd.lolin24} - ${pins.vspi32} - -D TFT_DC=5 - -D TFT_CS=26 - -D TFT_RST=-1 ; RST - -D TFT_BCKL=-1 ; None, configurable via web UI (e.g. 21) - -D TOUCH_CS=17 ; (can also be 22 or 16) - - ;*************************************************** ; Lolin D32 Pro with Lolin TFT 2.4" ;*************************************************** @@ -159,7 +138,7 @@ platform = espressif32 board = lolin_d32_pro upload_port = COM6 ; To change the port, use platform_override.ini monitor_port = COM6 ; To change the port, use platform_override.ini -board_build.partitions = default.csv +board_build.partitions = esp32_partition_app1300k_spiffs1216k.csv ; default.csv build_flags = ${flags.esp32_flags} ; -- TFT_eSPI build options ------------------------ diff --git a/src/hasp.cpp b/src/hasp.cpp index fc983b0c..8e8fef7e 100644 --- a/src/hasp.cpp +++ b/src/hasp.cpp @@ -362,12 +362,24 @@ void haspSetup() /* ********** Font Initializations ********** */ defaultFont = LV_FONT_DEFAULT; // Use default font +#if ESP32 + lv_font_t * font_small = defaultFont; + lv_font_t * font_normal = &lv_font_montserrat_12; + lv_font_t * font_subtitle = &lv_font_montserrat_16; + lv_font_t * font_title = &lv_font_montserrat_22; +#else + lv_font_t * font_small = defaultFont; + lv_font_t * font_normal = defaultFont; + lv_font_t * font_subtitle = defaultFont; + lv_font_t * font_title = defaultFont; +#endif + #if HASP_USE_SPIFFS > 0 #if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) lv_zifont_init(); if(lv_zifont_font_init(&haspFonts[0], haspZiFontPath, 24) != 0) { - Log.error(F("HASP: Failed to set the custom font to %s"), haspZiFontPath); + Log.error(F("HASP: Failed to set font to %s"), haspZiFontPath); } else { defaultFont = haspFonts[0]; } @@ -390,14 +402,20 @@ void haspSetup() #endif #if(LV_USE_THEME_MONO == 1) || (LV_USE_THEME_EMPTY == 1) case 3: - th = lv_theme_empty_init(LV_COLOR_PURPLE, LV_COLOR_BLACK, LV_THEME_DEFAULT_FLAGS, defaultFont, defaultFont, - defaultFont, defaultFont); + th = lv_theme_mono_init(LV_COLOR_PURPLE, LV_COLOR_BLACK, LV_THEME_DEFAULT_FLAGS, font_small, font_normal, + font_subtitle, font_title); break; #endif #if LV_USE_THEME_MATERIAL == 1 case 4: - th = lv_theme_material_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, defaultFont, - defaultFont, defaultFont, defaultFont); + th = lv_theme_material_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, + LV_THEME_MATERIAL_FLAG_LIGHT + LV_THEME_MATERIAL_FLAG_NO_FOCUS, font_small, + font_normal, font_subtitle, font_title); + break; + case 9: + th = lv_theme_material_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, + LV_THEME_MATERIAL_FLAG_DARK + LV_THEME_MATERIAL_FLAG_NO_FOCUS, font_small, + font_normal, font_subtitle, font_title); break; #endif @@ -418,8 +436,8 @@ void haspSetup() #endif #if(LV_USE_THEME_HASP == 1) || (LV_USE_THEME_TEMPLATE == 1) case 8: - th = lv_theme_template_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, defaultFont, - defaultFont, defaultFont, defaultFont); + th = lv_theme_template_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, font_small, + font_normal, font_subtitle, font_title); break; #endif /* case 0: @@ -431,8 +449,8 @@ void haspSetup() break; */ default: - th = lv_theme_material_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, defaultFont, - defaultFont, defaultFont, defaultFont); + th = lv_theme_template_init(LV_COLOR_PURPLE, LV_COLOR_ORANGE, LV_THEME_DEFAULT_FLAGS, font_small, + font_normal, font_subtitle, font_title); Log.error(F("HASP: Unknown theme selected")); } @@ -450,13 +468,13 @@ void haspSetup() lv_style_set_text_font(&pagefont, LV_STATE_DEFAULT, defaultFont); list = lv_obj_get_style_list(lv_disp_get_layer_top(NULL), LV_OBJ_PART_MAIN); - lv_style_list_add_style(list, &pagefont); + _lv_style_list_add_style(list, &pagefont); /* Create all screens using the theme */ for(uint8_t i = 0; i < (sizeof pages / sizeof *pages); i++) { pages[i] = lv_obj_create(NULL, NULL); list = lv_obj_get_style_list(pages[i], LV_OBJ_PART_MAIN); - lv_style_list_add_style(list, &pagefont); + _lv_style_list_add_style(list, &pagefont); // lv_obj_set_size(pages[0], hres, vres); } diff --git a/src/hasp_attribute.cpp b/src/hasp_attribute.cpp index 4a110d65..b52c8ae3 100644 --- a/src/hasp_attribute.cpp +++ b/src/hasp_attribute.cpp @@ -11,7 +11,7 @@ LV_FONT_DECLARE(unscii_8_icon); extern lv_font_t * haspFonts[8]; -static inline bool is_true(const char * s); +static bool is_true(const char * s); static inline bool only_digits(const char * s); /* 16-bit hashing function http://www.cse.yorku.ca/~oz/hash.html */ @@ -57,32 +57,32 @@ static lv_color_t haspPayloadToColor(const char * payload) { switch(strlen(payload)) { case 3: - if(!strcmp_P(payload, PSTR("red"))) return haspLogColor(LV_COLOR_RED); + if(!strcasecmp_P(payload, PSTR("red"))) return haspLogColor(LV_COLOR_RED); break; case 4: - if(!strcmp_P(payload, PSTR("blue"))) return haspLogColor(LV_COLOR_BLUE); - if(!strcmp_P(payload, PSTR("cyan"))) return haspLogColor(LV_COLOR_CYAN); - if(!strcmp_P(payload, PSTR("gray"))) return haspLogColor(LV_COLOR_GRAY); - /* if(!strcmp_P(payload, PSTR("aqua"))) return haspLogColor(LV_COLOR_AQUA); - if(!strcmp_P(payload, PSTR("lime"))) return haspLogColor(LV_COLOR_LIME); - if(!strcmp_P(payload, PSTR("teal"))) return haspLogColor(LV_COLOR_TEAL); - if(!strcmp_P(payload, PSTR("navy"))) return haspLogColor(LV_COLOR_NAVY);*/ + if(!strcasecmp_P(payload, PSTR("blue"))) return haspLogColor(LV_COLOR_BLUE); + if(!strcasecmp_P(payload, PSTR("cyan"))) return haspLogColor(LV_COLOR_CYAN); + if(!strcasecmp_P(payload, PSTR("gray"))) return haspLogColor(LV_COLOR_GRAY); + // if(!strcmp_P(payload, PSTR("aqua"))) return haspLogColor(LV_COLOR_AQUA); + // if(!strcmp_P(payload, PSTR("lime"))) return haspLogColor(LV_COLOR_LIME); + // if(!strcmp_P(payload, PSTR("teal"))) return haspLogColor(LV_COLOR_TEAL); + // if(!strcmp_P(payload, PSTR("navy"))) return haspLogColor(LV_COLOR_NAVY); break; case 5: - if(!strcmp_P(payload, PSTR("green"))) return haspLogColor(LV_COLOR_GREEN); - if(!strcmp_P(payload, PSTR("white"))) return haspLogColor(LV_COLOR_WHITE); - if(!strcmp_P(payload, PSTR("black"))) return haspLogColor(LV_COLOR_BLACK); + if(!strcasecmp_P(payload, PSTR("green"))) return haspLogColor(LV_COLOR_GREEN); + if(!strcasecmp_P(payload, PSTR("white"))) return haspLogColor(LV_COLOR_WHITE); + if(!strcasecmp_P(payload, PSTR("black"))) return haspLogColor(LV_COLOR_BLACK); // if(!strcmp_P(payload, PSTR("olive"))) return haspLogColor(LV_COLOR_OLIVE); break; case 6: - if(!strcmp_P(payload, PSTR("yellow"))) return haspLogColor(LV_COLOR_YELLOW); - if(!strcmp_P(payload, PSTR("orange"))) return haspLogColor(LV_COLOR_ORANGE); - if(!strcmp_P(payload, PSTR("purple"))) return haspLogColor(LV_COLOR_PURPLE); - if(!strcmp_P(payload, PSTR("silver"))) return haspLogColor(LV_COLOR_SILVER); + if(!strcasecmp_P(payload, PSTR("yellow"))) return haspLogColor(LV_COLOR_YELLOW); + if(!strcasecmp_P(payload, PSTR("orange"))) return haspLogColor(LV_COLOR_ORANGE); + if(!strcasecmp_P(payload, PSTR("purple"))) return haspLogColor(LV_COLOR_PURPLE); + if(!strcasecmp_P(payload, PSTR("silver"))) return haspLogColor(LV_COLOR_SILVER); // if(!strcmp_P(payload, PSTR("maroon"))) return haspLogColor(LV_COLOR_MAROON); break; case 7: - if(!strcmp_P(payload, PSTR("magenta"))) return haspLogColor(LV_COLOR_MAGENTA); + if(!strcasecmp_P(payload, PSTR("magenta"))) return haspLogColor(LV_COLOR_MAGENTA); default: // if(!strcmp_P(payload, PSTR("darkblue"))) return haspLogColor(LV_COLOR_MAKE(0, 51, 102)); @@ -118,19 +118,43 @@ static lv_color_t haspPayloadToColor(const char * payload) return LV_COLOR_BLACK; } +static lv_font_t * haspPayloadToFont(const char * payload) +{ + int16_t var = atoi(payload); + + switch(var) { + case 8: + return &unscii_8_icon; + +#if ESP32 + case 12: + return &lv_font_montserrat_12; + case 16: + return &lv_font_montserrat_16; + case 22: + return &lv_font_montserrat_22; + case 28: + return &lv_font_montserrat_28_compressed; +#endif + + default: + return nullptr; + } +} + static void hasp_process_label_long_mode(lv_obj_t * obj, const char * payload, bool update) { if(update) { lv_label_long_mode_t mode = LV_LABEL_LONG_EXPAND; - if(!strcmp_P(payload, PSTR("expand"))) { + if(!strcasecmp_P(payload, PSTR("expand"))) { mode = LV_LABEL_LONG_EXPAND; - } else if(!strcmp_P(payload, PSTR("break"))) { + } else if(!strcasecmp_P(payload, PSTR("break"))) { mode = LV_LABEL_LONG_BREAK; - } else if(!strcmp_P(payload, PSTR("dots"))) { + } else if(!strcasecmp_P(payload, PSTR("dots"))) { mode = LV_LABEL_LONG_DOT; - } else if(!strcmp_P(payload, PSTR("scroll"))) { + } else if(!strcasecmp_P(payload, PSTR("scroll"))) { mode = LV_LABEL_LONG_SROLL; - } else if(!strcmp_P(payload, PSTR("loop"))) { + } else if(!strcasecmp_P(payload, PSTR("loop"))) { mode = LV_LABEL_LONG_SROLL_CIRC; } else { return Log.warning(F("Invalid long mode")); @@ -202,60 +226,142 @@ static void hasp_attribute_get_part_state(lv_obj_t * obj, const char * attr_in, uint8_t & state) { int len = strlen(attr_in); - if(len > 0 && len < 32) { - // Check Trailing partnumber - if(attr_in[len - 1] == '1') { - part = LV_TABLE_PART_CELL1; - } else if(attr_in[len - 1] == '2') { - part = LV_TABLE_PART_CELL2; - } else if(attr_in[len - 1] == '3') { - part = LV_TABLE_PART_CELL3; - } else if(attr_in[len - 1] == '4') { - part = LV_TABLE_PART_CELL4; - } + if(len <= 0 || len >= 32) { + attr_out[0] = 0; // empty string + part = LV_OBJ_PART_MAIN; + state = LV_STATE_DEFAULT; + return; + } + int index = atoi(&attr_in[len - 1]); - // Remove Trailing part digit - if(part != LV_TABLE_PART_BG && len > 0) { - len--; + // Drop Trailing partnumber + if(attr_in[len - 1] == '0' || index > 0) { + part = LV_TABLE_PART_BG; + len--; + } + strncpy(attr_out, attr_in, len); + attr_out[len] = 0; + + /* Attributes depending on objecttype */ + lv_obj_type_t list; + lv_obj_get_type(obj, &list); + const char * objtype = list.type[0]; + + if(check_obj_type(objtype, LV_HASP_BUTTON)) { + switch(index) { + case 1: + state = LV_BTN_STATE_PRESSED; + break; + case 2: + state = LV_BTN_STATE_DISABLED; + break; + case 3: + state = LV_BTN_STATE_CHECKED_RELEASED; + break; + case 4: + state = LV_BTN_STATE_CHECKED_PRESSED; + break; + case 5: + state = LV_BTN_STATE_CHECKED_DISABLED; + break; + default: + state = LV_BTN_STATE_RELEASED; } - strncpy(attr_out, attr_in, len + 1); - attr_out[len] = 0; - } else { - attr_out[0] = 0; + part = LV_BTN_PART_MAIN; + return; + } + + if(check_obj_type(objtype, LV_HASP_BAR)) { + if(index == 1) { + part = LV_BAR_PART_INDIC; + } else { + part = LV_BAR_PART_BG; + } + state = LV_STATE_DEFAULT; + return; + } + + if(check_obj_type(objtype, LV_HASP_CHECKBOX)) { + if(index == 1) { + part = LV_CHECKBOX_PART_BULLET; + } else { + part = LV_CHECKBOX_PART_BG; + } + state = LV_STATE_DEFAULT; + return; + } + + if(check_obj_type(objtype, LV_HASP_CPICKER)) { + if(index == 1) { + part = LV_CPICKER_PART_KNOB; + } else { + part = LV_CPICKER_PART_MAIN; + } + state = LV_STATE_DEFAULT; + return; } } +/** + * Change or Retrieve the value of a local attribute of an object PART + * @param obj lv_obj_t*: the object to get/set the attribute + * @param attr_p char*: the attribute name (with or without leading ".") + * @param attr_hash uint16_t: the sbdm hash of the attribute name without leading "." + * @param payload char*: the new value of the attribute + * @param update bool: change/set the value if true, dispatch/get value if false + * @note setting a value won't return anything, getting will dispatch the value + */ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, uint16_t attr_hash, const char * payload, bool update) { char attr[32]; - uint8_t part = LV_TABLE_PART_BG; + uint8_t part = LV_OBJ_PART_MAIN; uint8_t state = LV_STATE_DEFAULT; int16_t var = atoi(payload); hasp_attribute_get_part_state(obj, attr_p, attr, part, state); + attr_hash = sdbm(attr); // attribute name without the index number /* ***** WARNING **************************************************** * when using hasp_out use attr_p for the original attribute name * *************************************************************** */ switch(attr_hash) { + +/* 1: Use other blend modes than normal (`LV_BLEND_MODE_...`)*/ +#if LV_USE_BLEND_MODES + case ATTR_BG_BLEND_MODE: + return attribute_bg_blend_mode(obj, part, state, update, attr_p, (lv_blend_mode_t)var); + case ATTR_TEXT_BLEND_MODE: + return lv_obj_set_style_local_text_blend_mode(obj, part, state, (lv_blend_mode_t)var); + case ATTR_BORDER_BLEND_MODE: + return lv_obj_set_style_local_border_blend_mode(obj, part, state, (lv_blend_mode_t)var); + case ATTR_OUTLINE_BLEND_MODE: + return lv_obj_set_style_local_outline_blend_mode(obj, part, state, (lv_blend_mode_t)var); + case ATTR_SHADOW_BLEND_MODE: + return lv_obj_set_style_local_shadow_blend_mode(obj, part, state, (lv_blend_mode_t)var); + case ATTR_LINE_BLEND_MODE: + return lv_obj_set_style_local_line_blend_mode(obj, part, state, (lv_blend_mode_t)var); + case ATTR_VALUE_BLEND_MODE: + return lv_obj_set_style_local_value_blend_mode(obj, part, state, (lv_blend_mode_t)var); + case ATTR_PATTERN_BLEND_MODE: + return lv_obj_set_style_local_pattern_blend_mode(obj, part, state, (lv_blend_mode_t)var); +#endif + + case ATTR_SIZE: + return attribute_size(obj, part, state, update, attr_p, var); case ATTR_RADIUS: return attribute_radius(obj, part, state, update, attr_p, var); case ATTR_CLIP_CORNER: return attribute_clip_corner(obj, part, state, update, attr_p, var); - case ATTR_SIZE: - return attribute_size(obj, part, state, update, attr_p, var); - case ATTR_TRANSFORM_WIDTH: - return lv_obj_set_style_local_transform_width(obj, part, state, (lv_style_int_t)var); - case ATTR_TRANSFORM_HEIGHT: - return lv_obj_set_style_local_transform_height(obj, part, state, (lv_style_int_t)var); case ATTR_OPA_SCALE: - return lv_obj_set_style_local_opa_scale(obj, part, state, (lv_opa_t)var); + return attribute_opa_scale(obj, part, state, update, attr_p, (lv_opa_t)var); + case ATTR_TRANSFORM_WIDTH: + return attribute_transform_width(obj, part, state, update, attr_p, (lv_style_int_t)var); + case ATTR_TRANSFORM_HEIGHT: + return attribute_transform_height(obj, part, state, update, attr_p, (lv_style_int_t)var); - /* Background attributes */ - case ATTR_BG_BLEND_MODE: - return attribute_bg_blend_mode(obj, part, state, update, attr_p, (lv_blend_mode_t)var); + /* Background attributes */ case ATTR_BG_MAIN_STOP: return attribute_bg_main_stop(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_BG_GRAD_STOP: @@ -276,25 +382,25 @@ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, uint16_t /* Padding attributes */ case ATTR_PAD_TOP: - return attribute_pad_top(obj, part, state, update, attr_p, (lv_blend_mode_t)var); + return attribute_pad_top(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_PAD_BOTTOM: return attribute_pad_bottom(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_PAD_LEFT: return attribute_pad_left(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_PAD_RIGHT: - return attribute_pad_right(obj, part, state, update, attr_p, (lv_grad_dir_t)var); + return attribute_pad_right(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_PAD_INNER: - return attribute_pad_inner(obj, part, state, update, attr_p, (lv_opa_t)var); + return attribute_pad_inner(obj, part, state, update, attr_p, (lv_style_int_t)var); /* Text attributes */ case ATTR_TEXT_LETTER_SPACE: - return lv_obj_set_style_local_text_letter_space(obj, part, state, (lv_style_int_t)var); + return attribute_text_letter_space(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_TEXT_LINE_SPACE: - return lv_obj_set_style_local_text_line_space(obj, part, state, (lv_style_int_t)var); + return attribute_text_line_space(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_TEXT_DECOR: - return lv_obj_set_style_local_text_decor(obj, part, state, (lv_text_decor_t)var); - case ATTR_TEXT_BLEND_MODE: - return lv_obj_set_style_local_text_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_text_decor(obj, part, state, update, attr_p, (lv_text_decor_t)var); + case ATTR_TEXT_OPA: + return attribute_text_opa(obj, part, state, update, attr_p, (lv_opa_t)var); case ATTR_TEXT_COLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_text_color(obj, part, state, color); @@ -303,210 +409,149 @@ static void hasp_local_style_attr(lv_obj_t * obj, const char * attr_p, uint16_t lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_text_sel_color(obj, part, state, color); } - case ATTR_TEXT_OPA: - return lv_obj_set_style_local_text_opa(obj, part, state, (lv_opa_t)var); + case ATTR_TEXT_FONT: { + lv_font_t * font = haspPayloadToFont(payload); + if(font) { + return lv_obj_set_style_local_text_font(obj, part, state, font); + } else { + return Log.warning(F("HASP: Unknown Font ID %s"), attr_p); + } + } /* Border attributes */ case ATTR_BORDER_WIDTH: - return lv_obj_set_style_local_border_width(obj, part, state, (lv_style_int_t)var); + return attribute_border_width(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_BORDER_SIDE: - return lv_obj_set_style_local_border_side(obj, part, state, (lv_border_side_t)var); - case ATTR_BORDER_BLEND_MODE: - return lv_obj_set_style_local_border_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_border_side(obj, part, state, update, attr_p, (lv_border_side_t)var); case ATTR_BORDER_POST: - return lv_obj_set_style_local_border_post(obj, part, state, (bool)var); + return attribute_border_post(obj, part, state, update, attr_p, is_true(payload)); + case ATTR_BORDER_OPA: + return attribute_border_opa(obj, part, state, update, attr_p, (lv_opa_t)var); case ATTR_BORDER_COLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_border_color(obj, part, state, color); } - case ATTR_BORDER_OPA: - return lv_obj_set_style_local_border_opa(obj, part, state, (lv_opa_t)var); - - /* Outline attributes */ + /* Outline attributes */ case ATTR_OUTLINE_WIDTH: - return lv_obj_set_style_local_outline_width(obj, part, state, (lv_style_int_t)var); + return attribute_outline_width(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_OUTLINE_PAD: - return lv_obj_set_style_local_outline_pad(obj, part, state, (lv_style_int_t)var); - case ATTR_OUTLINE_BLEND_MODE: - return lv_obj_set_style_local_outline_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_outline_pad(obj, part, state, update, attr_p, (lv_style_int_t)var); + case ATTR_OUTLINE_OPA: + return attribute_outline_opa(obj, part, state, update, attr_p, (lv_opa_t)var); case ATTR_OUTLINE_COLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_outline_color(obj, part, state, color); } - case ATTR_OUTLINE_OPA: - return lv_obj_set_style_local_outline_opa(obj, part, state, (lv_opa_t)var); /* Shadow attributes */ +#if LV_USE_SHADOW case ATTR_SHADOW_WIDTH: - return lv_obj_set_style_local_shadow_width(obj, part, state, (lv_style_int_t)var); + return attribute_shadow_width(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_SHADOW_OFS_X: - return lv_obj_set_style_local_shadow_ofs_x(obj, part, state, (lv_style_int_t)var); + return attribute_shadow_ofs_x(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_SHADOW_OFS_Y: - return lv_obj_set_style_local_shadow_ofs_y(obj, part, state, (lv_style_int_t)var); + return attribute_shadow_ofs_y(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_SHADOW_SPREAD: - return lv_obj_set_style_local_shadow_spread(obj, part, state, (lv_style_int_t)var); - case ATTR_SHADOW_BLEND_MODE: - return lv_obj_set_style_local_shadow_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_shadow_spread(obj, part, state, update, attr_p, (lv_style_int_t)var); + case ATTR_SHADOW_OPA: + return attribute_shadow_opa(obj, part, state, update, attr_p, (lv_opa_t)var); case ATTR_SHADOW_COLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_shadow_color(obj, part, state, color); } - case ATTR_SHADOW_OPA: - return lv_obj_set_style_local_shadow_opa(obj, part, state, (lv_opa_t)var); +#endif /* Line attributes */ case ATTR_LINE_WIDTH: - return lv_obj_set_style_local_line_width(obj, part, state, (lv_style_int_t)var); - case ATTR_LINE_BLEND_MODE: - return lv_obj_set_style_local_line_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_line_width(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_LINE_DASH_WIDTH: - return lv_obj_set_style_local_line_dash_width(obj, part, state, (lv_style_int_t)var); + return attribute_line_dash_width(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_LINE_DASH_GAP: - return lv_obj_set_style_local_line_dash_gap(obj, part, state, (lv_style_int_t)var); + return attribute_line_dash_gap(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_LINE_ROUNDED: - return lv_obj_set_style_local_line_rounded(obj, part, state, (bool)var); + return attribute_line_rounded(obj, part, state, update, attr_p, is_true(payload)); + case ATTR_LINE_OPA: + return attribute_line_opa(obj, part, state, update, attr_p, (lv_opa_t)var); case ATTR_LINE_COLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_line_color(obj, part, state, color); } - case ATTR_LINE_OPA: - return lv_obj_set_style_local_line_opa(obj, part, state, (lv_opa_t)var); /* Value attributes */ case ATTR_VALUE_LETTER_SPACE: - return lv_obj_set_style_local_value_letter_space(obj, part, state, (lv_style_int_t)var); - + return attribute_value_letter_space(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_VALUE_LINE_SPACE: - return lv_obj_set_style_local_value_line_space(obj, part, state, (lv_style_int_t)var); - case ATTR_VALUE_BLEND_MODE: - return lv_obj_set_style_local_value_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_value_line_space(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_VALUE_OFS_X: - return lv_obj_set_style_local_value_ofs_x(obj, part, state, (lv_style_int_t)var); + return attribute_value_ofs_x(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_VALUE_OFS_Y: - return lv_obj_set_style_local_value_ofs_y(obj, part, state, (lv_style_int_t)var); + return attribute_value_ofs_y(obj, part, state, update, attr_p, (lv_style_int_t)var); case ATTR_VALUE_ALIGN: - return lv_obj_set_style_local_value_align(obj, part, state, (lv_align_t)var); + return attribute_value_align(obj, part, state, update, attr_p, (lv_align_t)var); + case ATTR_VALUE_OPA: + return attribute_value_opa(obj, part, state, update, attr_p, (lv_opa_t)var); + case ATTR_VALUE_STR: { + if(update) { + // Free previous string + const char * str = lv_obj_get_style_value_str(obj, part); + lv_obj_set_style_local_value_str(obj, part, state, NULL); + lv_mem_free(str); + + // Create new string + size_t len = strlen(payload); + if(len > 0) { + len++; + char * str_p = (char *)lv_mem_alloc(len); + memset(str_p, 0, len); + memccpy(str_p, payload, 0, len); + lv_obj_set_style_local_value_str(obj, part, state, str_p); + } + } else { + hasp_out_str(obj, attr, lv_obj_get_style_value_str(obj, part)); + } + return; + } case ATTR_VALUE_COLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_value_color(obj, part, state, color); } - case ATTR_VALUE_OPA: - return lv_obj_set_style_local_value_opa(obj, part, state, (lv_opa_t)var); - case ATTR_VALUE_STR: - return lv_obj_set_style_local_value_str(obj, part, state, (const char *)payload); + case ATTR_VALUE_FONT: { + lv_font_t * font = haspPayloadToFont(payload); + if(font) { + return lv_obj_set_style_local_value_font(obj, part, state, font); + } else { + return Log.warning(F("HASP: Unknown Font ID %s"), attr_p); + } + } /* Pattern attributes */ case ATTR_PATTERN_REPEAT: - return lv_obj_set_style_local_pattern_repeat(obj, part, state, (bool)var); - case ATTR_PATTERN_BLEND_MODE: - return lv_obj_set_style_local_pattern_blend_mode(obj, part, state, (lv_blend_mode_t)var); + return attribute_pattern_repeat(obj, part, state, update, attr_p, is_true(payload)); + case ATTR_PATTERN_OPA: + return attribute_pattern_opa(obj, part, state, update, attr_p, (lv_opa_t)var); + case ATTR_PATTERN_RECOLOR_OPA: + return attribute_pattern_recolor_opa(obj, part, state, update, attr_p, (lv_opa_t)var); + case ATTR_PATTERN_IMAGE: + // return lv_obj_set_style_local_pattern_image(obj, part, state, (constvoid *)var); + break; case ATTR_PATTERN_RECOLOR: { lv_color_t color = haspPayloadToColor(payload); return lv_obj_set_style_local_pattern_recolor(obj, part, state, color); } - case ATTR_PATTERN_OPA: - return lv_obj_set_style_local_pattern_opa(obj, part, state, (lv_opa_t)var); - case ATTR_PATTERN_RECOLOR_OPA: - return lv_obj_set_style_local_pattern_recolor_opa(obj, part, state, (lv_opa_t)var); - case ATTR_PATTERN_IMAGE: - // return lv_obj_set_style_local_pattern_image(obj, part, state, (constvoid *)var); - break; + + /* Image attributes */ + // Todo + + /* Scale attributes */ + // Todo + + /* Transition attributes */ + // Todo } Log.warning(F("HASP: Unknown property %s"), attr_p); } -static void hasp_local_style_attr_font(lv_obj_t * obj, const char * attr_p, uint16_t attr_hash, const char * payload, - bool update) -{ - uint8_t part = LV_TABLE_PART_BG; - uint8_t state = LV_STATE_DEFAULT; - int16_t var = atoi(payload); - - int len = strlen(attr_p); - if(len > 0 && len < 32) { - // Check Trailing partnumber - if(attr_p[len - 1] == '1') { - part = LV_TABLE_PART_CELL1; - } else if(attr_p[len - 1] == '2') { - part = LV_TABLE_PART_CELL2; - } else if(attr_p[len - 1] == '3') { - part = LV_TABLE_PART_CELL3; - } else if(attr_p[len - 1] == '4') { - part = LV_TABLE_PART_CELL4; - // } else if(attr[len - 1] == '9') { - // part = LV_PAGE_PART_SCROLLBAR; - } - - // Remove Trailing part digit - char attr[32]; - if(part != LV_TABLE_PART_BG && len > 0) { - len--; - } - strncpy(attr, attr_p, len + 1); - attr[len] = 0; - - // debugPrintln(strAttr + "&" + part); - - /* ***** WARNING **************************************************** - * when using hasp_out use attr_p for the original attribute name - * *************************************************************** */ - - if(!strcmp_P(attr, PSTR("value_font"))) { -#if ESP32 - switch(var) { - case 8: - lv_obj_set_style_local_value_font(obj, part, state, &unscii_8_icon); - break; - case 12: - lv_obj_set_style_local_value_font(obj, part, state, &lv_font_montserrat_12); - break; - case 16: - lv_obj_set_style_local_value_font(obj, part, state, &lv_font_montserrat_16); - break; - case 22: - lv_obj_set_style_local_value_font(obj, part, state, &lv_font_montserrat_22); - break; - case 28: - lv_obj_set_style_local_value_font(obj, part, state, &lv_font_montserrat_28_compressed); - break; - } - return; -#endif - // return lv_obj_set_style_local_value_font(obj, part, state, (constlv_font_t *)var); - - } else if(!strcmp_P(attr, PSTR("text_font"))) { -#if ESP32 - switch(var) { - case 0: - lv_obj_set_style_local_text_font(obj, part, state, haspFonts[0]); - Log.verbose(F("Changing font to : %s"), (char *)haspFonts[0]->user_data); - break; - case 8: - lv_obj_set_style_local_text_font(obj, part, state, &unscii_8_icon); - break; - case 12: - lv_obj_set_style_local_text_font(obj, part, state, &lv_font_montserrat_12); - break; - case 16: - lv_obj_set_style_local_text_font(obj, part, state, &lv_font_montserrat_16); - break; - case 22: - lv_obj_set_style_local_text_font(obj, part, state, &lv_font_montserrat_22); - break; - case 28: - lv_obj_set_style_local_text_font(obj, part, state, &lv_font_montserrat_28_compressed); - break; - } - return; -#endif - // return lv_obj_set_style_local_text_font(obj, part, state, (constlv_font_t *)var); - } - } - - Log.warning(F("HASP: Unknown property %s"), attr_p); -} - // OK static void hasp_process_obj_attribute_txt(lv_obj_t * obj, const char * attr, const char * payload, bool update) { @@ -640,8 +685,14 @@ static void hasp_process_obj_attribute_range(lv_obj_t * obj, const char * attr, } } -// OK -// @param update bool: change the value if true, dispatch value if false +/** + * Change or Retrieve the value of the attribute of an object + * @param obj lv_obj_t*: the object to get/set the attribute + * @param attr_p char*: the attribute name (with or without leading ".") + * @param payload char*: the new value of the attribute + * @param update bool: change/set the value if true, dispatch/get value if false + * @note setting a value won't return anything, getting will dispatch the value + */ void hasp_process_obj_attribute(lv_obj_t * obj, const char * attr_p, const char * payload, bool update) { unsigned long start = millis(); @@ -789,11 +840,9 @@ void hasp_process_obj_attribute(lv_obj_t * obj, const char * attr_p, const char /* ************************** * Static Inline functions * **************************/ -static inline bool is_true(const char * s) +static bool is_true(const char * s) { - return (!strcmp_P(s, PSTR("true")) || !strcmp_P(s, PSTR("TRUE")) || !strcmp_P(s, PSTR("True")) || - !strcmp_P(s, PSTR("on")) || !strcmp_P(s, PSTR("ON")) || !strcmp_P(s, PSTR("On")) || - !strcmp_P(s, PSTR("yes")) || !strcmp_P(s, PSTR("YES")) || !strcmp_P(s, PSTR("Yes")) || + return (!strcasecmp_P(s, PSTR("true")) || !strcasecmp_P(s, PSTR("on")) || !strcasecmp_P(s, PSTR("yes")) || !strcmp_P(s, PSTR("1"))); } @@ -821,6 +870,13 @@ void inline hasp_out_color(lv_obj_t * obj, const char * attr, lv_color_t color) hasp_send_obj_attribute_color(obj, attr, color); } +/** + * Check if an lvgl object typename corresponds to a given HASP object ID + * @param lvobjtype a char* to a string + * @param haspobjtype the HASP object ID to check against + * @return true or false wether the types match + * @note + */ bool check_obj_type(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) { lvobjtype += 3; // skip "lv_" @@ -869,6 +925,13 @@ bool check_obj_type(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) } } +/** + * Check if an lvgl objecttype name corresponds to a given HASP object ID + * @param obj an lv_obj_t* of the object to check its type + * @param haspobjtype the HASP object ID to check against + * @return true or false wether the types match + * @note + */ bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype) { lv_obj_type_t list; diff --git a/src/hasp_attribute.h b/src/hasp_attribute.h index 6171e1e3..911a6f94 100644 --- a/src/hasp_attribute.h +++ b/src/hasp_attribute.h @@ -28,8 +28,8 @@ bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype); if(update) { \ return lv_obj_set_style_local_##func_name(obj, part, state, (value_type)val); \ } else { \ - value_type temp; \ - lv_obj_get_style_local_##func_name(obj, part, state, &temp); \ + value_type temp = lv_obj_get_style_##func_name(obj, part); \ + /*lv_obj_get_style_##func_name(obj, part, state, &temp);*/ \ return hasp_out_int(obj, attr, temp); \ } \ } @@ -45,7 +45,17 @@ _HASP_ATTRIBUTE(PAD_BOTTOM, pad_bottom, lv_style_int_t) _HASP_ATTRIBUTE(PAD_LEFT, pad_left, lv_style_int_t) _HASP_ATTRIBUTE(PAD_RIGHT, pad_right, lv_style_int_t) _HASP_ATTRIBUTE(PAD_INNER, pad_inner, lv_style_int_t) +#if LV_USE_BLEND_MODES _HASP_ATTRIBUTE(BG_BLEND_MODE, bg_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(BORDER_BLEND_MODE, border_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(OUTLINE_BLEND_MODE, outline_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(SHADOW_BLEND_MODE, shadow_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(PATTERN_BLEND_MODE, pattern_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(VALUE_BLEND_MODE, value_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(TEXT_BLEND_MODE, text_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(LINE_BLEND_MODE, line_blend_mode, lv_blend_mode_t) +_HASP_ATTRIBUTE(IMAGE_BLEND_MODE, image_blend_mode, lv_blend_mode_t) +#endif _HASP_ATTRIBUTE(BG_MAIN_STOP, bg_main_stop, lv_style_int_t) _HASP_ATTRIBUTE(BG_GRAD_STOP, bg_grad_stop, lv_style_int_t) _HASP_ATTRIBUTE(BG_GRAD_DIR, bg_grad_dir, lv_grad_dir_t) @@ -54,31 +64,28 @@ _HASP_ATTRIBUTE(BG_GRAD_DIR, bg_grad_dir, lv_grad_dir_t) _HASP_ATTRIBUTE(BG_OPA, bg_opa, lv_opa_t) _HASP_ATTRIBUTE(BORDER_WIDTH, border_width, lv_style_int_t) _HASP_ATTRIBUTE(BORDER_SIDE, border_side, lv_border_side_t) -_HASP_ATTRIBUTE(BORDER_BLEND_MODE, border_blend_mode, lv_blend_mode_t) _HASP_ATTRIBUTE(BORDER_POST, border_post, bool) //_HASP_ATTRIBUTE(BORDER_COLOR, border_color, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(BORDER_OPA, border_opa, lv_opa_t) _HASP_ATTRIBUTE(OUTLINE_WIDTH, outline_width, lv_style_int_t) _HASP_ATTRIBUTE(OUTLINE_PAD, outline_pad, lv_style_int_t) -_HASP_ATTRIBUTE(OUTLINE_BLEND_MODE, outline_blend_mode, lv_blend_mode_t) //_HASP_ATTRIBUTE(OUTLINE_COLOR, outline_color, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(OUTLINE_OPA, outline_opa, lv_opa_t) +#if LV_USE_SHADOW _HASP_ATTRIBUTE(SHADOW_WIDTH, shadow_width, lv_style_int_t) _HASP_ATTRIBUTE(SHADOW_OFS_X, shadow_ofs_x, lv_style_int_t) _HASP_ATTRIBUTE(SHADOW_OFS_Y, shadow_ofs_y, lv_style_int_t) _HASP_ATTRIBUTE(SHADOW_SPREAD, shadow_spread, lv_style_int_t) -_HASP_ATTRIBUTE(SHADOW_BLEND_MODE, shadow_blend_mode, lv_blend_mode_t) //_HASP_ATTRIBUTE(SHADOW_COLOR, shadow_color, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(SHADOW_OPA, shadow_opa, lv_opa_t) +#endif _HASP_ATTRIBUTE(PATTERN_REPEAT, pattern_repeat, bool) -_HASP_ATTRIBUTE(PATTERN_BLEND_MODE, pattern_blend_mode, lv_blend_mode_t) //_HASP_ATTRIBUTE(PATTERN_RECOLOR, pattern_recolor, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(PATTERN_OPA, pattern_opa, lv_opa_t) _HASP_ATTRIBUTE(PATTERN_RECOLOR_OPA, pattern_recolor_opa, lv_opa_t) //_HASP_ATTRIBUTE(PATTERN_IMAGE, pattern_image, const void *, _data_ptr, scalar) _HASP_ATTRIBUTE(VALUE_LETTER_SPACE, value_letter_space, lv_style_int_t) _HASP_ATTRIBUTE(VALUE_LINE_SPACE, value_line_space, lv_style_int_t) -_HASP_ATTRIBUTE(VALUE_BLEND_MODE, value_blend_mode, lv_blend_mode_t) _HASP_ATTRIBUTE(VALUE_OFS_X, value_ofs_x, lv_style_int_t) _HASP_ATTRIBUTE(VALUE_OFS_Y, value_ofs_y, lv_style_int_t) _HASP_ATTRIBUTE(VALUE_ALIGN, value_align, lv_align_t) @@ -89,19 +96,16 @@ _HASP_ATTRIBUTE(VALUE_OPA, value_opa, lv_opa_t) _HASP_ATTRIBUTE(TEXT_LETTER_SPACE, text_letter_space, lv_style_int_t) _HASP_ATTRIBUTE(TEXT_LINE_SPACE, text_line_space, lv_style_int_t) _HASP_ATTRIBUTE(TEXT_DECOR, text_decor, lv_text_decor_t) -_HASP_ATTRIBUTE(TEXT_BLEND_MODE, text_blend_mode, lv_blend_mode_t) //_HASP_ATTRIBUTE(TEXT_COLOR, text_color, lv_color_t, _color, nonscalar) //_HASP_ATTRIBUTE(TEXT_SEL_COLOR, text_sel_color, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(TEXT_OPA, text_opa, lv_opa_t) //_HASP_ATTRIBUTE(TEXT_FONT, text_font, const lv_font_t *, _data_ptr, scalar) _HASP_ATTRIBUTE(LINE_WIDTH, line_width, lv_style_int_t) -_HASP_ATTRIBUTE(LINE_BLEND_MODE, line_blend_mode, lv_blend_mode_t) _HASP_ATTRIBUTE(LINE_DASH_WIDTH, line_dash_width, lv_style_int_t) _HASP_ATTRIBUTE(LINE_DASH_GAP, line_dash_gap, lv_style_int_t) _HASP_ATTRIBUTE(LINE_ROUNDED, line_rounded, bool) //_HASP_ATTRIBUTE(LINE_COLOR, line_color, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(LINE_OPA, line_opa, lv_opa_t) -_HASP_ATTRIBUTE(IMAGE_BLEND_MODE, image_blend_mode, lv_blend_mode_t) //_HASP_ATTRIBUTE(IMAGE_RECOLOR, image_recolor, lv_color_t, _color, nonscalar) _HASP_ATTRIBUTE(IMAGE_OPA, image_opa, lv_opa_t) _HASP_ATTRIBUTE(IMAGE_RECOLOR_OPA, image_recolor_opa, lv_opa_t) @@ -122,92 +126,116 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t) //_HASP_ATTRIBUTE(SCALE_END_COLOR, scale_end_color, lv_color_t, _color, nonscalar) /* attribute hashes */ +/* Object Part Attributes */ #define ATTR_SIZE 16417 -#define ATTR_BG_OPA 48966 #define ATTR_RADIUS 20786 -#define ATTR_PAD_TOP 59081 -#define ATTR_LINE_OPA 24501 -#define ATTR_BG_COLOR 64969 -#define ATTR_PAD_LEFT 43123 -#define ATTR_TEXT_OPA 37166 -#define ATTR_IMAGE_OPA 58140 -#define ATTR_OPA_SCALE 64875 -#define ATTR_PAD_INNER 9930 -#define ATTR_PAD_RIGHT 65104 -#define ATTR_BORDER_OPA 2061 -#define ATTR_VALUE_OPA 50482 -#define ATTR_LINE_WIDTH 25467 -#define ATTR_LINE_COLOR 22200 -#define ATTR_PAD_BOTTOM 3767 -#define ATTR_TEXT_FONT 22465 -#define ATTR_VALUE_STR 1091 -#define ATTR_SHADOW_OPA 38401 -#define ATTR_TEXT_COLOR 23473 -#define ATTR_TEXT_DECOR 1971 -#define ATTR_BORDER_SIDE 53962 -#define ATTR_VALUE_FONT 9405 #define ATTR_CLIP_CORNER 9188 -#define ATTR_PATTERN_OPA 43633 -#define ATTR_OUTLINE_OPA 23011 -#define ATTR_BORDER_POST 49491 -#define ATTR_OUTLINE_PAD 26038 -#define ATTR_SCALE_WIDTH 36017 +#define ATTR_OPA_SCALE 64875 +#define ATTR_TRANSFORM_HEIGHT 55994 +#define ATTR_TRANSFORM_WIDTH 48627 + +/* Background Attributes */ +#define ATTR_BG_OPA 48966 +#define ATTR_BG_COLOR 64969 #define ATTR_BG_GRAD_DIR 41782 -#define ATTR_VALUE_ALIGN 27895 -#define ATTR_VALUE_COLOR 52661 #define ATTR_BG_GRAD_STOP 4025 -#define ATTR_VALUE_OFS_X 21415 -#define ATTR_VALUE_OFS_Y 21416 #define ATTR_BG_MAIN_STOP 63118 -#define ATTR_BORDER_WIDTH 24531 -#define ATTR_LINE_ROUNDED 15042 -#define ATTR_BORDER_COLOR 21264 #define ATTR_BG_BLEND_MODE 31147 #define ATTR_BG_GRAD_COLOR 44140 -#define ATTR_SHADOW_WIDTH 13255 -#define ATTR_IMAGE_RECOLOR 52204 -#define ATTR_SHADOW_COLOR 9988 -#define ATTR_LINE_DASH_GAP 49332 -#define ATTR_OUTLINE_WIDTH 9897 -#define ATTR_SHADOW_OFS_X 44278 -#define ATTR_SHADOW_OFS_Y 44279 -#define ATTR_PATTERN_IMAGE 61292 -#define ATTR_SHADOW_SPREAD 21138 -#define ATTR_OUTLINE_COLOR 6630 + +/* Padding Attributes */ +#define ATTR_PAD_TOP 59081 +#define ATTR_PAD_LEFT 43123 +#define ATTR_PAD_INNER 9930 +#define ATTR_PAD_RIGHT 65104 +#define ATTR_PAD_BOTTOM 3767 + +/* Text Attributes */ +#define ATTR_TEXT_OPA 37166 +#define ATTR_TEXT_FONT 22465 +#define ATTR_TEXT_COLOR 23473 +#define ATTR_TEXT_DECOR 1971 +#define ATTR_TEXT_LETTER_SPACE 62079 #define ATTR_TEXT_SEL_COLOR 32076 -#define ATTR_LINE_DASH_WIDTH 32676 -#define ATTR_PATTERN_REPEAT 31338 -#define ATTR_LINE_BLEND_MODE 60284 #define ATTR_TEXT_LINE_SPACE 54829 #define ATTR_TEXT_BLEND_MODE 32195 + +/* Border Attributes */ +#define ATTR_BORDER_OPA 2061 +#define ATTR_BORDER_SIDE 53962 +#define ATTR_BORDER_POST 49491 +#define ATTR_BORDER_BLEND_MODE 23844 +#define ATTR_BORDER_WIDTH 24531 +#define ATTR_BORDER_COLOR 21264 + +/* Outline Attributes */ +#define ATTR_OUTLINE_OPA 23011 +#define ATTR_OUTLINE_PAD 26038 +#define ATTR_OUTLINE_COLOR 6630 +#define ATTR_OUTLINE_BLEND_MODE 25038 +#define ATTR_OUTLINE_WIDTH 9897 + +/* Shadow Attributes */ +#define ATTR_SHADOW_OPA 38401 +#define ATTR_SHADOW_WIDTH 13255 +#define ATTR_SHADOW_OFS_X 44278 +#define ATTR_SHADOW_OFS_Y 44279 +#define ATTR_SHADOW_SPREAD 21138 +#define ATTR_SHADOW_BLEND_MODE 64048 +#define ATTR_SHADOW_COLOR 9988 + +/* Line Attributes */ +#define ATTR_LINE_OPA 24501 +#define ATTR_LINE_WIDTH 25467 +#define ATTR_LINE_COLOR 22200 +#define ATTR_LINE_DASH_WIDTH 32676 +#define ATTR_LINE_ROUNDED 15042 +#define ATTR_LINE_DASH_GAP 49332 +#define ATTR_LINE_BLEND_MODE 60284 + +/* Value Attributes */ +#define ATTR_VALUE_OPA 50482 +#define ATTR_VALUE_STR 1091 +#define ATTR_VALUE_FONT 9405 +#define ATTR_VALUE_ALIGN 27895 +#define ATTR_VALUE_COLOR 52661 +#define ATTR_VALUE_OFS_X 21415 +#define ATTR_VALUE_OFS_Y 21416 +#define ATTR_VALUE_LINE_SPACE 26921 +#define ATTR_VALUE_BLEND_MODE 4287 +#define ATTR_VALUE_LETTER_SPACE 51067 + +/* Pattern attributes */ +#define ATTR_PATTERN_BLEND_MODE 43456 +#define ATTR_PATTERN_RECOLOR_OPA 35074 +#define ATTR_PATTERN_RECOLOR 7745 +#define ATTR_PATTERN_REPEAT 31338 +#define ATTR_PATTERN_OPA 43633 +#define ATTR_PATTERN_IMAGE 61292 + #define ATTR_TRANSITION_PROP_1 49343 #define ATTR_TRANSITION_PROP_2 49344 -#define ATTR_SCALE_END_COLOR 44074 #define ATTR_TRANSITION_PROP_3 49345 -#define ATTR_TRANSFORM_WIDTH 48627 #define ATTR_TRANSITION_PROP_4 49346 #define ATTR_TRANSITION_PROP_5 49347 #define ATTR_TRANSITION_PROP_6 49348 #define ATTR_TRANSITION_TIME 26263 -#define ATTR_PATTERN_RECOLOR 7745 #define ATTR_TRANSITION_PATH 43343 -#define ATTR_IMAGE_BLEND_MODE 11349 -#define ATTR_VALUE_LINE_SPACE 26921 -#define ATTR_BORDER_BLEND_MODE 23844 -#define ATTR_VALUE_BLEND_MODE 4287 -#define ATTR_IMAGE_RECOLOR_OPA 43949 #define ATTR_TRANSITION_DELAY 64537 -#define ATTR_SCALE_GRAD_COLOR 47239 -#define ATTR_SHADOW_BLEND_MODE 64048 -#define ATTR_TRANSFORM_HEIGHT 55994 -#define ATTR_TEXT_LETTER_SPACE 62079 -#define ATTR_OUTLINE_BLEND_MODE 25038 -#define ATTR_PATTERN_BLEND_MODE 43456 -#define ATTR_SCALE_BORDER_WIDTH 2440 -#define ATTR_VALUE_LETTER_SPACE 51067 -#define ATTR_PATTERN_RECOLOR_OPA 35074 + +#define ATTR_IMAGE_OPA 58140 +#define ATTR_IMAGE_RECOLOR 52204 +#define ATTR_IMAGE_BLEND_MODE 11349 +#define ATTR_IMAGE_RECOLOR_OPA 43949 + #define ATTR_SCALE_END_LINE_WIDTH 30324 #define ATTR_SCALE_END_BORDER_WIDTH 34380 +#define ATTR_SCALE_BORDER_WIDTH 2440 +#define ATTR_SCALE_GRAD_COLOR 47239 +#define ATTR_SCALE_WIDTH 36017 +#define ATTR_SCALE_END_COLOR 44074 + +/* Object Attributes */ #define ATTR_X 120 #define ATTR_Y 121 #define ATTR_W 119 diff --git a/src/hasp_debug.cpp b/src/hasp_debug.cpp index 38033453..98ae27e7 100644 --- a/src/hasp_debug.cpp +++ b/src/hasp_debug.cpp @@ -71,7 +71,7 @@ Syslog * syslog; #endif // USE_SYSLOG // Serial Settings -uint8_t serialInputIndex = 0; // Empty buffer +uint8_t serialInputIndex = 0; // Empty buffer char serialInputBuffer[1024]; uint16_t debugSerialBaud = SERIAL_SPEED / 10; // Multiplied by 10 bool debugSerialStarted = false; @@ -97,7 +97,8 @@ String debugHaspHeader() String header((char *)0); header.reserve(256); if(debugAnsiCodes) header += TERM_COLOR_YELLOW; - header += F(" _____ _____ _____ _____\r\n" + header += F("\r\n" + " _____ _____ _____ _____\r\n" " | | | _ | __| _ |\r\n" " | | |__ | __|\r\n" " |__|__|__|__|_____|__|\r\n" @@ -381,7 +382,7 @@ void debugLvgl(lv_log_level_t level, const char * file, uint32_t line, const cha void debugLoop() { - while(Serial.available()) { + while(Serial.available()) { char ch = Serial.read(); Serial.print(ch); if(ch == 13 || ch == 10) { diff --git a/src/hasp_dispatch.cpp b/src/hasp_dispatch.cpp index ab227e64..17e1ab12 100644 --- a/src/hasp_dispatch.cpp +++ b/src/hasp_dispatch.cpp @@ -19,7 +19,7 @@ inline void dispatchPrintln(String header, String & data) bool isON(const char * payload) { - return strcmp_P(payload, PSTR("ON")) == 0; + return strcasecmp_P(payload, PSTR("ON")) == 0; } String getOnOff(bool state) @@ -362,21 +362,21 @@ void dispatchConfig(const char * topic, const char * payload) update = true; } - if(strcmp_P(topic, PSTR("debug")) == 0) { + if(strcasecmp_P(topic, PSTR("debug")) == 0) { if(update) debugSetConfig(settings); else debugGetConfig(settings); } - else if(strcmp_P(topic, PSTR("gui")) == 0) { + else if(strcasecmp_P(topic, PSTR("gui")) == 0) { if(update) guiSetConfig(settings); else guiGetConfig(settings); } - else if(strcmp_P(topic, PSTR("hasp")) == 0) { + else if(strcasecmp_P(topic, PSTR("hasp")) == 0) { if(update) haspSetConfig(settings); else @@ -384,14 +384,14 @@ void dispatchConfig(const char * topic, const char * payload) } #if HASP_USE_WIFI > 0 - else if(strcmp_P(topic, PSTR("wifi")) == 0) { + else if(strcasecmp_P(topic, PSTR("wifi")) == 0) { if(update) wifiSetConfig(settings); else wifiGetConfig(settings); } #if HASP_USE_MQTT > 0 - else if(strcmp_P(topic, PSTR("mqtt")) == 0) { + else if(strcasecmp_P(topic, PSTR("mqtt")) == 0) { if(update) mqttSetConfig(settings); else @@ -399,11 +399,11 @@ void dispatchConfig(const char * topic, const char * payload) } #endif #if HASP_USE_TELNET > 0 - // else if(strcmp_P(topic, PSTR("telnet")) == 0) + // else if(strcasecmp_P(topic, PSTR("telnet")) == 0) // telnetGetConfig(settings[F("telnet")]); #endif #if HASP_USE_MDNS > 0 - else if(strcmp_P(topic, PSTR("mdns")) == 0) { + else if(strcasecmp_P(topic, PSTR("mdns")) == 0) { if(update) mdnsSetConfig(settings); else @@ -411,7 +411,7 @@ void dispatchConfig(const char * topic, const char * payload) } #endif #if HASP_USE_HTTP > 0 - else if(strcmp_P(topic, PSTR("http")) == 0) { + else if(strcasecmp_P(topic, PSTR("http")) == 0) { if(update) httpSetConfig(settings); else diff --git a/src/hasp_http.cpp b/src/hasp_http.cpp index 3cb7e0fc..edb856f4 100644 --- a/src/hasp_http.cpp +++ b/src/hasp_http.cpp @@ -1286,10 +1286,11 @@ void webHandleHaspConfig() httpMessage += getOption(3, F("Mono"), themeid == 3); #endif #if LV_USE_THEME_MATERIAL == 1 - httpMessage += getOption(4, F("Material"), themeid == 4); + httpMessage += getOption(4, F("Material Light"), themeid == 4); + httpMessage += getOption(9, F("Material Dark"), themeid == 9); #endif #if LV_USE_THEME_ZEN == 1 - httpMessage += getOption(5, F("Zen"), themeid == 5); + // httpMessage += getOption(5, F("Zen"), themeid == 5); #endif #if LV_USE_THEME_NEMO == 1 httpMessage += getOption(6, F("Nemo"), themeid == 6); diff --git a/src/hasp_mqtt.cpp b/src/hasp_mqtt.cpp index 4bb7ef38..d05cc989 100644 --- a/src/hasp_mqtt.cpp +++ b/src/hasp_mqtt.cpp @@ -303,7 +303,7 @@ static void mqtt_message_cb(char * topic_p, byte * payload, unsigned int length) } // catch a dangling LWT from a previous connection if it appears - if(!strcmp_P(topic, PSTR("status")) && !strcmp_P((char *)payload, PSTR("OFF"))) { + if(!strcmp_P(topic, PSTR("status")) && !strcasecmp_P((char *)payload, PSTR("OFF"))) { char topicBuffer[128]; snprintf_P(topicBuffer, sizeof(topicBuffer), PSTR("%sstatus"), mqttNodeTopic); mqttClient.publish(topicBuffer, "ON", true); diff --git a/src/hasp_telnet.cpp b/src/hasp_telnet.cpp index e6595dba..365d8eeb 100644 --- a/src/hasp_telnet.cpp +++ b/src/hasp_telnet.cpp @@ -146,7 +146,7 @@ static void telnetProcessLine() } default: if(telnetInputIndex > 0) { - if(strcmp_P(telnetInputBuffer, PSTR("exit")) == 0) { + if(strcasecmp_P(telnetInputBuffer, PSTR("exit")) == 0) { telnetClientDisconnect(); } else { dispatchCommand(telnetInputBuffer); diff --git a/user_setups/esp32/d1-mini-esp32_ili9341.ini b/user_setups/esp32/d1-mini-esp32_ili9341.ini index bae61bc9..f05e45a8 100644 --- a/user_setups/esp32/d1-mini-esp32_ili9341.ini +++ b/user_setups/esp32/d1-mini-esp32_ili9341.ini @@ -8,9 +8,9 @@ [env:d1mini32-lolintft24] platform = espressif32@^1.12.0 board = wemos_d1_mini32 -upload_port = COM5 ; To change the port, use platform_override.ini -monitor_port = COM5 ; To change the port, use platform_override.ini -board_build.partitions = default.csv +upload_port = COM6 ; To change the port, use platform_override.ini +monitor_port = COM6 ; To change the port, use platform_override.ini +board_build.partitions = esp32_partition_app1300k_spiffs1216k.csv ; default.csv build_flags = ${flags.esp32_flags} ; -- TFT_eSPI build options ------------------------