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:
parent
7666ec39fe
commit
cfb1be0efd
@ -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 目标文件名
|
||||
|
||||
@ -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,");
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user