From 97c9971c2adcbf743cecd8a5752230435957d008 Mon Sep 17 00:00:00 2001 From: Mattia Maldini Date: Fri, 28 Feb 2020 15:36:19 +0100 Subject: [PATCH 1/4] Added mirror option for line meters --- src/lv_objx/lv_lmeter.c | 35 ++++++++++++++++++++++++++++++++--- src/lv_objx/lv_lmeter.h | 15 +++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/lv_objx/lv_lmeter.c b/src/lv_objx/lv_lmeter.c index d1f210149..7dd394d9f 100644 --- a/src/lv_objx/lv_lmeter.c +++ b/src/lv_objx/lv_lmeter.c @@ -77,6 +77,7 @@ lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy) ext->line_cnt = 21; /*Odd scale number looks better*/ ext->scale_angle = 240; /*(scale_num - 1) * N looks better */ ext->angle_ofs = 0; + ext->mirrored = 0; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_lmeter, lv_lmeter_signal); @@ -193,6 +194,20 @@ void lv_lmeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle) lv_obj_invalidate(lmeter); } +/** + * Set the orientation of the meter growth, clockwise or counterclockwise (mirrored) + * @param lmeter pointer to a line meter object + * @param mirror mirror setting + */ +void lv_lmeter_set_mirror(lv_obj_t *lmeter, uint8_t mirror) { + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); + if(ext->mirrored == mirror) return; + + ext->mirrored = mirror; + + lv_obj_invalidate(lmeter); +} + /*===================== * Getter functions *====================*/ @@ -273,6 +288,18 @@ uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter) return ext->angle_ofs; } + +/** + * get the mirror setting for the line meter + * @param lmeter pointer to a line meter object + * @return mirror (0 or 1) + */ +uint16_t lv_lmeter_get_mirror(lv_obj_t * lmeter) +{ + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); + + return ext->mirrored; +} /********************** * STATIC FUNCTIONS **********************/ @@ -315,7 +342,8 @@ static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_desig lv_coord_t x_ofs = lv_obj_get_width(lmeter) / 2 + lmeter->coords.x1; lv_coord_t y_ofs = lv_obj_get_height(lmeter) / 2 + lmeter->coords.y1; int16_t angle_ofs = ext->angle_ofs + 90 + (360 - ext->scale_angle) / 2; - int16_t level = + int16_t level = ext->mirrored ? + (int32_t)((int32_t)(ext->max_value - ext->cur_value) * ext->line_cnt) / (ext->max_value - ext->min_value) : (int32_t)((int32_t)(ext->cur_value - ext->min_value) * ext->line_cnt) / (ext->max_value - ext->min_value); uint8_t i; @@ -349,11 +377,12 @@ static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_desig p1.x = x_out + x_ofs; p1.y = y_out + y_ofs; - if(i >= level) + uint16_t index = ext->mirrored ? ext->line_cnt - i : i; + if((!ext->mirrored && i >= level) || (ext->mirrored && i <= level)) style_tmp.line.color = style->line.color; else { style_tmp.line.color = - lv_color_mix(style->body.grad_color, style->body.main_color, (255 * i) / ext->line_cnt); + lv_color_mix(style->body.grad_color, style->body.main_color, (255 * index) / ext->line_cnt); } lv_draw_line(&p1, &p2, mask, &style_tmp, opa_scale); diff --git a/src/lv_objx/lv_lmeter.h b/src/lv_objx/lv_lmeter.h index 6deac8ce8..576e11ffb 100644 --- a/src/lv_objx/lv_lmeter.h +++ b/src/lv_objx/lv_lmeter.h @@ -41,6 +41,7 @@ typedef struct int16_t cur_value; int16_t min_value; int16_t max_value; + uint8_t mirrored; } lv_lmeter_ext_t; /*Styles*/ @@ -96,6 +97,13 @@ void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint16_t line_cnt); */ void lv_lmeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle); +/** + * Set the orientation of the meter growth, clockwise or counterclockwise (mirrored) + * @param lmeter pointer to a line meter object + * @param mirror mirror setting + */ +void lv_lmeter_set_mirror(lv_obj_t *lmeter, uint8_t mirror); + /** * Set the styles of a line meter * @param lmeter pointer to a line meter object @@ -154,6 +162,13 @@ uint16_t lv_lmeter_get_scale_angle(const lv_obj_t * lmeter); */ uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter); +/** + * get the mirror setting for the line meter + * @param lmeter pointer to a line meter object + * @return mirror (0 or 1) + */ +uint16_t lv_lmeter_get_mirror(lv_obj_t * lmeter); + /** * Get the style of a line meter * @param lmeter pointer to a line meter object From 0303110dc3398169e3c7c293318fcee486abb523 Mon Sep 17 00:00:00 2001 From: Mattia Maldini Date: Sat, 29 Feb 2020 17:52:32 +0100 Subject: [PATCH 2/4] Update src/lv_objx/lv_lmeter.c Co-Authored-By: Gabor Kiss-Vamosi --- src/lv_objx/lv_lmeter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lv_objx/lv_lmeter.c b/src/lv_objx/lv_lmeter.c index 7dd394d9f..facea7429 100644 --- a/src/lv_objx/lv_lmeter.c +++ b/src/lv_objx/lv_lmeter.c @@ -199,7 +199,7 @@ void lv_lmeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle) * @param lmeter pointer to a line meter object * @param mirror mirror setting */ -void lv_lmeter_set_mirror(lv_obj_t *lmeter, uint8_t mirror) { +void lv_lmeter_set_mirror(lv_obj_t *lmeter, bool mirror) { lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); if(ext->mirrored == mirror) return; From ab4706bc09929a5206845f8bddf00c6f3213f5bc Mon Sep 17 00:00:00 2001 From: Mattia Maldini Date: Sat, 29 Feb 2020 17:53:05 +0100 Subject: [PATCH 3/4] Update src/lv_objx/lv_lmeter.h Co-Authored-By: Gabor Kiss-Vamosi --- src/lv_objx/lv_lmeter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lv_objx/lv_lmeter.h b/src/lv_objx/lv_lmeter.h index 576e11ffb..6ee746ee7 100644 --- a/src/lv_objx/lv_lmeter.h +++ b/src/lv_objx/lv_lmeter.h @@ -41,7 +41,7 @@ typedef struct int16_t cur_value; int16_t min_value; int16_t max_value; - uint8_t mirrored; + uint8_t mirrored :1; } lv_lmeter_ext_t; /*Styles*/ From acbcf109f946c6ed0e36f1a6394404e34de524ef Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Sat, 29 Feb 2020 21:22:58 +0100 Subject: [PATCH 4/4] lmeter: fix mirror prototypes --- src/lv_objx/lv_lmeter.c | 4 ++-- src/lv_objx/lv_lmeter.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lv_objx/lv_lmeter.c b/src/lv_objx/lv_lmeter.c index facea7429..8fdafb29d 100644 --- a/src/lv_objx/lv_lmeter.c +++ b/src/lv_objx/lv_lmeter.c @@ -292,9 +292,9 @@ uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter) /** * get the mirror setting for the line meter * @param lmeter pointer to a line meter object - * @return mirror (0 or 1) + * @return mirror (true or false) */ -uint16_t lv_lmeter_get_mirror(lv_obj_t * lmeter) +bool lv_lmeter_get_mirror(lv_obj_t * lmeter) { lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); diff --git a/src/lv_objx/lv_lmeter.h b/src/lv_objx/lv_lmeter.h index 6ee746ee7..10208f852 100644 --- a/src/lv_objx/lv_lmeter.h +++ b/src/lv_objx/lv_lmeter.h @@ -102,7 +102,7 @@ void lv_lmeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle); * @param lmeter pointer to a line meter object * @param mirror mirror setting */ -void lv_lmeter_set_mirror(lv_obj_t *lmeter, uint8_t mirror); +void lv_lmeter_set_mirror(lv_obj_t *lmeter, bool mirror); /** * Set the styles of a line meter @@ -165,9 +165,9 @@ uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter); /** * get the mirror setting for the line meter * @param lmeter pointer to a line meter object - * @return mirror (0 or 1) + * @return mirror (true or false) */ -uint16_t lv_lmeter_get_mirror(lv_obj_t * lmeter); +bool lv_lmeter_get_mirror(lv_obj_t * lmeter); /** * Get the style of a line meter