XNSim/XNCore/XNServiceObject.h

91 lines
3.9 KiB
C
Raw Normal View History

2025-04-28 12:25:20 +08:00
#pragma once
#include "XNObject.h"
#include "XNServiceManager.h"
#include "XNEventManager.h"
2025-05-20 15:39:40 +08:00
struct XNServiceObjectPrivate;
2025-04-28 12:25:20 +08:00
class XNServiceObject : public XNObject
{
2025-05-20 15:39:40 +08:00
XN_METATYPE(XNServiceObject, XNObject)
XN_DECLARE_PRIVATE(XNServiceObject)
2025-04-28 12:25:20 +08:00
public:
2025-05-20 15:39:40 +08:00
XNServiceObject();
2025-04-28 12:25:20 +08:00
virtual ~XNServiceObject();
protected:
2025-05-20 15:39:40 +08:00
XNServiceObject(PrivateType *p);
2025-04-28 12:25:20 +08:00
public:
2025-05-20 15:39:40 +08:00
const std::string &GetVersion();
const std::string &GetDescription();
const std::string &GetAuthor();
const std::string &GetXmlPath();
const XNTimePoint &GetCreateTime();
const XNTimePoint &GetChangeTime();
void SetVersion(const std::string &version);
void SetDescription(const std::string &description);
void SetAuthor(const std::string &author);
void SetXmlPath(const std::string &xmlPath);
void SetCreateTime(const XNTimePoint &createTime);
void SetChangeTime(const XNTimePoint &changeTime);
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);
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);
2025-05-20 15:39:40 +08:00
int RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback);
2025-04-28 12:25:20 +08:00
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
2025-05-20 15:39:40 +08:00
virtual void Initialize(uint32_t initialType);
virtual void PrepareForExecute();
2025-04-28 12:25:20 +08:00
virtual void RegisterDDSParticipant();
2025-05-20 15:39:40 +08:00
void SetFramework(XNFrameworkPtr framework);
protected:
XNFrameworkPtr GetFramework() const;
2025-04-28 12:25:20 +08:00
};
2025-05-20 15:39:40 +08:00
XNCLASS_PTR_DECLARE(XNServiceObject)
2025-04-28 12:25:20 +08:00
#define XN_DECLARE_DDS_SERVICE() \
public: \
virtual void RegisterDDSParticipant() override;
#define XN_REGISTER_SERVICE_BEGIN_SERVICE(class) \
void class ::RegisterDDSParticipant() \
{ \
XNServiceObject::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_SERVICE(topic) \
d->_dataWriters[#topic] = ddsManager->RegisterPublisher<topic##PubSubType>(#topic, MyID);
#define XN_SUBSCRIBETOPIC_SERVICE(topic, fun) \
ddsManager->RegisterSubscriber<topic##PubSubType>( \
#topic, MyID, std::bind(fun, this, std::placeholders::_1));
#define XN_REGISTER_SERVICE_END_SERVICE(class) }
2025-05-20 15:39:40 +08:00
#define XN_SERVICE_INITIALIZE(ClassName) \
extern "C" XNServiceObjectPtr Initial##ClassName() \
{ \
ClassNamePtr obj = std::make_shared<ClassName>(); \
return obj; \
}