acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_example_chart_2.c (4495B)

      1 #include "../../lv_examples.h"
      2 #if LV_USE_CHART && LV_DRAW_COMPLEX && LV_BUILD_EXAMPLES
      3 
      4 static lv_obj_t * chart1;
      5 static lv_chart_series_t * ser1;
      6 static lv_chart_series_t * ser2;
      7 
      8 static void draw_event_cb(lv_event_t * e)
      9 {
     10     lv_obj_t * obj = lv_event_get_target(e);
     11 
     12     /*Add the faded area before the lines are drawn*/
     13     lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
     14     if(dsc->part == LV_PART_ITEMS) {
     15         if(!dsc->p1 || !dsc->p2) return;
     16 
     17         /*Add a line mask that keeps the area below the line*/
     18         lv_draw_mask_line_param_t line_mask_param;
     19         lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y,
     20                                       LV_DRAW_MASK_LINE_SIDE_BOTTOM);
     21         int16_t line_mask_id = lv_draw_mask_add(&line_mask_param, NULL);
     22 
     23         /*Add a fade effect: transparent bottom covering top*/
     24         lv_coord_t h = lv_obj_get_height(obj);
     25         lv_draw_mask_fade_param_t fade_mask_param;
     26         lv_draw_mask_fade_init(&fade_mask_param, &obj->coords, LV_OPA_COVER, obj->coords.y1 + h / 8, LV_OPA_TRANSP,
     27                                obj->coords.y2);
     28         int16_t fade_mask_id = lv_draw_mask_add(&fade_mask_param, NULL);
     29 
     30         /*Draw a rectangle that will be affected by the mask*/
     31         lv_draw_rect_dsc_t draw_rect_dsc;
     32         lv_draw_rect_dsc_init(&draw_rect_dsc);
     33         draw_rect_dsc.bg_opa = LV_OPA_20;
     34         draw_rect_dsc.bg_color = dsc->line_dsc->color;
     35 
     36         lv_area_t a;
     37         a.x1 = dsc->p1->x;
     38         a.x2 = dsc->p2->x - 1;
     39         a.y1 = LV_MIN(dsc->p1->y, dsc->p2->y);
     40         a.y2 = obj->coords.y2;
     41         lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
     42 
     43         /*Remove the masks*/
     44         lv_draw_mask_free_param(&line_mask_param);
     45         lv_draw_mask_free_param(&fade_mask_param);
     46         lv_draw_mask_remove_id(line_mask_id);
     47         lv_draw_mask_remove_id(fade_mask_id);
     48     }
     49     /*Hook the division lines too*/
     50     else if(dsc->part == LV_PART_MAIN) {
     51         if(dsc->line_dsc == NULL || dsc->p1 == NULL || dsc->p2 == NULL) return;
     52 
     53         /*Vertical line*/
     54         if(dsc->p1->x == dsc->p2->x) {
     55             dsc->line_dsc->color  = lv_palette_lighten(LV_PALETTE_GREY, 1);
     56             if(dsc->id == 3) {
     57                 dsc->line_dsc->width  = 2;
     58                 dsc->line_dsc->dash_gap  = 0;
     59                 dsc->line_dsc->dash_width  = 0;
     60             }
     61             else {
     62                 dsc->line_dsc->width = 1;
     63                 dsc->line_dsc->dash_gap  = 6;
     64                 dsc->line_dsc->dash_width  = 6;
     65             }
     66         }
     67         /*Horizontal line*/
     68         else {
     69             if(dsc->id == 2) {
     70                 dsc->line_dsc->width  = 2;
     71                 dsc->line_dsc->dash_gap  = 0;
     72                 dsc->line_dsc->dash_width  = 0;
     73             }
     74             else {
     75                 dsc->line_dsc->width = 2;
     76                 dsc->line_dsc->dash_gap  = 6;
     77                 dsc->line_dsc->dash_width  = 6;
     78             }
     79 
     80             if(dsc->id == 1  || dsc->id == 3) {
     81                 dsc->line_dsc->color  = lv_palette_main(LV_PALETTE_GREEN);
     82             }
     83             else {
     84                 dsc->line_dsc->color  = lv_palette_lighten(LV_PALETTE_GREY, 1);
     85             }
     86         }
     87     }
     88 }
     89 
     90 static void add_data(lv_timer_t * timer)
     91 {
     92     LV_UNUSED(timer);
     93     static uint32_t cnt = 0;
     94     lv_chart_set_next_value(chart1, ser1, lv_rand(20, 90));
     95 
     96     if(cnt % 4 == 0) lv_chart_set_next_value(chart1, ser2, lv_rand(40, 60));
     97 
     98     cnt++;
     99 }
    100 
    101 /**
    102  * Add a faded area effect to the line chart and make some division lines ticker
    103  */
    104 void lv_example_chart_2(void)
    105 {
    106     /*Create a chart1*/
    107     chart1 = lv_chart_create(lv_scr_act());
    108     lv_obj_set_size(chart1, 200, 150);
    109     lv_obj_center(chart1);
    110     lv_chart_set_type(chart1, LV_CHART_TYPE_LINE);   /*Show lines and points too*/
    111 
    112     lv_chart_set_div_line_count(chart1, 5, 7);
    113 
    114     lv_obj_add_event_cb(chart1, draw_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL);
    115     lv_chart_set_update_mode(chart1, LV_CHART_UPDATE_MODE_CIRCULAR);
    116 
    117     /*Add two data series*/
    118     ser1 = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
    119     ser2 = lv_chart_add_series(chart1, lv_palette_main(LV_PALETTE_BLUE), LV_CHART_AXIS_SECONDARY_Y);
    120 
    121     uint32_t i;
    122     for(i = 0; i < 10; i++) {
    123         lv_chart_set_next_value(chart1, ser1, lv_rand(20, 90));
    124         lv_chart_set_next_value(chart1, ser2, lv_rand(30, 70));
    125     }
    126 
    127     lv_timer_create(add_data, 200, NULL);
    128 }
    129 
    130 #endif