#pragma once #include "XNObject.h" #include "XNServiceManager.h" #include "XNEventManager.h" class XNServiceObjectPrivate; class XNServiceObject : public XNObject { Q_OBJECT Q_DECLARE_PRIVATE(XNServiceObject) Q_DISABLE_COPY(XNServiceObject) 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: explicit XNServiceObject(QObject *parent = nullptr); virtual ~XNServiceObject(); protected: explicit XNServiceObject(XNServiceObjectPrivate &dd, QObject *parent = nullptr); public: const QString &GetVersion(); const QString &GetDescription(); const QString &GetAuthor(); const QString &GetXmlPath(); const QDateTime &GetCreateTime(); const QDateTime &GetChangeTime(); void SetVersion(const QString &version); void SetDescription(const QString &description); void SetAuthor(const QString &author); void SetXmlPath(const QString &xmlPath); void SetCreateTime(const QDateTime &createTime); void SetChangeTime(const QDateTime &changeTime); int RegisterEventHandler(const QString &eventName, std::function callback, bool async = false, XNEvent::Priority priority = XNEvent::Priority::Normal); void TriggerEvent(const QString &eventName, const QVariant &eventData = QVariant(), bool forceAsync = false, XNEvent::Priority priority = XNEvent::Priority::Normal); int RegisterRTEventHandler(const QString &eventName, std::function callback); void TriggerRTEvent(const QString &eventName, const QVariant &eventData = QVariant()); public slots: virtual void OnInitialize(); virtual void OnPrepareForExecute(); public: virtual void RegisterDDSParticipant(); private: XNEventManager *GetEventManager() const; }; #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); \ XNServiceManager *serviceManager = qobject_cast(parent()); \ if (serviceManager == nullptr) \ return; \ XNDDSManager *ddsManager = serviceManager->parent()->findChild(); \ if (ddsManager == nullptr) \ return; \ quint32 MyID = getUniqueId(); #define XN_PUBLISHTOPIC_SERVICE(topic) \ d->_dataWriters[#topic] = ddsManager->RegisterPublisher(#topic, MyID); #define XN_SUBSCRIBETOPIC_SERVICE(topic, fun) \ ddsManager->RegisterSubscriber( \ #topic, MyID, std::bind(fun, this, std::placeholders::_1)); #define XN_REGISTER_SERVICE_END_SERVICE(class) }