Merge pull request #1394 from Maldus512/master

Added mirror option for line meters
This commit is contained in:
Gabor Kiss-Vamosi
2020-02-29 21:23:53 +01:00
committed by GitHub
2 changed files with 47 additions and 3 deletions

View File

@@ -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->line_cnt = 21; /*Odd scale number looks better*/
ext->scale_angle = 240; /*(scale_num - 1) * N looks better */ ext->scale_angle = 240; /*(scale_num - 1) * N looks better */
ext->angle_ofs = 0; ext->angle_ofs = 0;
ext->mirrored = 0;
/*The signal and design functions are not copied so set them here*/ /*The signal and design functions are not copied so set them here*/
lv_obj_set_signal_cb(new_lmeter, lv_lmeter_signal); 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); 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, bool 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 * Getter functions
*====================*/ *====================*/
@@ -273,6 +288,18 @@ uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter)
return ext->angle_ofs; return ext->angle_ofs;
} }
/**
* get the mirror setting for the line meter
* @param lmeter pointer to a line meter object
* @return mirror (true or false)
*/
bool lv_lmeter_get_mirror(lv_obj_t * lmeter)
{
lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter);
return ext->mirrored;
}
/********************** /**********************
* STATIC FUNCTIONS * 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 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; 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 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); (int32_t)((int32_t)(ext->cur_value - ext->min_value) * ext->line_cnt) / (ext->max_value - ext->min_value);
uint8_t i; 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.x = x_out + x_ofs;
p1.y = y_out + y_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; style_tmp.line.color = style->line.color;
else { else {
style_tmp.line.color = 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); lv_draw_line(&p1, &p2, mask, &style_tmp, opa_scale);

View File

@@ -41,6 +41,7 @@ typedef struct
int16_t cur_value; int16_t cur_value;
int16_t min_value; int16_t min_value;
int16_t max_value; int16_t max_value;
uint8_t mirrored :1;
} lv_lmeter_ext_t; } lv_lmeter_ext_t;
/*Styles*/ /*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); 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, bool mirror);
/** /**
* Set the styles of a line meter * Set the styles of a line meter
* @param lmeter pointer to a line meter object * @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); 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 (true or false)
*/
bool lv_lmeter_get_mirror(lv_obj_t * lmeter);
/** /**
* Get the style of a line meter * Get the style of a line meter
* @param lmeter pointer to a line meter object * @param lmeter pointer to a line meter object