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));
|
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
|
* @brief 导出为CSV
|
||||||
* @param file_name_str 目标文件名
|
* @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;
|
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)
|
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");
|
||||||
@ -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 */
|
/**< Timestamp since system start in 0.1 milliseconds */
|
||||||
char time_str[20];
|
char time_str[20];
|
||||||
sprintf(time_str, "%d", p_msg->Msg.standard_header_extra.tmsp);
|
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;
|
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);
|
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
|
else
|
||||||
fprintf(p_file, "N/A,");
|
fprintf(p_file, "N/A,");
|
||||||
|
|
||||||
|
|||||||
@ -395,6 +395,8 @@ void Widgets::Control_Panel(const ImVec2 &size)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// 排序后导出
|
||||||
|
Log.sort_msg_list();
|
||||||
err = Log.export_to_csv(export_file_path_str);
|
err = Log.export_to_csv(export_file_path_str);
|
||||||
|
|
||||||
if (err == DLT_Type::DLT_ERROR_NONE)
|
if (err == DLT_Type::DLT_ERROR_NONE)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user