XNSim/XNCore/XNScenarioManager.cpp

191 lines
6.3 KiB
C++
Raw Normal View History

2025-04-28 12:25:20 +08:00
/**
* @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();
}