191 lines
6.3 KiB
C++
Executable File
191 lines
6.3 KiB
C++
Executable File
/**
|
||
* @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();
|
||
}
|