/** * @file XNModelObject.h * @author jinchao * @brief 模型基类头文件 * @version 1.0 * @date 2024-11-07 * * @copyright Copyright (c) 2024 XN * */ #pragma once #include "XNEventManager/XNEventManager.h" #include "XNObject/XNObject.h" namespace XNSim { struct XNModelObjectPrivate; /** * @brief 模型基类 * @details 所有模型系统中模型的基类,预先实现了部分模型共有的功能。 */ class XNModelObject : public XNObject { XN_METATYPE(XNModelObject, XNObject) XN_DECLARE_PRIVATE(XNModelObject) public: /** * @brief 模型基类默认构造函数 */ XNModelObject(); /** * @brief 模型基类默认析构函数 */ virtual ~XNModelObject(); protected: /** * @brief 模型基类带参构造函数 * @param p:XNModelObjectPrivate类型,私有结构体指针 * @details 子类构造时调用此构造函数,传入子类的私有结构体指针 */ XNModelObject(PrivateType *p); public: void SetFramework(XNFrameworkPtr framework); protected: XNFrameworkPtr GetFramework() const; public: /** * @brief 获取模型描述 * @return const QString&:模型描述 */ const XN_STRING &GetDescription(); /** * @brief 设置模型描述 * @param sDescription:QString类型,模型描述 */ void SetDescription(const XN_STRING &sDescription); /** * @brief 获取作者 * @return const QString&: 作者 */ const XN_STRING &GetAuthor(); /** * @brief 设置作者 * @param sAuthor: QString类型,作者 */ void SetAuthor(const XN_STRING &sAuthor); /** * @brief 获取模型配置文件路径 * @return const QString&: 模型配置文件路径 */ const XN_STRING &GetXmlPath(); /** * @brief 设置模型配置文件路径 * @param sXmlPath:QString类型,模型配置文件路径 */ void SetXmlPath(const XN_STRING &sXmlPath); /** * @brief 获取模型创建时间 * @return const XNTimePoint&:模型创建时间 */ const XNTimePoint &GetCreateTime(); /** * @brief 设置模型创建时间 * @param cTime: XNTimePoint类型,模型创建时间 */ void SetCreateTime(const XNTimePoint &cTime); /** * @brief 获取模型修改时间 * @return const XNTimePoint&:模型修改时间 */ const XNTimePoint &GetChangeTime(); /** * @brief 设置模型修改时间 * @param cTime: XNTimePoint类型,模型修改时间 */ void SetChangeTime(const XNTimePoint &cTime); /** * @brief 获取模型版本号 * @return const XNString&: 模型版本号 */ const XN_STRING &GetVersion(); /** * @brief 设置模型版本号 * @param sVersion: std::string类型,模型版本号 */ void SetVersion(const XN_STRING &sVersion); /** * @brief 获取模型运行频率组 * @return uint32_t: 模型运行频率组 */ XN_UINT32 GetRunFreq() const; /** * @brief 设置模型运行频率组 * @param runFreq: uint32_t类型,模型运行频率组 */ void SetRunFreq(XN_UINT32 runFreq); /** * @brief 获取模型运行节点 * @return uint32_t: 模型运行节点 */ XN_UINT32 GetRunNode() const; /** * @brief 设置模型运行节点 * @param runNode: uint32_t类型,模型运行节点 */ void SetRunNode(XN_UINT32 runNode); /** * @brief 获取模型运行优先级 * @return uint32_t: 模型运行优先级 */ XN_UINT32 GetRunPriority() const; /** * @brief 设置模型运行优先级 * @param runPriority: uint32_t类型,模型运行优先级 */ void SetRunPriority(XN_UINT32 runPriority); /** * @brief 获取模型设置频率 * @return double: 模型设置频率 */ XN_DOUBLE GetSetFreq() const; /** * @brief 设置模型设置频率 * @param setFreq: double类型,模型设置频率 */ void SetSetFreq(XN_DOUBLE setFreq); /** * @brief 获取模型动态库路径 * @return const std::string&: 模型动态库路径 */ const XN_STRING &GetLibPath(); /** * @brief 设置模型动态库路径 * @param sLibPath: std::string类型,模型动态库路径 */ void SetLibPath(const XN_STRING &sLibPath); /** * @brief 单步执行函数 * @details 模型默认的周期性执行函数 */ virtual void StepUpdate(); /** * @brief 注册事件处理器 * @param eventName: 事件名称 * @param callback: 事件处理回调函数 * @param async: 是否异步处理 * @return: 返回处理器ID,失败返回-1 */ int RegisterEventHandler( const XN_STRING &eventName, XNEventCallback callback, XN_BOOL async = false, XNEvent::Priority priority = XNEvent::Priority::Normal); /** * @brief 触发事件 * @param eventName: 要触发的事件名称 * @param eventData: 事件携带的数据 * @param forceAsync: 强制异步处理 */ void TriggerEvent(const XN_STRING &eventName, const XN_ANY &eventData = XN_ANY(), XN_BOOL forceAsync = false, XNEvent::Priority priority = XNEvent::Priority::Normal); /** * @brief 注册实时事件处理器 * @param eventName: 事件名称 * @param callback: 事件处理回调函数 * @return: 返回处理器ID,失败返回-1 */ int RegisterRTEventHandler(const XN_STRING &eventName, XNEventCallback callback) { return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime); } /** * @brief 触发实时事件 * @param eventName: 要触发的事件名称 * @param eventData: 事件携带的数据 */ void TriggerRTEvent(const XN_STRING &eventName, const XN_ANY &eventData = XN_ANY()) { TriggerEvent(eventName, eventData, true, XNEvent::Priority::RealTime); } void SetInitializeType(XN_UINT32 initialType); void SetThreadID(XN_UINT32 threadID); XN_UINT32 GetThreadID() const; /** * @brief 初始化函数 * @details * 模型的初始化函数接口,子类继承时要调用父类初始化接口,或在此函数中使用AddMyFunction方法注册需要被线程调用的函数 */ virtual void Initialize(); /** * @brief 仿真系统运行前做最后处理 * @details 系统运行前模型做最后处理的接口 */ virtual void PrepareForExecute(); public: virtual void RegisterDDSParticipant(); private: void ParseXml(); void ParseConfig(); }; } // namespace XNSim #define XN_MODEL_INITIALIZE(ClassName) \ extern "C" XNSim::XNModelObjectPtr Initial##ClassName() { \ XNSim::ClassName##Ptr obj = std::make_shared(); \ return obj; \ }