diff --git a/Inc/DLT_Utilities.hpp b/Inc/DLT_Utilities.hpp index 8e8499e..2c9ddbf 100644 --- a/Inc/DLT_Utilities.hpp +++ b/Inc/DLT_Utilities.hpp @@ -101,46 +101,42 @@ namespace DLT_Type } DLT_Msg_Node; } -// DLT 文件类 -class DLT_File +// DLT 日志类 +class DLT_Log { private: - FILE *p_file; // 文件指针 - size_t msg_count; // 消息条目计数 - size_t payload_max_len; // 最长载荷长度 + size_t loaded_msg_count; // 消息条目计数 + size_t max_payload_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文件头 - * @param Msg 读取后存储的目标结构体 - * @return DLT_Type::DLT_Err 错误类型枚举 + * @brief 从文件中读取dlt头 + * @param p_file 要读取的文件 + * @param Msg 读取后存储的目标结构体 + * @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文件载荷 - * @param Msg 读取后存储的目标结构体 - * @return DLT_Type::DLT_Err 错误类型枚举 + * @brief 从文件中读取dlt载荷 + * @param p_file 要读取的文件 + * @param Msg 读取后存储的目标结构体 + * @return DLT_Type::DLT_Err 错误类型枚举 */ - DLT_Type::DLT_Err dlt_file_read_payload(DLT_Type::DLT_Msg *Msg); - - /** - * @brief 解析dlt文件 - * @param null - * @return DLT_Type::DLT_Err 错误类型枚举 - */ - DLT_Type::DLT_Err dlt_file_parse(void); + DLT_Type::DLT_Err dlt_file_read_payload(FILE *p_file, DLT_Type::DLT_Msg *Msg); public: - DLT_File(); // 构造函数 - ~DLT_File(); // 析构函数 + DLT_Log(); // 构造函数 + ~DLT_Log(); // 析构函数 /** - * @brief 打开DLT文件 - * @param file_name_str 目标文件名 - * @return DLT_Type::DLT_Err 错误类型枚举 + * @brief 从文件加载DLT消息,多个文件会顺序加入 + * @param file_name_str 目标文件名 + * @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 获取解析完成的消息列表 diff --git a/Src/Command_Solve.cpp b/Src/Command_Solve.cpp index 4a64ccd..d189656 100644 --- a/Src/Command_Solve.cpp +++ b/Src/Command_Solve.cpp @@ -7,7 +7,7 @@ extern "C" #include "CSV_Utilities.hpp" } -DLT_File File; +DLT_Log File; // 命令行处理 void Pre_Command_Solve(void) @@ -47,7 +47,7 @@ void Pre_Command_Solve(void) char *strTo = (char *)malloc(size_needed); 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; File.get_msg_list(p_list); diff --git a/Src/DLT_Utilities.cpp b/Src/DLT_Utilities.cpp index aded40e..5aa756b 100644 --- a/Src/DLT_Utilities.cpp +++ b/Src/DLT_Utilities.cpp @@ -8,29 +8,24 @@ extern "C" } // 构造函数 -DLT_File::DLT_File() +DLT_Log::DLT_Log() { // 初始化内容 - this->p_file = nullptr; - this->msg_count = 0; - this->payload_max_len = 0; + this->loaded_msg_count = 0; + this->max_payload_len = 0; this->Msg_List_Head = nullptr; + this->Msg_List_End = nullptr; } // 析构函数 -DLT_File::~DLT_File() +DLT_Log::~DLT_Log() { 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) return; @@ -45,13 +40,14 @@ void DLT_File::clear(void) } // 初始化内容 - this->p_file = nullptr; - this->msg_count = 0; - this->payload_max_len = 0; + this->loaded_msg_count = 0; + this->max_payload_len = 0; + this->mem_use = 0; 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) 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; else 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; else 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); - 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; else 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); - 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; else 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); - 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; else 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); // 读取标扩展头 - 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; else 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; // 统计最长长度 - if (Msg->payload_length > this->payload_max_len) - this->payload_max_len = Msg->payload_length; + if (Msg->payload_length > this->max_payload_len) + this->max_payload_len = Msg->payload_length; 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) return DLT_Type::DLT_ERROR_NULL_POINTER; // 读取Payload Msg->payload_buffer = (uint8_t *)malloc(Msg->payload_length); + this->mem_use += Msg->payload_length; + if (Msg->payload_buffer == nullptr) 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); + this->mem_use -= Msg->payload_length; Msg->payload_buffer = nullptr; - if (feof(this->p_file)) + if (feof(p_file)) return DLT_Type::DLT_ERROR_INCOMPLETE_DATA; else 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; } -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; - while (1) + // 解析消息内容 { - DLT_Type::DLT_Msg Msg; - - err = dlt_file_read_header(&Msg); - if (err != DLT_Type::DLT_ERROR_NONE) + DLT_Type::DLT_Err err = DLT_Type::DLT_ERROR_NONE; + while (1) { - if (err == DLT_Type::DLT_ERROR_END_OF_FILE) - break; - return err; - } - err = dlt_file_read_payload(&Msg); - if (err != DLT_Type::DLT_ERROR_NONE) - return err; + DLT_Type::DLT_Msg Msg; + + err = dlt_file_read_header(p_file, &Msg); + if (err != DLT_Type::DLT_ERROR_NONE) + { + if (err == DLT_Type::DLT_ERROR_END_OF_FILE) + break; + fclose(p_file); + return err; + } + err = dlt_file_read_payload(p_file, &Msg); + if (err != DLT_Type::DLT_ERROR_NONE) + { + fclose(p_file); + 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) - { - this->Msg_List_Head = (DLT_Type::DLT_Msg_Node *)malloc(sizeof(DLT_Type::DLT_Msg_Node)); 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; + { + this->Msg_List_Head = this->Msg_List_End = p_target_msg; + } + else + { + this->Msg_List_End->p_next = p_target_msg; + this->Msg_List_End = p_target_msg; + } - p_list_end = Msg_List_Head; + this->loaded_msg_count++; } - else - { - DLT_Type::DLT_Msg_Node *p_target = (DLT_Type::DLT_Msg_Node *)malloc(sizeof(DLT_Type::DLT_Msg_Node)); - if (p_target == nullptr) - 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++; } + fclose(p_file); 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)) { - // 打开文件 - 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) + if (this->loaded_msg_count != 0) p_msg_list = this->Msg_List_Head; else 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"); 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,"); - 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); fseek(p_file, -1, SEEK_CUR); 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; - 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,", 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, "%d,", p_msg->Msg.extendedheader.noar); } + else + fprintf(p_file, "N/A,N/A,N/A,N/A,"); } // Payload概览行