From a218d7540945612d476f88b3b13d6a7a77b7e4de Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Sat, 19 Nov 2022 08:41:56 +0100 Subject: [PATCH] feat(meter): remove the option to add multiple scales API BREAKING --- demos/stress/lv_demo_stress.c | 3 +- demos/widgets/lv_demo_widgets.c | 46 ++- examples/widgets/meter/lv_example_meter_1.c | 15 +- examples/widgets/meter/lv_example_meter_2.c | 15 +- examples/widgets/meter/lv_example_meter_3.c | 49 ++- examples/widgets/meter/lv_example_meter_4.c | 11 +- src/widgets/meter/lv_meter.c | 372 ++++++++++---------- src/widgets/meter/lv_meter.h | 76 ++-- 8 files changed, 280 insertions(+), 307 deletions(-) diff --git a/demos/stress/lv_demo_stress.c b/demos/stress/lv_demo_stress.c index b24744307..a2041831d 100644 --- a/demos/stress/lv_demo_stress.c +++ b/demos/stress/lv_demo_stress.c @@ -238,8 +238,7 @@ static void obj_test_task_cb(lv_timer_t * tmr) obj = lv_meter_create(main_page); lv_obj_scroll_to_view(obj, LV_ANIM_ON); - lv_meter_scale_t * scale = lv_meter_add_scale(obj); - lv_meter_add_needle_line(obj, scale, 3, lv_palette_main(LV_PALETTE_RED), -10); + lv_meter_add_needle_line(obj, 3, lv_palette_main(LV_PALETTE_RED), -10); auto_del(obj, LV_DEMO_STRESS_TIME_STEP * 6 + 30); break; diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index aa18cd6f8..91d69fdf2 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -644,27 +644,25 @@ static void analytics_create(lv_obj_t * parent) lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); lv_chart_set_next_value(chart2, ser3, lv_rand(10, 80)); - lv_meter_scale_t * scale; lv_meter_indicator_t * indic; meter1 = create_meter_box(parent, "Monthly Target", "Revenue: 63%", "Sales: 44%", "Costs: 58%"); lv_obj_add_flag(lv_obj_get_parent(meter1), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); - scale = lv_meter_add_scale(meter1); - lv_meter_set_scale_range(meter1, scale, 0, 100, 270, 90); - lv_meter_set_scale_ticks(meter1, scale, 0, 0, 0, lv_color_black()); + lv_meter_set_scale_range(meter1, 0, 100, 270, 90); + lv_meter_set_scale_ticks(meter1, 0, 0, 0, lv_color_black()); lv_anim_t a; lv_anim_init(&a); lv_anim_set_values(&a, 20, 100); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - indic = lv_meter_add_arc(meter1, scale, 15, lv_palette_main(LV_PALETTE_BLUE), 0); + indic = lv_meter_add_arc(meter1, 15, lv_palette_main(LV_PALETTE_BLUE), 0); lv_anim_set_exec_cb(&a, meter1_indic1_anim_cb); lv_anim_set_var(&a, indic); lv_anim_set_time(&a, 4100); lv_anim_set_playback_time(&a, 2700); lv_anim_start(&a); - indic = lv_meter_add_arc(meter1, scale, 15, lv_palette_main(LV_PALETTE_RED), -20); + indic = lv_meter_add_arc(meter1, 15, lv_palette_main(LV_PALETTE_RED), -20); lv_anim_set_exec_cb(&a, meter1_indic2_anim_cb); lv_anim_set_var(&a, indic); lv_anim_set_time(&a, 2600); @@ -672,7 +670,7 @@ static void analytics_create(lv_obj_t * parent) a.user_data = indic; lv_anim_start(&a); - indic = lv_meter_add_arc(meter1, scale, 15, lv_palette_main(LV_PALETTE_GREEN), -40); + indic = lv_meter_add_arc(meter1, 15, lv_palette_main(LV_PALETTE_GREEN), -40); lv_anim_set_exec_cb(&a, meter1_indic3_anim_cb); lv_anim_set_var(&a, indic); lv_anim_set_time(&a, 2800); @@ -681,20 +679,19 @@ static void analytics_create(lv_obj_t * parent) meter2 = create_meter_box(parent, "Sessions", "Desktop: ", "Tablet: ", "Mobile: "); if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter2), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK); - scale = lv_meter_add_scale(meter2); - lv_meter_set_scale_range(meter2, scale, 0, 100, 360, 90); - lv_meter_set_scale_ticks(meter2, scale, 0, 0, 0, lv_color_black()); + lv_meter_set_scale_range(meter2, 0, 100, 360, 90); + lv_meter_set_scale_ticks(meter2, 0, 0, 0, lv_color_black()); static lv_meter_indicator_t * meter2_indic[3]; - meter2_indic[0] = lv_meter_add_arc(meter2, scale, 20, lv_palette_main(LV_PALETTE_RED), -10); + meter2_indic[0] = lv_meter_add_arc(meter2, 20, lv_palette_main(LV_PALETTE_RED), -10); lv_meter_set_indicator_start_value(meter2, meter2_indic[0], 0); lv_meter_set_indicator_end_value(meter2, meter2_indic[0], 39); - meter2_indic[1] = lv_meter_add_arc(meter2, scale, 30, lv_palette_main(LV_PALETTE_BLUE), 0); + meter2_indic[1] = lv_meter_add_arc(meter2, 30, lv_palette_main(LV_PALETTE_BLUE), 0); lv_meter_set_indicator_start_value(meter2, meter2_indic[1], 40); lv_meter_set_indicator_end_value(meter2, meter2_indic[1], 69); - meter2_indic[2] = lv_meter_add_arc(meter2, scale, 10, lv_palette_main(LV_PALETTE_GREEN), -20); + meter2_indic[2] = lv_meter_add_arc(meter2, 10, lv_palette_main(LV_PALETTE_GREEN), -20); lv_meter_set_indicator_start_value(meter2, meter2_indic[2], 70); lv_meter_set_indicator_end_value(meter2, meter2_indic[2], 99); @@ -713,39 +710,38 @@ static void analytics_create(lv_obj_t * parent) lv_obj_set_style_outline_width(meter3, 3, LV_PART_INDICATOR); lv_obj_set_style_text_color(meter3, lv_palette_darken(LV_PALETTE_GREY, 1), LV_PART_TICKS); - scale = lv_meter_add_scale(meter3); - lv_meter_set_scale_range(meter3, scale, 10, 60, 220, 360 - 220); - lv_meter_set_scale_ticks(meter3, scale, 21, 3, 17, lv_color_white()); - lv_meter_set_scale_major_ticks(meter3, scale, 4, 4, 22, lv_color_white(), 15); + lv_meter_set_scale_range(meter3, 10, 60, 220, 360 - 220); + lv_meter_set_scale_ticks(meter3, 21, 3, 17, lv_color_white()); + lv_meter_set_scale_major_ticks(meter3, 4, 4, 22, lv_color_white(), 15); - indic = lv_meter_add_arc(meter3, scale, 10, lv_palette_main(LV_PALETTE_RED), 0); + indic = lv_meter_add_arc(meter3, 10, lv_palette_main(LV_PALETTE_RED), 0); lv_meter_set_indicator_start_value(meter3, indic, 0); lv_meter_set_indicator_end_value(meter3, indic, 20); - indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_RED, 3), lv_palette_darken(LV_PALETTE_RED, - 3), true, 0); + indic = lv_meter_add_scale_lines(meter3, lv_palette_darken(LV_PALETTE_RED, 3), lv_palette_darken(LV_PALETTE_RED, + 3), true, 0); lv_meter_set_indicator_start_value(meter3, indic, 0); lv_meter_set_indicator_end_value(meter3, indic, 20); - indic = lv_meter_add_arc(meter3, scale, 12, lv_palette_main(LV_PALETTE_BLUE), 0); + indic = lv_meter_add_arc(meter3, 12, lv_palette_main(LV_PALETTE_BLUE), 0); lv_meter_set_indicator_start_value(meter3, indic, 20); lv_meter_set_indicator_end_value(meter3, indic, 40); - indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_BLUE, 3), + indic = lv_meter_add_scale_lines(meter3, lv_palette_darken(LV_PALETTE_BLUE, 3), lv_palette_darken(LV_PALETTE_BLUE, 3), true, 0); lv_meter_set_indicator_start_value(meter3, indic, 20); lv_meter_set_indicator_end_value(meter3, indic, 40); - indic = lv_meter_add_arc(meter3, scale, 10, lv_palette_main(LV_PALETTE_GREEN), 0); + indic = lv_meter_add_arc(meter3, 10, lv_palette_main(LV_PALETTE_GREEN), 0); lv_meter_set_indicator_start_value(meter3, indic, 40); lv_meter_set_indicator_end_value(meter3, indic, 60); - indic = lv_meter_add_scale_lines(meter3, scale, lv_palette_darken(LV_PALETTE_GREEN, 3), + indic = lv_meter_add_scale_lines(meter3, lv_palette_darken(LV_PALETTE_GREEN, 3), lv_palette_darken(LV_PALETTE_GREEN, 3), true, 0); lv_meter_set_indicator_start_value(meter3, indic, 40); lv_meter_set_indicator_end_value(meter3, indic, 60); - indic = lv_meter_add_needle_line(meter3, scale, 4, lv_palette_darken(LV_PALETTE_GREY, 4), -25); + indic = lv_meter_add_needle_line(meter3, 4, lv_palette_darken(LV_PALETTE_GREY, 4), -25); lv_obj_t * mbps_label = lv_label_create(meter3); lv_label_set_text(mbps_label, "-"); diff --git a/examples/widgets/meter/lv_example_meter_1.c b/examples/widgets/meter/lv_example_meter_1.c index 40686ca29..dd295ea0e 100644 --- a/examples/widgets/meter/lv_example_meter_1.c +++ b/examples/widgets/meter/lv_example_meter_1.c @@ -18,36 +18,35 @@ void lv_example_meter_1(void) lv_obj_set_size(meter, 200, 200); /*Add a scale first*/ - lv_meter_scale_t * scale = lv_meter_add_scale(meter); - lv_meter_set_scale_ticks(meter, scale, 41, 2, 10, lv_palette_main(LV_PALETTE_GREY)); - lv_meter_set_scale_major_ticks(meter, scale, 8, 4, 15, lv_color_black(), 10); + lv_meter_set_scale_ticks(meter, 41, 2, 10, lv_palette_main(LV_PALETTE_GREY)); + lv_meter_set_scale_major_ticks(meter, 8, 4, 15, lv_color_black(), 10); lv_meter_indicator_t * indic; /*Add a blue arc to the start*/ - indic = lv_meter_add_arc(meter, scale, 3, lv_palette_main(LV_PALETTE_BLUE), 0); + indic = lv_meter_add_arc(meter, 3, lv_palette_main(LV_PALETTE_BLUE), 0); lv_meter_set_indicator_start_value(meter, indic, 0); lv_meter_set_indicator_end_value(meter, indic, 20); /*Make the tick lines blue at the start of the scale*/ - indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE), + indic = lv_meter_add_scale_lines(meter, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_BLUE), false, 0); lv_meter_set_indicator_start_value(meter, indic, 0); lv_meter_set_indicator_end_value(meter, indic, 20); /*Add a red arc to the end*/ - indic = lv_meter_add_arc(meter, scale, 3, lv_palette_main(LV_PALETTE_RED), 0); + indic = lv_meter_add_arc(meter, 3, lv_palette_main(LV_PALETTE_RED), 0); lv_meter_set_indicator_start_value(meter, indic, 80); lv_meter_set_indicator_end_value(meter, indic, 100); /*Make the tick lines red at the end of the scale*/ - indic = lv_meter_add_scale_lines(meter, scale, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, + indic = lv_meter_add_scale_lines(meter, lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_RED), false, 0); lv_meter_set_indicator_start_value(meter, indic, 80); lv_meter_set_indicator_end_value(meter, indic, 100); /*Add a needle line indicator*/ - indic = lv_meter_add_needle_line(meter, scale, 4, lv_palette_main(LV_PALETTE_GREY), -10); + indic = lv_meter_add_needle_line(meter, 4, lv_palette_main(LV_PALETTE_GREY), -10); /*Create an animation to set the value*/ lv_anim_t a; diff --git a/examples/widgets/meter/lv_example_meter_2.c b/examples/widgets/meter/lv_example_meter_2.c index 811e056f6..0e4159b47 100644 --- a/examples/widgets/meter/lv_example_meter_2.c +++ b/examples/widgets/meter/lv_example_meter_2.c @@ -16,21 +16,20 @@ void lv_example_meter_2(void) { meter = lv_meter_create(lv_scr_act()); lv_obj_center(meter); - lv_obj_set_size(meter, 200, 200); + lv_obj_set_size(meter, 220, 220); /*Remove the circle from the middle*/ lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR); /*Add a scale first*/ - lv_meter_scale_t * scale = lv_meter_add_scale(meter); - lv_meter_set_scale_ticks(meter, scale, 11, 2, 10, lv_palette_main(LV_PALETTE_GREY)); - lv_meter_set_scale_major_ticks(meter, scale, 1, 2, 30, lv_color_hex3(0xeee), 15); - lv_meter_set_scale_range(meter, scale, 0, 100, 270, 90); + lv_meter_set_scale_ticks(meter, 11, 2, 10, lv_palette_main(LV_PALETTE_GREY)); + lv_meter_set_scale_major_ticks(meter, 1, 2, 30, lv_color_hex3(0xeee), 15); + lv_meter_set_scale_range(meter, 0, 100, 270, 90); /*Add a three arc indicator*/ - lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_RED), 0); - lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_GREEN), -10); - lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_BLUE), -20); + lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, 10, lv_palette_main(LV_PALETTE_RED), 0); + lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, 10, lv_palette_main(LV_PALETTE_GREEN), -10); + lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, 10, lv_palette_main(LV_PALETTE_BLUE), -20); /*Create an animation to set the value*/ lv_anim_t a; diff --git a/examples/widgets/meter/lv_example_meter_3.c b/examples/widgets/meter/lv_example_meter_3.c index 6b51f851e..9b867153f 100644 --- a/examples/widgets/meter/lv_example_meter_3.c +++ b/examples/widgets/meter/lv_example_meter_3.c @@ -8,6 +8,28 @@ static void set_value(void * indic, int32_t v) lv_meter_set_indicator_end_value(meter, indic, v); } +static void tick_label_event(lv_event_t * e) +{ + lv_obj_draw_part_dsc_t * draw_part_dsc = lv_event_get_draw_part_dsc(e); + + /*Be sure it's drawing meter related parts*/ + if(draw_part_dsc->class_p != &lv_meter_class) return; + + /*Be sure it's drawing the ticks*/ + if(draw_part_dsc->type != LV_METER_DRAW_PART_TICK) return; + + /*Be sure it's a major ticks*/ + if(draw_part_dsc->id % 5) return; + + /*The order of numbers on the clock is tricky: 12, 1, 2, 3...*/ + if(draw_part_dsc->id == 0) { + lv_strncpy(draw_part_dsc->text, "12", 4); + } + else { + lv_snprintf(draw_part_dsc->text, 4, "%d", draw_part_dsc->id / 5); + } +} + /** * A clock from a meter */ @@ -19,35 +41,32 @@ void lv_example_meter_3(void) /*Create a scale for the minutes*/ /*61 ticks in a 360 degrees range (the last and the first line overlaps)*/ - lv_meter_scale_t * scale_min = lv_meter_add_scale(meter); - lv_meter_set_scale_ticks(meter, scale_min, 61, 1, 10, lv_palette_main(LV_PALETTE_GREY)); - lv_meter_set_scale_range(meter, scale_min, 0, 60, 360, 270); - - /*Create another scale for the hours. It's only visual and contains only major ticks*/ - lv_meter_scale_t * scale_hour = lv_meter_add_scale(meter); - lv_meter_set_scale_ticks(meter, scale_hour, 12, 0, 0, lv_palette_main(LV_PALETTE_GREY)); /*12 ticks*/ - lv_meter_set_scale_major_ticks(meter, scale_hour, 1, 2, 20, lv_color_black(), 10); /*Every tick is major*/ - lv_meter_set_scale_range(meter, scale_hour, 1, 12, 330, 300); /*[1..12] values in an almost full circle*/ + lv_meter_set_scale_ticks(meter, 60, 1, 10, lv_palette_main(LV_PALETTE_GREY)); + lv_meter_set_scale_major_ticks(meter, 5, 2, 20, lv_color_black(), 10); + lv_meter_set_scale_range(meter, 0, 59, 354, 270); LV_IMG_DECLARE(img_hand) /*Add a the hands from images*/ - lv_meter_indicator_t * indic_min = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5); - lv_meter_indicator_t * indic_hour = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5); + lv_meter_indicator_t * indic_min = lv_meter_add_needle_img(meter, &img_hand, 5, 5); + lv_meter_indicator_t * indic_hour = lv_meter_add_needle_img(meter, &img_hand, 5, 5); + + lv_obj_add_event_cb(meter, tick_label_event, LV_EVENT_DRAW_PART_BEGIN, NULL); + /*Create an animation to set the value*/ lv_anim_t a; lv_anim_init(&a); lv_anim_set_exec_cb(&a, set_value); - lv_anim_set_values(&a, 0, 60); + lv_anim_set_values(&a, 0, 59); lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lv_anim_set_time(&a, 2000); /*2 sec for 1 turn of the minute hand (1 hour)*/ + lv_anim_set_time(&a, 5000); /*2 sec for 1 turn of the minute hand (1 hour)*/ lv_anim_set_var(&a, indic_min); lv_anim_start(&a); lv_anim_set_var(&a, indic_hour); - lv_anim_set_time(&a, 24000); /*24 sec for 1 turn of the hour hand*/ - lv_anim_set_values(&a, 0, 60); + lv_anim_set_time(&a, 240000); /*24 sec for 1 turn of the hour hand*/ + lv_anim_set_values(&a, 0, 59); lv_anim_start(&a); } diff --git a/examples/widgets/meter/lv_example_meter_4.c b/examples/widgets/meter/lv_example_meter_4.c index e16fd2aa4..4df61fbec 100644 --- a/examples/widgets/meter/lv_example_meter_4.c +++ b/examples/widgets/meter/lv_example_meter_4.c @@ -16,21 +16,20 @@ void lv_example_meter_4(void) lv_obj_center(meter); /*Add a scale first with no ticks.*/ - lv_meter_scale_t * scale = lv_meter_add_scale(meter); - lv_meter_set_scale_ticks(meter, scale, 0, 0, 0, lv_color_black()); - lv_meter_set_scale_range(meter, scale, 0, 100, 360, 0); + lv_meter_set_scale_ticks(meter, 0, 0, 0, lv_color_black()); + lv_meter_set_scale_range(meter, 0, 100, 360, 0); /*Add a three arc indicator*/ lv_coord_t indic_w = 100; - lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_ORANGE), 0); + lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, indic_w, lv_palette_main(LV_PALETTE_ORANGE), 0); lv_meter_set_indicator_start_value(meter, indic1, 0); lv_meter_set_indicator_end_value(meter, indic1, 40); - lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_YELLOW), 0); + lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, indic_w, lv_palette_main(LV_PALETTE_YELLOW), 0); lv_meter_set_indicator_start_value(meter, indic2, 40); /*Start from the previous*/ lv_meter_set_indicator_end_value(meter, indic2, 80); - lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, scale, indic_w, lv_palette_main(LV_PALETTE_DEEP_ORANGE), 0); + lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, indic_w, lv_palette_main(LV_PALETTE_DEEP_ORANGE), 0); lv_meter_set_indicator_start_value(meter, indic3, 80); /*Start from the previous*/ lv_meter_set_indicator_end_value(meter, indic3, 100); } diff --git a/src/widgets/meter/lv_meter.c b/src/widgets/meter/lv_meter.c index 80f01a18f..f7261d655 100644 --- a/src/widgets/meter/lv_meter.c +++ b/src/widgets/meter/lv_meter.c @@ -63,55 +63,37 @@ lv_obj_t * lv_meter_create(lv_obj_t * parent) * Add scale *====================*/ -lv_meter_scale_t * lv_meter_add_scale(lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, MY_CLASS); - lv_meter_t * meter = (lv_meter_t *)obj; - - lv_meter_scale_t * scale = _lv_ll_ins_head(&meter->scale_ll); - LV_ASSERT_MALLOC(scale); - lv_memzero(scale, sizeof(lv_meter_scale_t)); - - scale->angle_range = 270; - scale->rotation = 90 + (360 - scale->angle_range) / 2; - scale->min = 0; - scale->max = 100; - scale->tick_cnt = 6; - scale->tick_length = 8; - scale->tick_width = 2; - scale->label_gap = 2; - - return scale; -} - -void lv_meter_set_scale_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t cnt, uint16_t width, uint16_t len, +void lv_meter_set_scale_ticks(lv_obj_t * obj, uint16_t cnt, uint16_t width, uint16_t len, lv_color_t color) { - scale->tick_cnt = cnt; - scale->tick_width = width; - scale->tick_length = len; - scale->tick_color = color; + lv_meter_t * meter = (lv_meter_t *)obj; + meter->scale.tick_cnt = cnt; + meter->scale.tick_width = width; + meter->scale.tick_length = len; + meter->scale.tick_color = color; lv_obj_invalidate(obj); } -void lv_meter_set_scale_major_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t nth, uint16_t width, +void lv_meter_set_scale_major_ticks(lv_obj_t * obj, uint16_t nth, uint16_t width, uint16_t len, lv_color_t color, int16_t label_gap) { - scale->tick_major_nth = nth; - scale->tick_major_width = width; - scale->tick_major_length = len; - scale->tick_major_color = color; - scale->label_gap = label_gap; + lv_meter_t * meter = (lv_meter_t *)obj; + meter->scale.tick_major_nth = nth; + meter->scale.tick_major_width = width; + meter->scale.tick_major_length = len; + meter->scale.tick_major_color = color; + meter->scale.label_gap = label_gap; lv_obj_invalidate(obj); } -void lv_meter_set_scale_range(lv_obj_t * obj, lv_meter_scale_t * scale, int32_t min, int32_t max, uint32_t angle_range, +void lv_meter_set_scale_range(lv_obj_t * obj, int32_t min, int32_t max, uint32_t angle_range, uint32_t rotation) { - scale->min = min; - scale->max = max; - scale->angle_range = angle_range; - scale->rotation = rotation; + lv_meter_t * meter = (lv_meter_t *)obj; + meter->scale.min = min; + meter->scale.max = max; + meter->scale.angle_range = angle_range; + meter->scale.rotation = rotation; lv_obj_invalidate(obj); } @@ -119,7 +101,7 @@ void lv_meter_set_scale_range(lv_obj_t * obj, lv_meter_scale_t * scale, int32_t * Add indicator *====================*/ -lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, +lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, uint16_t width, lv_color_t color, int16_t r_mod) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -127,7 +109,6 @@ lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, lv_meter_scale_t lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); LV_ASSERT_MALLOC(indic); lv_memzero(indic, sizeof(lv_meter_indicator_t)); - indic->scale = scale; indic->opa = LV_OPA_COVER; indic->type = LV_METER_INDICATOR_TYPE_NEEDLE_LINE; @@ -139,7 +120,7 @@ lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, lv_meter_scale_t return indic; } -lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t * scale, const void * src, +lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, const void * src, lv_coord_t pivot_x, lv_coord_t pivot_y) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -147,7 +128,6 @@ lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); LV_ASSERT_MALLOC(indic); lv_memzero(indic, sizeof(lv_meter_indicator_t)); - indic->scale = scale; indic->opa = LV_OPA_COVER; indic->type = LV_METER_INDICATOR_TYPE_NEEDLE_IMG; @@ -159,7 +139,7 @@ lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t return indic; } -lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, lv_color_t color, +lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, uint16_t width, lv_color_t color, int16_t r_mod) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -167,7 +147,6 @@ lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); LV_ASSERT_MALLOC(indic); lv_memzero(indic, sizeof(lv_meter_indicator_t)); - indic->scale = scale; indic->opa = LV_OPA_COVER; indic->type = LV_METER_INDICATOR_TYPE_ARC; @@ -179,7 +158,7 @@ lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale return indic; } -lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_meter_scale_t * scale, lv_color_t color_start, +lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_color_t color_start, lv_color_t color_end, bool local, int16_t width_mod) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -187,7 +166,6 @@ lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_meter_scale_t lv_meter_indicator_t * indic = _lv_ll_ins_head(&meter->indicator_ll); LV_ASSERT_MALLOC(indic); lv_memzero(indic, sizeof(lv_meter_indicator_t)); - indic->scale = scale; indic->opa = LV_OPA_COVER; indic->type = LV_METER_INDICATOR_TYPE_SCALE_LINES; @@ -270,9 +248,18 @@ static void lv_meter_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) lv_meter_t * meter = (lv_meter_t *)obj; - _lv_ll_init(&meter->scale_ll, sizeof(lv_meter_scale_t)); _lv_ll_init(&meter->indicator_ll, sizeof(lv_meter_indicator_t)); + meter->scale.angle_range = 270; + meter->scale.rotation = 90 + (360 - meter->scale.angle_range) / 2; + meter->scale.min = 0; + meter->scale.max = 100; + meter->scale.tick_cnt = 6; + meter->scale.tick_length = 8; + meter->scale.tick_width = 2; + meter->scale.label_gap = 2; + + LV_TRACE_OBJ_CREATE("finished"); } @@ -282,7 +269,6 @@ static void lv_meter_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); lv_meter_t * meter = (lv_meter_t *)obj; _lv_ll_clear(&meter->indicator_ll); - _lv_ll_clear(&meter->scale_ll); } @@ -354,12 +340,10 @@ static void draw_arcs(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area_t arc_dsc.width = indic->type_data.arc.width; arc_dsc.opa = indic->opa > LV_OPA_MAX ? opa_main : (opa_main * indic->opa) >> 8; - lv_meter_scale_t * scale = indic->scale; - - int32_t start_angle = lv_map(indic->start_value, scale->min, scale->max, scale->rotation, - scale->rotation + scale->angle_range); - int32_t end_angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, - scale->rotation + scale->angle_range); + int32_t start_angle = lv_map(indic->start_value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.rotation + meter->scale.angle_range); + int32_t end_angle = lv_map(indic->end_value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.rotation + meter->scale.angle_range); part_draw_dsc.radius = r_out + indic->type_data.arc.r_mod; part_draw_dsc.sub_part_ptr = indic; @@ -389,8 +373,6 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons lv_draw_label_dsc_init(&label_dsc); lv_obj_init_draw_label_dsc(obj, LV_PART_TICKS, &label_dsc); - lv_meter_scale_t * scale; - lv_draw_mask_radius_param_t inner_minor_mask; lv_draw_mask_radius_param_t inner_major_mask; lv_draw_mask_radius_param_t outer_mask; @@ -402,149 +384,146 @@ static void draw_ticks_and_labels(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, cons part_draw_dsc.type = LV_METER_DRAW_PART_TICK; part_draw_dsc.line_dsc = &line_dsc; - _LV_LL_READ_BACK(&meter->scale_ll, scale) { - part_draw_dsc.sub_part_ptr = scale; + lv_coord_t r_out = r_edge; + lv_coord_t r_in_minor = r_out - meter->scale.tick_length; + lv_coord_t r_in_major = r_out - meter->scale.tick_major_length; - lv_coord_t r_out = r_edge; - lv_coord_t r_in_minor = r_out - scale->tick_length; - lv_coord_t r_in_major = r_out - scale->tick_major_length; + lv_area_t area_inner_minor; + area_inner_minor.x1 = p_center.x - r_in_minor; + area_inner_minor.y1 = p_center.y - r_in_minor; + area_inner_minor.x2 = p_center.x + r_in_minor; + area_inner_minor.y2 = p_center.y + r_in_minor; + lv_draw_mask_radius_init(&inner_minor_mask, &area_inner_minor, LV_RADIUS_CIRCLE, true); - lv_area_t area_inner_minor; - area_inner_minor.x1 = p_center.x - r_in_minor; - area_inner_minor.y1 = p_center.y - r_in_minor; - area_inner_minor.x2 = p_center.x + r_in_minor; - area_inner_minor.y2 = p_center.y + r_in_minor; - lv_draw_mask_radius_init(&inner_minor_mask, &area_inner_minor, LV_RADIUS_CIRCLE, true); + lv_area_t area_inner_major; + area_inner_major.x1 = p_center.x - r_in_major; + area_inner_major.y1 = p_center.y - r_in_major; + area_inner_major.x2 = p_center.x + r_in_major - 1; + area_inner_major.y2 = p_center.y + r_in_major - 1; + lv_draw_mask_radius_init(&inner_major_mask, &area_inner_major, LV_RADIUS_CIRCLE, true); - lv_area_t area_inner_major; - area_inner_major.x1 = p_center.x - r_in_major; - area_inner_major.y1 = p_center.y - r_in_major; - area_inner_major.x2 = p_center.x + r_in_major - 1; - area_inner_major.y2 = p_center.y + r_in_major - 1; - lv_draw_mask_radius_init(&inner_major_mask, &area_inner_major, LV_RADIUS_CIRCLE, true); + lv_area_t area_outer; + area_outer.x1 = p_center.x - r_out; + area_outer.y1 = p_center.y - r_out; + area_outer.x2 = p_center.x + r_out - 1; + area_outer.y2 = p_center.y + r_out - 1; + lv_draw_mask_radius_init(&outer_mask, &area_outer, LV_RADIUS_CIRCLE, false); + int16_t outer_mask_id = lv_draw_mask_add(&outer_mask, NULL); - lv_area_t area_outer; - area_outer.x1 = p_center.x - r_out; - area_outer.y1 = p_center.y - r_out; - area_outer.x2 = p_center.x + r_out - 1; - area_outer.y2 = p_center.y + r_out - 1; - lv_draw_mask_radius_init(&outer_mask, &area_outer, LV_RADIUS_CIRCLE, false); - int16_t outer_mask_id = lv_draw_mask_add(&outer_mask, NULL); + int16_t inner_act_mask_id = LV_MASK_ID_INV; /*Will be added later*/ - int16_t inner_act_mask_id = LV_MASK_ID_INV; /*Will be added later*/ + uint32_t minor_cnt = meter->scale.tick_major_nth ? meter->scale.tick_major_nth - 1 : 0xFFFF; + uint16_t i; + for(i = 0; i < meter->scale.tick_cnt; i++) { + minor_cnt++; + bool major = false; + if(minor_cnt == meter->scale.tick_major_nth) { + minor_cnt = 0; + major = true; + } - uint32_t minor_cnt = scale->tick_major_nth ? scale->tick_major_nth - 1 : 0xFFFF; - uint16_t i; - for(i = 0; i < scale->tick_cnt; i++) { - minor_cnt++; - bool major = false; - if(minor_cnt == scale->tick_major_nth) { - minor_cnt = 0; - major = true; - } + int32_t value_of_line = lv_map(i, 0, meter->scale.tick_cnt - 1, meter->scale.min, meter->scale.max); + part_draw_dsc.value = value_of_line; - int32_t value_of_line = lv_map(i, 0, scale->tick_cnt - 1, scale->min, scale->max); - part_draw_dsc.value = value_of_line; + lv_color_t line_color = major ? meter->scale.tick_major_color : meter->scale.tick_color; + lv_color_t line_color_ori = line_color; - lv_color_t line_color = major ? scale->tick_major_color : scale->tick_color; - lv_color_t line_color_ori = line_color; + lv_coord_t line_width_ori = major ? meter->scale.tick_major_width : meter->scale.tick_width; + lv_coord_t line_width = line_width_ori; - lv_coord_t line_width_ori = major ? scale->tick_major_width : scale->tick_width; - lv_coord_t line_width = line_width_ori; + lv_meter_indicator_t * indic; + _LV_LL_READ_BACK(&meter->indicator_ll, indic) { + if(indic->type != LV_METER_INDICATOR_TYPE_SCALE_LINES) continue; + if(value_of_line >= indic->start_value && value_of_line <= indic->end_value) { + line_width += indic->type_data.scale_lines.width_mod; - lv_meter_indicator_t * indic; - _LV_LL_READ_BACK(&meter->indicator_ll, indic) { - if(indic->type != LV_METER_INDICATOR_TYPE_SCALE_LINES) continue; - if(value_of_line >= indic->start_value && value_of_line <= indic->end_value) { - line_width += indic->type_data.scale_lines.width_mod; - - if(indic->type_data.scale_lines.color_start.full == indic->type_data.scale_lines.color_end.full) { - line_color = indic->type_data.scale_lines.color_start; + if(indic->type_data.scale_lines.color_start.full == indic->type_data.scale_lines.color_end.full) { + line_color = indic->type_data.scale_lines.color_start; + } + else { + lv_opa_t ratio; + if(indic->type_data.scale_lines.local_grad) { + ratio = lv_map(value_of_line, indic->start_value, indic->end_value, LV_OPA_TRANSP, LV_OPA_COVER); } else { - lv_opa_t ratio; - if(indic->type_data.scale_lines.local_grad) { - ratio = lv_map(value_of_line, indic->start_value, indic->end_value, LV_OPA_TRANSP, LV_OPA_COVER); - } - else { - ratio = lv_map(value_of_line, scale->min, scale->max, LV_OPA_TRANSP, LV_OPA_COVER); - } - line_color = lv_color_mix(indic->type_data.scale_lines.color_end, indic->type_data.scale_lines.color_start, ratio); + ratio = lv_map(value_of_line, meter->scale.min, meter->scale.max, LV_OPA_TRANSP, LV_OPA_COVER); } + line_color = lv_color_mix(indic->type_data.scale_lines.color_end, indic->type_data.scale_lines.color_start, ratio); } } - - int32_t angle_upscale = ((i * scale->angle_range) * 10) / (scale->tick_cnt - 1) + + scale->rotation * 10; - - line_dsc.color = line_color; - line_dsc.width = line_width; - - /*Draw a little bit longer lines to be sure the mask will clip them correctly - *and to get a better precision*/ - lv_point_t p_outer; - p_outer.x = p_center.x + r_out + LV_MAX(LV_DPI_DEF, r_out); - p_outer.y = p_center.y; - lv_point_transform(&p_outer, angle_upscale, 256, &p_center); - - part_draw_dsc.p1 = &p_center; - part_draw_dsc.p2 = &p_outer; - part_draw_dsc.id = i; - part_draw_dsc.label_dsc = &label_dsc; - - /*Draw the text*/ - if(major) { - lv_draw_mask_remove_id(outer_mask_id); - uint32_t r_text = r_in_major - scale->label_gap; - lv_point_t p; - p.x = p_center.x + r_text; - p.y = p_center.y; - lv_point_transform(&p, angle_upscale, 256, &p_center); - - lv_draw_label_dsc_t label_dsc_tmp; - lv_memcpy(&label_dsc_tmp, &label_dsc, sizeof(label_dsc_tmp)); - - part_draw_dsc.label_dsc = &label_dsc_tmp; - char buf[16]; - - lv_snprintf(buf, sizeof(buf), "%" LV_PRId32, value_of_line); - part_draw_dsc.text = buf; - - lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); - - lv_point_t label_size; - lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, - LV_COORD_MAX, LV_TEXT_FLAG_NONE); - - lv_area_t label_cord; - label_cord.x1 = p.x - label_size.x / 2; - label_cord.y1 = p.y - label_size.y / 2; - label_cord.x2 = label_cord.x1 + label_size.x; - label_cord.y2 = label_cord.y1 + label_size.y; - - lv_draw_label(draw_ctx, part_draw_dsc.label_dsc, &label_cord, part_draw_dsc.text, NULL); - - outer_mask_id = lv_draw_mask_add(&outer_mask, NULL); - } - else { - part_draw_dsc.label_dsc = NULL; - part_draw_dsc.text = NULL; - lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); - } - - inner_act_mask_id = lv_draw_mask_add(major ? &inner_major_mask : &inner_minor_mask, NULL); - lv_draw_line(draw_ctx, &line_dsc, &p_outer, &p_center); - lv_draw_mask_remove_id(inner_act_mask_id); - lv_event_send(obj, LV_EVENT_DRAW_MAIN_END, &part_draw_dsc); - - line_dsc.color = line_color_ori; - line_dsc.width = line_width_ori; - } - lv_draw_mask_free_param(&inner_minor_mask); - lv_draw_mask_free_param(&inner_major_mask); - lv_draw_mask_free_param(&outer_mask); - lv_draw_mask_remove_id(outer_mask_id); + + int32_t angle_upscale = ((i * meter->scale.angle_range) * 10) / (meter->scale.tick_cnt - 1) + + meter->scale.rotation * + 10; + + line_dsc.color = line_color; + line_dsc.width = line_width; + + /*Draw a little bit longer lines to be sure the mask will clip them correctly + *and to get a better precision*/ + lv_point_t p_outer; + p_outer.x = p_center.x + r_out + LV_MAX(LV_DPI_DEF, r_out); + p_outer.y = p_center.y; + lv_point_transform(&p_outer, angle_upscale, 256, &p_center); + + part_draw_dsc.p1 = &p_center; + part_draw_dsc.p2 = &p_outer; + part_draw_dsc.id = i; + part_draw_dsc.label_dsc = &label_dsc; + + /*Draw the text*/ + if(major) { + lv_draw_mask_remove_id(outer_mask_id); + uint32_t r_text = r_in_major - meter->scale.label_gap; + lv_point_t p; + p.x = p_center.x + r_text; + p.y = p_center.y; + lv_point_transform(&p, angle_upscale, 256, &p_center); + + lv_draw_label_dsc_t label_dsc_tmp; + lv_memcpy(&label_dsc_tmp, &label_dsc, sizeof(label_dsc_tmp)); + + part_draw_dsc.label_dsc = &label_dsc_tmp; + char buf[16]; + + lv_snprintf(buf, sizeof(buf), "%" LV_PRId32, value_of_line); + part_draw_dsc.text = buf; + + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + + lv_point_t label_size; + lv_txt_get_size(&label_size, part_draw_dsc.text, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, + LV_COORD_MAX, LV_TEXT_FLAG_NONE); + + lv_area_t label_cord; + label_cord.x1 = p.x - label_size.x / 2; + label_cord.y1 = p.y - label_size.y / 2; + label_cord.x2 = label_cord.x1 + label_size.x; + label_cord.y2 = label_cord.y1 + label_size.y; + + lv_draw_label(draw_ctx, part_draw_dsc.label_dsc, &label_cord, part_draw_dsc.text, NULL); + + outer_mask_id = lv_draw_mask_add(&outer_mask, NULL); + } + else { + part_draw_dsc.label_dsc = NULL; + part_draw_dsc.text = NULL; + lv_event_send(obj, LV_EVENT_DRAW_PART_BEGIN, &part_draw_dsc); + } + + inner_act_mask_id = lv_draw_mask_add(major ? &inner_major_mask : &inner_minor_mask, NULL); + lv_draw_line(draw_ctx, &line_dsc, &p_outer, &p_center); + lv_draw_mask_remove_id(inner_act_mask_id); + lv_event_send(obj, LV_EVENT_DRAW_MAIN_END, &part_draw_dsc); + + line_dsc.color = line_color_ori; + line_dsc.width = line_width_ori; + } + lv_draw_mask_free_param(&inner_minor_mask); + lv_draw_mask_free_param(&inner_major_mask); + lv_draw_mask_free_param(&outer_mask); + lv_draw_mask_remove_id(outer_mask_id); } @@ -573,12 +552,12 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area lv_meter_indicator_t * indic; _LV_LL_READ_BACK(&meter->indicator_ll, indic) { - lv_meter_scale_t * scale = indic->scale; part_draw_dsc.sub_part_ptr = indic; if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { - int32_t angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); - lv_coord_t r_out = r_edge + scale->r_mod + indic->type_data.needle_line.r_mod; + int32_t angle = lv_map(indic->end_value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.rotation + meter->scale.angle_range); + lv_coord_t r_out = r_edge + meter->scale.r_mod + indic->type_data.needle_line.r_mod; lv_point_t p_end; p_end.y = (lv_trigo_sin(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.y; p_end.x = (lv_trigo_cos(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.x; @@ -597,7 +576,8 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG) { if(indic->type_data.needle_img.src == NULL) continue; - int32_t angle = lv_map(indic->end_value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + int32_t angle = lv_map(indic->end_value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.rotation + meter->scale.angle_range); lv_img_header_t info; lv_img_decoder_get_info(indic->type_data.needle_img.src, &info); lv_area_t a; @@ -624,6 +604,8 @@ static void draw_needles(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, const lv_area static void inv_arc(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t old_value, int32_t new_value) { + lv_meter_t * meter = (lv_meter_t *)obj; + bool rounded = lv_obj_get_style_arc_rounded(obj, LV_PART_ITEMS); lv_area_t scale_area; @@ -636,10 +618,10 @@ static void inv_arc(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t old_va r_out += indic->type_data.arc.r_mod; - lv_meter_scale_t * scale = indic->scale; - - int32_t start_angle = lv_map(old_value, scale->min, scale->max, scale->rotation, scale->angle_range + scale->rotation); - int32_t end_angle = lv_map(new_value, scale->min, scale->max, scale->rotation, scale->angle_range + scale->rotation); + int32_t start_angle = lv_map(old_value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.angle_range + meter->scale.rotation); + int32_t end_angle = lv_map(new_value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.angle_range + meter->scale.rotation); lv_area_t a; lv_draw_arc_get_area(scale_center.x, scale_center.y, r_out, LV_MIN(start_angle, end_angle), LV_MAX(start_angle, @@ -650,6 +632,8 @@ static void inv_arc(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t old_va static void inv_line(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value) { + lv_meter_t * meter = (lv_meter_t *)obj; + lv_area_t scale_area; lv_obj_get_content_coords(obj, &scale_area); @@ -658,11 +642,10 @@ static void inv_line(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value scale_center.x = scale_area.x1 + r_out; scale_center.y = scale_area.y1 + r_out; - lv_meter_scale_t * scale = indic->scale; - if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_LINE) { - int32_t angle = lv_map(value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); - r_out += scale->r_mod + indic->type_data.needle_line.r_mod; + int32_t angle = lv_map(value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.rotation + meter->scale.angle_range); + r_out += meter->scale.r_mod + indic->type_data.needle_line.r_mod; lv_point_t p_end; p_end.y = (lv_trigo_sin(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.y; p_end.x = (lv_trigo_cos(angle) * (r_out)) / LV_TRIGO_SIN_MAX + scale_center.x; @@ -676,7 +659,8 @@ static void inv_line(lv_obj_t * obj, lv_meter_indicator_t * indic, int32_t value lv_obj_invalidate_area(obj, &a); } else if(indic->type == LV_METER_INDICATOR_TYPE_NEEDLE_IMG) { - int32_t angle = lv_map(value, scale->min, scale->max, scale->rotation, scale->rotation + scale->angle_range); + int32_t angle = lv_map(value, meter->scale.min, meter->scale.max, meter->scale.rotation, + meter->scale.rotation + meter->scale.angle_range); lv_img_header_t info; lv_img_decoder_get_info(indic->type_data.needle_img.src, &info); diff --git a/src/widgets/meter/lv_meter.h b/src/widgets/meter/lv_meter.h index fdf2ae644..118b763cf 100644 --- a/src/widgets/meter/lv_meter.h +++ b/src/widgets/meter/lv_meter.h @@ -30,27 +30,6 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct { - lv_color_t tick_color; - uint16_t tick_cnt; - uint16_t tick_length; - uint16_t tick_width; - - lv_color_t tick_major_color; - uint16_t tick_major_nth; - uint16_t tick_major_length; - uint16_t tick_major_width; - - int16_t label_gap; - int16_t label_color; - - int32_t min; - int32_t max; - int16_t r_mod; - uint16_t angle_range; - int16_t rotation; -} lv_meter_scale_t; - enum { LV_METER_INDICATOR_TYPE_NEEDLE_IMG, LV_METER_INDICATOR_TYPE_NEEDLE_LINE, @@ -60,7 +39,6 @@ enum { typedef uint8_t lv_meter_indicator_type_t; typedef struct { - lv_meter_scale_t * scale; lv_meter_indicator_type_t type; lv_opa_t opa; int32_t start_value; @@ -93,7 +71,26 @@ typedef struct { /*Data of line meter*/ typedef struct { lv_obj_t obj; - lv_ll_t scale_ll; + struct { + lv_color_t tick_color; + uint16_t tick_cnt; + uint16_t tick_length; + uint16_t tick_width; + + lv_color_t tick_major_color; + uint16_t tick_major_nth; + uint16_t tick_major_length; + uint16_t tick_major_width; + + int16_t label_gap; + int16_t label_color; + + int32_t min; + int32_t max; + int16_t r_mod; + uint16_t angle_range; + int16_t rotation; + } scale; lv_ll_t indicator_ll; } lv_meter_t; @@ -121,54 +118,39 @@ typedef enum { */ lv_obj_t * lv_meter_create(lv_obj_t * parent); -/*===================== - * Add scale - *====================*/ - -/** - * Add a new scale to the meter. - * @param obj pointer to a meter object - * @return the new scale - * @note Indicators can be attached to scales. - */ -lv_meter_scale_t * lv_meter_add_scale(lv_obj_t * obj); - /** * Set the properties of the ticks of a scale * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param cnt number of tick lines * @param width width of tick lines * @param len length of tick lines * @param color color of tick lines */ -void lv_meter_set_scale_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t cnt, uint16_t width, uint16_t len, +void lv_meter_set_scale_ticks(lv_obj_t * obj, uint16_t cnt, uint16_t width, uint16_t len, lv_color_t color); /** * Make some "normal" ticks major ticks and set their attributes. * Texts with the current value are also added to the major ticks. * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param nth make every Nth normal tick major tick. (start from the first on the left) * @param width width of the major ticks * @param len length of the major ticks * @param color color of the major ticks * @param label_gap gap between the major ticks and the labels */ -void lv_meter_set_scale_major_ticks(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t nth, uint16_t width, +void lv_meter_set_scale_major_ticks(lv_obj_t * obj, uint16_t nth, uint16_t width, uint16_t len, lv_color_t color, int16_t label_gap); /** * Set the value and angular range of a scale. * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param min the minimum value * @param max the maximal value * @param angle_range the angular range of the scale * @param rotation the angular offset from the 3 o'clock position (clock-wise) */ -void lv_meter_set_scale_range(lv_obj_t * obj, lv_meter_scale_t * scale, int32_t min, int32_t max, uint32_t angle_range, +void lv_meter_set_scale_range(lv_obj_t * obj, int32_t min, int32_t max, uint32_t angle_range, uint32_t rotation); /*===================== @@ -178,52 +160,48 @@ void lv_meter_set_scale_range(lv_obj_t * obj, lv_meter_scale_t * scale, int32_t /** * Add a needle line indicator the scale * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param width width of the line * @param color color of the line * @param r_mod the radius modifier (added to the scale's radius) to get the lines length * @return the new indicator */ -lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, +lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * obj, uint16_t width, lv_color_t color, int16_t r_mod); /** * Add a needle image indicator the scale * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param src the image source of the indicator. path or pointer to ::lv_img_dsc_t * @param pivot_x the X pivot point of the needle * @param pivot_y the Y pivot point of the needle * @return the new indicator * @note the needle image should point to the right, like -O-----> */ -lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, lv_meter_scale_t * scale, const void * src, +lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * obj, const void * src, lv_coord_t pivot_x, lv_coord_t pivot_y); /** * Add an arc indicator the scale * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param width width of the arc * @param color color of the arc * @param r_mod the radius modifier (added to the scale's radius) to get the outer radius of the arc * @return the new indicator */ -lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, lv_meter_scale_t * scale, uint16_t width, lv_color_t color, +lv_meter_indicator_t * lv_meter_add_arc(lv_obj_t * obj, uint16_t width, lv_color_t color, int16_t r_mod); /** * Add a scale line indicator the scale. It will modify the ticks. * @param obj pointer to a meter object - * @param scale pointer to scale (added to `meter`) * @param color_start the start color * @param color_end the end color * @param local tell how to map start and end color. true: the indicator's start and end_value; false: the scale's min max value * @param width_mod add this the affected tick's width * @return the new indicator */ -lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_meter_scale_t * scale, lv_color_t color_start, +lv_meter_indicator_t * lv_meter_add_scale_lines(lv_obj_t * obj, lv_color_t color_start, lv_color_t color_end, bool local, int16_t width_mod); /*=====================