#include #include #include #include #include #include "libcsv.h" #include "lvgl.h" #include "SC828_DATA_table.h" #define CSV_MAX_ROWS 260 // 最大行数 #define CSV_MAX_COLS 48 // 每行最大列数 #define CSV_MAX_FIELD 64 // 每个字段最大长度 // ============ 数据结构定义 ============ typedef struct { int row; // 当前行号 int col; // 当前列号 int total_rows; // 总行数 int max_cols; // 最大列数 int col_widths[CSV_MAX_COLS]; // 宽度(像素) char data[CSV_MAX_ROWS][CSV_MAX_COLS][CSV_MAX_FIELD]; // 固定二维数组 } UserData; // ============ 字段回调函数 ============ void field_callback(void *data, size_t size, void *user_data) { UserData *user = (UserData *)user_data; // 检查边界 if (user->row >= CSV_MAX_ROWS) { //rt_kprintf("[W] 超出最大行数 %d\n", CSV_MAX_ROWS); return; } if (user->col >= CSV_MAX_COLS) { //rt_kprintf("[W] 超出最大列数 %d\n", CSV_MAX_COLS); return; } // 限制字段长度 size_t copy_size = size; if (copy_size >= CSV_MAX_FIELD) { copy_size = CSV_MAX_FIELD - 1; //rt_kprintf("[W] 字段截断\n"); } // 复制数据到固定数组 rt_memcpy(user->data[user->row][user->col], data, copy_size); user->data[user->row][user->col][copy_size] = '\0'; // 计算当前字段宽度并更新列宽 int field_width = size * 18; // 假设每个字符 8 像素(英文) // 中文字符需要 ×2:field_width = copy_size * 16; if (field_width > user->col_widths[user->col]) { user->col_widths[user->col] = field_width; } // 调试输出 //rt_kprintf("R:%d C:%d V:\"%s\"\n", user->row, user->col, user->data[user->row][user->col]); // 列号+1 user->col++; // 更新最大列数 if (user->col > user->max_cols) { user->max_cols = user->col; } // 更新总行数 if (user->row + 1 > user->total_rows) { user->total_rows = user->row + 1; } } // ============ 行回调函数 ============ void row_callback(int c, void *user_data) { UserData *user = (UserData *)user_data; // 行结束,重置列号,行号+1 user->row++; user->col = 0; } // ============ 获取指定单元格数据 ============ const char* csv_get_cell(UserData *user, int row, int col) { if (user == NULL) { return NULL; } if (row < 0 || row >= user->total_rows) { return NULL; } if (col < 0 || col >= user->max_cols) { return NULL; } return user->data[row][col]; } // ============ 获取列宽 ============ int csv_get_col_width(UserData *user, int col) { if (user == NULL) return 0; if (col < 0 || col >= user->max_cols) return 0; return user->col_widths[col]; } // ============ 获取行数 ============ int csv_get_row_count(UserData *user) { return user ? user->total_rows : 0; } // ============ 获取列数 ============ int csv_get_col_count(UserData *user) { return user ? user->max_cols : 0; } // ============ 清空数据 ============ void csv_clear_data(UserData *user) { if (user == NULL) { return; } user->row = 0; user->col = 0; user->total_rows = 0; user->max_cols = 0; for(int i = 0; i < CSV_MAX_COLS; i++) { user->col_widths[i] = 0; } } // ============ 解析后创建 LVGL 表格 ============ int parse_csv_string(const char *csv_data, UserData *user) { if (csv_data == NULL) { //rt_kprintf("[E] NOT DATA\n"); return -1; } if (user == NULL) { //rt_kprintf("[E] NOT USER DATA\n"); return -1; } // 初始化 UserData csv_clear_data(user); /*if (container != NULL) { lv_obj_set_size(container, LV_PCT(100), LV_SIZE_CONTENT); lv_obj_set_style_pad_all(container, 0, LV_PART_MAIN); }*/ struct csv_parser parser; csv_init(&parser, 0); size_t data_len = rt_strlen(csv_data); if (csv_parse(&parser, csv_data, data_len, field_callback, row_callback, user) != data_len) { //rt_kprintf("[E] ERR: %s\n", csv_strerror(csv_error(&parser))); csv_fini(&parser, field_callback, row_callback, user); csv_free(&parser); return -1; } csv_fini(&parser, field_callback, row_callback, user); csv_free(&parser); //rt_kprintf("ROW: %d\n COL:%d", user->total_rows,user->max_cols); return 0; } // ============ 全局指针 ============ static UserData *user = NULL; extern struct rt_memheap sdram_heap; int parse_csv_to_table(lv_obj_t *container, const char *csv_data,int flags) { if (container == NULL || csv_data == NULL) { return -1; } user = (UserData *)rt_memheap_alloc(&sdram_heap, sizeof(UserData)); // 解析 CSV if (parse_csv_string(csv_data, user) != 0) { return -1; } int data_row = user->total_rows; // 表格 lv_obj_set_size(container, LV_PCT(100), LV_SIZE_CONTENT); lv_obj_set_style_pad_all(container, 0, LV_PART_MAIN); lv_table_set_col_cnt(container,user->max_cols); lv_table_set_row_cnt(container,user->total_rows); // 设置列宽 for (int col = 0; col < user->max_cols; col++) { lv_table_set_col_width(container, col, user->col_widths[col]); //rt_kprintf("COL=%d W=%d\n", col, user->col_widths[col]); } // 填充表格数据 for (int i = 0; i < user->total_rows; i++) { for (int j = 0; j < user->max_cols; j++) { const char *val = csv_get_cell(user, i + flags, j); lv_table_set_cell_value(container, i, j, val ? val : ""); } } // 释放内存 rt_memheap_free(user); return data_row; } char value_[512] = {0}; int parse_csv_to_inf(lv_obj_t *container, const char *csv_data ,int W_data,int H_data) { if (csv_data == NULL) { return 0; } user = (UserData *)rt_memheap_alloc(&sdram_heap, sizeof(UserData)); int text_row = 0; // 解析 CSV if (parse_csv_string(csv_data, user) != 0) { return 0; } // 填充数据 for (int i = 0; i < 512; i++) { value_[i] = 0; } for (int j = 0; j < user->max_cols; j++) { text_row = j*28; rt_snprintf(value_, sizeof(value_),"%s%s:%s\n",value_,csv_get_cell(user, 0, j),csv_get_cell(user, 1, j)); } // 显示框大小 if (text_rowmax_cols); lv_table_set_row_cnt(guider_ui.screen_run_step,user->total_rows); 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,"工艺"); //先停止清除任务缓存信息 DATA_INSTRUCTION_STOP(); // 填充表格数据 for (int i = 1; i < user->total_rows; i++) { lv_table_set_cell_value_fmt(guider_ui.screen_run_step, i, 0,"%d",i); lv_table_set_cell_value(guider_ui.screen_run_step, i, 1,csv_get_cell(user, i, 2)); //数据组信息 step_table[i-1].RUN = 0; rt_snprintf(step_table[i-1].Dyelot ,1,csv_get_cell(user, i, 0)); rt_snprintf(step_table[i-1].StepID ,1,csv_get_cell(user, i, 1)); rt_snprintf(step_table[i-1].StepName ,1,csv_get_cell(user, i, 2)); rt_snprintf(step_table[i-1].ParameterName ,1,csv_get_cell(user, i, 3)); step_table[i-1].Parameter1 = atof(csv_get_cell(user, i, 4)); step_table[i-1].Parameter2 = atof(csv_get_cell(user, i, 5)); step_table[i-1].Parameter3 = atof(csv_get_cell(user, i, 6)); step_table[i-1].Parameter4 = atof(csv_get_cell(user, i, 7)); step_table[i-1].Parameter5 = atof(csv_get_cell(user, i, 8)); step_table[i-1].P6 = atoi(csv_get_cell(user, i, 9)); step_table[i-1].P7 = atoi(csv_get_cell(user, i, 10)); step_table[i-1].P8 = atoi(csv_get_cell(user, i, 11)); step_table[i-1].P9 = atoi(csv_get_cell(user, i, 12)); step_table[i-1].P10 = atoi(csv_get_cell(user, i, 13)); step_table[i-1].Parameter1_S1 = atof(csv_get_cell(user, i, 14)); step_table[i-1].Parameter2_S1 = atof(csv_get_cell(user, i, 15)); step_table[i-1].Parameter3_S1 = atof(csv_get_cell(user, i, 16)); step_table[i-1].Parameter4_S1 = atof(csv_get_cell(user, i, 17)); step_table[i-1].Parameter5_S1 = atof(csv_get_cell(user, i, 18)); step_table[i-1].Parameter1_S2 = atof(csv_get_cell(user, i, 19)); step_table[i-1].Parameter2_S2 = atof(csv_get_cell(user, i, 20)); step_table[i-1].Parameter3_S2 = atof(csv_get_cell(user, i, 21)); step_table[i-1].Parameter4_S2 = atof(csv_get_cell(user, i, 22)); step_table[i-1].Parameter5_S2 = atof(csv_get_cell(user, i, 23)); step_table[i-1].Parameter1_S3 = atof(csv_get_cell(user, i, 24)); step_table[i-1].Parameter2_S3 = atof(csv_get_cell(user, i, 25)); step_table[i-1].Parameter3_S3 = atof(csv_get_cell(user, i, 26)); step_table[i-1].Parameter4_S3 = atof(csv_get_cell(user, i, 27)); step_table[i-1].Parameter5_S3 = atof(csv_get_cell(user, i, 28)); step_table[i-1].ReDye = atoi(csv_get_cell(user, i, 29)); rt_snprintf(step_table[i-1].StepID_S1, 3,csv_get_cell(user, i, 30)); rt_snprintf(step_table[i-1].StepID_S2, 3,csv_get_cell(user, i, 31)); rt_snprintf(step_table[i-1].StepID_S3, 3,csv_get_cell(user, i, 32)); } // 释放内存 rt_memheap_free(user); return 0; } //处理启动设置 int run_csv_to_set(const char *csv_data) { if (csv_data == NULL) { return -1; } user = (UserData *)rt_memheap_alloc(&sdram_heap, sizeof(UserData)); // 解析 CSV if (parse_csv_string(csv_data, user) != 0) { return -1; } //数据组信息 rt_snprintf(Work,sizeof(Work),csv_get_cell(user, 1, 0)); rt_snprintf(Dye,sizeof(Dye),csv_get_cell(user, 1, 1)); rt_snprintf(Process,sizeof(Process),"%s:%s","工艺",csv_get_cell(user, 1, 2)); Pump = atoi(csv_get_cell(user, 1, 3)); Fan = atoi(csv_get_cell(user, 1, 4)); Swing = atoi(csv_get_cell(user, 1, 5)); Pull1 = atoi(csv_get_cell(user, 1, 6)); Pull2=Pull1; Pull3=Pull1; Pull4=Pull1; Pull5=Pull1;Pull6=Pull1; // 释放内存 rt_memheap_free(user); return 0; }