236 lines
7.6 KiB
C
236 lines
7.6 KiB
C
|
/**
|
|||
|
* @file XNModelObject.h
|
|||
|
* @author jinchao
|
|||
|
* @brief 模型基类头文件
|
|||
|
* @version 1.0
|
|||
|
* @date 2024-11-07
|
|||
|
*
|
|||
|
* @copyright Copyright (c) 2024 XN
|
|||
|
*
|
|||
|
*/
|
|||
|
#pragma once
|
|||
|
#include "XNObject.h"
|
|||
|
#include "XNEventManager.h"
|
|||
|
|
|||
|
class XNModelObjectPrivate;
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 模型基类
|
|||
|
* @details 所有模型系统中模型的基类,预先实现了部分模型共有的功能。
|
|||
|
*/
|
|||
|
class XNModelObject : public XNObject
|
|||
|
{
|
|||
|
Q_OBJECT
|
|||
|
Q_DISABLE_COPY(XNModelObject)
|
|||
|
Q_DECLARE_PRIVATE(XNModelObject)
|
|||
|
|
|||
|
Q_PROPERTY(QString description READ GetDescription WRITE SetDescription)
|
|||
|
Q_PROPERTY(QString author READ GetAuthor WRITE SetAuthor)
|
|||
|
Q_PROPERTY(QString xmlPath READ GetXmlPath WRITE SetXmlPath)
|
|||
|
Q_PROPERTY(QDateTime createTime READ GetCreateTime WRITE SetCreateTime)
|
|||
|
Q_PROPERTY(QDateTime changeTime READ GetChangeTime WRITE SetChangeTime)
|
|||
|
Q_PROPERTY(QString version READ GetVersion WRITE SetVersion)
|
|||
|
|
|||
|
public:
|
|||
|
/**
|
|||
|
* @brief 模型基类默认构造函数
|
|||
|
*/
|
|||
|
XNModelObject(QObject *parent = nullptr);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 模型基类默认析构函数
|
|||
|
*/
|
|||
|
virtual ~XNModelObject();
|
|||
|
|
|||
|
protected:
|
|||
|
/**
|
|||
|
* @brief 模型基类带参构造函数
|
|||
|
* @param dd:XNModelObjectPrivate类型,私有结构体指针
|
|||
|
* @param parent:QObject类型,父对象指针
|
|||
|
* @details 子类构造时调用此构造函数,传入子类的私有结构体指针
|
|||
|
*/
|
|||
|
XNModelObject(XNModelObjectPrivate &dd, QObject *parent = nullptr);
|
|||
|
|
|||
|
public:
|
|||
|
/**
|
|||
|
* @brief 获取模型描述
|
|||
|
* @return const QString&:模型描述
|
|||
|
*/
|
|||
|
const QString &GetDescription();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置模型描述
|
|||
|
* @param sDescription:QString类型,模型描述
|
|||
|
*/
|
|||
|
void SetDescription(const QString &sDescription);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 获取作者
|
|||
|
* @return const QString&: 作者
|
|||
|
*/
|
|||
|
const QString &GetAuthor();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置作者
|
|||
|
* @param sAuthor: QString类型,作者
|
|||
|
*/
|
|||
|
void SetAuthor(const QString &sAuthor);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 获取模型配置文件路径
|
|||
|
* @return const QString&: 模型配置文件路径
|
|||
|
*/
|
|||
|
const QString &GetXmlPath();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置模型配置文件路径
|
|||
|
* @param sXmlPath:QString类型,模型配置文件路径
|
|||
|
*/
|
|||
|
void SetXmlPath(const QString &sXmlPath);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 获取模型创建时间
|
|||
|
* @return const QDateTime&:模型创建时间
|
|||
|
*/
|
|||
|
const QDateTime &GetCreateTime();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置模型创建时间
|
|||
|
* @param cTime: QDateTime类型,模型创建时间
|
|||
|
*/
|
|||
|
void SetCreateTime(const QDateTime &cTime);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 获取模型修改时间
|
|||
|
* @return const QDateTime&:模型修改时间
|
|||
|
*/
|
|||
|
const QDateTime &GetChangeTime();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置模型修改时间
|
|||
|
* @param cTime: QDateTime类型,模型修改时间
|
|||
|
*/
|
|||
|
void SetChangeTime(const QDateTime &cTime);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 获取模型版本号
|
|||
|
* @return const XNString&: 模型版本号
|
|||
|
*/
|
|||
|
const QString &GetVersion();
|
|||
|
/**
|
|||
|
* @brief 设置模型版本号
|
|||
|
* @param sVersion: QString类型,模型版本号
|
|||
|
*/
|
|||
|
void SetVersion(const QString &sVersion);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置仿真系统运行基频
|
|||
|
* @param dBaseFreq: double类型,频率值,单位Hz
|
|||
|
*/
|
|||
|
void SetBaseFreq(const double &dBaseFreq);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 单步执行函数
|
|||
|
* @details 模型默认的周期性执行函数
|
|||
|
*/
|
|||
|
virtual void StepUpdate();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 注册事件处理器
|
|||
|
* @param eventName: 事件名称
|
|||
|
* @param callback: 事件处理回调函数
|
|||
|
* @param async: 是否异步处理
|
|||
|
* @return: 返回处理器ID,失败返回-1
|
|||
|
*/
|
|||
|
int RegisterEventHandler(const QString &eventName,
|
|||
|
std::function<void(const QVariant &)> callback, bool async = false,
|
|||
|
XNEvent::Priority priority = XNEvent::Priority::Normal);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 触发事件
|
|||
|
* @param eventName: 要触发的事件名称
|
|||
|
* @param eventData: 事件携带的数据
|
|||
|
* @param forceAsync: 强制异步处理
|
|||
|
*/
|
|||
|
void TriggerEvent(const QString &eventName, const QVariant &eventData = QVariant(),
|
|||
|
bool forceAsync = false,
|
|||
|
XNEvent::Priority priority = XNEvent::Priority::Normal);
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 注册实时事件处理器
|
|||
|
* @param eventName: 事件名称
|
|||
|
* @param callback: 事件处理回调函数
|
|||
|
* @return: 返回处理器ID,失败返回-1
|
|||
|
*/
|
|||
|
int RegisterRTEventHandler(const QString &eventName,
|
|||
|
std::function<void(const QVariant &)> callback)
|
|||
|
{
|
|||
|
return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 触发实时事件
|
|||
|
* @param eventName: 要触发的事件名称
|
|||
|
* @param eventData: 事件携带的数据
|
|||
|
*/
|
|||
|
void TriggerRTEvent(const QString &eventName, const QVariant &eventData = QVariant())
|
|||
|
{
|
|||
|
TriggerEvent(eventName, eventData, true, XNEvent::Priority::RealTime);
|
|||
|
}
|
|||
|
|
|||
|
signals:
|
|||
|
/**
|
|||
|
* @brief 注册周期性执行的函数
|
|||
|
* @param id: quint32类型,模型ID
|
|||
|
* @param fun: QFunctionPointer类型,需要提交的函数的包装
|
|||
|
* @param freqGroup:UINT32类型,提交的函数运行频率组,0为基频,1为半频,2为1/4频,3为1/8频,4为1/16频,5为1/32频
|
|||
|
* @param RunPos: UINT32类型,提交的函数运行节点号,<2^(freqGroup)
|
|||
|
* @param RunPriorty:INT32类型,提交的函数运行优先级,99~0,优先级数值越大,优先级越高
|
|||
|
* @details 向线程管理器添加要周期性执行的函数
|
|||
|
*/
|
|||
|
void RegisterFunction(quint32 id, XNCallBack fun, quint32 freqGroup, quint32 RunPos,
|
|||
|
quint32 RunPriorty);
|
|||
|
|
|||
|
public slots:
|
|||
|
/**
|
|||
|
* @brief 初始化函数
|
|||
|
* @details
|
|||
|
* 模型的初始化函数接口,子类继承时要调用父类初始化接口,或在此函数中使用AddMyFunction方法注册需要被线程调用的函数
|
|||
|
*/
|
|||
|
virtual void OnInitialize();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 仿真系统运行前做最后处理
|
|||
|
* @details 系统运行前模型做最后处理的接口
|
|||
|
*/
|
|||
|
virtual void OnPrepareForExecute();
|
|||
|
|
|||
|
public:
|
|||
|
virtual void RegisterDDSParticipant();
|
|||
|
};
|
|||
|
|
|||
|
#define XN_DECLARE_DDS() \
|
|||
|
public: \
|
|||
|
virtual void RegisterDDSParticipant() override;
|
|||
|
|
|||
|
#define XN_REGISTER_PARTICIPANT_BEGIN(class) \
|
|||
|
void class ::RegisterDDSParticipant() \
|
|||
|
{ \
|
|||
|
XNModelObject::RegisterDDSParticipant(); \
|
|||
|
Q_D(class); \
|
|||
|
XNModelManager *modelManager = qobject_cast<XNModelManager *>(parent()); \
|
|||
|
if (modelManager == nullptr) \
|
|||
|
return; \
|
|||
|
XNDDSManager *ddsManager = modelManager->parent()->findChild<XNDDSManager *>(); \
|
|||
|
if (ddsManager == nullptr) \
|
|||
|
return; \
|
|||
|
quint32 MyID = getUniqueId();
|
|||
|
|
|||
|
#define XN_PUBLISHTOPIC(topic) \
|
|||
|
d->_dataWriters[#topic] = ddsManager->RegisterPublisher<topic##PubSubType>(#topic, MyID);
|
|||
|
|
|||
|
#define XN_SUBSCRIBETOPIC(topic, fun) \
|
|||
|
ddsManager->RegisterSubscriber<topic##PubSubType>( \
|
|||
|
#topic, MyID, std::bind(fun, this, std::placeholders::_1));
|
|||
|
|
|||
|
#define XN_REGISTER_PARTICIPANT_END(class) }
|