From 546909c1d2ec8969a7ed7fb73caedd00ec80b8e6 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 04:10:42 -0700 Subject: [PATCH 01/26] Added lv_utils_num_to_str_fixed --- src/lv_misc/lv_utils.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lv_misc/lv_utils.h b/src/lv_misc/lv_utils.h index 6eed79501..33e462b39 100644 --- a/src/lv_misc/lv_utils.h +++ b/src/lv_misc/lv_utils.h @@ -35,6 +35,15 @@ extern "C" { */ char * lv_utils_num_to_str(int32_t num, char * buf); +/** + * Convert a fixed point number to string + * @param num a number + * @param number of digits after decimal point + * @param buf pointer to a `char` buffer. Buffer must be big enough for number. + * @return same as `buf` (just for convenience) + */ +char * lv_utils_num_to_str_fixed(int32_t num, int decimals, char * buf); + /** Searches base[0] to base[n - 1] for an item that matches *key. * * @note The function cmp must return negative if its first From 9e1c261eb019b13771e60fd734f2be3cdfe550d8 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 04:12:26 -0700 Subject: [PATCH 02/26] Added lv_utils_num_to_str_fixed --- src/lv_misc/lv_utils.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/lv_misc/lv_utils.c b/src/lv_misc/lv_utils.c index 1939af6f9..e95aab079 100644 --- a/src/lv_misc/lv_utils.c +++ b/src/lv_misc/lv_utils.c @@ -72,6 +72,42 @@ char * lv_utils_num_to_str(int32_t num, char * buf) return buf; } +/** + * Convert a fixed point number to string + * @param num a number + * @param number of digits after decimal point + * @param buf pointer to a `char` buffer. Buffer must be big enough for number. + * @return same as `buf` (just for convenience) + */ +char * lv_utils_num_to_str_fixed(int32_t num, int decimals, char * buf) +{ + uint16_t dec_power = 1; + for(int i=0; i 0) { + /*find end of string*/ + char * p = buf; + while(*p != 0) + p++; + *p++ = localeconv()->decimal_point[0]; + + /*now work backwards from end*/ + num = num % dec_power; + p += decimals; + *p-- = '\x0'; + + while(decimals > 0) { + char digit = num % 10; + *p-- = digit + 48; + decimals--; + num = num / 10; + } + } + return buf; +} + /** Searches base[0] to base[n - 1] for an item that matches *key. * * @note The function cmp must return negative if its first From 0e5d99d1592d4afa3d437b27d6d0c991365e5b7c Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 04:14:58 -0700 Subject: [PATCH 03/26] Added gauge value format function --- src/lv_widgets/lv_gauge.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lv_widgets/lv_gauge.h b/src/lv_widgets/lv_gauge.h index 436fefb0b..655a4be22 100644 --- a/src/lv_widgets/lv_gauge.h +++ b/src/lv_widgets/lv_gauge.h @@ -35,6 +35,8 @@ extern "C" { * TYPEDEFS **********************/ +typedef void (*value_format_type)(lv_obj_t * gauge, char buf[], int bufsize, lv_gauge_value_t value); + /*Data of gauge*/ typedef struct { lv_linemeter_ext_t lmeter; /*Ext. of ancestor*/ @@ -47,6 +49,7 @@ typedef struct { lv_style_list_t style_strong; uint8_t needle_count; /*Number of needles*/ uint8_t label_count; /*Number of labels on the scale*/ + value_format_type value_format_cb; } lv_gauge_ext_t; /*Styles*/ @@ -144,6 +147,13 @@ static inline void lv_gauge_set_angle_offset(lv_obj_t * gauge, uint16_t angle) */ void lv_gauge_set_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivot_x, lv_coord_t pivot_y); +/** + * Assign a function to format gauge values + * @param gauge pointer to a gauge object + * @param value_format_fn pointer to function of value_format_type + */ +void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn); + /*===================== * Getter functions *====================*/ From 72b9a2b7395f630ee3fb4805dcb5c41e7565ad02 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 04:17:43 -0700 Subject: [PATCH 04/26] Added gauge label format function --- src/lv_widgets/lv_gauge.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index f353cc282..cceda8096 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -84,6 +84,7 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) ext->values = NULL; ext->needle_colors = NULL; ext->label_count = LV_GAUGE_DEF_LABEL_COUNT; + ext->value_format_cb = NULL; ext->needle_img = 0; ext->needle_img_pivot.x = 0; @@ -118,6 +119,7 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) ext->values[i] = copy_ext->values[i]; } ext->label_count = copy_ext->label_count; + ext->value_format_cb = copy_ext->value_format_cb; /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_gauge, LV_STYLE_PROP_ALL); @@ -237,6 +239,20 @@ void lv_gauge_set_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivo lv_obj_invalidate(gauge); } +/** + * Assign a function to format gauge values + * @param gauge pointer to a gauge object + * @param value_format_fn pointer to function of value_format_type + */ +void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn) +{ + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); + + ext->value_format_cb = value_format_fn; +} + /*===================== * Getter functions *====================*/ @@ -474,8 +490,11 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) int16_t scale_act = (int32_t)((int32_t)(max - min) * i) / (label_num - 1); scale_act += min; - lv_utils_num_to_str(scale_act, scale_txt); - + if(ext->value_format_cb == NULL) + lv_utils_num_to_str(scale_act, scale_txt); + else + ext->value_format_cb(gauge, scale_txt, sizeof(scale_txt), scale_act); + lv_area_t label_cord; lv_point_t label_size; lv_txt_get_size(&label_size, scale_txt, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, From 61e296dc2a842c5d063288e092b3baf4417d70e5 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 04:27:56 -0700 Subject: [PATCH 05/26] Remove locale reference --- src/lv_misc/lv_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lv_misc/lv_utils.c b/src/lv_misc/lv_utils.c index e95aab079..6451a89e3 100644 --- a/src/lv_misc/lv_utils.c +++ b/src/lv_misc/lv_utils.c @@ -91,7 +91,7 @@ char * lv_utils_num_to_str_fixed(int32_t num, int decimals, char * buf) char * p = buf; while(*p != 0) p++; - *p++ = localeconv()->decimal_point[0]; + *p++ = '.'; /*now work backwards from end*/ num = num % dec_power; From 17759f79322845861131875b1a8a8497ca2d99fe Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 09:43:05 -0700 Subject: [PATCH 06/26] Added gauge & linemeter value typedefs --- lv_conf_template.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lv_conf_template.h b/lv_conf_template.h index 6919bbf70..97a12a767 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -488,6 +488,8 @@ typedef void * lv_obj_user_data_t; /*Gauge (dependencies:lv_bar, lv_linemeter)*/ #define LV_USE_GAUGE 1 +/*Type for gauge min, max, value*/ +typedef int16_t lv_gauge_value_t; /*Image (dependencies: lv_label*/ #define LV_USE_IMG 1 @@ -537,6 +539,8 @@ typedef void * lv_obj_user_data_t; /*Line meter (dependencies: *;)*/ #define LV_USE_LINEMETER 1 +/*Type for line meter min, max, value*/ +typedef int16_t lv_linemeter_value_t; /*Mask (dependencies: -)*/ #define LV_USE_OBJMASK 0 From be685a648e4f924807bf133ed27941b87a6cac74 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 09:44:44 -0700 Subject: [PATCH 07/26] Use lv_linemeter_value_t for value data type --- src/lv_widgets/lv_linemeter.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lv_widgets/lv_linemeter.h b/src/lv_widgets/lv_linemeter.h index 27691ea38..0b4ae5f49 100644 --- a/src/lv_widgets/lv_linemeter.h +++ b/src/lv_widgets/lv_linemeter.h @@ -33,9 +33,9 @@ typedef struct { uint16_t scale_angle; /*Angle of the scale in deg. (0..360)*/ uint16_t angle_ofs; uint16_t line_cnt; /*Count of lines */ - int16_t cur_value; - int16_t min_value; - int16_t max_value; + lv_linemeter_value_t cur_value; + lv_linemeter_value_t min_value; + lv_linemeter_value_t max_value; } lv_linemeter_ext_t; /*Styles*/ @@ -68,7 +68,7 @@ lv_obj_t * lv_linemeter_create(lv_obj_t * par, const lv_obj_t * copy); * @param lmeter pointer to a line meter object * @param value new value */ -void lv_linemeter_set_value(lv_obj_t * lmeter, int16_t value); +void lv_linemeter_set_value(lv_obj_t * lmeter, lv_linemeter_value_t value); /** * Set minimum and the maximum values of a line meter @@ -76,7 +76,7 @@ void lv_linemeter_set_value(lv_obj_t * lmeter, int16_t value); * @param min minimum value * @param max maximum value */ -void lv_linemeter_set_range(lv_obj_t * lmeter, int16_t min, int16_t max); +void lv_linemeter_set_range(lv_obj_t * lmeter, lv_linemeter_value_t min, lv_linemeter_value_t max); /** * Set the scale settings of a line meter @@ -102,21 +102,21 @@ void lv_linemeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle); * @param lmeter pointer to a line meter object * @return the value of the line meter */ -int16_t lv_linemeter_get_value(const lv_obj_t * lmeter); +lv_linemeter_value_t lv_linemeter_get_value(const lv_obj_t * lmeter); /** * Get the minimum value of a line meter * @param lmeter pointer to a line meter object * @return the minimum value of the line meter */ -int16_t lv_linemeter_get_min_value(const lv_obj_t * lmeter); +lv_linemeter_value_t lv_linemeter_get_min_value(const lv_obj_t * lmeter); /** * Get the maximum value of a line meter * @param lmeter pointer to a line meter object * @return the maximum value of the line meter */ -int16_t lv_linemeter_get_max_value(const lv_obj_t * lmeter); +lv_linemeter_value_t lv_linemeter_get_max_value(const lv_obj_t * lmeter); /** * Get the scale number of a line meter From 69a726940e3a96900082a0f51af4c0e35f2fed6b Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 09:45:44 -0700 Subject: [PATCH 08/26] Use lv_linemeter_value_t for value data type --- src/lv_widgets/lv_linemeter.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lv_widgets/lv_linemeter.c b/src/lv_widgets/lv_linemeter.c index e6fe6af94..d45ea069f 100644 --- a/src/lv_widgets/lv_linemeter.c +++ b/src/lv_widgets/lv_linemeter.c @@ -113,7 +113,7 @@ lv_obj_t * lv_linemeter_create(lv_obj_t * par, const lv_obj_t * copy) * @param lmeter pointer to a line meter object * @param value new value */ -void lv_linemeter_set_value(lv_obj_t * lmeter, int16_t value) +void lv_linemeter_set_value(lv_obj_t * lmeter, lv_linemeter_value_t value) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -131,7 +131,7 @@ void lv_linemeter_set_value(lv_obj_t * lmeter, int16_t value) * @param min minimum value * @param max maximum value */ -void lv_linemeter_set_range(lv_obj_t * lmeter, int16_t min, int16_t max) +void lv_linemeter_set_range(lv_obj_t * lmeter, lv_linemeter_value_t min, lv_linemeter_value_t max) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -194,7 +194,7 @@ void lv_linemeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle) * @param lmeter pointer to a line meter object * @return the value of the line meter */ -int16_t lv_linemeter_get_value(const lv_obj_t * lmeter) +lv_linemeter_value_t lv_linemeter_get_value(const lv_obj_t * lmeter) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -207,7 +207,7 @@ int16_t lv_linemeter_get_value(const lv_obj_t * lmeter) * @param lmeter pointer to a line meter object * @return the minimum value of the line meter */ -int16_t lv_linemeter_get_min_value(const lv_obj_t * lmeter) +lv_linemeter_value_t lv_linemeter_get_min_value(const lv_obj_t * lmeter) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -220,7 +220,7 @@ int16_t lv_linemeter_get_min_value(const lv_obj_t * lmeter) * @param lmeter pointer to a line meter object * @return the maximum value of the line meter */ -int16_t lv_linemeter_get_max_value(const lv_obj_t * lmeter) +lv_linemeter_value_t lv_linemeter_get_max_value(const lv_obj_t * lmeter) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); From e990b1c521468adab2e7ad6f94d1f48bb0235d75 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 09:48:06 -0700 Subject: [PATCH 09/26] Use lv_gauge_value_t for value data type --- src/lv_widgets/lv_gauge.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lv_widgets/lv_gauge.h b/src/lv_widgets/lv_gauge.h index 655a4be22..d838d38f0 100644 --- a/src/lv_widgets/lv_gauge.h +++ b/src/lv_widgets/lv_gauge.h @@ -41,7 +41,7 @@ typedef void (*value_format_type)(lv_obj_t * gauge, char buf[], int bufsize, lv_ typedef struct { lv_linemeter_ext_t lmeter; /*Ext. of ancestor*/ /*New data for this type */ - int16_t * values; /*Array of the set values (for needles) */ + lv_gauge_value_t * values; /*Array of the set values (for needles) */ const lv_color_t * needle_colors; /*Color of the needles (lv_color_t my_colors[needle_num])*/ const void * needle_img; lv_point_t needle_img_pivot; @@ -92,7 +92,7 @@ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_co * @param needle_id the id of the needle * @param value the new value */ -void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int16_t value); +void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, lv_gauge_value_t value); /** * Set minimum and the maximum values of a gauge @@ -100,7 +100,7 @@ void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int16_t value); * @param min minimum value * @param max maximum value */ -static inline void lv_gauge_set_range(lv_obj_t * gauge, int16_t min, int16_t max) +static inline void lv_gauge_set_range(lv_obj_t * gauge, lv_gauge_value_t min, lv_gauge_value_t max) { lv_linemeter_set_range(gauge, min, max); } @@ -110,7 +110,7 @@ static inline void lv_gauge_set_range(lv_obj_t * gauge, int16_t min, int16_t max * @param gauge pointer to a gauge object * @param value the critical value */ -static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, int16_t value) +static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, lv_gauge_value_t value) { lv_linemeter_set_value(gauge, value); } @@ -164,7 +164,7 @@ void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn) * @param needle the id of the needle * @return the value of the needle [min,max] */ -int16_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle); +lv_gauge_value_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle); /** * Get the count of needles on a gauge @@ -178,7 +178,7 @@ uint8_t lv_gauge_get_needle_count(const lv_obj_t * gauge); * @param gauge pointer to a gauge object * @return the minimum value of the gauge */ -static inline int16_t lv_gauge_get_min_value(const lv_obj_t * lmeter) +static inline lv_gauge_value_t lv_gauge_get_min_value(const lv_obj_t * lmeter) { return lv_linemeter_get_min_value(lmeter); } @@ -188,7 +188,7 @@ static inline int16_t lv_gauge_get_min_value(const lv_obj_t * lmeter) * @param gauge pointer to a gauge object * @return the maximum value of the gauge */ -static inline int16_t lv_gauge_get_max_value(const lv_obj_t * lmeter) +static inline lv_gauge_value_t lv_gauge_get_max_value(const lv_obj_t * lmeter) { return lv_linemeter_get_max_value(lmeter); } @@ -198,7 +198,7 @@ static inline int16_t lv_gauge_get_max_value(const lv_obj_t * lmeter) * @param gauge pointer to a gauge object * @return the critical value */ -static inline int16_t lv_gauge_get_critical_value(const lv_obj_t * gauge) +static inline lv_gauge_value_t lv_gauge_get_critical_value(const lv_obj_t * gauge) { return lv_linemeter_get_value(gauge); } From 7581cfd8c1dfe1719f7486a9ad76e2f1552ffc95 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 09:50:16 -0700 Subject: [PATCH 10/26] Use lv_gauge_value_t for value data type --- src/lv_widgets/lv_gauge.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index cceda8096..19e499b20 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -175,7 +175,7 @@ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_co * @param needle_id the id of the needle * @param value the new value */ -void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int16_t value) +void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, lv_gauge_value_t value) { LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); @@ -263,7 +263,7 @@ void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn) * @param needle the id of the needle * @return the value of the needle [min,max] */ -int16_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle) +lv_gauge_value_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle) { LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); @@ -470,8 +470,8 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) int16_t scale_angle = lv_linemeter_get_scale_angle(gauge); uint16_t label_num = ext->label_count; int16_t angle_ofs = 90 + (360 - scale_angle) / 2; - int16_t min = lv_gauge_get_min_value(gauge); - int16_t max = lv_gauge_get_max_value(gauge); + lv_gauge_value_t min = lv_gauge_get_min_value(gauge); + lv_gauge_value_t max = lv_gauge_get_max_value(gauge); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); @@ -488,7 +488,7 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) lv_coord_t x = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r) / LV_TRIGO_SIN_MAX; x += x_ofs; - int16_t scale_act = (int32_t)((int32_t)(max - min) * i) / (label_num - 1); + lv_gauge_value_t scale_act = (lv_gauge_value_t)((lv_gauge_value_t)(max - min) * i) / (label_num - 1); scale_act += min; if(ext->value_format_cb == NULL) lv_utils_num_to_str(scale_act, scale_txt); From 5248e8953ff319a437f65f3fdb06c3edb1555b60 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Tue, 17 Mar 2020 16:13:55 -0700 Subject: [PATCH 11/26] Added lv_gauge_value_t and lv_linemeter_value_t typedefs --- tests/lv_test_conf.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/lv_test_conf.h b/tests/lv_test_conf.h index 3fe814868..cf47cc866 100644 --- a/tests/lv_test_conf.h +++ b/tests/lv_test_conf.h @@ -34,6 +34,8 @@ typedef void * lv_anim_user_data_t; typedef void * lv_group_user_data_t; typedef void * lv_fs_drv_user_data_t; typedef void * lv_img_decoder_user_data_t; +typedef int16_t lv_gauge_value_t; +typedef int16_t lv_linemeter_value_t; /********************** * GLOBAL PROTOTYPES From dd24c844f6cf97204d57a5776afa076afad22eeb Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 03:43:34 -0700 Subject: [PATCH 12/26] Undo typedef addition --- tests/lv_test_conf.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/lv_test_conf.h b/tests/lv_test_conf.h index cf47cc866..3fe814868 100644 --- a/tests/lv_test_conf.h +++ b/tests/lv_test_conf.h @@ -34,8 +34,6 @@ typedef void * lv_anim_user_data_t; typedef void * lv_group_user_data_t; typedef void * lv_fs_drv_user_data_t; typedef void * lv_img_decoder_user_data_t; -typedef int16_t lv_gauge_value_t; -typedef int16_t lv_linemeter_value_t; /********************** * GLOBAL PROTOTYPES From 7418f460547a6bcf31340681bb5c8027c6795697 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 03:46:44 -0700 Subject: [PATCH 13/26] Change value typedef to int32_t --- src/lv_widgets/lv_linemeter.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lv_widgets/lv_linemeter.h b/src/lv_widgets/lv_linemeter.h index 0b4ae5f49..592b5adbd 100644 --- a/src/lv_widgets/lv_linemeter.h +++ b/src/lv_widgets/lv_linemeter.h @@ -33,9 +33,9 @@ typedef struct { uint16_t scale_angle; /*Angle of the scale in deg. (0..360)*/ uint16_t angle_ofs; uint16_t line_cnt; /*Count of lines */ - lv_linemeter_value_t cur_value; - lv_linemeter_value_t min_value; - lv_linemeter_value_t max_value; + int32_t cur_value; + int32_t min_value; + int32_t max_value; } lv_linemeter_ext_t; /*Styles*/ @@ -68,7 +68,7 @@ lv_obj_t * lv_linemeter_create(lv_obj_t * par, const lv_obj_t * copy); * @param lmeter pointer to a line meter object * @param value new value */ -void lv_linemeter_set_value(lv_obj_t * lmeter, lv_linemeter_value_t value); +void lv_linemeter_set_value(lv_obj_t * lmeter, int32_t value); /** * Set minimum and the maximum values of a line meter @@ -76,7 +76,7 @@ void lv_linemeter_set_value(lv_obj_t * lmeter, lv_linemeter_value_t value); * @param min minimum value * @param max maximum value */ -void lv_linemeter_set_range(lv_obj_t * lmeter, lv_linemeter_value_t min, lv_linemeter_value_t max); +void lv_linemeter_set_range(lv_obj_t * lmeter, int32_t min, int32_t max); /** * Set the scale settings of a line meter @@ -102,21 +102,21 @@ void lv_linemeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle); * @param lmeter pointer to a line meter object * @return the value of the line meter */ -lv_linemeter_value_t lv_linemeter_get_value(const lv_obj_t * lmeter); +int32_t lv_linemeter_get_value(const lv_obj_t * lmeter); /** * Get the minimum value of a line meter * @param lmeter pointer to a line meter object * @return the minimum value of the line meter */ -lv_linemeter_value_t lv_linemeter_get_min_value(const lv_obj_t * lmeter); +int32_t lv_linemeter_get_min_value(const lv_obj_t * lmeter); /** * Get the maximum value of a line meter * @param lmeter pointer to a line meter object * @return the maximum value of the line meter */ -lv_linemeter_value_t lv_linemeter_get_max_value(const lv_obj_t * lmeter); +int32_t lv_linemeter_get_max_value(const lv_obj_t * lmeter); /** * Get the scale number of a line meter From e8d527f2d9e649c44215a3d11a1525d46288660b Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 03:47:23 -0700 Subject: [PATCH 14/26] Change value typedef to int32_t --- src/lv_widgets/lv_linemeter.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lv_widgets/lv_linemeter.c b/src/lv_widgets/lv_linemeter.c index d45ea069f..c01064901 100644 --- a/src/lv_widgets/lv_linemeter.c +++ b/src/lv_widgets/lv_linemeter.c @@ -113,7 +113,7 @@ lv_obj_t * lv_linemeter_create(lv_obj_t * par, const lv_obj_t * copy) * @param lmeter pointer to a line meter object * @param value new value */ -void lv_linemeter_set_value(lv_obj_t * lmeter, lv_linemeter_value_t value) +void lv_linemeter_set_value(lv_obj_t * lmeter, int32_t value) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -131,7 +131,7 @@ void lv_linemeter_set_value(lv_obj_t * lmeter, lv_linemeter_value_t value) * @param min minimum value * @param max maximum value */ -void lv_linemeter_set_range(lv_obj_t * lmeter, lv_linemeter_value_t min, lv_linemeter_value_t max) +void lv_linemeter_set_range(lv_obj_t * lmeter, int32_t min, int32_t max) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -194,7 +194,7 @@ void lv_linemeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle) * @param lmeter pointer to a line meter object * @return the value of the line meter */ -lv_linemeter_value_t lv_linemeter_get_value(const lv_obj_t * lmeter) +int32_t lv_linemeter_get_value(const lv_obj_t * lmeter) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -207,7 +207,7 @@ lv_linemeter_value_t lv_linemeter_get_value(const lv_obj_t * lmeter) * @param lmeter pointer to a line meter object * @return the minimum value of the line meter */ -lv_linemeter_value_t lv_linemeter_get_min_value(const lv_obj_t * lmeter) +int32_t lv_linemeter_get_min_value(const lv_obj_t * lmeter) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); @@ -220,7 +220,7 @@ lv_linemeter_value_t lv_linemeter_get_min_value(const lv_obj_t * lmeter) * @param lmeter pointer to a line meter object * @return the maximum value of the line meter */ -lv_linemeter_value_t lv_linemeter_get_max_value(const lv_obj_t * lmeter) +int32_t lv_linemeter_get_max_value(const lv_obj_t * lmeter) { LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); From ae64c3ebf3d0520cc010cd1a33389ad31ecd5204 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 03:48:38 -0700 Subject: [PATCH 15/26] Removed gauge and line meter value typedef --- lv_conf_template.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lv_conf_template.h b/lv_conf_template.h index 97a12a767..6919bbf70 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -488,8 +488,6 @@ typedef void * lv_obj_user_data_t; /*Gauge (dependencies:lv_bar, lv_linemeter)*/ #define LV_USE_GAUGE 1 -/*Type for gauge min, max, value*/ -typedef int16_t lv_gauge_value_t; /*Image (dependencies: lv_label*/ #define LV_USE_IMG 1 @@ -539,8 +537,6 @@ typedef int16_t lv_gauge_value_t; /*Line meter (dependencies: *;)*/ #define LV_USE_LINEMETER 1 -/*Type for line meter min, max, value*/ -typedef int16_t lv_linemeter_value_t; /*Mask (dependencies: -)*/ #define LV_USE_OBJMASK 0 From 982c65da930853ce6b357accae92318301dcf345 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 03:49:50 -0700 Subject: [PATCH 16/26] Changed value typedef to int32_t --- src/lv_widgets/lv_gauge.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lv_widgets/lv_gauge.h b/src/lv_widgets/lv_gauge.h index d838d38f0..a85d51f3a 100644 --- a/src/lv_widgets/lv_gauge.h +++ b/src/lv_widgets/lv_gauge.h @@ -41,7 +41,7 @@ typedef void (*value_format_type)(lv_obj_t * gauge, char buf[], int bufsize, lv_ typedef struct { lv_linemeter_ext_t lmeter; /*Ext. of ancestor*/ /*New data for this type */ - lv_gauge_value_t * values; /*Array of the set values (for needles) */ + int32_t * values; /*Array of the set values (for needles) */ const lv_color_t * needle_colors; /*Color of the needles (lv_color_t my_colors[needle_num])*/ const void * needle_img; lv_point_t needle_img_pivot; @@ -92,7 +92,7 @@ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_co * @param needle_id the id of the needle * @param value the new value */ -void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, lv_gauge_value_t value); +void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int32_t value); /** * Set minimum and the maximum values of a gauge @@ -100,7 +100,7 @@ void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, lv_gauge_value_t va * @param min minimum value * @param max maximum value */ -static inline void lv_gauge_set_range(lv_obj_t * gauge, lv_gauge_value_t min, lv_gauge_value_t max) +static inline void lv_gauge_set_range(lv_obj_t * gauge, int32_t min, int32_t max) { lv_linemeter_set_range(gauge, min, max); } @@ -110,7 +110,7 @@ static inline void lv_gauge_set_range(lv_obj_t * gauge, lv_gauge_value_t min, lv * @param gauge pointer to a gauge object * @param value the critical value */ -static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, lv_gauge_value_t value) +static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, int32_t value) { lv_linemeter_set_value(gauge, value); } @@ -164,7 +164,7 @@ void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn) * @param needle the id of the needle * @return the value of the needle [min,max] */ -lv_gauge_value_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle); +int32_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle); /** * Get the count of needles on a gauge @@ -178,7 +178,7 @@ uint8_t lv_gauge_get_needle_count(const lv_obj_t * gauge); * @param gauge pointer to a gauge object * @return the minimum value of the gauge */ -static inline lv_gauge_value_t lv_gauge_get_min_value(const lv_obj_t * lmeter) +static inline int32_t lv_gauge_get_min_value(const lv_obj_t * lmeter) { return lv_linemeter_get_min_value(lmeter); } @@ -188,7 +188,7 @@ static inline lv_gauge_value_t lv_gauge_get_min_value(const lv_obj_t * lmeter) * @param gauge pointer to a gauge object * @return the maximum value of the gauge */ -static inline lv_gauge_value_t lv_gauge_get_max_value(const lv_obj_t * lmeter) +static inline int32_t lv_gauge_get_max_value(const lv_obj_t * lmeter) { return lv_linemeter_get_max_value(lmeter); } @@ -198,7 +198,7 @@ static inline lv_gauge_value_t lv_gauge_get_max_value(const lv_obj_t * lmeter) * @param gauge pointer to a gauge object * @return the critical value */ -static inline lv_gauge_value_t lv_gauge_get_critical_value(const lv_obj_t * gauge) +static inline int32_t lv_gauge_get_critical_value(const lv_obj_t * gauge) { return lv_linemeter_get_value(gauge); } From 9a5acbcb4f81f10f3fd129da924952c7b0ec1418 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 03:51:19 -0700 Subject: [PATCH 17/26] Changed value typedef to int32_t --- src/lv_widgets/lv_gauge.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index 19e499b20..7d39d5128 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -175,7 +175,7 @@ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_co * @param needle_id the id of the needle * @param value the new value */ -void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, lv_gauge_value_t value) +void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int32_t value) { LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); @@ -263,7 +263,7 @@ void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn) * @param needle the id of the needle * @return the value of the needle [min,max] */ -lv_gauge_value_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle) +int32_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle) { LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); @@ -470,8 +470,8 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) int16_t scale_angle = lv_linemeter_get_scale_angle(gauge); uint16_t label_num = ext->label_count; int16_t angle_ofs = 90 + (360 - scale_angle) / 2; - lv_gauge_value_t min = lv_gauge_get_min_value(gauge); - lv_gauge_value_t max = lv_gauge_get_max_value(gauge); + int32_t min = lv_gauge_get_min_value(gauge); + int32_t max = lv_gauge_get_max_value(gauge); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); @@ -488,7 +488,7 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) lv_coord_t x = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r) / LV_TRIGO_SIN_MAX; x += x_ofs; - lv_gauge_value_t scale_act = (lv_gauge_value_t)((lv_gauge_value_t)(max - min) * i) / (label_num - 1); + int32_t scale_act = (int32_t)((int32_t)(max - min) * i) / (label_num - 1); scale_act += min; if(ext->value_format_cb == NULL) lv_utils_num_to_str(scale_act, scale_txt); From cd5084cd6467f7e6e64fb885924cde9fcde52e72 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 04:15:38 -0700 Subject: [PATCH 18/26] Renamed lv_gauge_format_cb_t --- src/lv_widgets/lv_gauge.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lv_widgets/lv_gauge.h b/src/lv_widgets/lv_gauge.h index a85d51f3a..1c26f4078 100644 --- a/src/lv_widgets/lv_gauge.h +++ b/src/lv_widgets/lv_gauge.h @@ -35,7 +35,7 @@ extern "C" { * TYPEDEFS **********************/ -typedef void (*value_format_type)(lv_obj_t * gauge, char buf[], int bufsize, lv_gauge_value_t value); +typedef void (*lv_gauge_format_cb_t)(lv_obj_t * gauge, char buf[], int bufsize, int32_t value); /*Data of gauge*/ typedef struct { @@ -49,7 +49,7 @@ typedef struct { lv_style_list_t style_strong; uint8_t needle_count; /*Number of needles*/ uint8_t label_count; /*Number of labels on the scale*/ - value_format_type value_format_cb; + lv_gauge_format_cb_t format_cb; } lv_gauge_ext_t; /*Styles*/ @@ -150,9 +150,9 @@ void lv_gauge_set_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivo /** * Assign a function to format gauge values * @param gauge pointer to a gauge object - * @param value_format_fn pointer to function of value_format_type + * @param format_cb pointer to function of lv_gauge_format_cb_t */ -void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn); +void lv_gauge_set_formatter_cb(lv_obj_t * gauge, lv_gauge_format_cb_t format_cb); /*===================== * Getter functions From 9846c3f62c35de1d5671692481234ab69da35243 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 04:17:11 -0700 Subject: [PATCH 19/26] Renamed lv_gauge_format_cb_t --- src/lv_widgets/lv_gauge.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index 7d39d5128..a4f4e3935 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -84,7 +84,7 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) ext->values = NULL; ext->needle_colors = NULL; ext->label_count = LV_GAUGE_DEF_LABEL_COUNT; - ext->value_format_cb = NULL; + ext->format_cb = NULL; ext->needle_img = 0; ext->needle_img_pivot.x = 0; @@ -119,7 +119,7 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) ext->values[i] = copy_ext->values[i]; } ext->label_count = copy_ext->label_count; - ext->value_format_cb = copy_ext->value_format_cb; + ext->format_cb = copy_ext->format_cb; /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_gauge, LV_STYLE_PROP_ALL); @@ -242,15 +242,15 @@ void lv_gauge_set_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivo /** * Assign a function to format gauge values * @param gauge pointer to a gauge object - * @param value_format_fn pointer to function of value_format_type + * @param format_cb pointer to function of lv_gauge_format_cb_t */ -void lv_gauge_set_formatter(lv_obj_t * gauge, value_format_type value_format_fn) +void lv_gauge_set_formatter_cb(lv_obj_t * gauge, lv_gauge_format_cb_t format_cb) { LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); - ext->value_format_cb = value_format_fn; + ext->format_cb = format_cb; } /*===================== @@ -490,10 +490,10 @@ static void lv_gauge_draw_labels(lv_obj_t * gauge, const lv_area_t * mask) int32_t scale_act = (int32_t)((int32_t)(max - min) * i) / (label_num - 1); scale_act += min; - if(ext->value_format_cb == NULL) + if(ext->format_cb == NULL) lv_utils_num_to_str(scale_act, scale_txt); else - ext->value_format_cb(gauge, scale_txt, sizeof(scale_txt), scale_act); + ext->format_cb(gauge, scale_txt, sizeof(scale_txt), scale_act); lv_area_t label_cord; lv_point_t label_size; From 41117ac0a9127765b4c4063ae74bc90519e0b0a3 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 15:24:17 -0700 Subject: [PATCH 20/26] Added lv_utils_set_decimal_separator --- src/lv_misc/lv_utils.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/lv_misc/lv_utils.h b/src/lv_misc/lv_utils.h index 33e462b39..17c221344 100644 --- a/src/lv_misc/lv_utils.h +++ b/src/lv_misc/lv_utils.h @@ -38,12 +38,18 @@ char * lv_utils_num_to_str(int32_t num, char * buf); /** * Convert a fixed point number to string * @param num a number - * @param number of digits after decimal point + * @param decimals number of digits after decimal point * @param buf pointer to a `char` buffer. Buffer must be big enough for number. * @return same as `buf` (just for convenience) */ -char * lv_utils_num_to_str_fixed(int32_t num, int decimals, char * buf); - +char * lv_utils_num_to_str_fixed(int32_t num, int32_t decimals, char * buf, size_t bufsize); + +/** + * Set the decimal separator character used by lv_utils_num_to_str_fixed + * @param separator the decimal separator char + */ +void lv_utils_set_decimal_separator(char separator); + /** Searches base[0] to base[n - 1] for an item that matches *key. * * @note The function cmp must return negative if its first From cc8667482ffa464495d149b3f4a48c9dd2834e9c Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 15:26:43 -0700 Subject: [PATCH 21/26] Added lv_utils_set_decimal_separator --- src/lv_misc/lv_utils.c | 44 ++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/src/lv_misc/lv_utils.c b/src/lv_misc/lv_utils.c index 6451a89e3..7c06e8a1b 100644 --- a/src/lv_misc/lv_utils.c +++ b/src/lv_misc/lv_utils.c @@ -26,6 +26,7 @@ /********************** * STATIC VARIABLES **********************/ +static char decimal_separator[2] = "."; /********************** * MACROS @@ -75,39 +76,28 @@ char * lv_utils_num_to_str(int32_t num, char * buf) /** * Convert a fixed point number to string * @param num a number - * @param number of digits after decimal point - * @param buf pointer to a `char` buffer. Buffer must be big enough for number. + * @param decimals number of digits after decimal point + * @param buf pointer to a `char` buffer + * @param bufsize length of buffer * @return same as `buf` (just for convenience) */ -char * lv_utils_num_to_str_fixed(int32_t num, int decimals, char * buf) +char * lv_utils_num_to_str_fixed(int32_t num, int32_t decimals, char * buf, size_t bufsize) { - uint16_t dec_power = 1; - for(int i=0; i 0) { - /*find end of string*/ - char * p = buf; - while(*p != 0) - p++; - *p++ = '.'; - - /*now work backwards from end*/ - num = num % dec_power; - p += decimals; - *p-- = '\x0'; - - while(decimals > 0) { - char digit = num % 10; - *p-- = digit + 48; - decimals--; - num = num / 10; - } - } + lv_snprintf(buf, bufsize, "%0*d", decimals+1, num); + if(decimals > 0) + lv_txt_ins(buf, strlen(buf) - decimals, decimal_separator); return buf; } +/** + * Set the decimal separator character used by lv_utils_num_to_str_fixed + * @param separator the decimal separator char + */ +void lv_utils_set_decimal_separator(char separator) +{ + decimal_separator[0] = separator; +} + /** Searches base[0] to base[n - 1] for an item that matches *key. * * @note The function cmp must return negative if its first From d3127af4c762e566589ffbdb144d2936d3ae9a67 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 15:28:11 -0700 Subject: [PATCH 22/26] Fixed function comment --- src/lv_misc/lv_utils.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lv_misc/lv_utils.h b/src/lv_misc/lv_utils.h index 17c221344..e2a61d6ee 100644 --- a/src/lv_misc/lv_utils.h +++ b/src/lv_misc/lv_utils.h @@ -39,7 +39,8 @@ char * lv_utils_num_to_str(int32_t num, char * buf); * Convert a fixed point number to string * @param num a number * @param decimals number of digits after decimal point - * @param buf pointer to a `char` buffer. Buffer must be big enough for number. + * @param buf pointer to a `char` buffer + * @param bufsize length of buffer * @return same as `buf` (just for convenience) */ char * lv_utils_num_to_str_fixed(int32_t num, int32_t decimals, char * buf, size_t bufsize); From 7c3e20af49dc5282266df8e76595e9e5dbe71f61 Mon Sep 17 00:00:00 2001 From: xennex22 <25083624+xennex22@users.noreply.github.com> Date: Fri, 20 Mar 2020 15:30:51 -0700 Subject: [PATCH 23/26] Added includes --- src/lv_misc/lv_utils.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lv_misc/lv_utils.c b/src/lv_misc/lv_utils.c index 7c06e8a1b..c8f44ec87 100644 --- a/src/lv_misc/lv_utils.c +++ b/src/lv_misc/lv_utils.c @@ -10,6 +10,8 @@ #include "lv_utils.h" #include "lv_math.h" +#include "lv_printf.h" +#include "lv_txt.h" /********************* * DEFINES From f4ececf7c70f44f8945a830a3c6be0200301995d Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 24 Mar 2020 20:14:19 +0100 Subject: [PATCH 24/26] add lv_anim_get --- src/lv_misc/lv_anim.c | 20 +++++++++++++++++++- src/lv_misc/lv_anim.h | 10 ++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lv_misc/lv_anim.c b/src/lv_misc/lv_anim.c index 55e155109..cb46da69e 100644 --- a/src/lv_misc/lv_anim.c +++ b/src/lv_misc/lv_anim.c @@ -106,7 +106,6 @@ void lv_anim_start(lv_anim_t * a) if(new_anim == NULL) return; /*Initialize the animation descriptor*/ - a->playback_now = 0; a->time_orig = a->time; memcpy(new_anim, a, sizeof(lv_anim_t)); @@ -153,6 +152,25 @@ bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb) return del; } +/** + * Get the animation of a variable and its `exec_cb`. + * @param var pointer to variable + * @param exec_cb a function pointer which is animating 'var', + * or NULL to delete all the animations of 'var' + * @return pointer to the animation. + */ +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) { + if(a->var == var && a->exec_cb == exec_cb) { + return a; + } + } + + return NULL; +} + /** * Get the number of currently running animations * @return the number of running animations diff --git a/src/lv_misc/lv_anim.h b/src/lv_misc/lv_anim.h index 6b45652da..c9583810e 100644 --- a/src/lv_misc/lv_anim.h +++ b/src/lv_misc/lv_anim.h @@ -279,6 +279,16 @@ static inline int32_t lv_anim_get_delay(lv_anim_t * a) */ bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb); + +/** + * Get the animation of a variable and its `exec_cb`. + * @param var pointer to variable + * @param exec_cb a function pointer which is animating 'var', + * or NULL to delete all the animations of 'var' + * @return pointer to the animation. + */ +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb); + /** * Delete an animation by getting the animated variable from `a`. * Only animations with `exec_cb` will be deleted. From 4e85f9df1c391f22b6f60709df9cf4c1330c0d08 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 24 Mar 2020 20:14:39 +0100 Subject: [PATCH 25/26] label: keep scroll position when the text changes --- src/lv_widgets/lv_label.c | 62 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/src/lv_widgets/lv_label.c b/src/lv_widgets/lv_label.c index 0b9775701..e03528514 100644 --- a/src/lv_widgets/lv_label.c +++ b/src/lv_widgets/lv_label.c @@ -1220,6 +1220,27 @@ static void lv_label_refr_text(lv_obj_t * label) lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_x); lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); lv_anim_set_playback_time(&a, a.time); + + lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); + uint32_t act_time = 0; + bool playback_now = false; + if(anim_cur) { + act_time = anim_cur->act_time; + playback_now = anim_cur->playback_now; + } + if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + if(playback_now) { + a.playback_now = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start; + a.start = a.end; + a.end = tmp; + } + } + lv_anim_start(&a); hor_anim = true; } @@ -1234,6 +1255,27 @@ static void lv_label_refr_text(lv_obj_t * label) lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_y); lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); lv_anim_set_playback_time(&a, a.time); + + lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); + uint32_t act_time = 0; + bool playback_now = false; + if(anim_cur) { + act_time = anim_cur->act_time; + playback_now = anim_cur->playback_now; + } + if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + if(playback_now) { + a.playback_now = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start; + a.start = a.end; + a.end = tmp; + } + } + lv_anim_start(&a); } else { @@ -1250,16 +1292,20 @@ static void lv_label_refr_text(lv_obj_t * label) lv_anim_init(&a); lv_anim_set_var(&a, label); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINIT); - uint32_t delay = (((lv_font_get_glyph_width(font, ' ', ' ') + letter_space) * 1000) / - ext->anim_speed) * - LV_LABEL_WAIT_CHAR_COUNT; - lv_anim_set_delay(&a, delay); bool hor_anim = false; if(size.x > lv_area_get_width(&txt_coords)) { lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_x); lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); + + lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); + uint32_t act_time = anim_cur ? anim_cur->act_time : 0; + if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + } + lv_anim_start(&a); hor_anim = true; } @@ -1273,6 +1319,14 @@ static void lv_label_refr_text(lv_obj_t * label) lv_anim_set_values(&a, 0, -size.y - (lv_font_get_line_height(font))); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_label_set_offset_y); lv_anim_set_time(&a, lv_anim_speed_to_time(ext->anim_speed, a.start, a.end)); + + lv_anim_t * anim_cur = lv_anim_get(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); + uint32_t act_time = anim_cur ? anim_cur->act_time : 0; + if(act_time < a.time) { + a.act_time = act_time; /*To keep the old position*/ + a.early_apply = 0; + } + lv_anim_start(&a); } else { From b4f8c715018adbf5cce28365f239e5c202676a40 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 24 Mar 2020 20:25:04 +0100 Subject: [PATCH 26/26] lv_dropdown_add_option: add invalidation --- src/lv_widgets/lv_dropdown.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lv_widgets/lv_dropdown.c b/src/lv_widgets/lv_dropdown.c index 99194fc94..48cd12936 100644 --- a/src/lv_widgets/lv_dropdown.c +++ b/src/lv_widgets/lv_dropdown.c @@ -332,6 +332,8 @@ void lv_dropdown_add_option(lv_obj_t * ddlist, const char * option, uint16_t pos lv_mem_buf_release(ins_buf); ext->option_cnt++; + + lv_obj_invalidate(ddlist); } /**