XNSim/XNMonitor/ModelStatusWidget/ModelInfoUpdateThread.cpp

116 lines
3.7 KiB
C++
Raw Permalink Normal View History

2025-04-28 12:25:20 +08:00
/**
* @file ModelInfoUpdateThread.cpp
* @author jinchao
* @brief 线
* @version 1.0
* @date 2025-03-10
*
* @copyright Copyright (c) 2025 COMAC
*
*/
#include "ModelInfoUpdateThread.h"
#include "../TopicManager/TopicManager.h"
ModelInfoUpdateThread::~ModelInfoUpdateThread()
{
//注销模型状态订阅
TopicManager::Instance()->unregisterSubscriber("XNSim::XNSimStatus::XNModelStatus");
}
void ModelInfoUpdateThread::run()
{
//模型周期计数
QMap<quint32, quint64> modelCycleCount;
while (!m_Quit) {
if (m_Active) {
QMutexLocker locker(&m_Mutex);
for (auto &modelStatus : m_ModelStatus) {
XNRuntimeData modelData;
//模型名称
modelData.m_name = QString::fromStdString(modelStatus.XNModelName());
//模型ID
modelData.m_id = modelStatus.XNModelID();
//模型亲和掩码
modelData.m_AffinityMask = modelStatus.XNModelThID();
//模型节点ID
modelData.m_NodeID = modelStatus.XNModelNode();
//模型运行周期计数
modelData.m_CycleCount = modelStatus.XNModelRunCnt();
//模型优先级
modelData.m_Priority = modelStatus.XNModelPro();
//如果模型周期计数包含模型ID
if (modelCycleCount.contains(modelData.m_id)) {
//如果模型周期计数不等于模型运行周期计数
if (modelCycleCount[modelData.m_id] != modelData.m_CycleCount) {
//更新模型周期计数
modelCycleCount[modelData.m_id] = modelData.m_CycleCount;
//更新模型运行状态
modelData.m_RunningState = modelStatus.XNModelSt();
} else {
//如果模型周期计数等于模型运行周期计数
//设置模型运行状态为99
modelData.m_RunningState = 99;
//继续
continue;
}
} else {
//如果模型周期计数不包含模型ID
//设置模型周期计数
modelCycleCount[modelData.m_id] = modelData.m_CycleCount;
//设置模型运行状态
modelData.m_RunningState = modelStatus.XNModelSt();
}
//设置模型运行频率
modelData.m_SetFrequency = modelStatus.XNMdlSetFreq();
//设置模型最大频率
modelData.m_MaxFrequency = modelStatus.XNMdlSetFreq();
//设置模型最小频率
modelData.m_MinFrequency = modelStatus.XNMdlSetFreq();
//设置模型平均频率
modelData.m_AvgFrequency = modelStatus.XNMdlSetFreq();
//设置模型当前频率
modelData.m_CurrentFrequency.push_back(modelStatus.XNMdlCurFreq());
//设置模型运行周期
modelData.m_SetPeriod = 1000.0 / modelData.m_SetFrequency;
//设置模型最大周期
modelData.m_MaxPeriod = 1000.0 / modelData.m_MinFrequency;
//设置模型最小周期
modelData.m_MinPeriod = 1000.0 / modelData.m_MaxFrequency;
//设置模型平均周期
modelData.m_AvgPeriod = 1000.0 / modelData.m_AvgFrequency;
//设置模型当前周期
modelData.m_CurrentPeriod.push_back(1000.0 / modelData.m_CurrentFrequency[0]);
//发送模型信息更新信号
emit updateModelInfo(modelData);
}
}
QThread::msleep(m_SleepTime);
}
}
void ModelInfoUpdateThread::onChangeSleepTime(const unsigned int newSleepTime)
{
m_SleepTime = newSleepTime;
}
void ModelInfoUpdateThread::onThreadController(const bool &isActive)
{
m_Active = isActive;
}
void ModelInfoUpdateThread::Initialize()
{
//注册模型状态订阅
TopicManager::Instance()->registerSubscriber<XNSim::XNSimStatus::XNModelStatusPubSubType>(
"XNSim::XNSimStatus::XNModelStatus",
std::bind(&ModelInfoUpdateThread::ModelStatusListener, this, std::placeholders::_1));
}
void ModelInfoUpdateThread::ModelStatusListener(const XNSim::XNSimStatus::XNModelStatus &status)
{
if (m_Active) {
QMutexLocker locker(&m_Mutex);
m_ModelStatus[status.XNModelID()] = status;
}
}