Compare commits

...

2 Commits

4 changed files with 111 additions and 115 deletions

View File

@ -101,46 +101,42 @@ namespace DLT_Type
} DLT_Msg_Node; } DLT_Msg_Node;
} }
// DLT 文件 // DLT 日志
class DLT_File class DLT_Log
{ {
private: private:
FILE *p_file; // 文件指针 size_t loaded_msg_count; // 消息条目计数
size_t msg_count; // 消息条目计数 size_t max_payload_len; // 最长载荷长度
size_t payload_max_len; // 最长载荷长度 size_t mem_use; // 存储占用
DLT_Type::DLT_Msg_Node *Msg_List_Head; // 消息列表 DLT_Type::DLT_Msg_Node *Msg_List_Head; // 消息列表头
DLT_Type::DLT_Msg_Node *Msg_List_End; // 消息列表尾
/** /**
* @brief dlt文件头 * @brief dlt头
* @param p_file
* @param Msg * @param Msg
* @return DLT_Type::DLT_Err * @return DLT_Type::DLT_Err
*/ */
DLT_Type::DLT_Err dlt_file_read_header(DLT_Type::DLT_Msg *Msg); DLT_Type::DLT_Err dlt_file_read_header(FILE *p_file, DLT_Type::DLT_Msg *Msg);
/** /**
* @brief dlt文件载荷 * @brief dlt载荷
* @param p_file
* @param Msg * @param Msg
* @return DLT_Type::DLT_Err * @return DLT_Type::DLT_Err
*/ */
DLT_Type::DLT_Err dlt_file_read_payload(DLT_Type::DLT_Msg *Msg); DLT_Type::DLT_Err dlt_file_read_payload(FILE *p_file, DLT_Type::DLT_Msg *Msg);
/**
* @brief dlt文件
* @param null
* @return DLT_Type::DLT_Err
*/
DLT_Type::DLT_Err dlt_file_parse(void);
public: public:
DLT_File(); // 构造函数 DLT_Log(); // 构造函数
~DLT_File(); // 析构函数 ~DLT_Log(); // 析构函数
/** /**
* @brief DLT文件 * @brief DLT消息
* @param file_name_str * @param file_name_str
* @return DLT_Type::DLT_Err * @return DLT_Type::DLT_Err
*/ */
DLT_Type::DLT_Err open(const char *file_name_str); DLT_Type::DLT_Err load_from_file(const char *file_name_str);
/** /**
* @brief * @brief

View File

@ -486,7 +486,7 @@ CSV_Type::CSV_Err CSV_Table::export_to_file(const char *file_name_str)
size_t count = 0; size_t count = 0;
for (decltype(this->Column_List_Head) p_target_column = this->Column_List_Head; p_target_column != nullptr; p_target_column = p_target_column->p_next_column) for (decltype(this->Column_List_Head) p_target_column = this->Column_List_Head; p_target_column != nullptr; p_target_column = p_target_column->p_next_column)
{ {
if (fprintf(p_file, "%s,", p_target_column->column_title_str) < 0) if (fprintf(p_file, strstr(p_target_column->column_title_str, ",") ? "\"%s\"," : "%s,", p_target_column->column_title_str) < 0)
goto file_write_error; goto file_write_error;
p_parallel_cell_list[count] = p_target_column->Cell_List_Head; p_parallel_cell_list[count] = p_target_column->Cell_List_Head;
count++; count++;

View File

@ -7,7 +7,7 @@ extern "C"
#include "CSV_Utilities.hpp" #include "CSV_Utilities.hpp"
} }
DLT_File File; DLT_Log File;
// 命令行处理 // 命令行处理
void Pre_Command_Solve(void) void Pre_Command_Solve(void)
@ -47,7 +47,7 @@ void Pre_Command_Solve(void)
char *strTo = (char *)malloc(size_needed); char *strTo = (char *)malloc(size_needed);
WideCharToMultiByte(CP_UTF8, 0, argv[1], -1, &strTo[0], size_needed, NULL, NULL); WideCharToMultiByte(CP_UTF8, 0, argv[1], -1, &strTo[0], size_needed, NULL, NULL);
err = File.open(strTo); err = File.load_from_file(strTo);
DLT_Type::DLT_Msg_Node *p_list; DLT_Type::DLT_Msg_Node *p_list;
File.get_msg_list(p_list); File.get_msg_list(p_list);

View File

@ -8,29 +8,24 @@ extern "C"
} }
// 构造函数 // 构造函数
DLT_File::DLT_File() DLT_Log::DLT_Log()
{ {
// 初始化内容 // 初始化内容
this->p_file = nullptr; this->loaded_msg_count = 0;
this->msg_count = 0; this->max_payload_len = 0;
this->payload_max_len = 0;
this->Msg_List_Head = nullptr; this->Msg_List_Head = nullptr;
this->Msg_List_End = nullptr;
} }
// 析构函数 // 析构函数
DLT_File::~DLT_File() DLT_Log::~DLT_Log()
{ {
clear(); clear();
} }
// 清理请求的存储并恢复初始状态 // 清理请求的存储并恢复初始状态
void DLT_File::clear(void) void DLT_Log::clear(void)
{ {
if (this->p_file != nullptr)
{
fclose(this->p_file);
this->p_file = nullptr;
}
if (this->Msg_List_Head == nullptr) if (this->Msg_List_Head == nullptr)
return; return;
@ -45,13 +40,14 @@ void DLT_File::clear(void)
} }
// 初始化内容 // 初始化内容
this->p_file = nullptr; this->loaded_msg_count = 0;
this->msg_count = 0; this->max_payload_len = 0;
this->payload_max_len = 0; this->mem_use = 0;
this->Msg_List_Head = nullptr; this->Msg_List_Head = nullptr;
this->Msg_List_End = nullptr;
} }
DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg) DLT_Type::DLT_Err DLT_Log::dlt_file_read_header(FILE *p_file, DLT_Type::DLT_Msg *Msg)
{ {
if (Msg == nullptr) if (Msg == nullptr)
return DLT_Type::DLT_ERROR_NULL_POINTER; return DLT_Type::DLT_ERROR_NULL_POINTER;
@ -60,9 +56,9 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
{ {
// 读取存储头 // 读取存储头
if (fread(&(Msg->storage_header), sizeof(Msg->storage_header), 1, this->p_file) != 1) if (fread(&(Msg->storage_header), sizeof(Msg->storage_header), 1, p_file) != 1)
{ {
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_END_OF_FILE; return DLT_Type::DLT_ERROR_END_OF_FILE;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -76,9 +72,9 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
// 标准头 // 标准头
{ {
// 读取标准头 // 读取标准头
if (fread(&(Msg->standard_header), sizeof(Msg->standard_header), 1, this->p_file) != 1) if (fread(&(Msg->standard_header), sizeof(Msg->standard_header), 1, p_file) != 1)
{ {
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; return DLT_Type::DLT_ERROR_INCOMPLETE_DATA;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -105,9 +101,9 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
{ {
msg_header_len += sizeof(Msg->standard_header_extra.ecu); msg_header_len += sizeof(Msg->standard_header_extra.ecu);
if (fread(&(Msg->standard_header_extra.ecu), sizeof(Msg->standard_header_extra.ecu), 1, this->p_file) != 1) if (fread(&(Msg->standard_header_extra.ecu), sizeof(Msg->standard_header_extra.ecu), 1, p_file) != 1)
{ {
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; return DLT_Type::DLT_ERROR_INCOMPLETE_DATA;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -119,9 +115,9 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
{ {
msg_header_len += sizeof(Msg->standard_header_extra.seid); msg_header_len += sizeof(Msg->standard_header_extra.seid);
if (fread(&(Msg->standard_header_extra.seid), sizeof(Msg->standard_header_extra.seid), 1, this->p_file) != 1) if (fread(&(Msg->standard_header_extra.seid), sizeof(Msg->standard_header_extra.seid), 1, p_file) != 1)
{ {
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; return DLT_Type::DLT_ERROR_INCOMPLETE_DATA;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -146,9 +142,9 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
{ {
msg_header_len += sizeof(Msg->standard_header_extra.tmsp); msg_header_len += sizeof(Msg->standard_header_extra.tmsp);
if (fread(&(Msg->standard_header_extra.tmsp), sizeof(Msg->standard_header_extra.tmsp), 1, this->p_file) != 1) if (fread(&(Msg->standard_header_extra.tmsp), sizeof(Msg->standard_header_extra.tmsp), 1, p_file) != 1)
{ {
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; return DLT_Type::DLT_ERROR_INCOMPLETE_DATA;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -175,9 +171,9 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
msg_header_len += sizeof(Msg->extendedheader); msg_header_len += sizeof(Msg->extendedheader);
// 读取标扩展头 // 读取标扩展头
if (fread(&(Msg->extendedheader), sizeof(Msg->extendedheader), 1, this->p_file) != 1) if (fread(&(Msg->extendedheader), sizeof(Msg->extendedheader), 1, p_file) != 1)
{ {
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; return DLT_Type::DLT_ERROR_INCOMPLETE_DATA;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -188,28 +184,31 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_header(DLT_Type::DLT_Msg *Msg)
Msg->payload_length = Msg->standard_header.len - msg_header_len; Msg->payload_length = Msg->standard_header.len - msg_header_len;
// 统计最长长度 // 统计最长长度
if (Msg->payload_length > this->payload_max_len) if (Msg->payload_length > this->max_payload_len)
this->payload_max_len = Msg->payload_length; this->max_payload_len = Msg->payload_length;
return DLT_Type::DLT_ERROR_NONE; return DLT_Type::DLT_ERROR_NONE;
} }
DLT_Type::DLT_Err DLT_File::dlt_file_read_payload(DLT_Type::DLT_Msg *Msg) DLT_Type::DLT_Err DLT_Log::dlt_file_read_payload(FILE *p_file, DLT_Type::DLT_Msg *Msg)
{ {
if (Msg == nullptr) if (Msg == nullptr)
return DLT_Type::DLT_ERROR_NULL_POINTER; return DLT_Type::DLT_ERROR_NULL_POINTER;
// 读取Payload // 读取Payload
Msg->payload_buffer = (uint8_t *)malloc(Msg->payload_length); Msg->payload_buffer = (uint8_t *)malloc(Msg->payload_length);
this->mem_use += Msg->payload_length;
if (Msg->payload_buffer == nullptr) if (Msg->payload_buffer == nullptr)
return DLT_Type::DLT_ERROR_MEM_ALLOCATE_FAILED; return DLT_Type::DLT_ERROR_MEM_ALLOCATE_FAILED;
if (fread(Msg->payload_buffer, Msg->payload_length, 1, this->p_file) != 1) if (fread(Msg->payload_buffer, Msg->payload_length, 1, p_file) != 1)
{ {
free(Msg->payload_buffer); free(Msg->payload_buffer);
this->mem_use -= Msg->payload_length;
Msg->payload_buffer = nullptr; Msg->payload_buffer = nullptr;
if (feof(this->p_file)) if (feof(p_file))
return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; return DLT_Type::DLT_ERROR_INCOMPLETE_DATA;
else else
return DLT_Type::DLT_ERROR_FILE_READ_FAILED; return DLT_Type::DLT_ERROR_FILE_READ_FAILED;
@ -218,76 +217,75 @@ DLT_Type::DLT_Err DLT_File::dlt_file_read_payload(DLT_Type::DLT_Msg *Msg)
return ::DLT_Type::DLT_ERROR_NONE; return ::DLT_Type::DLT_ERROR_NONE;
} }
DLT_Type::DLT_Err DLT_File::dlt_file_parse(void) DLT_Type::DLT_Err DLT_Log::load_from_file(const char *file_name_str)
{ {
DLT_Type::DLT_Msg_Node *p_list_end = nullptr; // 打开文件
FILE *p_file = fopen(file_name_str, "rb");
if (p_file == nullptr)
return DLT_Type::DLT_ERROR_FILE_OPEN_FAILED;
// 解析消息内容
{
DLT_Type::DLT_Err err = DLT_Type::DLT_ERROR_NONE; DLT_Type::DLT_Err err = DLT_Type::DLT_ERROR_NONE;
while (1) while (1)
{ {
DLT_Type::DLT_Msg Msg; DLT_Type::DLT_Msg Msg;
err = dlt_file_read_header(&Msg); err = dlt_file_read_header(p_file, &Msg);
if (err != DLT_Type::DLT_ERROR_NONE) if (err != DLT_Type::DLT_ERROR_NONE)
{ {
if (err == DLT_Type::DLT_ERROR_END_OF_FILE) if (err == DLT_Type::DLT_ERROR_END_OF_FILE)
break; break;
fclose(p_file);
return err; return err;
} }
err = dlt_file_read_payload(&Msg); err = dlt_file_read_payload(p_file, &Msg);
if (err != DLT_Type::DLT_ERROR_NONE) if (err != DLT_Type::DLT_ERROR_NONE)
{
fclose(p_file);
return err; return err;
}
DLT_Type::DLT_Msg_Node *p_target_msg = (DLT_Type::DLT_Msg_Node *)malloc(sizeof(DLT_Type::DLT_Msg_Node));
this->mem_use += sizeof(DLT_Type::DLT_Msg_Node);
if (p_target_msg == nullptr)
{
this->mem_use -= sizeof(DLT_Type::DLT_Msg_Node);
fclose(p_file);
return DLT_Type::DLT_ERROR_MEM_ALLOCATE_FAILED;
}
p_target_msg->p_next = nullptr;
p_target_msg->Msg = Msg;
if (this->Msg_List_Head == nullptr) if (this->Msg_List_Head == nullptr)
{ {
this->Msg_List_Head = (DLT_Type::DLT_Msg_Node *)malloc(sizeof(DLT_Type::DLT_Msg_Node)); this->Msg_List_Head = this->Msg_List_End = p_target_msg;
if (this->Msg_List_Head == nullptr)
return DLT_Type::DLT_ERROR_MEM_ALLOCATE_FAILED;
this->Msg_List_Head->p_next = nullptr;
this->Msg_List_Head->Msg = Msg;
p_list_end = Msg_List_Head;
} }
else else
{ {
DLT_Type::DLT_Msg_Node *p_target = (DLT_Type::DLT_Msg_Node *)malloc(sizeof(DLT_Type::DLT_Msg_Node)); this->Msg_List_End->p_next = p_target_msg;
if (p_target == nullptr) this->Msg_List_End = p_target_msg;
return DLT_Type::DLT_ERROR_MEM_ALLOCATE_FAILED;
p_target->p_next = nullptr;
p_target->Msg = Msg;
p_list_end->p_next = p_target;
p_list_end = p_target;
} }
this->msg_count++; this->loaded_msg_count++;
}
} }
fclose(p_file);
return DLT_Type::DLT_ERROR_NONE; return DLT_Type::DLT_ERROR_NONE;
} }
DLT_Type::DLT_Err DLT_File::open(const char *file_name_str) size_t DLT_Log::get_msg_list(DLT_Type::DLT_Msg_Node *(&p_msg_list))
{ {
// 打开文件 if (this->loaded_msg_count != 0)
this->p_file = fopen(file_name_str, "rb");
if (this->p_file == nullptr)
return DLT_Type::DLT_ERROR_FILE_OPEN_FAILED;
// 求解文件
return dlt_file_parse();
}
size_t DLT_File::get_msg_list(DLT_Type::DLT_Msg_Node *(&p_msg_list))
{
if (this->msg_count != 0)
p_msg_list = this->Msg_List_Head; p_msg_list = this->Msg_List_Head;
else else
p_msg_list = nullptr; p_msg_list = nullptr;
return this->msg_count; return this->loaded_msg_count;
} }
DLT_Type::DLT_Err DLT_File::export_to_csv(const char *file_name_str) DLT_Type::DLT_Err DLT_Log::export_to_csv(const char *file_name_str)
{ {
FILE *p_file = fopen(file_name_str, "wb"); FILE *p_file = fopen(file_name_str, "wb");
if (p_file == nullptr) if (p_file == nullptr)
@ -297,7 +295,7 @@ DLT_Type::DLT_Err DLT_File::export_to_csv(const char *file_name_str)
{ {
fprintf(p_file, "Index,Date&Time(Local),Timestamp,Count,ECU ID,Application ID,Context ID ,Session ID,Type,Sub Type,Mode,#Args,Payload,"); fprintf(p_file, "Index,Date&Time(Local),Timestamp,Count,ECU ID,Application ID,Context ID ,Session ID,Type,Sub Type,Mode,#Args,Payload,");
for (size_t count = 0; count < this->payload_max_len; count++) for (size_t count = 0; count < this->max_payload_len; count++)
fprintf(p_file, "B%d,", count); fprintf(p_file, "B%d,", count);
fseek(p_file, -1, SEEK_CUR); fseek(p_file, -1, SEEK_CUR);
fprintf(p_file, "\r\n"); fprintf(p_file, "\r\n");
@ -305,7 +303,7 @@ DLT_Type::DLT_Err DLT_File::export_to_csv(const char *file_name_str)
// 遍历每行数据 // 遍历每行数据
DLT_Type::DLT_Msg_Node *p_msg = this->Msg_List_Head; DLT_Type::DLT_Msg_Node *p_msg = this->Msg_List_Head;
for (size_t line_count = 0; line_count < this->msg_count; line_count++) for (size_t line_count = 0; line_count < this->loaded_msg_count; line_count++)
{ {
// 输出索引号 // 输出索引号
@ -386,10 +384,12 @@ DLT_Type::DLT_Err DLT_File::export_to_csv(const char *file_name_str)
fprintf(p_file, "%s,", Type_str[p_msg->Msg.extendedheader.msin.MSTP]); fprintf(p_file, "%s,", Type_str[p_msg->Msg.extendedheader.msin.MSTP]);
fprintf(p_file, "%s,", SubType_Str[p_msg->Msg.extendedheader.msin.MSTP][(p_msg->Msg.extendedheader.msin.MTIN - 1) % 0xF]); fprintf(p_file, "%s,", SubType_Str[p_msg->Msg.extendedheader.msin.MSTP][(p_msg->Msg.extendedheader.msin.MTIN - 1) % 0xF]);
// Mode ** #Args // Mode && #Args
fprintf(p_file, "%s,", p_msg->Msg.extendedheader.msin.VERB ? "verbose" : "non-verbose"); fprintf(p_file, "%s,", p_msg->Msg.extendedheader.msin.VERB ? "verbose" : "non-verbose");
fprintf(p_file, "%d,", p_msg->Msg.extendedheader.noar); fprintf(p_file, "%d,", p_msg->Msg.extendedheader.noar);
} }
else
fprintf(p_file, "N/A,N/A,N/A,N/A,");
} }
// Payload概览行 // Payload概览行