/** * @file XNScenarioManager.cpp * @author jinchao * @brief 运行环境描述管理器类源文件 * @version 1.0 * @date 2024-11-07 * * @copyright Copyright (c) 2024 XN * */ #include "XNScenarioManager.h" #include "XNScenarioManager_p.h" #include "XNFramework.h" // 默认构造函数 XNScenarioManager::XNScenarioManager(QObject *parent) : XNBaseFrameObject(*new XNScenarioManagerPrivate(this), parent) { setUniqueId(5); setObjectName("XNScenarioManager"); } XNScenarioManager::~XNScenarioManager() { } XNScenarioManager::XNScenarioManager(XNScenarioManagerPrivate &dd, QObject *parent) : XNBaseFrameObject(dd, parent) { } // 获取运行环境名称 const QString &XNScenarioManager::GetSimName() { Q_D(const XNScenarioManager); return d->_ScenarioName; } // 设置运行环境名称 void XNScenarioManager::SetSimName(QString &simName) { Q_D(XNScenarioManager); d->_ScenarioName = simName; } // 获取运行环境开始时间 const QDateTime &XNScenarioManager::GetSimStartTime() { Q_D(XNScenarioManager); return d->_SimStartTime; } // 设置运行环境开始时间 void XNScenarioManager::SetSimStartTime(QDateTime &startTime) { Q_D(XNScenarioManager); d->_SimStartTime = startTime; } // 初始化 void XNScenarioManager::OnInitialize() { Q_D(XNScenarioManager); LOG_INFO("XNScenarioManager Initialize Success!"); d->_status = XNFrameObjectStatus::Initialized; emit Initialize(); } void XNScenarioManager::OnPrepareForExecute() { Q_D(XNScenarioManager); d->_status = XNFrameObjectStatus::Ready; LOG_INFO("XNScenarioManager is prepared!"); emit PrepareForExecute(); } // 运行环境配置文件解析 void XNScenarioManager::AnalysisScenarioXml(const QString &XmlPath) { Q_D(XNScenarioManager); QFile file(XmlPath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { LOG_ERROR("0x2100 打开运行环境描述文件: %1出错,错误信息: %2", XmlPath, file.errorString()); emit AnalyzeScenarioXmlFailed(); return; } QDomDocument doc; if (!doc.setContent(&file)) { LOG_ERROR("0x2100 解析XML文件: %1 失败", XmlPath); file.close(); emit AnalyzeScenarioXmlFailed(); return; } QDomElement root = doc.documentElement(); // 读取环境信息 QDomElement envInfo = root.firstChildElement("Environment"); QString OSName = envInfo.attribute("OSName"); QString version = envInfo.attribute("Version"); QString kernel = envInfo.attribute("RTXVersion"); double basefreq = envInfo.attribute("BaseFrequency").toDouble(); emit SetBaseFreq(basefreq); // 设置工作目录 QString rootPath = envInfo.attribute("WorkPath"); emit SetWorkPath(rootPath); // 设置模型库目录 QString modelPath = rootPath + envInfo.attribute("ModelsPath"); emit SetModelPath(modelPath); // 设置服务库目录 QString servicePath = rootPath + envInfo.attribute("ServicesPath"); emit SetServicePath(servicePath); quint32 domainID = envInfo.attribute("DomainID").toUInt(); emit SetDomainID(domainID); // 读取CPU亲和性 QString cpuAff = envInfo.attribute("CPUAffinity"); QStringList cpuAffList = cpuAff.split(","); //读取服务列表 QDomElement serviceList = root.firstChildElement("ServicesList"); for (int i = 0; i < serviceList.elementsByTagName("Service").count(); i++) { QDomElement service = serviceList.elementsByTagName("Service").at(i).toElement(); QString serviceName = service.attribute("Name"); QString libName = service.attribute("ClassName"); libName = libName.left(libName.lastIndexOf('.')); QString dynamicLibName = servicePath + "lib" + libName + ".so"; // 加载动态库 emit LoadService(dynamicLibName, libName); } // 默认按CAE模式,创建5个线程 // emit AddThreadPool("100Hz thread", FreqLevel::BaseFreq, 99, 1, 1.0E9 / basefreq); // emit AddThreadPool("50Hz thread", FreqLevel::BaseFreq, 89, 1, 1.0E9 / basefreq); // emit AddThreadPool("25Hz thread", FreqLevel::BaseFreq, 79, 1, 1.0E9 / basefreq); // emit AddThreadPool("12.5Hz thread", FreqLevel::BaseFreq, 69, 1, 1.0E9 / basefreq); // emit AddThreadPool("6.25Hz thread", FreqLevel::BaseFreq, 59, 1, 1.0E9 / basefreq); // 读取模型分组 for (int i = 0; i < root.elementsByTagName("ModelGroup").count(); i++) { // 读取模型分组信息 QDomElement modelGroup = root.elementsByTagName("ModelGroup").at(i).toElement(); // 读取模型分组名称 QString modelGroupName = modelGroup.attribute("Name"); // 读取模型分组频率 int modelGroupFreq = modelGroup.attribute("FreqGroup").toInt(); if (modelGroupFreq > 5 || modelGroupFreq < 0) { LOG_ERROR("0x2100 模型分组频率设置错误,频率值:%1", modelGroupFreq); emit AnalyzeScenarioXmlFailed(); return; } // 读取模型分组优先级 int modelGroupPriority = modelGroup.attribute("Priority").toInt(); if (modelGroupPriority > 99 || modelGroupPriority < 0) { LOG_ERROR("0x2100 模型分组优先级设置错误,优先级值:%1", modelGroupPriority); emit AnalyzeScenarioXmlFailed(); return; } // 读取模型分组CPU亲和性 QString modelGroupCPUAff = modelGroup.attribute("CPUAff"); QStringList modelGroupCPUAffList = modelGroupCPUAff.split(","); for (int j = 0; j < modelGroupCPUAffList.count(); j++) { if (!cpuAffList.contains(modelGroupCPUAffList.at(j))) { LOG_ERROR("0x2100 模型分组CPU亲和性设置错误,CPU亲和性值:%1,进程CPU亲和性值:%2", modelGroupCPUAffList.at(j), cpuAff); emit AnalyzeScenarioXmlFailed(); return; } } int ThreadCpuAffinity = 0; for (int j = 0; j < modelGroupCPUAffList.count(); j++) { ThreadCpuAffinity |= 1 << cpuAffList.indexOf(modelGroupCPUAffList.at(j)); } emit AddThreadPool(modelGroupName, (FreqLevel)modelGroupFreq, modelGroupPriority, ThreadCpuAffinity, (1.0E9 / basefreq) * pow(2.0, modelGroupFreq)); // 读取模型列表 for (int j = 0; j < modelGroup.elementsByTagName("Model").count(); j++) { QDomElement model = modelGroup.elementsByTagName("Model").at(j).toElement(); QString modelName = model.attribute("Name"); QString libName = model.attribute("ClassName"); libName = libName.left(libName.lastIndexOf('.')); // 获得动态库的路径 QString dynamicLibName = modelPath + "lib" + libName + ".so"; // 加载动态库 emit LoadModel(dynamicLibName, libName); } } // TODO 提交事件 emit AnalyzeScenarioXmlSuccess(); }