diff --git a/CHANGELOG.md b/CHANGELOG.md index 04e84cf20..bcdf6b855 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,16 @@ # Changelog -## v7.4.0 (planned on 01.09.2020) +## v7.4.0 (01.09.2020) + +The main new features of v7.4 are run-time font loading, style caching and arc knob with value setting by click. ### New features -- arc: add set value by click feature -- arc: add `LV_ARC_PART_KNOB` similarly to slider -- send gestures even is the the obejct was dragged. User can check dragging with `lv_indev_is_dragging(lv_indev_act())` in the event function. - Add `lv_font_load()` function - Loads a `lv_font_t` object from a binary font file - Add `lv_font_free()` function - Frees the memory allocated by the `lv_font_load()` function - Add style caching to reduce acces time of properties with default value -- Add `clean_dcache_cb` and `lv_disp_clean_dcache` to enable users to use their own cache management function -- Add `gpu_wait_cb` to wait until the GPU is working. It allows to run CPU a wait only when the rendered data is needed. +- arc: add set value by click feature +- arc: add `LV_ARC_PART_KNOB` similarly to slider +- send gestures even is the the obejct was dragged. User can check dragging with `lv_indev_is_dragging(lv_indev_act())` in the event function. ### Bugfixes - Fix color bleeding on border drawing diff --git a/library.json b/library.json index a6eb48edf..5f6adb3ed 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "lvgl", - "version": "7.3.1", + "version": "7.4.0", "keywords": "graphics, gui, embedded, tft, lvgl", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "repository": { diff --git a/library.properties b/library.properties index 44897bb54..4a160a47f 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=lvgl -version=7.3.1 +version=7.4.0 author=kisvegabor maintainer=kisvegabor,embeddedt,pete-pjb sentence=Full-featured Graphics Library for Embedded Systems diff --git a/lv_conf_template.h b/lv_conf_template.h index e8b636498..f41d573c2 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v7.6.0-dev-dev + * Configuration file for v7.4.0 */ /* diff --git a/lvgl.h b/lvgl.h index fb18d9ff2..ee54e2d80 100644 --- a/lvgl.h +++ b/lvgl.h @@ -17,7 +17,7 @@ extern "C" { #define LVGL_VERSION_MAJOR 7 #define LVGL_VERSION_MINOR 4 #define LVGL_VERSION_PATCH 0 -#define LVGL_VERSION_INFO "dev" +#define LVGL_VERSION_INFO "" /********************* * INCLUDES diff --git a/scripts/release.py b/scripts/release.py index cef3f4afe..fbde8f8c5 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -52,7 +52,7 @@ from os import path from datetime import date import sys -upstream_org_url = "https://github.com/kisvegabor/" +upstream_org_url = "https://github.com/lvgl/" workdir = "./release_tmp" proj_list = [ "lv_sim_eclipse_sdl"] @@ -105,10 +105,10 @@ def clone_repos(): os.chdir(workdir) #For debuging just copy the repos - cmd("cp -a ../repos/. .") - return + #cmd("cp -a ../repos/. .") + #return - cmd("git clone " + upstream("lvgl") + " lvgl; cd lvgl; git checkout master") + cmd("git clone " + upstream("lvgl") + "; cd lvgl; git checkout master") cmd("git clone " + upstream("lv_examples") + "; cd lv_examples; git checkout master") cmd("git clone " + upstream("lv_drivers") + "; cd lv_drivers; git checkout master") cmd("git clone --recurse-submodules " + upstream("docs") + "; cd docs; git checkout master") @@ -305,6 +305,17 @@ def update_release_branches(): cmd("cd docs; " + merge_cmd) def publish_master(): + + #Merge LVGL master to dev first to avoid "merge-to-dev.yml" running asynchronous + os.chdir("./lvgl") + cmd("git checkout dev") + cmd("git merge master -X theirs") + cmd("git add .") + cmd("git commit -am 'Merge master'") + cmd("git push origin dev") + cmd("git checkout master") + os.chdir("../") + pub_cmd = "git push origin master; git push origin " + ver_str cmd("cd lvgl; " + pub_cmd) cmd("cd lv_examples; " + pub_cmd) @@ -348,7 +359,7 @@ def lvgl_update_master_version(): templ = fnmatch.filter(os.listdir('.'), '*templ*') if templ[0]: print("Updating version in " + templ[0]) - cmd("sed -i -r 's/v[0-9]+\.[0-9]+\.[0-9]+/"+ ver_str +"/' " + templ[0]) + cmd("sed -i -r 's/v[0-9]+\.[0-9]+\.[0-9]+.*/"+ ver_str +"/' " + templ[0]) cmd("git commit -am 'Update version'") @@ -381,7 +392,7 @@ def lvgl_update_dev_version(): templ = fnmatch.filter(os.listdir('.'), '*templ*') if templ[0]: print("Updating version in " + templ[0]) - cmd("sed -i -r 's/v[0-9]+\.[0-9]+\.[0-9]+/"+ dev_ver_str +"/' " + templ[0]) + cmd("sed -i -r 's/v[0-9]+\.[0-9]+\.[0-9]+.*/"+ dev_ver_str +"/' " + templ[0]) cmd("git commit -am 'Update dev version'") @@ -450,23 +461,19 @@ def cleanup(): cmd("rm -fr " + workdir) if __name__ == '__main__': - if(len(sys.argv) != 2): - print("Argument error. Usage ./release.py bugfix | minor | major") - #exit(1) - - #dev_prepare = sys.argv[1] dev_prepare = 'minor' + if(len(sys.argv) != 2): + print("Missing argument. Usage ./release.py bugfix | minor | major") + print("Use minor by deafult") + else: + dev_prepare = sys.argv[1] + if not (dev_prepare in prepare_type): print("Invalid argument. Usage ./release.py bugfix | minor | major") exit(1) clone_repos() get_lvgl_version("master") - - projs_update() - - exit(1); - lvgl_prepare() lv_examples_prepare() lv_drivers_prepare() diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index d43134241..0f5f28ac0 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -1047,6 +1047,11 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h" */ #endif #endif +/*Rotary (dependencies: lv_arc, lv_btn)*/ +#ifndef LV_USE_ROTARY +#define LV_USE_ROTARY 1 +#endif + /*Slider (dependencies: lv_bar)*/ #ifndef LV_USE_SLIDER #define LV_USE_SLIDER 1 diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index 3ed5182db..17ba015d6 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -572,10 +572,15 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) /*If this object is fully cover the draw area check the children too */ if(_lv_area_is_in(area_p, &obj->coords, 0) && obj->hidden == 0) { - lv_design_res_t design_res = obj->design_cb ? obj->design_cb(obj, area_p, - LV_DESIGN_COVER_CHK) : LV_DESIGN_RES_NOT_COVER; + lv_design_res_t design_res = obj->design_cb(obj, area_p, LV_DESIGN_COVER_CHK); if(design_res == LV_DESIGN_RES_MASKED) return NULL; +#if LV_USE_OPA_SCALE + if(design_res == LV_DESIGN_RES_COVER && lv_obj_get_style_opa_scale(obj, LV_OBJ_PART_MAIN) != LV_OPA_COVER) { + design_res = LV_DESIGN_RES_NOT_COVER; + } +#endif + lv_obj_t * i; _LV_LL_READ(obj->child_ll, i) { found_p = lv_refr_get_top_obj(area_p, i); diff --git a/src/lv_widgets/lv_arc.c b/src/lv_widgets/lv_arc.c index c42402e7d..655a12802 100644 --- a/src/lv_widgets/lv_arc.c +++ b/src/lv_widgets/lv_arc.c @@ -400,7 +400,36 @@ void lv_arc_set_value(lv_obj_t * arc, int16_t value) if(ext->cur_value == new_value) return; ext->cur_value = new_value; - value_update(arc); + int16_t bg_midpoint, range_midpoint, bg_end = ext->bg_angle_end; + if(ext->bg_angle_end < ext->bg_angle_start) bg_end = ext->bg_angle_end + 360; + + int16_t angle; + switch(ext->type) { + case LV_ARC_TYPE_SYMMETRIC: + bg_midpoint = (ext->bg_angle_start + bg_end) / 2; + range_midpoint = (int32_t)(ext->min_value + ext->max_value) / 2; + + if(ext->cur_value < range_midpoint) { + angle = _lv_map(ext->cur_value, ext->min_value, range_midpoint, ext->bg_angle_start, bg_midpoint); + lv_arc_set_start_angle(arc, angle); + lv_arc_set_end_angle(arc, bg_midpoint); + } + else { + angle = _lv_map(ext->cur_value, range_midpoint, ext->max_value, bg_midpoint, bg_end); + lv_arc_set_start_angle(arc, bg_midpoint); + lv_arc_set_end_angle(arc, angle); + } + break; + case LV_ARC_TYPE_REVERSE: + angle = _lv_map(ext->cur_value, ext->min_value, ext->max_value, ext->bg_angle_start, bg_end); + lv_arc_set_start_angle(arc, angle); + break; + default: /** LV_ARC_TYPE_NORMAL*/ + angle = _lv_map(ext->cur_value, ext->min_value, ext->max_value, ext->bg_angle_start, bg_end); + lv_arc_set_start_angle(arc, ext->bg_angle_start); + lv_arc_set_end_angle(arc, angle); + } + ext->last_angle = angle; /*Cache angle for slew rate limiting*/ } /** diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index f7f47dc40..97ccd54f3 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -619,7 +619,6 @@ static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * clip_area) lv_draw_img_dsc_t img_dsc; lv_draw_img_dsc_init(&img_dsc); lv_obj_init_draw_img_dsc(gauge, LV_GAUGE_PART_MAIN, &img_dsc); - img_dsc.recolor_opa = LV_OPA_COVER; img_dsc.pivot.x = ext->needle_img_pivot.x; img_dsc.pivot.y = ext->needle_img_pivot.y; diff --git a/src/lv_widgets/lv_img.c b/src/lv_widgets/lv_img.c index dc95c4985..d7fb1a85d 100644 --- a/src/lv_widgets/lv_img.c +++ b/src/lv_widgets/lv_img.c @@ -605,6 +605,11 @@ static lv_design_res_t lv_img_design(lv_obj_t * img, const lv_area_t * clip_area if(_lv_area_is_in(clip_area, &a, 0) == false) return LV_DESIGN_RES_NOT_COVER; } +#if LV_USE_BLEND_MODES + if(lv_obj_get_style_bg_blend_mode(img, LV_IMG_PART_MAIN) != LV_BLEND_MODE_NORMAL) return LV_DESIGN_RES_NOT_COVER; + if(lv_obj_get_style_image_blend_mode(img, LV_IMG_PART_MAIN) != LV_BLEND_MODE_NORMAL) return LV_DESIGN_RES_NOT_COVER; +#endif + return LV_DESIGN_RES_COVER; } else if(mode == LV_DESIGN_DRAW_MAIN) {