169 lines
4.3 KiB
C++
169 lines
4.3 KiB
C++
|
/**
|
|||
|
* @file XNModelManager.cpp
|
|||
|
* @author jinchao
|
|||
|
* @brief 模型管理器类源文件
|
|||
|
* @version 1.0
|
|||
|
* @date 2024-11-06
|
|||
|
*
|
|||
|
* @copyright Copyright (c) 2024 XN
|
|||
|
*
|
|||
|
*/
|
|||
|
#include "XNModelManager.h"
|
|||
|
#include "XNModelManager_p.h"
|
|||
|
#include "XNModelObject.h"
|
|||
|
#include <QLibrary>
|
|||
|
#include <QMetaObject>
|
|||
|
#include <QPointer>
|
|||
|
|
|||
|
// 构造函数
|
|||
|
XNModelManager::XNModelManager(QObject *parent)
|
|||
|
: XNBaseFrameObject(*new XNModelManagerPrivate(this), parent)
|
|||
|
{
|
|||
|
setUniqueId(6);
|
|||
|
setObjectName("XNModelManager");
|
|||
|
Q_D(XNModelManager);
|
|||
|
d->ModelIDAssigned.resize(10000, false);
|
|||
|
}
|
|||
|
|
|||
|
// 析构函数
|
|||
|
XNModelManager::~XNModelManager()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
XNModelManager::XNModelManager(XNModelManagerPrivate &dd, QObject *parent)
|
|||
|
: XNBaseFrameObject(dd, parent)
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
d->ModelIDAssigned.resize(10000, false);
|
|||
|
}
|
|||
|
|
|||
|
// 运行前最后准备
|
|||
|
void XNModelManager::OnPrepareForExecute()
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
emit PrepareForExecute();
|
|||
|
d->_status = XNFrameObjectStatus::Ready;
|
|||
|
LOG_INFO("XNModelManager is prepared!");
|
|||
|
emit PrepareForExecuteSuccess();
|
|||
|
}
|
|||
|
|
|||
|
void XNModelManager::OnInitialize()
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
LOG_INFO("XNModelManager Initialize Success!");
|
|||
|
d->_status = XNFrameObjectStatus::Initialized;
|
|||
|
emit InitializeSuccess();
|
|||
|
}
|
|||
|
|
|||
|
void XNModelManager::OnLoadModel(const QString &modelPath, const QString &className)
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
QLibrary lib(modelPath);
|
|||
|
if (lib.load()) {
|
|||
|
typedef void (*InitialModelFunc)();
|
|||
|
QString initialModelName = "Initial" + className;
|
|||
|
InitialModelFunc initialModel =
|
|||
|
(InitialModelFunc)lib.resolve(initialModelName.toUtf8().constData());
|
|||
|
if (initialModel) {
|
|||
|
initialModel();
|
|||
|
QMetaType metaType = QMetaType::fromName(className.toUtf8().constData());
|
|||
|
if (metaType.isValid()) {
|
|||
|
QObject *obj = static_cast<QObject *>(metaType.create());
|
|||
|
if (obj) {
|
|||
|
XNModelObject *model = qobject_cast<XNModelObject *>(obj);
|
|||
|
if (model) {
|
|||
|
quint32 modelID = RegisterModel();
|
|||
|
if (modelID == 0) {
|
|||
|
LOG_WARNING("0x2174 Assign Model ID Failed, Model ID is used up!");
|
|||
|
delete obj;
|
|||
|
return;
|
|||
|
}
|
|||
|
model->setParent(this);
|
|||
|
model->setObjectName(className);
|
|||
|
model->setUniqueId(modelID);
|
|||
|
model->SetBaseFreq(d->dBaseFreq);
|
|||
|
QString configFilePath =
|
|||
|
QFileInfo(modelPath).absolutePath() + "/" + className + ".mcfg";
|
|||
|
model->SetXmlPath(configFilePath);
|
|||
|
connect(model, &XNModelObject::RegisterFunction, this,
|
|||
|
&XNModelManager::OnRegisterFunction);
|
|||
|
connect(this, &XNModelManager::PrepareForExecute, model,
|
|||
|
&XNModelObject::OnPrepareForExecute);
|
|||
|
model->OnInitialize();
|
|||
|
} else {
|
|||
|
LOG_WARNING("0x2175 Model %1 Instantiation Failed, Not a subclass of "
|
|||
|
"XNModelObject!",
|
|||
|
className);
|
|||
|
delete obj;
|
|||
|
return;
|
|||
|
}
|
|||
|
} else {
|
|||
|
LOG_WARNING("0x2176 Model %1 Instantiation Failed, Not a subclass of QObject!",
|
|||
|
className);
|
|||
|
delete obj;
|
|||
|
return;
|
|||
|
}
|
|||
|
} else {
|
|||
|
LOG_WARNING("0x2173 Model %1 Not found in dynamic link library %2!", className,
|
|||
|
modelPath);
|
|||
|
}
|
|||
|
} else {
|
|||
|
LOG_WARNING("0x2177 InitialModel function not found in dynamic link library %2!",
|
|||
|
modelPath);
|
|||
|
}
|
|||
|
} else {
|
|||
|
LOG_WARNING("0x2172 Model %1 Dynamic link library loading failed! Error: %2", className,
|
|||
|
lib.errorString());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void XNModelManager::OnSetBaseFreq(const double &dBaseFreq)
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
d->dBaseFreq = dBaseFreq;
|
|||
|
}
|
|||
|
|
|||
|
// 模型注册
|
|||
|
quint32 XNModelManager::RegisterModel()
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
// 从10000~19999的编号中分配ID
|
|||
|
for (int i = 0; i < 10000; i++) {
|
|||
|
if (d->ModelIDAssigned[i])
|
|||
|
continue;
|
|||
|
else {
|
|||
|
d->ModelIDAssigned[i] = true;
|
|||
|
return i + 10000;
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
// 获取模型指针
|
|||
|
XNModelObject *XNModelManager::GetModel(quint32 modelID)
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
if (d->ModelIDAssigned[modelID - 10000]) {
|
|||
|
QList<XNModelObject *> modelList = findChildren<XNModelObject *>();
|
|||
|
for (auto &model : modelList) {
|
|||
|
if (model->getUniqueId() == modelID)
|
|||
|
return model;
|
|||
|
}
|
|||
|
return nullptr;
|
|||
|
} else
|
|||
|
return nullptr;
|
|||
|
}
|
|||
|
|
|||
|
void XNModelManager::OnRegisterFunction(quint32 id, XNCallBack fun, quint32 freqGroup,
|
|||
|
quint32 RunPos, quint32 RunPriorty)
|
|||
|
{
|
|||
|
Q_D(XNModelManager);
|
|||
|
if (d->ModelIDAssigned[id - 10000]) {
|
|||
|
emit RegisterFunction(id, fun, freqGroup, RunPos, RunPriorty);
|
|||
|
} else {
|
|||
|
LOG_WARNING(
|
|||
|
"0x2177 Submission of periodic function was rejected, model ID %1 is not registered!",
|
|||
|
id);
|
|||
|
}
|
|||
|
}
|