/* * Copyright 2023 NXP * NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in * accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, * activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to * comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license * terms, then you may not retain, install, activate or otherwise use the software. */ /********************* * INCLUDES *********************/ #include #include #include "lvgl.h" #include "custom.h" #include #include #include #include /********************* * DEFINES *********************/ /********************** * TYPEDEFS **********************/ //lv_obj_t *screen_list_inf; /********************** * STATIC PROTOTYPES **********************/ /********************** * STATIC VARIABLES **********************/ /** * Create a demo application */ int16_t Work_row = -1; int16_t Work_step_row = -1; int16_t run_step_row = -1; int16_t pname_row = -1; int16_t pname_step_row = -1; // 绘图回调 static void table_style_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t *table = lv_event_get_target(e); if (code == LV_EVENT_DRAW_PART_BEGIN) { lv_obj_draw_part_dsc_t *dsc = lv_event_get_param(e); // 检查是否是单元格绘制 if (dsc->part == LV_PART_ITEMS && dsc->id < LV_TABLE_CELL_NONE) { uint16_t row = dsc->id / lv_table_get_col_cnt(table); //uint16_t col = dsc->id % lv_table_get_col_cnt(table); if (row == 0) { // 表头 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->rect_dsc->bg_color = lv_color_hex(0xd5dee6); dsc->label_dsc->color = lv_color_hex(0x000000); dsc->label_dsc->font = &lv_font_simsun_30; }// 如果是选中行,绘制蓝色背景 else if ((row == Work_row)&&(table == guider_ui.screen_list_inf)) { dsc->rect_dsc->bg_color = lv_color_hex(0x007185); // 蓝色背景 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->label_dsc->color = lv_color_hex(0xFFFFFF); // 白色文字 dsc->label_dsc->font = &lv_font_simsun_24; } else if ((table == guider_ui.screen_w_list)&&(row == Work_step_row)) { dsc->rect_dsc->bg_color = lv_color_hex(0x007185); // 蓝色背景 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->label_dsc->color = lv_color_hex(0xFFFFFF); // 白色文字 dsc->label_dsc->font = &lv_font_simsun_24; } else if ((table == guider_ui.screen_run_step)&&(row == run_step_row)) { dsc->rect_dsc->bg_color = lv_color_hex(0x007185); // 蓝色背景 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->label_dsc->color = lv_color_hex(0xFFFFFF); // 白色文字 dsc->label_dsc->font = &lv_font_simsun_24; } else if ((table == guider_ui.screen_pname_row)&&(row == pname_row)) { dsc->rect_dsc->bg_color = lv_color_hex(0x007185); // 蓝色背景 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->label_dsc->color = lv_color_hex(0xFFFFFF); // 白色文字 dsc->label_dsc->font = &lv_font_simsun_24; } else if ((table == guider_ui.screen_pname_step_row)&&(row == pname_step_row)) { dsc->rect_dsc->bg_color = lv_color_hex(0x007185); // 蓝色背景 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->label_dsc->color = lv_color_hex(0xFFFFFF); // 白色文字 dsc->label_dsc->font = &lv_font_simsun_24; } ; } } } static void table_step_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t *table = lv_event_get_target(e); if (code == LV_EVENT_DRAW_PART_BEGIN) { lv_obj_draw_part_dsc_t *dsc = lv_event_get_param(e); // 检查是否是单元格绘制 if (dsc->part == LV_PART_ITEMS && dsc->id < LV_TABLE_CELL_NONE) { uint16_t row = dsc->id / lv_table_get_col_cnt(table); //uint16_t col = dsc->id % lv_table_get_col_cnt(table); if (row == Work_step_row) { dsc->rect_dsc->bg_color = lv_color_hex(0x007185); // 蓝色背景 dsc->rect_dsc->bg_opa = LV_OPA_COVER; dsc->label_dsc->color = lv_color_hex(0xFFFFFF); // 白色文字 dsc->label_dsc->font = &lv_font_simsun_24; } } } } //点击事件回调 char value_W[32] = {0}; int value_S=0; static void table_click_event_cb(lv_event_t *e) { lv_obj_t *table = lv_event_get_target(e); lv_indev_t *indev = lv_indev_get_act(); if (indev == NULL) return; char sql[64] = {0}; // 获取点击坐标 lv_point_t point; lv_indev_get_point(indev, &point); // 获取 table 区域 lv_area_t table_area; lv_obj_get_coords(table, &table_area); // 计算相对 Y 坐标 int32_t rel_y = point.y - table_area.y1; //通过内容高度和行数计算行高 uint16_t row_cnt = lv_table_get_row_cnt(table); if (row_cnt == 0) return; // 获取表格内容区域高度(减去边框和padding) int32_t border_width = lv_obj_get_style_border_width(table, LV_PART_MAIN); int32_t pad_top = lv_obj_get_style_pad_top(table, LV_PART_MAIN); int32_t pad_bottom = lv_obj_get_style_pad_bottom(table, LV_PART_MAIN); int32_t content_h = table_area.y2 - table_area.y1 - border_width * 2 - pad_top - pad_bottom; // 计算行高 int32_t row_h = content_h / row_cnt; if (row_h <= 0) return; // 计算行号 int16_t row = rel_y / row_h; if (row >= 0 && row < row_cnt) { lv_obj_invalidate(table); //rt_kprintf("row: %d", row); } Work_row=-1; Work_step_row=-1; run_step_row = -1; pname_row = -1; pname_step_row = -1; //获得来源表 if(table == guider_ui.screen_list_inf)//总览信息/工艺信息 { Work_row = row;// 写入行号 rt_snprintf(value_W, sizeof(value_W),lv_table_get_cell_value(guider_ui.screen_list_inf, row, 0)); Work_Program_step_ui(value_W); } else if(table == guider_ui.screen_w_list){//步骤信息 Work_step_row = row;// 写入行号 if(value_W[0] == '\0') return; rt_snprintf(sql, sizeof(sql),"%s' AND Step = '%s'",value_W,lv_table_get_cell_value(guider_ui.screen_w_list, row, 0)); Work_Program_stepINF_ui(sql); } else if(table == guider_ui.screen_run_step){//工艺信息 run_step_row = row;// 写入行号 if(value_W[0] == '\0') return; } else if(table == guider_ui.screen_pname_row){//工艺程序信息 pname_row = row;// 写入行号 rt_snprintf(value_W, sizeof(value_W),lv_table_get_cell_value(guider_ui.screen_pname_row, row, 0)); UI_pname_step_row(value_W); UI_pname_step_inf(value_W,0); //按钮(删除,存储)生效 lv_obj_clear_state(guider_ui.screen_set_Delete,LV_STATE_DISABLED); lv_obj_clear_state(guider_ui.screen_set_Save,LV_STATE_DISABLED); } else if(table == guider_ui.screen_pname_step_row){//工艺程序细节信息 pname_step_row = row;// 写入行号 value_S = atoi(lv_table_get_cell_value(guider_ui.screen_pname_step_row, row, 0)); UI_pname_step_inf(value_W,value_S); //按钮(编辑,插入)生效 lv_obj_clear_state(guider_ui.screen_set_Edit,LV_STATE_DISABLED); lv_obj_clear_state(guider_ui.screen_set_Insert,LV_STATE_DISABLED); } } // 初始化样式 void table_style_init(lv_obj_t *container) { //lv_obj_add_event_cb(container, table_style_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_obj_add_event_cb(container, table_click_event_cb, LV_EVENT_CLICKED, NULL); lv_obj_set_pos(container, 0, 0); lv_obj_set_scrollbar_mode(container, LV_SCROLLBAR_MODE_OFF); //Write style for screen_list_inf, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT. lv_obj_set_style_pad_top(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_pad_bottom(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_pad_left(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_pad_right(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_bg_opa(container, 255, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_bg_color(container, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_bg_grad_dir(container, LV_GRAD_DIR_NONE, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_border_width(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_radius(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_shadow_width(container, 0, LV_PART_MAIN|LV_STATE_DEFAULT); //Write style for screen_list_inf, Part: LV_PART_ITEMS, State: LV_STATE_DEFAULT. lv_obj_set_style_text_color(container, lv_color_hex(0x393c41), LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_text_font(container, &lv_font_simsun_24, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_text_opa(container, 255, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_text_align(container, LV_TEXT_ALIGN_CENTER, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_bg_opa(container, 0, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_border_width(container, 3, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_border_opa(container, 255, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_border_color(container, lv_color_hex(0xd5dee6), LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_border_side(container, LV_BORDER_SIDE_FULL, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_pad_top(container, 10, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_pad_bottom(container, 10, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_pad_left(container, 10, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_pad_right(container, 10, LV_PART_ITEMS|LV_STATE_DEFAULT); lv_obj_set_style_text_color(container, lv_color_hex(0xFFFFFF), LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_text_font(container, &lv_font_simsun_24, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_text_opa(container, 255, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_text_align(container, LV_TEXT_ALIGN_CENTER, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_bg_opa(container, 255, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_bg_color(container, lv_color_hex(0x007185), LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_border_width(container, 0, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_border_opa(container, 0, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_pad_top(container, 10, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_pad_bottom(container, 10, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_pad_left(container, 10, LV_PART_ITEMS|LV_STATE_CHECKED); lv_obj_set_style_pad_right(container, 10, LV_PART_ITEMS|LV_STATE_CHECKED); } // 页面事件回调函数 static void tabview_event_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t *tabview = lv_event_get_target(e); if (code == LV_EVENT_VALUE_CHANGED) { // 获取当前选中的 Tab 索引 uint16_t tab_id = lv_tabview_get_tab_act(tabview); // 根据 tab_id 执行不同操作 switch (tab_id) { case 0://工单页面 io_ui_show=0; break; case 1://工艺页面 io_ui_show=0; break; case 2: io_ui_show=1; break; case 3://程序页面 io_ui_show=0; lv_obj_add_state(guider_ui.screen_set_Edit,LV_STATE_DISABLED); lv_obj_add_state(guider_ui.screen_set_Insert,LV_STATE_DISABLED); lv_obj_add_state(guider_ui.screen_set_Delete,LV_STATE_DISABLED); lv_obj_add_state(guider_ui.screen_set_Save,LV_STATE_DISABLED); UI_pname_row(); break; case 4: io_ui_show=0; break; } } } // 机台页面事件回调函数 static void w_io_event_cb(lv_event_t *e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t *tabview = lv_event_get_target(e); if (code == LV_EVENT_VALUE_CHANGED) { // 获取当前选中的 Tab 索引 uint16_t tab_id = lv_tabview_get_tab_act(tabview); // 根据 tab_id 执行不同操作 switch (tab_id) { case 0: io_ui_size=0; break; case 1: io_ui_size=1; break; case 2: io_ui_size=2; break; case 3: io_ui_size=3; break; } } } void custom_init(lv_ui *ui) { lv_obj_clear_flag(lv_tabview_get_content(ui->screen_tabview), LV_OBJ_FLAG_SCROLLABLE);//禁止左右滑动 lv_obj_clear_flag(lv_tabview_get_content(ui->screen_w_io), LV_OBJ_FLAG_SCROLLABLE);//禁止左右滑动 //选项卡回调事件设置 lv_obj_add_event_cb(ui->screen_tabview, tabview_event_cb, LV_EVENT_VALUE_CHANGED, NULL);// lv_obj_add_event_cb(ui->screen_w_io, w_io_event_cb, LV_EVENT_VALUE_CHANGED, NULL);// lv_obj_set_style_pad_all(ui->screen_tabview_tab_1, 0, LV_PART_MAIN); lv_obj_set_style_pad_all(ui->screen_tabview_tab_2, 0, LV_PART_MAIN); lv_obj_set_style_pad_all(ui->screen_tabview_tab_3, 0, LV_PART_MAIN); lv_obj_set_style_pad_all(ui->screen_tabview_tab_4, 0, LV_PART_MAIN); lv_obj_set_style_pad_all(ui->screen_w_io_tab_1, 0, LV_PART_MAIN); lv_obj_set_scroll_dir(ui->screen_w_io_tab_1, LV_DIR_NONE); lv_obj_set_style_pad_all(ui->screen_w_io_tab_2, 0, LV_PART_MAIN); lv_obj_set_scroll_dir(ui->screen_w_io_tab_2, LV_DIR_NONE); lv_obj_set_style_pad_all(ui->screen_w_io_tab_3, 0, LV_PART_MAIN); lv_obj_set_scroll_dir(ui->screen_w_io_tab_3, LV_DIR_NONE); lv_obj_set_style_pad_all(ui->screen_w_io_tab_4, 0, LV_PART_MAIN); lv_obj_set_scroll_dir(ui->screen_w_io_tab_4, LV_DIR_NONE); //工单页面的工艺信息列表 guider_ui.screen_list_inf = lv_table_create(guider_ui.screen_inf_list); table_style_init(guider_ui.screen_list_inf); lv_obj_add_event_cb(guider_ui.screen_list_inf, table_style_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_table_set_col_cnt(guider_ui.screen_list_inf,2); lv_table_set_col_width(guider_ui.screen_list_inf, 0, 350); lv_table_set_col_width(guider_ui.screen_list_inf, 1, 360); lv_table_set_cell_value(guider_ui.screen_list_inf,0,0,"工单"); lv_table_set_cell_value(guider_ui.screen_list_inf,0,1,"工艺"); //工单页面的步骤列表 guider_ui.screen_w_list_NAME = lv_table_create(guider_ui.screen_tabview_tab_1); lv_obj_set_pos(guider_ui.screen_w_list_NAME, 0, 0); lv_obj_set_size(guider_ui.screen_w_list_NAME, 300, 50); table_style_init(guider_ui.screen_w_list_NAME); lv_obj_add_event_cb(guider_ui.screen_w_list_NAME, table_style_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_table_set_row_cnt(guider_ui.screen_w_list_NAME,1); lv_table_set_col_width(guider_ui.screen_w_list_NAME, 0, 50); lv_table_set_col_width(guider_ui.screen_w_list_NAME, 1, 250); lv_table_set_cell_value(guider_ui.screen_w_list_NAME,0,0,"步"); lv_table_set_cell_value(guider_ui.screen_w_list_NAME,0,1,"工艺"); guider_ui.screen_w_list = lv_table_create(guider_ui.screen_step_list); table_style_init(guider_ui.screen_w_list); lv_obj_add_event_cb(guider_ui.screen_w_list, table_step_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_table_set_col_cnt(guider_ui.screen_w_list,2); lv_table_set_row_cnt(guider_ui.screen_w_list,2); lv_table_set_col_width(guider_ui.screen_w_list, 0, 50); lv_table_set_col_width(guider_ui.screen_w_list, 1, 250); lv_obj_set_style_height(guider_ui.screen_w_list, 100, LV_PART_ITEMS | LV_STATE_DEFAULT); lv_obj_set_style_min_height(guider_ui.screen_w_list, 100, LV_PART_ITEMS | LV_STATE_DEFAULT); lv_obj_set_style_max_height(guider_ui.screen_w_list, 100, LV_PART_ITEMS | LV_STATE_DEFAULT); //工单页面的信息 lv_obj_set_size(guider_ui.screen_text_inf, 550, 230); lv_label_set_text(guider_ui.screen_text_inf,""); //运行页面的步骤列表 guider_ui.screen_run_step = lv_table_create(guider_ui.screen_cont_p); table_style_init(guider_ui.screen_run_step); lv_obj_add_event_cb(guider_ui.screen_run_step, table_style_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_table_set_row_cnt(guider_ui.screen_run_step,1); lv_table_set_col_width(guider_ui.screen_run_step, 0, 80); lv_table_set_col_width(guider_ui.screen_run_step, 1, 370); lv_table_set_cell_value(guider_ui.screen_run_step,0,0,"步"); lv_table_set_cell_value(guider_ui.screen_run_step,0,1,"工艺"); //程序页面的工艺信息列表 guider_ui.screen_pname_row = lv_table_create(guider_ui.screen_step_set); table_style_init(guider_ui.screen_pname_row); lv_obj_add_event_cb(guider_ui.screen_pname_row, table_style_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_table_set_col_cnt(guider_ui.screen_pname_row,3); lv_table_set_col_width(guider_ui.screen_pname_row, 0, 430); lv_table_set_col_width(guider_ui.screen_pname_row, 1, 84); lv_table_set_col_width(guider_ui.screen_pname_row, 2, 200); lv_table_set_cell_value(guider_ui.screen_pname_row,0,0,"工艺"); lv_table_set_cell_value(guider_ui.screen_pname_row,0,1,"步骤"); lv_table_set_cell_value(guider_ui.screen_pname_row,0,2,"时间"); //程序页面的步骤列表 guider_ui.screen_pname_step_row = lv_table_create(guider_ui.screen_proess_set); lv_obj_set_pos(guider_ui.screen_pname_step_row, 0, 0); lv_obj_set_size(guider_ui.screen_pname_step_row, 300, 50); table_style_init(guider_ui.screen_pname_step_row); lv_obj_add_event_cb(guider_ui.screen_pname_step_row, table_style_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); lv_table_set_row_cnt(guider_ui.screen_pname_step_row,1); lv_table_set_col_width(guider_ui.screen_pname_step_row, 0, 50); lv_table_set_col_width(guider_ui.screen_pname_step_row, 1, 250); lv_table_set_cell_value(guider_ui.screen_pname_step_row,0,0,"步"); lv_table_set_cell_value(guider_ui.screen_pname_step_row,0,1,"工艺"); /* Add your codes here */ }