XNSim/XNCore/XNScenarioManager.cpp
2025-04-28 12:25:20 +08:00

191 lines
6.3 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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