/********************* * INCLUDES *********************/ #include "display.h" /********************* * DEFINES *********************/ #define Maximum_Y_axis 20000 #define Maximum_X_axis 3600 #define Y_axis_scales 4000 //Y轴的刻度数量为(Maximum_Y_axis/Y_axis_scales) /********************** * TYPEDEFS **********************/ /* 结构体 ------------------------------------------------------*/ struct ui_dynamic_obj_t { lv_obj_t *menu_Labe; lv_obj_t *menu_cout; lv_obj_t *dynamic_show_Labe1; lv_obj_t *dynamic_show_Labe2; lv_obj_t *btn_graph; lv_obj_t *btn_query; lv_obj_t *btn_data; lv_obj_t *btn_clear; lv_obj_t *btn_back; lv_obj_t *btn_graph_confirm; lv_obj_t* btn_ellipse_angel; lv_obj_t *btn_menu_back; lv_obj_t *btn_setting; lv_obj_t *btn_cal; lv_obj_t* btn_channal_list; lv_obj_t * confirm_btn_Labe; }; struct ui_dynamic_obj_t global_obj = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; struct ui_dynamic_param_t global_param = { 1, 0, 0, 0, 0 }; struct ui_dynamic_state_t global_state = { false, false, false }; char string[10]; /********************** * STATIC PROTOTYPES **********************/ /********************** * MACROS **********************/ static void analytics_create12(lv_obj_t* parent); static void graph_started(lv_obj_t * parent); static void lv_example_get_started(lv_obj_t * parent); static void query_started(lv_obj_t * parent); static void data_started(lv_obj_t * parent); /********************** * GLOBAL FUNCTIONS **********************/ static const lv_font_t * font_normal; static lv_style_t style_title; lv_chart_series_t * ser1; lv_chart_series_t * ser2; lv_chart_series_t * ser3; //lv_chart_series_t * ser4; //lv_chart_series_t * ser5; /** * @brief 样式配置 * @param None * @retval None */ static lv_style_t style_btn; static lv_style_t style_btn_pressed;//按键按下的样式 static lv_style_t style_btn_checked;//按键按下的样式 static lv_style_t style_Line_btn; static lv_style_t style_Line_btn_pressed; static lv_style_t style_cout; static lv_style_t style_cout_labe; static lv_color_t darken(const lv_color_filter_dsc_t* dsc, lv_color_t color, lv_opa_t opa) { LV_UNUSED(dsc); return lv_color_darken(color, opa); } static void style_init(void) { /* 菜单按键松开样式style */ lv_style_init(&style_btn); lv_style_set_radius(&style_btn, 10);//设置圆角半径 lv_style_set_bg_opa(&style_btn, LV_OPA_100);//背景透明度 lv_style_set_bg_color(&style_btn, lv_palette_main(LV_PALETTE_BLUE));//背景颜色 lv_style_set_bg_grad_color(&style_btn, lv_palette_darken(LV_PALETTE_BLUE, 2));//背景渐变色 lv_style_set_bg_grad_dir(&style_btn, LV_GRAD_DIR_VER);//背景渐变色角度 lv_style_set_border_opa(&style_btn, LV_OPA_40);//设置边界透明度 lv_style_set_border_width(&style_btn, 1);//设置边界宽度 lv_style_set_border_color(&style_btn, lv_palette_main(LV_PALETTE_GREY));//设置边界颜色 lv_style_set_shadow_width(&style_btn, 1);//设置阴影的宽度 lv_style_set_shadow_color(&style_btn, lv_palette_main(LV_PALETTE_GREY));//设置阴影的颜色 lv_style_set_shadow_ofs_y(&style_btn, 1);//设置阴影Y方向的大小 lv_style_set_outline_opa(&style_btn, LV_OPA_COVER);//设置轮廓的透明度 lv_style_set_outline_color(&style_btn, lv_palette_main(LV_PALETTE_BLUE));//设置轮廓的颜色 lv_style_set_text_color(&style_btn, lv_color_white());//设置文字的颜色 lv_style_set_pad_all(&style_btn, 10);//去除所有的垫衬 lv_style_set_text_font(&style_btn, &myFont_heiti24); /* checked style */ lv_style_init(&style_btn_checked); lv_style_set_outline_width(&style_btn_checked, 2);//Ad a large outline when pressed lv_style_set_outline_opa(&style_btn_checked, LV_OPA_TRANSP);//设置轮廓的透明度 lv_style_set_translate_y(&style_btn_checked, 1);//按键在Y方向移动 lv_style_set_shadow_ofs_y(&style_btn_checked, 2);//设置阴影Y方向的大小 lv_style_set_bg_color(&style_btn_checked, lv_palette_darken(LV_PALETTE_BLUE, 5)); lv_style_set_bg_grad_color(&style_btn_checked, lv_palette_darken(LV_PALETTE_BLUE, 1)); /* pressed style */ lv_style_init(&style_btn_pressed); lv_style_set_outline_width(&style_btn_pressed, 2);//Ad a large outline when pressed lv_style_set_outline_opa(&style_btn_pressed, LV_OPA_TRANSP);//设置轮廓的透明度 lv_style_set_translate_y(&style_btn_pressed, 1);//按键在Y方向移动 lv_style_set_shadow_ofs_y(&style_btn_pressed, 2);//设置阴影Y方向的大小 lv_style_set_bg_color(&style_btn_pressed, lv_palette_darken(LV_PALETTE_BLUE, 6)); lv_style_set_bg_grad_color(&style_btn_pressed, lv_palette_darken(LV_PALETTE_BLUE, 2)); /* 线条选择按键松开样式style */ lv_style_init(&style_Line_btn); lv_style_set_radius(&style_Line_btn, 10);//设置圆角半径 lv_style_set_bg_opa(&style_Line_btn, LV_OPA_0);//背景透明度 lv_style_set_bg_color(&style_Line_btn, lv_palette_main(LV_PALETTE_BLUE));//背景颜色 lv_style_set_bg_grad_color(&style_Line_btn, lv_palette_darken(LV_PALETTE_BLUE, 2));//背景渐变色 lv_style_set_bg_grad_dir(&style_Line_btn, LV_GRAD_DIR_VER);//背景渐变色角度 lv_style_set_border_opa(&style_Line_btn, LV_OPA_40);//设置边界透明度 lv_style_set_border_width(&style_Line_btn, 2);//设置边界宽度 lv_style_set_border_color(&style_Line_btn, lv_palette_main(LV_PALETTE_GREY));//设置边界颜色 lv_style_set_shadow_width(&style_Line_btn, 1);//设置阴影的宽度 lv_style_set_shadow_color(&style_Line_btn, lv_palette_main(LV_PALETTE_GREY));//设置阴影的颜色 lv_style_set_shadow_ofs_y(&style_Line_btn, 1);//设置阴影Y方向的大小 lv_style_set_outline_opa(&style_Line_btn, LV_OPA_COVER);//设置轮廓的透明度 lv_style_set_outline_color(&style_Line_btn, lv_palette_main(LV_PALETTE_BLUE));//设置轮廓的颜色 lv_style_set_text_color(&style_Line_btn, lv_palette_lighten(LV_PALETTE_GREY, 2));//设置文字的颜色 lv_style_set_pad_all(&style_Line_btn, 10);//去除所有的垫衬 lv_style_set_text_font(&style_Line_btn, &myFont_heiti20); /* pressed style */ lv_style_init(&style_Line_btn_pressed); lv_style_set_outline_width(&style_Line_btn_pressed, 2);//Ad a large outline when pressed lv_style_set_outline_opa(&style_Line_btn_pressed, LV_OPA_TRANSP);//设置轮廓的透明度 lv_style_set_translate_y(&style_Line_btn_pressed, 2);//按键在Y方向移动 lv_style_set_shadow_ofs_y(&style_Line_btn_pressed, 0);//设置阴影Y方向的大小 /* 容器样式style */ lv_style_init(&style_cout); lv_style_set_radius(&style_cout, 10);//图标边框线的弧度 lv_style_set_shadow_width(&style_cout, 0);//设置阴影宽度 lv_style_set_border_width(&style_cout, 0);//设置边框宽度 lv_style_set_bg_color(&style_cout, lv_color_hex(0xFFFAFA));//背景颜色 lv_style_set_bg_opa(&style_cout, LV_OPA_100);//设置边界透明度 lv_style_set_pad_all(&style_cout, 0);//容器边上的填充为零 lv_style_set_flex_flow(&style_cout, LV_FLEX_FLOW_COLUMN_WRAP); /* 容器样式style */ lv_style_init(&style_cout_labe); lv_style_set_radius(&style_cout_labe, 10);//图标边框线的弧度 lv_style_set_border_width(&style_cout_labe, 1);//设置边界宽度 lv_style_set_border_opa(&style_cout_labe, LV_OPA_40);//设置边界透明度 lv_style_set_border_color(&style_cout_labe, lv_palette_main(LV_PALETTE_GREY));//设置边界颜色 lv_style_set_shadow_width(&style_cout_labe, 1);//设置阴影的宽度 lv_style_set_shadow_color(&style_cout_labe, lv_palette_main(LV_PALETTE_GREY));//设置阴影的颜色 lv_style_set_outline_opa(&style_cout_labe, LV_OPA_COVER);//设置轮廓的透明度 lv_style_set_outline_color(&style_cout_labe, lv_palette_main(LV_PALETTE_BLUE));//设置轮廓的颜色 lv_style_set_bg_color(&style_cout_labe, lv_color_hex(0xC0C0C0));//背景颜色 lv_style_set_bg_opa(&style_cout_labe, LV_OPA_40);//设置边界透明度 lv_style_set_pad_all(&style_cout_labe, 0);//容器边上的填充为零 lv_style_set_text_font(&style_cout_labe, &myFont_verdana35); } /** * @brief 图表功能回调 * @param None * @retval None */ static void chart_event_cb12(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { lv_obj_invalidate(obj); /*To make the value boxes visible*/ } else if(code == LV_EVENT_DRAW_PART_BEGIN) { lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e); /*Set the markers' text*/ if(dsc->part == LV_PART_TICKS && dsc->id == LV_CHART_AXIS_PRIMARY_X) { const char * month[] = {"0", "36", "72", "108", "144", "180", "216", "252", "288", "324", "360"}; lv_snprintf(dsc->text, sizeof(dsc->text), "%s", month[dsc->value]); } if (dsc->part == LV_PART_TICKS && dsc->id == LV_CHART_AXIS_PRIMARY_Y) { const char* ASS[] = { "0", "0.5", "1", "1.5", "2", "2.5" }; lv_snprintf(dsc->text, dsc->text_length, "%s", ASS[dsc->value / Y_axis_scales]); } /*Add the faded area before the lines are drawn */ else if(dsc->part == LV_PART_ITEMS) { #if 1 /*Add a line mask that keeps the area below the line*/ if(dsc->p1 && dsc->p2) { lv_draw_mask_line_param_t line_mask_param; lv_draw_mask_line_points_init(&line_mask_param, dsc->p1->x, dsc->p1->y, dsc->p2->x, dsc->p2->y, LV_DRAW_MASK_LINE_SIDE_BOTTOM); int16_t line_mask_id = lv_draw_mask_add(&line_mask_param, NULL); /*Add a fade effect: transparent bottom covering top*/ lv_coord_t h = lv_obj_get_height(e->target); lv_draw_mask_fade_param_t fade_mask_param; lv_draw_mask_fade_init(&fade_mask_param, &e->target->coords, LV_OPA_COVER, e->target->coords.y1 + h / 8, LV_OPA_TRANSP,e->target->coords.y2); int16_t fade_mask_id = lv_draw_mask_add(&fade_mask_param, NULL); /*Draw a rectangle that will be affected by the mask*/ lv_draw_rect_dsc_t draw_rect_dsc; lv_draw_rect_dsc_init(&draw_rect_dsc); draw_rect_dsc.bg_opa = LV_OPA_50; draw_rect_dsc.bg_color = dsc->line_dsc->color; lv_area_t obj_clip_area; _lv_area_intersect(&obj_clip_area, dsc->clip_area, &e->target->coords); lv_area_t a; a.x1 = dsc->p1->x; a.x2 = dsc->p2->x - 1; a.y1 = LV_MIN(dsc->p1->y, dsc->p2->y); a.y2 = e->target->coords.y2; lv_draw_rect(&a, &obj_clip_area, &draw_rect_dsc); /*Remove the masks*/ lv_draw_mask_remove_id(line_mask_id); lv_draw_mask_remove_id(fade_mask_id); } #endif const lv_chart_series_t * ser = dsc->sub_part_ptr; if(lv_chart_get_pressed_point(e->target) == dsc->id) { if(lv_chart_get_type(e->target) == LV_CHART_TYPE_LINE) { dsc->rect_dsc->outline_color = lv_color_white(); dsc->rect_dsc->outline_width = 2; } else { dsc->rect_dsc->shadow_color = ser->color; dsc->rect_dsc->shadow_width = 15; dsc->rect_dsc->shadow_spread = 0; } char buf[8]; lv_snprintf(buf, sizeof(buf), "%d", dsc->value); lv_point_t text_size; lv_txt_get_size(&text_size, buf, font_normal, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE); lv_area_t txt_area; if(lv_chart_get_type(e->target) == LV_CHART_TYPE_BAR) { txt_area.y2 = dsc->draw_area->y1 - LV_DPX(15); txt_area.y1 = txt_area.y2 - text_size.y; if(ser == lv_chart_get_series_next(e->target, NULL)) { txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2; txt_area.x2 = txt_area.x1 + text_size.x; } else { txt_area.x2 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2; txt_area.x1 = txt_area.x2 - text_size.x; } } else { txt_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2 - text_size.x / 2; txt_area.x2 = txt_area.x1 + text_size.x; txt_area.y2 = dsc->draw_area->y1 - LV_DPX(15); txt_area.y1 = txt_area.y2 - text_size.y; } lv_area_t bg_area; bg_area.x1 = txt_area.x1 - LV_DPX(8); bg_area.x2 = txt_area.x2 + LV_DPX(8); bg_area.y1 = txt_area.y1 - LV_DPX(8); bg_area.y2 = txt_area.y2 + LV_DPX(8); lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); rect_dsc.bg_color = ser->color; rect_dsc.radius = LV_DPX(5); lv_draw_rect(&bg_area, dsc->clip_area, &rect_dsc); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); label_dsc.color = lv_color_white(); label_dsc.font = font_normal; lv_draw_label(&txt_area, dsc->clip_area, &label_dsc, buf, NULL); } else { dsc->rect_dsc->outline_width = 0; dsc->rect_dsc->shadow_width = 0; } } } } /** * @brief 进入按键回调 * @param None * @retval None */ void delete_start_page_cb(lv_obj_t *obj, lv_event_code_t event) { if (event == LV_EVENT_CLICKED) { lv_obj_del(obj->parent); } } /** * @brief 图表刷新定时回调 * @param None * @retval None */ static void add_data(lv_timer_t* timer) { LV_UNUSED(timer); lv_obj_t* chart = timer->user_data; // lv_chart_set_next_value(chart, ser1, lv_rand(10, 100)); // lv_chart_set_next_value(chart, ser2, lv_rand(200, 300)); // lv_chart_set_next_value(chart, ser3, lv_rand(400, 500)); lv_chart_refresh(chart); } /** * @brief 动态数据定时回调 * @param None * @retval None */ static void dynamic_show_data(lv_timer_t* timer) { LV_UNUSED(timer); sprintf(string, "%0.1f", (float)global_param.ser_dynamicData / 10); lv_label_set_text(global_obj.dynamic_show_Labe1, string); sprintf(string, "%05d", global_param.Light_dynamicData); lv_label_set_text(global_obj.dynamic_show_Labe2, string); } /** * @brief 消息框事件回调 * @param None * @retval None */ uint16_t adda; static void msgbox_event_cb(lv_event_t* e) { lv_obj_t* obj = lv_event_get_current_target(e); //LV_LOG_USER("Button %s clicked", lv_msgbox_get_active_btn_text(obj)); const char* dat = lv_msgbox_get_active_btn_text(obj); if (strcmp(dat, "确定") == 0) { if (lv_obj_get_state(global_obj.btn_graph_confirm) & LV_STATE_CHECKED)//判断启动按键的状态 { /* 根据通道号选择做线 */ global_state.Start_graph_state=true; lv_label_set_text(global_obj.confirm_btn_Labe, "停 止"); lv_obj_add_state(global_obj.btn_ellipse_angel, LV_STATE_DISABLED);//禁用按键 lv_obj_add_state(global_obj.btn_menu_back, LV_STATE_DISABLED);//禁用按键 lv_obj_add_state(global_obj.btn_channal_list, LV_STATE_DISABLED);//禁用按键 } else { global_state.Start_graph_state=false; lv_label_set_text(global_obj.confirm_btn_Labe, "启 动"); lv_obj_clear_state(global_obj.btn_ellipse_angel, LV_STATE_DISABLED);//启用按键 lv_obj_clear_state(global_obj.btn_menu_back, LV_STATE_DISABLED);//启用按键 lv_obj_clear_state(global_obj.btn_channal_list, LV_STATE_DISABLED);//启用按键 } lv_obj_del(obj->parent); } else if (strcmp(dat, "取消") == 0) { adda=lv_obj_get_state(global_obj.btn_graph_confirm); if (lv_obj_get_state(global_obj.btn_graph_confirm) & LV_STATE_CHECKED)//判断启动按键的状态 { lv_obj_clear_state(global_obj.btn_graph_confirm, LV_STATE_CHECKED);//清除按下状态 } if (lv_obj_get_state(global_obj.btn_graph_confirm)==LV_STATE_DEFAULT)//判断启动按键的状态 { lv_obj_add_state(global_obj.btn_graph_confirm, LV_STATE_CHECKED);//设置按下状态 } lv_obj_del(obj->parent); } } /** * @brief 消息框 * @param None * @retval None */ void lv_msgbox_create1(void) { static const char* btns[] = { "确定", "取消", "" }; lv_obj_t* mbox1 = lv_msgbox_create(NULL, "提示", "确定", btns, false); lv_obj_set_style_text_font(mbox1, &myFont_heiti20,0); lv_obj_add_event_cb(mbox1, msgbox_event_cb, LV_EVENT_VALUE_CHANGED, NULL); lv_obj_center(mbox1); } /** * @brief 校准提示消息框事件回调 * @param None * @retval None */ static void msgbox_event_cb2(lv_event_t* e) { lv_obj_t* obj = lv_event_get_current_target(e); //LV_LOG_USER("Button %s clicked", lv_msgbox_get_active_btn_text(obj)); const char* dat = lv_msgbox_get_active_btn_text(obj); if (strcmp(dat, "确定") == 0) { if(global_state.cal_confirm_state==false) { global_state.cal_confirm_state=true; } lv_obj_del(obj->parent); } else if (strcmp(dat, "取消") == 0) { lv_obj_del(obj->parent); } } /** * @brief 校准提示消息框 * @param None * @retval None */ void lv_msgbox_create2(void) { static const char* btns[] = { "确定", "取消", "" }; lv_obj_t* mbox1 = lv_msgbox_create(NULL, "提示", "确定", btns, false); lv_obj_set_style_text_font(mbox1, &myFont_heiti20, 0); lv_obj_add_event_cb(mbox1, msgbox_event_cb2, LV_EVENT_VALUE_CHANGED, NULL); lv_obj_center(mbox1); } /** * @brief 菜单按键回调 * @param None * @retval None */ void menu_btn_click_cb(lv_event_t *e) { lv_obj_t* obj = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); if (code == LV_EVENT_CLICKED) { if (obj == global_obj.btn_graph) // 作图 { lv_label_set_text(global_obj.menu_Labe, "作图"); graph_started(global_obj.menu_cout); global_param.FollowNum=1; } else if (obj == global_obj.btn_query) //查询 { lv_label_set_text(global_obj.menu_Labe, "查询"); query_started(global_obj.menu_cout); global_param.FollowNum=2; } else if (obj == global_obj.btn_data) //数据 { //lv_obj_del(chart1); lv_label_set_text(global_obj.menu_Labe, "数据"); data_started(global_obj.menu_cout); global_param.FollowNum=3; } else if (obj == global_obj.btn_clear) //清除 { global_param.FollowNum=4; } else if (obj == global_obj.btn_cal) //校准 { lv_msgbox_create2();//创建消息弹窗 global_param.FollowNum=5; } } } /** * @brief 数字键盘回调 * @param None * @retval None */ //static void textarea_event_handler(lv_event_t* e) //{ // lv_obj_t* ta = lv_event_get_target(e); // LV_LOG_USER("Enter was pressed. The current text is: %s", lv_textarea_get_text(ta)); //} static void btnm_event_handler(lv_event_t* e) { lv_obj_t* obj = lv_event_get_target(e); lv_obj_t* ta = lv_event_get_user_data(e); const char* txt = lv_btnmatrix_get_btn_text(obj, lv_btnmatrix_get_selected_btn(obj)); if (strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) lv_textarea_del_char(ta); else if (strcmp(txt, LV_SYMBOL_NEW_LINE) == 0){ //LV_LOG_USER("Enter was pressed. The current text is: %s",lv_textarea_get_text(ta)); lv_obj_del(obj->parent); } else lv_textarea_add_text(ta, txt); } /** * @brief 数字键盘创建 * @param None * @retval None */ void lv_btnm_create(lv_obj_t* parent) { lv_obj_t* textarea_cout = lv_obj_create(parent); lv_obj_remove_style_all(textarea_cout); /*Remove the style coming from the theme*/ lv_obj_add_style(textarea_cout, &style_cout, 0); lv_obj_set_size(textarea_cout, LV_HOR_RES, LV_VER_RES); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(textarea_cout, 0, 0); //设置位置 lv_obj_clear_flag(textarea_cout, LV_OBJ_FLAG_SCROLLABLE);//使对象不要滚动 lv_obj_set_style_bg_opa(textarea_cout, LV_OPA_90, 0); lv_obj_t* labe = lv_label_create(textarea_cout); //lv_obj_set_style_text_color(labe, lv_color_hex(0x006400), 0); lv_obj_set_style_text_font(labe, &myFont_heiti24, 0); lv_label_set_text(labe, "椭圆θ:"); lv_obj_align(labe, LV_ALIGN_TOP_MID, -200, 20); lv_obj_t* ta = lv_textarea_create(textarea_cout); lv_textarea_set_one_line(ta, true); lv_obj_align(ta, LV_ALIGN_TOP_MID, 0, 20); //lv_obj_add_event_cb(ta, textarea_event_handler, LV_EVENT_READY, ta); lv_obj_add_state(ta, LV_STATE_FOCUSED); /*To be sure the cursor is visible*/ static const char* btnm_map[] = { "1", "2", "3", "\n", "4", "5", "6", "\n", "7", "8", "9", "\n", "0", ".", LV_SYMBOL_BACKSPACE, "\n", LV_SYMBOL_NEW_LINE, "quit", "" }; lv_obj_t* btnm = lv_btnmatrix_create(textarea_cout); lv_obj_set_size(btnm, 260, 190); lv_obj_align(btnm, LV_ALIGN_BOTTOM_MID, 0, -10); lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, ta); lv_obj_clear_flag(btnm, LV_OBJ_FLAG_CLICK_FOCUSABLE); /*To keep the text area focused on button clicks*/ lv_btnmatrix_set_map(btnm, btnm_map); } /** * @brief 作图按键回调 * @param None * @retval None */ void graph_btn_click_cb(lv_event_t* e) { lv_obj_t* obj = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); uint16_t staa; if (code == LV_EVENT_CLICKED) { if (obj == global_obj.btn_graph_confirm) //启动 { lv_msgbox_create1();//创建消息弹窗 } else if(obj == global_obj.btn_ellipse_angel)//椭圆 { lv_btnm_create(lv_scr_act()); } else if (obj == global_obj.btn_menu_back) //返回菜单 { lv_label_set_text(global_obj.menu_Labe, "菜单"); lv_obj_del(global_obj.btn_menu_back->parent); //lv_obj_del(global_obj.chart_cout); } } } /** * @brief 查询按键回调 * @param None * @retval None */ void query_btn_click_cb(lv_event_t* e) { lv_obj_t* obj = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); uint16_t staa; if (code == LV_EVENT_CLICKED) { if (obj == global_obj.btn_graph_confirm) //启动 { lv_msgbox_create1();//创建消息弹窗 } else if (obj == global_obj.btn_menu_back) //返回菜单 { lv_label_set_text(global_obj.menu_Labe, "菜单"); lv_obj_del(global_obj.btn_menu_back->parent); //lv_obj_del(global_obj.chart_cout); } } } /** * @brief 数据按键回调 * @param None * @retval None */ void data_btn_click_cb(lv_event_t* e) { lv_obj_t* obj = lv_event_get_target(e); lv_event_code_t code = lv_event_get_code(e); uint16_t staa; if (code == LV_EVENT_CLICKED) { if (obj == global_obj.btn_graph_confirm) //启动 { lv_msgbox_create1();//创建消息弹窗 } else if (obj == global_obj.btn_menu_back) //返回菜单 { lv_label_set_text(global_obj.menu_Labe, "菜单"); lv_obj_del(global_obj.btn_menu_back->parent); //lv_obj_del(global_obj.chart_cout); } } } /** * @brief 下拉列表回调 * @param None * @retval None */ static void dropdown_event_handler(lv_event_t* e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t* obj = lv_event_get_target(e); if (code == LV_EVENT_VALUE_CHANGED) { char buf[32]; lv_dropdown_get_selected_str(obj, buf, sizeof(buf)); if(strcmp(buf, "通道1") == 0) global_param.Start_graph_num=1; if(strcmp(buf, "通道2") == 0) global_param.Start_graph_num=2; if(strcmp(buf, "通道3") == 0) global_param.Start_graph_num=3;//LV_LOG_USER("Option: %s", buf); } } /** * @brief 图表创建 * @param None * @retval None */ static void analytics_create12(lv_obj_t* parent) { // lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_ROW_WRAP); static lv_coord_t grid_chart_row_dsc[] = { 10, LV_GRID_FR(1), 20,LV_GRID_TEMPLATE_LAST };//图表容器上边10个像素点 static lv_coord_t grid_chart_col_dsc[] = { 27, LV_GRID_FR(1),5,LV_GRID_TEMPLATE_LAST };//图表左边27个像素点显示刻度 lv_obj_t* chart1_cont = lv_obj_create(parent); lv_obj_remove_style_all(chart1_cont); /*Remove the style coming from the theme*/ lv_obj_add_style(chart1_cont, &style_cout, 0); lv_obj_set_grid_dsc_array(chart1_cont, grid_chart_col_dsc, grid_chart_row_dsc);//设置图表容器的布局 lv_obj_set_size(chart1_cont, LV_PCT(81), LV_PCT(98));//设置图表容器的大小 lv_obj_set_pos(chart1_cont, 3, 3); //设置位置 /* 创建图表 */ static lv_obj_t* chart1; chart1 = lv_chart_create(chart1_cont); lv_obj_set_grid_cell(chart1, LV_GRID_ALIGN_STRETCH, 1, 1, LV_GRID_ALIGN_STRETCH, 1, 1);//设置对象的单元格,给图表划分区域,可以设置几行几列 lv_chart_set_axis_tick(chart1, LV_CHART_AXIS_PRIMARY_Y, 4, 2, 6, 5, true, 50);//Y轴刻度线绘制,主刻度4个像素,次刻度2个像素,6个主刻度,5个次刻度 lv_chart_set_axis_tick(chart1, LV_CHART_AXIS_PRIMARY_X, 4, 2, 11, 5, true, 30);//X轴刻度线绘制 lv_chart_set_div_line_count(chart1, 6, 0);//设置图表的水平线和垂直分线的数量 lv_obj_set_style_size(chart1, 3, LV_PART_INDICATOR);//Do not display points on the data lv_chart_set_point_count(chart1, Maximum_X_axis); //X轴的刻度从0~360度 lv_obj_set_style_border_width(chart1, 2, 0);//图表刻度边线的宽度 lv_obj_set_style_radius(chart1, 8, 0);//图标边框线的弧度 //lv_obj_set_style_bg_color(chart1,lv_palette_lighten(LV_PALETTE_BROWN,10),0); lv_chart_set_range(chart1, LV_CHART_AXIS_PRIMARY_Y, 0, Maximum_Y_axis);//设置Y轴的刻度从0~5.00V lv_obj_add_event_cb(chart1, chart_event_cb12, LV_EVENT_ALL, NULL); //lv_chart_set_zoom_x(chart1, 360 * 3); lv_obj_set_style_border_side(chart1, LV_BORDER_SIDE_LEFT | LV_BORDER_SIDE_BOTTOM, 0);//设置图表的边框 ser1 = lv_chart_add_series(chart1, lv_color_hex(0xD43239), LV_CHART_AXIS_PRIMARY_Y);//添加一条线D43239 ser2 = lv_chart_add_series(chart1, lv_color_hex(0xFDC800), LV_CHART_AXIS_PRIMARY_Y);//添加一条线FDC800 ser3 = lv_chart_add_series(chart1, lv_color_hex(0x00A7EE), LV_CHART_AXIS_PRIMARY_Y);//添加一条线00A7EE //ser4 = lv_chart_add_series(chart1, lv_color_hex(0x2F8F1F), LV_CHART_AXIS_PRIMARY_Y);//添加一条线2F8F1F //ser5 = lv_chart_add_series(chart1, lv_color_hex(0xA020F0), LV_CHART_AXIS_PRIMARY_Y);//添加一条线A020F0 lv_chart_set_update_mode(chart1, LV_CHART_UPDATE_MODE_CIRCULAR);//图表数据循环更新,lv_chart_set_next_value更新模式 lv_timer_create(add_data, 40, chart1); } /** * @brief 开始按钮菜单 * @param None * @retval None */ static void lv_example_get_started(lv_obj_t * parent) { lv_obj_t * btn_cout = lv_obj_create(parent); lv_obj_remove_style_all(btn_cout); /*Remove the style coming from the theme*/ lv_obj_add_style(btn_cout, &style_cout, 0); lv_obj_set_size(btn_cout, 82, lv_pct(84)); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(btn_cout, LV_HOR_RES-85, 40); //设置位置 lv_obj_clear_flag(btn_cout, LV_OBJ_FLAG_SCROLLABLE);//使对象不要滚动 lv_obj_set_flex_align(btn_cout, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND );//弹性布局 /* 按键1 */ lv_obj_t * btn1 = lv_btn_create(btn_cout); lv_obj_remove_style_all(btn1); /*Remove the style coming from the theme*/ lv_obj_add_style(btn1, &style_btn, 0); lv_obj_add_style(btn1, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn1, 76, 40); lv_obj_t * label = lv_label_create(btn1); lv_label_set_text(label, "作 图"); lv_obj_center(label); /* 按键2 */ lv_obj_t * btn2 = lv_btn_create(btn_cout); lv_obj_remove_style_all(btn2); /*Remove the style coming from the theme*/ lv_obj_add_style(btn2, &style_btn, 0); lv_obj_add_style(btn2, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn2, 76, 40); lv_obj_t * labe2 = lv_label_create(btn2); lv_label_set_text(labe2, "查 询"); lv_obj_center(labe2); /* 按键3 */ lv_obj_t * btn3 = lv_btn_create(btn_cout); lv_obj_remove_style_all(btn3); /*Remove the style coming from the theme*/ lv_obj_add_style(btn3, &style_btn, 0); lv_obj_add_style(btn3, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn3, 76, 40); lv_obj_t * labe3 = lv_label_create(btn3); lv_label_set_text(labe3, "数 据"); lv_obj_center(labe3); /* 按键4 */ lv_obj_t * btn4 = lv_btn_create(btn_cout); lv_obj_remove_style_all(btn4); /*Remove the style coming from the theme*/ lv_obj_add_style(btn4, &style_btn, 0); lv_obj_add_style(btn4, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn4, 76, 40); lv_obj_t * labe4 = lv_label_create(btn4); lv_label_set_text(labe4, "清 除"); lv_obj_center(labe4); /* 按键5 */ lv_obj_t * btn5 = lv_btn_create(btn_cout); lv_obj_remove_style_all(btn5); /*Remove the style coming from the theme*/ lv_obj_add_style(btn5, &style_btn, 0); lv_obj_add_style(btn5, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn5, 76, 40); lv_obj_t * labe5 = lv_label_create(btn5); lv_label_set_text(labe5, "校 准"); lv_obj_center(labe5); lv_obj_add_event_cb(btn1, menu_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn2, menu_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn3, menu_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn4, menu_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn5, menu_btn_click_cb, LV_EVENT_CLICKED, NULL); global_obj.btn_graph = btn1; global_obj.btn_query = btn2; global_obj.btn_data = btn3; global_obj.btn_back = btn4; global_obj.btn_cal = btn5; } /** * @brief 作图按钮菜单 * @param None * @retval None */ static void graph_started(lv_obj_t * parent) { //style_init(); lv_obj_t * btn_cout2 = lv_obj_create(parent); lv_obj_remove_style_all(btn_cout2); /*Remove the style coming from the theme*/ lv_obj_add_style(btn_cout2, &style_cout, 0); lv_obj_set_size(btn_cout2, 82, lv_pct(84)); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(btn_cout2, LV_HOR_RES-85, 40); //设置位置 lv_obj_clear_flag(btn_cout2, LV_OBJ_FLAG_SCROLLABLE);//使对象不要滚动 lv_obj_set_flex_align(btn_cout2, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND );//弹性布局 /* 通道选择下拉列表 */ static const char * opts = "通道1\n" "通道2\n" "通道3"; lv_obj_t * dd = lv_dropdown_create(btn_cout2); lv_obj_remove_style_all(dd); /*Remove the style coming from the theme*/ lv_obj_add_style(dd, &style_btn, 0); lv_obj_add_style(dd, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(dd, 76, 40); //设置大小(宽、高),lv_pct()表示百分比 lv_dropdown_set_options_static(dd, opts);//从静态字符串(全局、静态或动态分配)中设置下拉列表中的选项。 只有选项字符串的指针将被保存。 lv_dropdown_set_dir(dd, LV_DIR_LEFT);//设置列表的弹出方向 lv_dropdown_set_symbol(dd, LV_SYMBOL_DUMMY);//设置下拉列表的符号,LV_SYMBOL_DUMMY为不显示 lv_obj_t* list = lv_dropdown_get_list(dd); //要设置列表的样式,必须先获取列表 lv_obj_set_style_text_font(list, &myFont_heiti24, 0); /* 按键1 */ lv_obj_t * btn11 = lv_btn_create(btn_cout2); lv_obj_remove_style_all(btn11); /*Remove the style coming from the theme*/ lv_obj_add_style(btn11, &style_btn, 0); lv_obj_add_style(btn11, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_add_style(btn11, &style_btn_checked, LV_STATE_CHECKED); lv_obj_add_flag(btn11, LV_OBJ_FLAG_CHECKABLE);// 设置成开关类型 lv_obj_set_size(btn11, 76, 40); lv_obj_t * labe11 = lv_label_create(btn11); lv_label_set_text(labe11, "启 动"); lv_obj_center(labe11); /* 按键2 */ lv_obj_t* btn12 = lv_btn_create(btn_cout2); lv_obj_remove_style_all(btn12); /*Remove the style coming from the theme*/ lv_obj_add_style(btn12, &style_btn, 0); lv_obj_add_style(btn12, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn12, 76, 40); lv_obj_t* labe12 = lv_label_create(btn12); lv_label_set_text(labe12, "椭 圆"); lv_obj_center(labe12); /* 按键3 */ lv_obj_t * btn13 = lv_btn_create(btn_cout2); lv_obj_remove_style_all(btn13); /*Remove the style coming from the theme*/ lv_obj_add_style(btn13, &style_btn, 0); lv_obj_add_style(btn13, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn13, 76, 40); lv_obj_t * labe13 = lv_label_create(btn13); lv_label_set_text(labe13, "返 回"); lv_obj_center(labe13); lv_obj_add_event_cb(btn11, graph_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn12, graph_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn13, graph_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(dd, dropdown_event_handler, LV_EVENT_ALL, NULL); global_obj.btn_graph_confirm = btn11; global_obj.btn_ellipse_angel = btn12; global_obj.btn_menu_back = btn13; global_obj.btn_channal_list = dd; global_obj.confirm_btn_Labe = labe11; } /** * @brief 查询按钮菜单 * @param None * @retval None */ static void query_started(lv_obj_t * parent) { lv_obj_t * btn_cout3 = lv_obj_create(parent); lv_obj_remove_style_all(btn_cout3); /*Remove the style coming from the theme*/ lv_obj_add_style(btn_cout3, &style_cout, 0); lv_obj_set_size(btn_cout3, 82, lv_pct(84)); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(btn_cout3, LV_HOR_RES-85, 40); //设置位置 lv_obj_clear_flag(btn_cout3, LV_OBJ_FLAG_SCROLLABLE);//使对象不要滚动 lv_obj_set_flex_align(btn_cout3, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND );//弹性布局 /* 按键7 */ lv_obj_t * btn7 = lv_btn_create(btn_cout3); lv_obj_remove_style_all(btn7); /*Remove the style coming from the theme*/ lv_obj_add_style(btn7, &style_btn, 0); lv_obj_add_style(btn7, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn7, 76, 40); lv_obj_t * labe7 = lv_label_create(btn7); lv_label_set_text(labe7, "确 认"); lv_obj_center(labe7); /* 按键8 */ lv_obj_t * btn8 = lv_btn_create(btn_cout3); lv_obj_remove_style_all(btn8); /*Remove the style coming from the theme*/ lv_obj_add_style(btn8, &style_btn, 0); lv_obj_add_style(btn8, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn8, 76, 40); lv_obj_t * labe8 = lv_label_create(btn8); lv_label_set_text(labe8, "返 回"); lv_obj_center(labe8); lv_obj_add_event_cb(btn7, query_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn8, query_btn_click_cb, LV_EVENT_CLICKED, NULL); global_obj.btn_graph_confirm = btn7; global_obj.btn_menu_back = btn8; } /** * @brief 数据按钮菜单 * @param None * @retval None */ static void data_started(lv_obj_t * parent) { //style_init(); lv_obj_t * btn_cout4 = lv_obj_create(parent); lv_obj_remove_style_all(btn_cout4); /*Remove the style coming from the theme*/ lv_obj_add_style(btn_cout4, &style_cout, 0); lv_obj_set_size(btn_cout4, 82, lv_pct(84)); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(btn_cout4, LV_HOR_RES-85, 40); //设置位置 lv_obj_clear_flag(btn_cout4, LV_OBJ_FLAG_SCROLLABLE);//使对象不要滚动 lv_obj_set_flex_align(btn_cout4, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND );//弹性布局 /* 按键7 */ lv_obj_t * btn9 = lv_btn_create(btn_cout4); lv_obj_remove_style_all(btn9); /*Remove the style coming from the theme*/ lv_obj_add_style(btn9, &style_btn, 0); lv_obj_add_style(btn9, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn9, 76, 40); lv_obj_t * labe9 = lv_label_create(btn9); lv_label_set_text(labe9, "确认"); lv_obj_center(labe9); /* 按键8 */ lv_obj_t * btn10 = lv_btn_create(btn_cout4); lv_obj_remove_style_all(btn10); /*Remove the style coming from the theme*/ lv_obj_add_style(btn10, &style_btn, 0); lv_obj_add_style(btn10, &style_btn_pressed, LV_STATE_PRESSED); lv_obj_set_size(btn10, 76, 40); lv_obj_t * labe10 = lv_label_create(btn10); lv_label_set_text(labe10, "返 回"); lv_obj_center(labe10); lv_obj_add_event_cb(btn9, data_btn_click_cb, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn10, data_btn_click_cb, LV_EVENT_CLICKED, NULL); global_obj.btn_graph_confirm = btn9; global_obj.btn_menu_back = btn10; } static void lv_menu_name_create(lv_obj_t * parent) { lv_obj_t * menu_name_cout = lv_obj_create(lv_scr_act()); lv_obj_remove_style_all(menu_name_cout); /*Remove the style coming from the theme*/ lv_obj_add_style(menu_name_cout, &style_cout, 0); lv_obj_set_size(menu_name_cout, 82, 32); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(menu_name_cout, LV_HOR_RES-85, 3); //设置位置 lv_obj_t * labe5 = lv_label_create(menu_name_cout); lv_obj_set_style_text_font(labe5,&myFont_heiti24,0); lv_obj_set_style_text_color(labe5,lv_color_hex(0x000000),0); lv_label_set_text(labe5, "菜单"); lv_obj_center(labe5); global_obj.menu_Labe = labe5; } static void lv_dynamic_show_create(lv_obj_t * parent) { lv_obj_t * dynamic_show_cout1 = lv_obj_create(lv_scr_act()); lv_obj_remove_style_all(dynamic_show_cout1); /*Remove the style coming from the theme*/ lv_obj_add_style(dynamic_show_cout1, &style_cout_labe, 0); lv_obj_set_size(dynamic_show_cout1, 160, 46); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(dynamic_show_cout1, lv_pct(8), lv_pct(2)); //设置位置 lv_obj_t * labe1 = lv_label_create(dynamic_show_cout1); lv_obj_set_style_text_color(labe1,lv_color_hex(0x9932CC),0); lv_obj_set_style_text_font(labe1,&myFont_heiti24,0); lv_label_set_text(labe1, "角度:"); lv_obj_align_to(labe1,dynamic_show_cout1 , LV_ALIGN_LEFT_MID, 0, 3); lv_obj_t * labe3 = lv_label_create(dynamic_show_cout1); lv_obj_set_style_text_color(labe3,lv_color_hex(0x9932CC),0); lv_label_set_text(labe3, "360.0"); lv_obj_align_to(labe3,dynamic_show_cout1 , LV_ALIGN_CENTER, 18, 0); lv_obj_t * dynamic_show_cout2 = lv_obj_create(lv_scr_act()); lv_obj_remove_style_all(dynamic_show_cout2); /*Remove the style coming from the theme*/ lv_obj_add_style(dynamic_show_cout2, &style_cout_labe, 0); lv_obj_set_size(dynamic_show_cout2, 165, 46); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(dynamic_show_cout2, lv_pct(45), lv_pct(2)); //设置位置 lv_obj_t * labe4 = lv_label_create(dynamic_show_cout2); lv_obj_set_style_text_color(labe4,lv_color_hex(0x006400),0); lv_obj_set_style_text_font(labe4,&myFont_heiti24,0); lv_label_set_text(labe4, "光强:"); lv_obj_align_to(labe4,dynamic_show_cout2 , LV_ALIGN_LEFT_MID, 0, 3); lv_obj_t * labe5 = lv_label_create(dynamic_show_cout2); lv_obj_set_style_text_color(labe5,lv_color_hex(0x006400),0); lv_label_set_text(labe5, "22000"); lv_obj_align_to(labe5,dynamic_show_cout2 , LV_ALIGN_RIGHT_MID, 0, 0); global_obj.dynamic_show_Labe1 = labe3; global_obj.dynamic_show_Labe2 = labe5; lv_timer_create(dynamic_show_data, 150, dynamic_show_cout1); } void lv_display_widgets(void) { style_init(); lv_obj_t * cout = lv_obj_create(lv_scr_act()); lv_obj_set_size(cout, LV_HOR_RES, LV_VER_RES); //设置大小(宽、高),lv_pct()表示百分比 lv_obj_set_pos(cout, 0, 0); //设置位置 lv_obj_clear_flag(cout, LV_OBJ_FLAG_SCROLLABLE);//使对象不要滚动 lv_obj_set_style_radius(cout, 0, 0);//图标边框线的弧度 lv_obj_set_style_border_width(cout,0,0); lv_obj_set_style_pad_all(cout,0,0);//容器边上的填充为零 lv_obj_set_style_bg_color(cout, lv_color_hex(0xC0C0C0),0); global_obj.menu_cout = cout; lv_menu_name_create(cout); lv_dynamic_show_create(cout); analytics_create12(cout); lv_example_get_started(cout); }