XNSim/Release/include/XNCore/XNModelObject.h
2025-04-28 12:25:20 +08:00

236 lines
7.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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类型提交的函数运行优先级990优先级数值越大优先级越高
* @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) }