116 lines
3.7 KiB
C++
116 lines
3.7 KiB
C++
|
/**
|
||
|
* @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;
|
||
|
}
|
||
|
}
|