/** * @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 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::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; } }