From 03c3838605851dec06d01c8ee4cd937871be567e Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 1 Sep 2020 16:45:36 +0200 Subject: [PATCH 1/4] arc: use value_update in lv_arc_set_value it was overwritten on merge --- src/lv_widgets/lv_arc.c | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/src/lv_widgets/lv_arc.c b/src/lv_widgets/lv_arc.c index 655a12802..c42402e7d 100644 --- a/src/lv_widgets/lv_arc.c +++ b/src/lv_widgets/lv_arc.c @@ -400,36 +400,7 @@ void lv_arc_set_value(lv_obj_t * arc, int16_t value) if(ext->cur_value == new_value) return; ext->cur_value = new_value; - 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*/ + value_update(arc); } /** From 4613811c45d4e58929f739f6342a1b4c8ced56a9 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 1 Sep 2020 17:59:53 +0200 Subject: [PATCH 2/4] lmeter: fix uninitialized 'mirror' property --- lv_conf_template.h | 2 +- src/lv_widgets/lv_linemeter.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lv_conf_template.h b/lv_conf_template.h index 7f009b082..01d8184a2 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -653,7 +653,7 @@ typedef void * lv_obj_user_data_t; * 1: Some extra precision * 2: Best precision */ -# define LV_LINEMETER_PRECISE 0 +# define LV_LINEMETER_PRECISE 1 #endif /*Mask (dependencies: -)*/ diff --git a/src/lv_widgets/lv_linemeter.c b/src/lv_widgets/lv_linemeter.c index cd7f291c0..a8c9d3db8 100644 --- a/src/lv_widgets/lv_linemeter.c +++ b/src/lv_widgets/lv_linemeter.c @@ -76,6 +76,7 @@ lv_obj_t * lv_linemeter_create(lv_obj_t * par, const lv_obj_t * copy) ext->line_cnt = 18; ext->scale_angle = 240; ext->angle_ofs = 0; + ext->mirrored = 0; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(linemeter, lv_linemeter_signal); From 85bd12a794b3525cfba8cc702f06c97d83dd01d6 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 1 Sep 2020 19:14:03 +0200 Subject: [PATCH 3/4] fix lv_obj_del and lv_obj_clean if the children list changed during deletion https://forum.lvgl.io/t/lv-obj-del-and-kin-wrongly-assume-that-child-ll-wont-change-while-deleting/3091 --- CHANGELOG.md | 1 + src/lv_core/lv_obj.c | 15 ++++----------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index adb860656..f45d45f7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - 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. ### Bugfixes +- Fix `lv_obj_del` and `lv_obj_clean` if the children list changed during deletion. ## v7.4.0 (01.09.2020) diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 30c5f6c6c..25fec838a 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -487,11 +487,8 @@ void lv_obj_clean(lv_obj_t * obj) lv_obj_t * child = lv_obj_get_child(obj, NULL); lv_obj_t * child_next; while(child) { - /* Read the next child before deleting the current - * because the next couldn't be read from a deleted (invalid) node*/ - child_next = lv_obj_get_child(obj, child); lv_obj_del(child); - child = child_next; + child = lv_obj_get_child(obj, NULL); /*Get the new first child*/ } } @@ -3709,17 +3706,13 @@ static void obj_del_core(lv_obj_t * obj) /*Recursively delete the children*/ lv_obj_t * i; - lv_obj_t * i_next; i = _lv_ll_get_head(&(obj->child_ll)); while(i != NULL) { - /*Get the next object before delete this*/ - i_next = _lv_ll_get_next(&(obj->child_ll), i); - - /*Call the recursive del to the child too*/ + /*Call the recursive delete to the child too*/ obj_del_core(i); - /*Set i to the next node*/ - i = i_next; + /*Set i to the new head node*/ + i = _lv_ll_get_head(&(obj->child_ll)); } lv_event_mark_deleted(obj); From 05960885440e7ac412ba7d4b5e7c46af9716134c Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 1 Sep 2020 19:19:25 +0200 Subject: [PATCH 4/4] remove unused variable --- src/lv_core/lv_obj.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 25fec838a..56284a063 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -485,7 +485,6 @@ void lv_obj_clean(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_obj_t * child = lv_obj_get_child(obj, NULL); - lv_obj_t * child_next; while(child) { lv_obj_del(child); child = lv_obj_get_child(obj, NULL); /*Get the new first child*/