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