1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

Merge branch 'master' of https://github.com/ali-rostami/lvgl into ali-rostami-master

This commit is contained in:
Gabor Kiss-Vamosi 2019-03-24 05:25:52 +01:00
commit 7c2abad471
2 changed files with 112 additions and 5 deletions

View File

@ -36,7 +36,9 @@ static void lv_chart_draw_points(lv_obj_t * chart, const lv_area_t * mask);
static void lv_chart_draw_cols(lv_obj_t * chart, const lv_area_t * mask);
static void lv_chart_draw_vertical_lines(lv_obj_t * chart, const lv_area_t * mask);
static void lv_chart_draw_areas(lv_obj_t * chart, const lv_area_t * mask);
static void lv_chart_inv_lines(lv_obj_t * chart, lv_chart_series_t * ser, uint16_t i);
static void lv_chart_inv_points(lv_obj_t * chart, lv_chart_series_t * ser, uint16_t i);
static void lv_chart_inv_cols(lv_obj_t * chart, lv_chart_series_t * ser, uint16_t i);
/**********************
* STATIC VARIABLES
**********************/
@ -380,12 +382,22 @@ void lv_chart_set_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t *
*/
void lv_chart_set_next(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y)
{
lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart);
lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart);
if(ext->update_mode == LV_CHART_MODE_SHIFT) {
ser->points[ser->start_point] = y; /*This was the place of the former left most value, after shifting it is the rightmost*/
ser->start_point = (ser->start_point + 1) % ext->point_cnt;
lv_chart_refresh(chart);
} else if(ext->update_mode == LV_CHART_MODE_CIRCULAR) {
static uint16_t x = 0;
ser->points[x] = y;
ser->points[ser->start_point] = y; /*This was the place of the former left most value, after shifting it is the rightmost*/
ser->start_point = (ser->start_point + 1) % ext->point_cnt;
if(ext->type & LV_CHART_TYPE_LINE) lv_chart_inv_lines(chart, ser, x);
if(ext->type & LV_CHART_TYPE_COLUMN) lv_chart_inv_cols(chart, ser, x);
if(ext->type & LV_CHART_TYPE_POINT) lv_chart_inv_points(chart, ser, x);
if(ext->type & LV_CHART_TYPE_VERTICAL_LINE) lv_chart_inv_lines(chart, ser, x);
lv_chart_refresh(chart);
x = (x + 1) % ext->point_cnt;/*update the x for next incoming y*/
}
}
/*=====================
@ -885,4 +897,90 @@ static void lv_chart_draw_areas(lv_obj_t * chart, const lv_area_t * mask)
}
}
/**
* invalid area of the new line data lines on a chart
* @param obj pointer to chart object
*/
static void lv_chart_inv_lines(lv_obj_t * chart, lv_chart_series_t * ser, uint16_t i)
{
lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart);
lv_coord_t w = lv_obj_get_width(chart);
lv_coord_t x_ofs = chart->coords.x1;
lv_coord_t p_prev;
lv_coord_t p_act;
if(i < ext->point_cnt) {
if(i == 0) {
p_prev = ser->start_point;
} else {
p_prev = (ser->start_point + (i - 1)) % ext->point_cnt;
}
p_act = (ser->start_point + i) % ext->point_cnt;
if(ser->points[p_prev] != LV_CHART_POINT_DEF && ser->points[p_act] != LV_CHART_POINT_DEF) {
lv_area_t coords;
lv_obj_get_coords(chart, &coords);
coords.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs - ext->series.width;
coords.x2 = ((w * (i + 1)) / (ext->point_cnt - 1)) + x_ofs + ext->series.width;
lv_inv_area(&coords);
}
}
}
/**
* invalid area of the new point data lines on a chart
* @param chart pointer to chart object
* @param mask mask, inherited from the design function
*/
static void lv_chart_inv_points(lv_obj_t * chart, lv_chart_series_t * ser, uint16_t i)
{
lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart);
lv_area_t cir_a;
lv_coord_t w = lv_obj_get_width(chart);
lv_coord_t x_ofs = chart->coords.x1;
lv_coord_t p_act;
lv_obj_get_coords(chart, &cir_a);
cir_a.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs;
cir_a.x2 = cir_a.x1 + ext->series.width;
cir_a.x1 -= ext->series.width;
p_act = (ser->start_point + i) % ext->point_cnt;
if(ser->points[p_act] != LV_CHART_POINT_DEF)
lv_inv_area(&cir_a);
}
/**
* invalid area of the new column data lines on a chart
* @param chart pointer to chart object
* @param mask mask, inherited from the design function
*/
static void lv_chart_inv_cols(lv_obj_t * chart, lv_chart_series_t * ser, uint16_t i)
{
lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart);
lv_area_t col_a;
lv_coord_t w = lv_obj_get_width(chart);
lv_coord_t col_w = w / ((ext->series.num + 1) * ext->point_cnt); /* Suppose + 1 series as separator*/
lv_coord_t x_ofs = col_w / 2; /*Shift with a half col.*/
lv_coord_t x_act;
x_act = (int32_t)((int32_t) w * i) / ext->point_cnt;
x_act += chart->coords.x1 + x_ofs;
lv_obj_get_coords(chart, &col_a);
col_a.x1 = x_act;
col_a.x2 = col_a.x1 + col_w;
//lv_coord_t p_act = (ser->start_point + i) % ext->point_cnt;
/*if(ser->points[p_act] != LV_CHART_POINT_DEF)*/ {
lv_inv_area(&col_a);
}
}
#endif

View File

@ -44,6 +44,14 @@ enum
};
typedef uint8_t lv_chart_type_t;
/*Chart update mode*/
enum
{
LV_CHART_MODE_SHIFT,
LV_CHART_MODE_CIRCULAR,
};
typedef uint8_t lv_chart_update_mode_t;
typedef struct
{
lv_coord_t * points;
@ -63,6 +71,7 @@ typedef struct
uint8_t vdiv_cnt; /*Number of vertical division lines*/
uint16_t point_cnt; /*Point number in a data line*/
lv_chart_type_t type; /*Line, column or point chart (from 'lv_chart_type_t')*/
uint8_t update_mode: 1;
struct {
lv_coord_t width; /*Line width or point radius*/
uint8_t num; /*Number of data lines in dl_ll*/