mirror of
https://github.com/lvgl/lvgl.git
synced 2026-03-23 22:39:09 +08:00
Chart ready
This commit is contained in:
@@ -61,7 +61,7 @@ static lv_charts_t lv_charts_def =
|
||||
.div_line_opa = 100,
|
||||
|
||||
/*Data lines*/
|
||||
.width = 10 * LV_STYLE_MULT, .col_space = 5 * LV_STYLE_MULT,
|
||||
.width = 3 * LV_STYLE_MULT,
|
||||
.data_opa = 100,
|
||||
.dark_eff = 150,
|
||||
.color[0] = COLOR_RED,
|
||||
@@ -111,6 +111,7 @@ lv_obj_t* lv_chart_create(lv_obj_t* par_dp, lv_obj_t * copy_dp)
|
||||
|
||||
/*Init the new chart background object*/
|
||||
if(copy_dp == NULL) {
|
||||
ext_dp->type = LV_CHART_COL;
|
||||
lv_obj_set_style(new_obj_dp, &lv_charts_def);
|
||||
lv_obj_set_signal_f(new_obj_dp, lv_chart_signal);
|
||||
lv_obj_set_design_f(new_obj_dp, lv_chart_design);
|
||||
@@ -121,9 +122,9 @@ lv_obj_t* lv_chart_create(lv_obj_t* par_dp, lv_obj_t * copy_dp)
|
||||
ext_dp->hdiv_num = LV_CHART_HDIV_DEF;
|
||||
ext_dp->vdiv_num = LV_CHART_VDIV_DEF;
|
||||
ext_dp->pnum = LV_CHART_PNUM_DEF;
|
||||
ext_dp->type = LV_CHART_POINT;
|
||||
} else {
|
||||
lv_chart_ext_t * ext_copy_dp = lv_obj_get_ext(copy_dp);
|
||||
ext_dp->type = ext_copy_dp->type;
|
||||
ext_dp->xmin = ext_copy_dp->xmin;
|
||||
ext_dp->xmax = ext_copy_dp->xmax;
|
||||
ext_dp->ymin = ext_copy_dp->ymin;
|
||||
@@ -131,7 +132,6 @@ lv_obj_t* lv_chart_create(lv_obj_t* par_dp, lv_obj_t * copy_dp)
|
||||
ext_dp->hdiv_num = ext_copy_dp->hdiv_num;
|
||||
ext_dp->vdiv_num = ext_copy_dp->vdiv_num;
|
||||
ext_dp->pnum = ext_copy_dp->pnum;
|
||||
ext_dp->type = ext_copy_dp->type;
|
||||
}
|
||||
|
||||
return new_obj_dp;
|
||||
@@ -176,6 +176,7 @@ cord_t * lv_chart_add_dataline(lv_obj_t* obj_dp)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
cord_t ** dl_dp = ll_ins_head(&ext_dp->dl_ll);
|
||||
cord_t def = (ext_dp->ymax - ext_dp->ymin) >> 2; /*1/4 range as default value*/
|
||||
|
||||
if(dl_dp == NULL) return NULL;
|
||||
|
||||
@@ -184,7 +185,7 @@ cord_t * lv_chart_add_dataline(lv_obj_t* obj_dp)
|
||||
uint16_t i;
|
||||
cord_t * p_tmp = *dl_dp;
|
||||
for(i = 0; i < ext_dp->pnum; i++) {
|
||||
*p_tmp = 20;//ext_dp->ymin;
|
||||
*p_tmp = def;
|
||||
p_tmp++;
|
||||
}
|
||||
|
||||
@@ -193,6 +194,14 @@ cord_t * lv_chart_add_dataline(lv_obj_t* obj_dp)
|
||||
return *dl_dp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh a chart if its data line has changed
|
||||
* @param obj_dp pionter to chart object
|
||||
*/
|
||||
void lv_chart_refr(lv_obj_t * obj_dp)
|
||||
{
|
||||
lv_obj_inv(obj_dp);
|
||||
}
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
@@ -229,6 +238,61 @@ void lv_chart_set_range(lv_obj_t * obj_dp, int32_t xmin, int32_t xmax, int32_t y
|
||||
ext_dp->xmax = xmax;
|
||||
ext_dp->ymin = ymin;
|
||||
ext_dp->ymax = ymax;
|
||||
|
||||
lv_chart_refr(obj_dp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a new type for a chart
|
||||
* @param obj_dp pointer to a chart object
|
||||
* @param type ew type of the chart (from 'lv_chart_type_t' enum)
|
||||
*/
|
||||
void lv_chart_set_type(lv_obj_t * obj_dp, lv_chart_type_t type)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
ext_dp->type = type;
|
||||
|
||||
lv_chart_refr(obj_dp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the number of points on a data line on a chart
|
||||
* @param obj_dp pointer r to chart object
|
||||
* @param pnum new number of points on the data lines
|
||||
*/
|
||||
void lv_chart_set_pnum(lv_obj_t * obj_dp, uint16_t pnum)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
cord_t ** y_data;
|
||||
|
||||
if(pnum < 1) pnum = 1;
|
||||
|
||||
LL_READ_BACK(ext_dp->dl_ll, y_data) {
|
||||
*y_data = dm_realloc(*y_data, sizeof(cord_t) * pnum);
|
||||
}
|
||||
|
||||
ext_dp->pnum = pnum;
|
||||
lv_chart_refr(obj_dp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift all data right and set the most right data on a data line
|
||||
* @param obj_dp pointer to chart object
|
||||
* @param dl_p pointer to a data line on 'obj_dp'
|
||||
* @param y the new value of the most right data
|
||||
*/
|
||||
void lv_chart_set_next(lv_obj_t * obj_dp, cord_t * dl_p, cord_t y)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
|
||||
uint16_t i;
|
||||
for(i = 0; i < ext_dp->pnum - 1; i++) {
|
||||
dl_p[i] = dl_p[i + 1];
|
||||
}
|
||||
|
||||
dl_p[ext_dp->pnum - 1] = y;
|
||||
lv_chart_refr(obj_dp);
|
||||
|
||||
}
|
||||
|
||||
/*=====================
|
||||
@@ -261,6 +325,29 @@ lv_charts_t * lv_charts_get(lv_charts_builtin_t style, lv_charts_t * copy_p)
|
||||
return style_p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type of a chart
|
||||
* @param obj_dp pointer to chart object
|
||||
* @return type of the chart (from 'lv_chart_t' enum)
|
||||
*/
|
||||
lv_chart_type_t lv_chart_get_type(lv_obj_t * obj_dp)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
|
||||
return ext_dp->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the data point number per data line on chart
|
||||
* @param obj_dp pointer to chart object
|
||||
* @return point number on each data line
|
||||
*/
|
||||
uint16_t lv_chart_get_pnum(lv_obj_t * obj_dp)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
|
||||
return ext_dp->pnum;
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
@@ -309,7 +396,11 @@ static bool lv_chart_design(lv_obj_t* obj_dp, const area_t * mask_p, lv_design_m
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw the division lines on chart background
|
||||
* @param obj_dp pointer to chart object
|
||||
* @param mask_p mask, inherited from the design function
|
||||
*/
|
||||
static void lv_chart_draw_div(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
@@ -342,6 +433,11 @@ static void lv_chart_draw_div(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw the data lines as lines on a chart
|
||||
* @param obj_dp pointer to chart object
|
||||
* @param mask_p mask, inherited from the design function
|
||||
*/
|
||||
static void lv_chart_draw_lines(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
@@ -361,6 +457,7 @@ static void lv_chart_draw_lines(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
lv_lines_t lines;
|
||||
lv_lines_get(LV_LINES_CHART, &lines);
|
||||
|
||||
/*Go through all data lines*/
|
||||
LL_READ_BACK(ext_dp->dl_ll, y_data) {
|
||||
|
||||
lines.objs.color = style_p->color[dl_cnt];
|
||||
@@ -376,7 +473,7 @@ static void lv_chart_draw_lines(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
p1.x = p2.x;
|
||||
p1.y = p2.y;
|
||||
|
||||
p2.x = (w / ext_dp->pnum) * i + x_ofs;
|
||||
p2.x = (w / (ext_dp->pnum - 1)) * i + x_ofs;
|
||||
|
||||
y_tmp = (int32_t)((int32_t) (*y_data)[i] - ext_dp->ymin) * h;
|
||||
y_tmp = y_tmp / (ext_dp->ymax - ext_dp->ymin);
|
||||
@@ -388,6 +485,11 @@ static void lv_chart_draw_lines(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw the data lines as points on a chart
|
||||
* @param obj_dp pointer to chart object
|
||||
* @param mask_p mask, inherited from the design function
|
||||
*/
|
||||
static void lv_chart_draw_points(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
@@ -404,19 +506,20 @@ static void lv_chart_draw_points(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
cord_t ** y_data;
|
||||
uint8_t dl_cnt = 0;
|
||||
lv_rects_t rects;
|
||||
cord_t rad = style_p->width >> 1;
|
||||
cord_t rad = style_p->width;
|
||||
|
||||
lv_rects_get(LV_RECTS_DEF, &rects);
|
||||
rects.bwidth = 0;
|
||||
rects.empty = 0;
|
||||
rects.round = LV_RECT_CIRCLE;
|
||||
|
||||
/*Go through all data lines*/
|
||||
LL_READ_BACK(ext_dp->dl_ll, y_data) {
|
||||
rects.objs.color = style_p->color[dl_cnt];
|
||||
rects.gcolor = color_mix(COLOR_BLACK, style_p->color[dl_cnt], style_p->dark_eff);
|
||||
|
||||
for(i = 0; i < ext_dp->pnum; i ++) {
|
||||
cir_a.x1 = (w / ext_dp->pnum) * i + x_ofs;
|
||||
cir_a.x1 = (w / (ext_dp->pnum - 1)) * i + x_ofs;
|
||||
cir_a.x2 = cir_a.x1 + rad;
|
||||
cir_a.x1 -= rad;
|
||||
|
||||
@@ -432,6 +535,11 @@ static void lv_chart_draw_points(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw the data lines as columns on a chart
|
||||
* @param obj_dp pointer to chart object
|
||||
* @param mask_p mask, inherited from the design function
|
||||
*/
|
||||
static void lv_chart_draw_cols(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
{
|
||||
lv_chart_ext_t * ext_dp = lv_obj_get_ext(obj_dp);
|
||||
@@ -448,6 +556,7 @@ static void lv_chart_draw_cols(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
cord_t ** y_data;
|
||||
uint8_t dl_cnt = 0;
|
||||
lv_rects_t rects;
|
||||
cord_t x_ofs = w / ((ext_dp->dl_num + 1) * ext_dp->pnum) / 2; /*Shift with a half col.*/
|
||||
|
||||
lv_rects_get(LV_RECTS_DEF, &rects);
|
||||
rects.bwidth = 0;
|
||||
@@ -455,17 +564,22 @@ static void lv_chart_draw_cols(lv_obj_t* obj_dp, const area_t * mask_p)
|
||||
rects.round = 0;
|
||||
|
||||
col_a.y2 = obj_dp->cords.y2;
|
||||
|
||||
/*Go through all data lines*/
|
||||
LL_READ_BACK(ext_dp->dl_ll, y_data) {
|
||||
rects.objs.color = style_p->color[dl_cnt];
|
||||
rects.gcolor = color_mix(COLOR_BLACK, style_p->color[dl_cnt], style_p->dark_eff);
|
||||
|
||||
for(i = 0; i < ext_dp->pnum; i ++) {
|
||||
/*Calculate the x coordinates. Suppose (dl_num + 1) * pnum columns */
|
||||
col_a.x1 = (int32_t)((int32_t)w * (i * (ext_dp->dl_num + 1) + dl_cnt)) /
|
||||
(ext_dp->pnum * (ext_dp->dl_num + 1)) + obj_dp->cords.x1;
|
||||
col_a.x2 = (int32_t)((int32_t)w * (i * (ext_dp->dl_num + 1) + dl_cnt + 1 )) /
|
||||
(ext_dp->pnum * (ext_dp->dl_num + 1)) + obj_dp->cords.x1 - 1;
|
||||
|
||||
col_a.x1 += x_ofs;
|
||||
col_a.x2 += x_ofs;
|
||||
|
||||
/*Calculate the x coordinates. Suppose dl_num * pnum columns */
|
||||
col_a.x1 = (int32_t)((int32_t)w * (i * ext_dp->dl_num + dl_cnt)) /
|
||||
(ext_dp->pnum * ext_dp->dl_num) + obj_dp->cords.x1;
|
||||
col_a.x2 = (int32_t)((int32_t)w * (i * ext_dp->dl_num + dl_cnt + 1 )) /
|
||||
(ext_dp->pnum * ext_dp->dl_num) + obj_dp->cords.x1 - 1;
|
||||
|
||||
y_tmp = (int32_t)((int32_t) (*y_data)[i] - ext_dp->ymin) * h;
|
||||
y_tmp = y_tmp / (ext_dp->ymax - ext_dp->ymin);
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_CHART_DL_NUM 8
|
||||
#define LV_CHART_DL_NUM 8 /*Max data line number. Used in the style.*/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
@@ -32,7 +32,7 @@ typedef enum
|
||||
LV_CHART_POINT,
|
||||
}lv_chart_type_t;
|
||||
|
||||
typedef int32_t lv_chart_range_t;
|
||||
typedef cord_t lv_chart_range_t;
|
||||
|
||||
/*Style of chart background*/
|
||||
typedef struct
|
||||
@@ -42,7 +42,6 @@ typedef struct
|
||||
uint8_t div_line_opa; /*Percentage of obj. opacity*/
|
||||
color_t color[LV_CHART_DL_NUM]; /*Line/Point/Col color */
|
||||
uint16_t width; /*Line width or point diameter*/
|
||||
cord_t col_space; /*Space between columns*/
|
||||
opa_t data_opa; /*Line/Point/Col opacity in the percentage of obj. opacity*/
|
||||
uint8_t dark_eff; /*Dark effect on the bottom of points and columns*/
|
||||
}lv_charts_t;
|
||||
@@ -89,6 +88,7 @@ void lv_chart_set_next(lv_obj_t * obj_dp, cord_t * dl_p, cord_t y);
|
||||
|
||||
lv_chart_type_t lv_chart_get_type(lv_obj_t * obj_dp);
|
||||
uint16_t lv_chart_get_pnum(lv_obj_t * obj_dp);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
Reference in New Issue
Block a user