From cfb1be0efdae0ec29fe214d7571899d9203bcbcc Mon Sep 17 00:00:00 2001 From: LuChiChick <1084116302@qq.com> Date: Mon, 26 Jan 2026 20:32:36 +0800 Subject: [PATCH] Fixed an issue with incorrect output format for extended timestamps (unit: 0.1 milliseconds) && Added DLT message sorting.Output message rows are now arranged in ascending order by timestamp. --- Inc/DLT_Utilities.hpp | 7 ++++ Src/DLT_Utilities.cpp | 98 ++++++++++++++++++++++++++++++++++++++++--- Src/UI_Layout.cpp | 2 + 3 files changed, 101 insertions(+), 6 deletions(-) diff --git a/Inc/DLT_Utilities.hpp b/Inc/DLT_Utilities.hpp index 2c9ddbf..aa1f8de 100644 --- a/Inc/DLT_Utilities.hpp +++ b/Inc/DLT_Utilities.hpp @@ -145,6 +145,13 @@ public: */ size_t get_msg_list(DLT_Type::DLT_Msg_Node *(&p_msg_list)); + /** + * @brief 将消息列表按时间戳排序 + * @param null + * @return DLT_Type::DLT_Err 错误类型枚举 + */ + DLT_Type::DLT_Err sort_msg_list(void); + /** * @brief 导出为CSV * @param file_name_str 目标文件名 diff --git a/Src/DLT_Utilities.cpp b/Src/DLT_Utilities.cpp index 84953f5..fd38b3e 100644 --- a/Src/DLT_Utilities.cpp +++ b/Src/DLT_Utilities.cpp @@ -285,6 +285,82 @@ size_t DLT_Log::get_msg_list(DLT_Type::DLT_Msg_Node *(&p_msg_list)) return this->loaded_msg_count; } +DLT_Type::DLT_Err DLT_Log::sort_msg_list(void) +{ + // 临时分配的排序用指针数组 + DLT_Type::DLT_Msg_Node **Node_P_Arr = (DLT_Type::DLT_Msg_Node **)malloc(sizeof(DLT_Type::DLT_Msg_Node *) * this->loaded_msg_count); + if (Node_P_Arr == nullptr) + return DLT_Type::DLT_ERROR_MEM_ALLOCATE_FAILED; + + // 填充地址数组 + { + DLT_Type::DLT_Msg_Node *p_target_node = this->Msg_List_Head; + for (size_t count = 0; count < loaded_msg_count; count++) + { + Node_P_Arr[count] = p_target_node; + p_target_node = p_target_node->p_next; + } + } + + // qsort排序 + qsort(Node_P_Arr, + loaded_msg_count, + sizeof(DLT_Type::DLT_Msg_Node *), + + // 升序,小时间戳在前 + [](const void *param1, const void *param2) -> int + { + DLT_Type::DLT_Msg_Node *Node1 = *(DLT_Type::DLT_Msg_Node **)param1; + DLT_Type::DLT_Msg_Node *Node2 = *(DLT_Type::DLT_Msg_Node **)param2; + if (Node1->Msg.storage_header.seconds > Node2->Msg.storage_header.seconds) + return 1; + else if (Node1->Msg.storage_header.seconds == Node2->Msg.storage_header.seconds) + { + if (Node1->Msg.storage_header.microseconds > Node2->Msg.storage_header.microseconds) + return 1; + else if (Node1->Msg.storage_header.microseconds == Node2->Msg.storage_header.microseconds) + { + // 存在0.1ms时间戳 + if (Node1->Msg.standard_header.htyp.WTMS && Node2->Msg.standard_header.htyp.WTMS) + { + if (Node1->Msg.standard_header_extra.tmsp > Node2->Msg.standard_header_extra.tmsp) + return 1; + else if (Node1->Msg.standard_header_extra.tmsp == Node2->Msg.standard_header_extra.tmsp) + return 0; + else if (Node1->Msg.standard_header_extra.tmsp < Node2->Msg.standard_header_extra.tmsp) + return -1; + } + else + return 0; + } + else + return -1; + } + else + return -1; + + return 0; + }); + + // 重新连接消息列表 + { + this->Msg_List_Head = Node_P_Arr[0]; + this->Msg_List_End = Node_P_Arr[this->loaded_msg_count - 1]; + this->Msg_List_End->p_next = nullptr; + + DLT_Type::DLT_Msg_Node *p_target = Node_P_Arr[0]; + for (size_t count = 1; count < this->loaded_msg_count; count++) + { + p_target->p_next = Node_P_Arr[count]; + p_target = p_target->p_next; + } + } + + // 释放空间 + free(Node_P_Arr); + return DLT_Type::DLT_ERROR_NONE; +} + DLT_Type::DLT_Err DLT_Log::export_to_csv(const char *file_name_str) { FILE *p_file = fopen(file_name_str, "wb"); @@ -327,13 +403,23 @@ DLT_Type::DLT_Err DLT_Log::export_to_csv(const char *file_name_str) /**< Timestamp since system start in 0.1 milliseconds */ char time_str[20]; sprintf(time_str, "%d", p_msg->Msg.standard_header_extra.tmsp); - char *p_sec_end = time_str + strlen(time_str) - 4; + if (strlen(time_str) > 4) + { + char *p_sec_end = time_str + strlen(time_str) - 4; - // 输出秒 - for (char *p = time_str; p < p_sec_end; p++) - fputc(*p, p_file); - // 输出剩余的时间 - fprintf(p_file, ".%s,", p_sec_end); + // 输出秒 + for (char *p = time_str; p < p_sec_end; p++) + fputc(*p, p_file); + // 输出剩余的时间 + fprintf(p_file, ".%s,", p_sec_end); + } + else + { + fprintf(p_file, "0."); + for (int count = 4 - strlen(time_str); count > 0; count--) + fputc('0', p_file); + fprintf(p_file, "%s,", time_str); + } } else fprintf(p_file, "N/A,"); diff --git a/Src/UI_Layout.cpp b/Src/UI_Layout.cpp index 583071a..aa0a375 100644 --- a/Src/UI_Layout.cpp +++ b/Src/UI_Layout.cpp @@ -395,6 +395,8 @@ void Widgets::Control_Panel(const ImVec2 &size) } else { + // 排序后导出 + Log.sort_msg_list(); err = Log.export_to_csv(export_file_path_str); if (err == DLT_Type::DLT_ERROR_NONE)