/** * @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 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 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(parent()); \ if (modelManager == nullptr) \ return; \ XNDDSManager *ddsManager = modelManager->parent()->findChild(); \ if (ddsManager == nullptr) \ return; \ quint32 MyID = getUniqueId(); #define XN_PUBLISHTOPIC(topic) \ d->_dataWriters[#topic] = ddsManager->RegisterPublisher(#topic, MyID); #define XN_SUBSCRIBETOPIC(topic, fun) \ ddsManager->RegisterSubscriber( \ #topic, MyID, std::bind(fun, this, std::placeholders::_1)); #define XN_REGISTER_PARTICIPANT_END(class) }