XNSim/XNCore/XNModelObject.h

221 lines
6.8 KiB
C
Raw Normal View History

2025-04-28 12:25:20 +08:00
/**
* @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"
2025-05-20 15:39:40 +08:00
struct XNModelObjectPrivate;
2025-04-28 12:25:20 +08:00
/**
* @brief
* @details
*/
class XNModelObject : public XNObject
{
2025-05-20 15:39:40 +08:00
XN_METATYPE(XNModelObject, XNObject)
XN_DECLARE_PRIVATE(XNModelObject)
2025-04-28 12:25:20 +08:00
public:
/**
* @brief
*/
2025-05-20 15:39:40 +08:00
XNModelObject();
2025-04-28 12:25:20 +08:00
/**
* @brief
*/
virtual ~XNModelObject();
protected:
/**
* @brief
2025-05-20 15:39:40 +08:00
* @param p:XNModelObjectPrivate类型
2025-04-28 12:25:20 +08:00
* @details
*/
2025-05-20 15:39:40 +08:00
XNModelObject(PrivateType *p);
public:
void SetFramework(XNFrameworkPtr framework);
protected:
XNFrameworkPtr GetFramework() const;
2025-04-28 12:25:20 +08:00
public:
/**
* @brief
* @return const QString&:
*/
2025-05-20 15:39:40 +08:00
const std::string &GetDescription();
2025-04-28 12:25:20 +08:00
/**
* @brief
* @param sDescription:QString类型
*/
2025-05-20 15:39:40 +08:00
void SetDescription(const std::string &sDescription);
2025-04-28 12:25:20 +08:00
/**
* @brief
* @return const QString&:
*/
2025-05-20 15:39:40 +08:00
const std::string &GetAuthor();
2025-04-28 12:25:20 +08:00
/**
* @brief
* @param sAuthor: QString类型
*/
2025-05-20 15:39:40 +08:00
void SetAuthor(const std::string &sAuthor);
2025-04-28 12:25:20 +08:00
/**
* @brief
* @return const QString&:
*/
2025-05-20 15:39:40 +08:00
const std::string &GetXmlPath();
2025-04-28 12:25:20 +08:00
/**
* @brief
* @param sXmlPath:QString类型
*/
2025-05-20 15:39:40 +08:00
void SetXmlPath(const std::string &sXmlPath);
2025-04-28 12:25:20 +08:00
/**
* @brief
2025-05-20 15:39:40 +08:00
* @return const XNTimePoint&:
2025-04-28 12:25:20 +08:00
*/
2025-05-20 15:39:40 +08:00
const XNTimePoint &GetCreateTime();
2025-04-28 12:25:20 +08:00
/**
* @brief
2025-05-20 15:39:40 +08:00
* @param cTime: XNTimePoint类型
2025-04-28 12:25:20 +08:00
*/
2025-05-20 15:39:40 +08:00
void SetCreateTime(const XNTimePoint &cTime);
2025-04-28 12:25:20 +08:00
/**
* @brief
2025-05-20 15:39:40 +08:00
* @return const XNTimePoint&:
2025-04-28 12:25:20 +08:00
*/
2025-05-20 15:39:40 +08:00
const XNTimePoint &GetChangeTime();
2025-04-28 12:25:20 +08:00
/**
* @brief
2025-05-20 15:39:40 +08:00
* @param cTime: XNTimePoint类型
2025-04-28 12:25:20 +08:00
*/
2025-05-20 15:39:40 +08:00
void SetChangeTime(const XNTimePoint &cTime);
2025-04-28 12:25:20 +08:00
/**
* @brief
* @return const XNString&:
*/
2025-05-20 15:39:40 +08:00
const std::string &GetVersion();
2025-04-28 12:25:20 +08:00
/**
2025-05-20 15:39:40 +08:00
* @brief
* @param sVersion: std::string类型
2025-04-28 12:25:20 +08:00
*/
2025-05-20 15:39:40 +08:00
void SetVersion(const std::string &sVersion);
2025-04-28 12:25:20 +08:00
/**
* @brief
* @details
*/
virtual void StepUpdate();
/**
* @brief
* @param eventName:
* @param callback:
* @param async:
* @return: ID-1
*/
2025-05-20 15:39:40 +08:00
int RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
bool async = false,
2025-04-28 12:25:20 +08:00
XNEvent::Priority priority = XNEvent::Priority::Normal);
/**
* @brief
* @param eventName:
* @param eventData:
* @param forceAsync:
*/
2025-05-20 15:39:40 +08:00
void TriggerEvent(const std::string &eventName, const std::any &eventData = std::any(),
2025-04-28 12:25:20 +08:00
bool forceAsync = false,
XNEvent::Priority priority = XNEvent::Priority::Normal);
/**
* @brief
* @param eventName:
* @param callback:
* @return: ID-1
*/
2025-05-20 15:39:40 +08:00
int RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback)
2025-04-28 12:25:20 +08:00
{
return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime);
}
/**
* @brief
* @param eventName:
* @param eventData:
*/
2025-05-20 15:39:40 +08:00
void TriggerRTEvent(const std::string &eventName, const std::any &eventData = std::any())
2025-04-28 12:25:20 +08:00
{
TriggerEvent(eventName, eventData, true, XNEvent::Priority::RealTime);
}
/**
* @brief
* @details
* 使AddMyFunction方法注册需要被线程调用的函数
*/
2025-05-20 15:39:40 +08:00
virtual void Initialize(uint32_t initialType, uint32_t threadID);
2025-04-28 12:25:20 +08:00
/**
* @brief 仿
* @details
*/
2025-05-20 15:39:40 +08:00
virtual void PrepareForExecute();
2025-04-28 12:25:20 +08:00
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); \
2025-05-20 15:39:40 +08:00
auto framework = GetFramework(); \
if (!framework) \
2025-04-28 12:25:20 +08:00
return; \
2025-05-20 15:39:40 +08:00
XNDDSManagerPtr ddsManager = framework->GetDDSManager(); \
if (!ddsManager) \
2025-04-28 12:25:20 +08:00
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));
2025-05-20 15:39:40 +08:00
#define XN_REGISTER_PARTICIPANT_END(class) }
#define XN_MODEL_INITIALIZE(ClassName) \
extern "C" XNModelObjectPtr Initial##ClassName() \
{ \
ClassNamePtr obj = std::make_shared<ClassName>(); \
return obj; \
}