EC600U_esp32_iap_uart/EC600U_lvgl/ui/fs_function.c
2024-02-05 17:39:56 +08:00

265 lines
8.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ql_log.h"
#include "../inc/ui/ui_screen3.h"
#include "../inc/ui/fs_function.h"
#define LOG_INFO(msg, ...) QL_LOG(QL_LOG_LEVEL_INFO, "fsfunction", msg, ##__VA_ARGS__)
#define LOG 1
struct Return_Data global_file_data_p;
int end_count = 0;
int current_id = 0;
/**
* func:根据日期查询是否存在对应的数据文件
*/
int8_t findDataFile(uint16_t year,uint8_t month,uint8_t day)
{
/*查询目录路径*/
char dir_path[32];
sprintf(dir_path,"SD:%d/%02d",year,month);
#if LOG
LOG_INFO("dir_path = %s",dir_path);
#endif
QDIR *dir = ql_opendir(dir_path);
if(dir == NULL){
#if LOG
LOG_INFO("ql_opendir fail");
#endif
return -1;
}
ql_closedir(dir);
/*查询文件路径*/
char file_path[32];
sprintf(file_path,"SD:%d/%02d/%02d.txt",year,month,day);
#if LOG
LOG_INFO("file_path = %s",file_path);
#endif
QFILE file_fd = ql_fopen(file_path,"rb");
if(file_fd <= 0){
#if LOG
LOG_INFO("ql_fopen fail");
#endif
return -2;
}
/*查询文件是否为空*/
if(ql_fseek(file_fd,0,QL_SEEK_END) <= 0){
#if LOG
LOG_INFO("ql_fseek fail");
#endif
ql_fclose(file_fd);
return -3;
}
/*存在该目录下的非空文件*/
ql_fclose(file_fd);
return 1;
}
/**
* 解析单独的一条数据
*/
void dealdata(char*buffer,int last_file,int last_i,struct Return_Data *newStruct)
{
int id = 0 ;
time_t utc_time = 0;
struct tm *tm_now;
float max_depth = 0;
float max_V = 0;
float average_I = 0;
sscanf(buffer + last_i,"%d,%lld,%f,%f,%f",&id,&utc_time,&max_depth,&max_V,&average_I);
#if LOG
LOG_INFO("id = %d,utc_time = %lld,max_depth = %f,max_V = %f,average_I = %f",id,utc_time,max_depth,max_V,average_I);
#endif
tm_now = gmtime(&utc_time);
//处理数据
if(current_id != id){
current_id = id;
//LV_LOG_USER("新的id\n");
newStruct->dataArr[end_count].count ++;
newStruct->dataArr[end_count].id = id;
newStruct->dataArr[end_count].max_depth = max_depth;
newStruct->dataArr[end_count].max_V = max_V;
newStruct->dataArr[end_count].average_I = average_I;
newStruct->dataArr[end_count].start_hour = tm_now ->tm_hour;
newStruct->dataArr[end_count].start_min = tm_now ->tm_min;
newStruct->dataArr[end_count].start_second = tm_now ->tm_sec;
newStruct->dataArr[end_count].end_hour= tm_now ->tm_hour;
newStruct->dataArr[end_count].end_min = tm_now ->tm_min;
newStruct->dataArr[end_count].end_second = tm_now ->tm_sec;
newStruct->dataArr[end_count].offset = last_file;
//LV_LOG_USER("当前id在文件中的指针偏移量为%d\n",newStruct->dataArr[end_count].offset);
newStruct->id_count = end_count+1;
end_count++;
}else if(current_id == id){
//LV_LOG_USER("相同id\n");
newStruct->dataArr[end_count-1].max_depth = (max_depth > newStruct->dataArr[end_count-1].max_depth) ? max_depth : newStruct->dataArr[end_count-1].max_depth;
newStruct->dataArr[end_count-1].max_V = (max_V > newStruct->dataArr[end_count-1].max_V) ? max_V : newStruct->dataArr[end_count-1].max_V;
newStruct->dataArr[end_count-1].average_I = (newStruct->dataArr[end_count-1].average_I * newStruct->dataArr[end_count-1].count + average_I)/(newStruct->dataArr[end_count-1].count +1);
newStruct->dataArr[end_count-1].count += 1;
if(newStruct->dataArr[end_count-1].end_hour != tm_now ->tm_hour) newStruct->dataArr[end_count-1].end_hour = tm_now ->tm_hour;
if(newStruct->dataArr[end_count-1].end_min != tm_now ->tm_min) newStruct->dataArr[end_count-1].end_min = tm_now ->tm_min;
if(newStruct->dataArr[end_count-1].end_second != tm_now ->tm_sec) newStruct->dataArr[end_count-1].end_second = tm_now ->tm_sec;
}
}
/**
* 解析文件内容,将数据存储在指针指向的结构体变量中
*/
void readDataFromFile(QFILE fd, struct Return_Data * data)
{
char buffer[CHAR_READ_LENGTH];
int last_file = 0;
int char_length = 0;
int last_i = 0;
ql_fseek(fd,0,QL_SEEK_END);
int end_pos = ql_ftell(fd);
ql_fseek(fd,0,QL_SEEK_SET);
while(1){
ql_fread(buffer + char_length, CHAR_READ_LENGTH - char_length, 1, fd);//int br = 0; lv_fs_read(file,buffer+char_length,CHAR_READ_LENGTH-char_length,&br);
#if LOG
LOG_INFO("buffer: %s",buffer);
#endif
last_i = 0;
for(int i = 0; i < CHAR_READ_LENGTH; i++){
if(buffer[i]=='\n'){
dealdata(buffer,last_file,last_i,data);
last_file = last_file + i - last_i + 2;//当前数据在文件中的偏移量=本身+上一行数据的数据长度
last_i = i + 1;//下一次读取的起始位置
}
}
if(buffer[CHAR_READ_LENGTH-1] != '\n'){
char_length = CHAR_READ_LENGTH-last_i;
int pos = ql_ftell(fd);// int pos = 0; lv_fs_tell(file,&pos);
last_file = pos - char_length;
strncpy(buffer,buffer + last_i, CHAR_READ_LENGTH - last_i);
}
// if (feof(file->file_d)) { // 如果已经读完文件,则退出循环
// break;
// }
if(ql_ftell(fd) == end_pos){
return;
}
}
}
/**
* 传入数据结构体把数据设置到8个table上
*/
void setDataToTables(struct Return_Data* dataArray, int page, int page_count)
{
char max_V[10];
char max_depth[10];
char average_I[10];
int end_pos = 0;
lv_obj_t * data_tables_in_func[] = {data_table1, data_table2, data_table3, data_table4,data_table5, data_table6, data_table7, data_table8 };
if(page<page_count){
end_pos = 8;
}else if(page == page_count){
end_pos = dataArray->id_count - 8*(page-1);
//清空8个table
for(int m=0;m<8;m++){
for(int n=0;n<6;n++){
lv_table_set_cell_value_fmt(data_tables_in_func[m],0,n,"");
}
}
}
for(int i = 0; i < end_pos; i++){
sprintf(max_V,"%.3f",dataArray->dataArr[(page-1)*8+i].max_V);
sprintf(max_depth,"%.3f",dataArray->dataArr[(page-1)*8+i].max_depth);
sprintf(average_I,"%.2f",dataArray->dataArr[(page-1)*8+i].average_I);
lv_table_set_cell_value_fmt(data_tables_in_func[i],0,0,"%d",dataArray->dataArr[(page-1)*8+i].id);
lv_table_set_cell_value_fmt(data_tables_in_func[i],0,1,"%s",max_V);
lv_table_set_cell_value_fmt(data_tables_in_func[i],0,2,"%s",max_depth);
lv_table_set_cell_value_fmt(data_tables_in_func[i],0,3,"%s",average_I);
lv_table_set_cell_value_fmt(data_tables_in_func[i],0,4,"%d:%d:%d",
dataArray->dataArr[(page-1)*8+i].start_hour,
dataArray->dataArr[(page-1)*8+i].start_min,
dataArray->dataArr[(page-1)*8+i].start_second);
lv_table_set_cell_value_fmt(data_tables_in_func[i],0,5,"%d:%d:%d",
dataArray->dataArr[(page-1)*8+i].end_hour,
dataArray->dataArr[(page-1)*8+i].end_min,
dataArray->dataArr[(page-1)*8+i].end_second);
}
}
/**
* 读取数据设置到chart上
*/
void setDataToChart(QFILE fd, int offset ,int current_id,struct ChartData* chart_data)
{
char buffer[CHAR_READ_LENGTH];//存储每次读到的字符串
int char_length = 0;//记录不完整字符串的长度
int same_id_count = 0;
/*获取长度*/
ql_fseek(fd,0,QL_SEEK_END);
int end_pos = ql_ftell(fd);
ql_fseek(fd,offset,LV_FS_SEEK_SET);//lv_fs_seek(file,offset,LV_FS_SEEK_SET);
int last_i = 0;
while(1){
last_i = 0;
ql_fread(buffer + char_length, CHAR_READ_LENGTH - char_length, 1, fd);//lv_fs_read(file,buffer+char_length,CHAR_READ_LENGTH-char_length,NULL);
//buffer[CHAR_READ_LENGTH] = '\0';
for(int i = 0; i < CHAR_READ_LENGTH; i++){
if(buffer[i]=='\n'){
int id = 0 ;
time_t utc_time = 0;
struct tm *tm_now;
float max_depth = 0;
float max_V = 0;
float average_I = 0;
sscanf(buffer + last_i,"%d,%lld,%f,%f,%f",&id,&utc_time,&max_depth,&max_V,&average_I);
tm_now = gmtime(&utc_time);
if(current_id == id){
if(same_id_count < SAME_ID_MAX_NUM){
chart_data->depth[same_id_count] = max_depth;
chart_data->V[same_id_count] = max_V;
chart_data->I[same_id_count] = average_I;
sprintf(chart_data->time[same_id_count], "%d:%d:%d", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);
chart_data->same_id_count = same_id_count;
same_id_count++;
}
last_i = i + 1;
}else{
return;
}
}
}
if(buffer[CHAR_READ_LENGTH-1] != '\n'){
char_length = CHAR_READ_LENGTH-last_i;
strncpy(buffer,buffer+last_i,CHAR_READ_LENGTH-last_i);
}
if(ql_ftell(fd) >= end_pos){
return;
}
}
return;
}