#include "../../lv_examples.h" #if LV_USE_SCALE && LV_BUILD_EXAMPLES && LV_FONT_MONTSERRAT_40 && LV_FONT_MONTSERRAT_18 static int32_t hr_value = 98; static int8_t hr_step = 1; static lv_obj_t * needle_line = NULL; static lv_obj_t * hr_value_label = NULL; static lv_obj_t * bpm_label = NULL; static lv_obj_t * scale = NULL; typedef struct { lv_style_t items; lv_style_t indicator; lv_style_t main; } section_styles_t; static section_styles_t zone1_styles; static section_styles_t zone2_styles; static section_styles_t zone3_styles; static section_styles_t zone4_styles; static section_styles_t zone5_styles; static lv_color_t get_hr_zone_color(int32_t hr) { if(hr < 117) return lv_palette_main(LV_PALETTE_GREY); /* Zone 1 */ else if(hr < 135) return lv_palette_main(LV_PALETTE_BLUE); /* Zone 2 */ else if(hr < 158) return lv_palette_main(LV_PALETTE_GREEN); /* Zone 3 */ else if(hr < 176) return lv_palette_main(LV_PALETTE_ORANGE); /* Zone 4 */ else return lv_palette_main(LV_PALETTE_RED); /* Zone 5 */ } static void hr_anim_timer_cb(lv_timer_t * timer) { LV_UNUSED(timer); hr_value += hr_step; if(hr_value >= 195) { hr_value = 195; hr_step = -1; } else if(hr_value <= 98) { hr_value = 98; hr_step = 1; } /* Update needle */ lv_scale_set_line_needle_value(scale, needle_line, -8, hr_value); /* Update HR text */ lv_label_set_text_fmt(hr_value_label, "%d", hr_value); /* Update text color based on zone */ lv_color_t zone_color = get_hr_zone_color(hr_value); lv_obj_set_style_text_color(hr_value_label, zone_color, 0); lv_obj_set_style_text_color(bpm_label, zone_color, 0); } static void init_section_styles(section_styles_t * styles, lv_color_t color) { lv_style_init(&styles->items); lv_style_set_line_color(&styles->items, color); lv_style_set_line_width(&styles->items, 0); lv_style_init(&styles->indicator); lv_style_set_line_color(&styles->indicator, color); lv_style_set_line_width(&styles->indicator, 0); lv_style_init(&styles->main); lv_style_set_arc_color(&styles->main, color); lv_style_set_arc_width(&styles->main, 20); } static void add_section(lv_obj_t * target_scale, int32_t from, int32_t to, const section_styles_t * styles) { lv_scale_section_t * sec = lv_scale_add_section(target_scale); lv_scale_set_section_range(target_scale, sec, from, to); lv_scale_set_section_style_items(target_scale, sec, &styles->items); lv_scale_set_section_style_indicator(target_scale, sec, &styles->indicator); lv_scale_set_section_style_main(target_scale, sec, &styles->main); } void lv_example_scale_10(void) { scale = lv_scale_create(lv_screen_active()); lv_obj_center(scale); lv_obj_set_size(scale, 200, 200); lv_scale_set_mode(scale, LV_SCALE_MODE_ROUND_INNER); lv_scale_set_range(scale, 98, 195); lv_scale_set_total_tick_count(scale, 15); lv_scale_set_major_tick_every(scale, 3); lv_scale_set_angle_range(scale, 280); lv_scale_set_rotation(scale, 130); lv_scale_set_label_show(scale, false); lv_obj_set_style_length(scale, 6, LV_PART_ITEMS); lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR); lv_obj_set_style_arc_width(scale, 0, LV_PART_MAIN); /* Zone 1: (Grey) */ init_section_styles(&zone1_styles, lv_palette_main(LV_PALETTE_GREY)); add_section(scale, 98, 117, &zone1_styles); /* Zone 2: (Blue) */ init_section_styles(&zone2_styles, lv_palette_main(LV_PALETTE_BLUE)); add_section(scale, 117, 135, &zone2_styles); /* Zone 3: (Green) */ init_section_styles(&zone3_styles, lv_palette_main(LV_PALETTE_GREEN)); add_section(scale, 135, 158, &zone3_styles); /* Zone 4: (Orange) */ init_section_styles(&zone4_styles, lv_palette_main(LV_PALETTE_ORANGE)); add_section(scale, 158, 176, &zone4_styles); /* Zone 5: (Red) */ init_section_styles(&zone5_styles, lv_palette_main(LV_PALETTE_RED)); add_section(scale, 176, 195, &zone5_styles); needle_line = lv_line_create(scale); /* Optional styling */ lv_obj_set_style_line_color(needle_line, lv_color_black(), LV_PART_MAIN); lv_obj_set_style_line_width(needle_line, 12, LV_PART_MAIN); lv_obj_set_style_length(needle_line, 20, LV_PART_MAIN); lv_obj_set_style_line_rounded(needle_line, false, LV_PART_MAIN); lv_obj_set_style_pad_right(needle_line, 50, LV_PART_MAIN); int32_t current_hr = 145; lv_scale_set_line_needle_value(scale, needle_line, 0, current_hr); lv_obj_t * circle = lv_obj_create(lv_scr_act()); lv_obj_set_size(circle, 130, 130); lv_obj_center(circle); lv_obj_set_style_radius(circle, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_color(circle, lv_obj_get_style_bg_color(lv_scr_act(), LV_PART_MAIN), 0); lv_obj_set_style_bg_opa(circle, LV_OPA_COVER, 0); lv_obj_set_style_border_width(circle, 0, LV_PART_MAIN); lv_obj_t * hr_container = lv_obj_create(circle); lv_obj_center(hr_container); lv_obj_set_size(hr_container, lv_pct(100), LV_SIZE_CONTENT); lv_obj_set_style_bg_opa(hr_container, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(hr_container, 0, 0); lv_obj_set_layout(hr_container, LV_LAYOUT_FLEX); lv_obj_set_flex_flow(hr_container, LV_FLEX_FLOW_COLUMN); lv_obj_set_style_pad_all(hr_container, 0, LV_PART_MAIN); lv_obj_set_style_pad_row(hr_container, 0, 0); lv_obj_set_flex_align(hr_container, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); hr_value_label = lv_label_create(hr_container); lv_label_set_text_fmt(hr_value_label, "%d", current_hr); lv_obj_set_style_text_font(hr_value_label, &lv_font_montserrat_40, 0); lv_obj_set_style_text_align(hr_value_label, LV_TEXT_ALIGN_CENTER, 0); bpm_label = lv_label_create(hr_container); lv_label_set_text(bpm_label, "bpm"); lv_obj_set_style_text_font(bpm_label, &lv_font_montserrat_18, 0); lv_obj_set_style_text_align(bpm_label, LV_TEXT_ALIGN_CENTER, 0); lv_color_t zone_color = get_hr_zone_color(current_hr); lv_obj_set_style_text_color(hr_value_label, zone_color, 0); lv_obj_set_style_text_color(bpm_label, zone_color, 0); lv_timer_create(hr_anim_timer_cb, 80, NULL); } #endif