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.

This commit is contained in:
LuChiChick 2026-01-26 20:32:36 +08:00
parent 7666ec39fe
commit cfb1be0efd
3 changed files with 101 additions and 6 deletions

View File

@ -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

View File

@ -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,6 +403,8 @@ 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);
if (strlen(time_str) > 4)
{
char *p_sec_end = time_str + strlen(time_str) - 4;
// 输出秒
@ -335,6 +413,14 @@ DLT_Type::DLT_Err DLT_Log::export_to_csv(const char *file_name_str)
// 输出剩余的时间
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,");

View File

@ -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)