#pragma once #include "XNObject.h" #include "XNServiceManager.h" #include "XNEventManager.h" struct XNServiceObjectPrivate; class XNServiceObject : public XNObject { XN_METATYPE(XNServiceObject, XNObject) XN_DECLARE_PRIVATE(XNServiceObject) public: XNServiceObject(); virtual ~XNServiceObject(); protected: XNServiceObject(PrivateType *p); public: 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, XNEvent::Priority priority = XNEvent::Priority::Normal); void TriggerEvent(const std::string &eventName, const std::any &eventData = std::any(), bool forceAsync = false, XNEvent::Priority priority = XNEvent::Priority::Normal); int RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback); void TriggerRTEvent(const std::string &eventName, const std::any &eventData = std::any()); virtual void Initialize(uint32_t initialType); virtual void PrepareForExecute(); virtual void RegisterDDSParticipant(); void SetFramework(XNFrameworkPtr framework); protected: XNFrameworkPtr GetFramework() const; }; XNCLASS_PTR_DECLARE(XNServiceObject) #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); \ auto framework = GetFramework(); \ if (!framework) \ return; \ XNDDSManagerPtr ddsManager = framework->GetDDSManager(); \ if (!ddsManager) \ 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) } #define XN_SERVICE_INITIALIZE(ClassName) \ extern "C" XNServiceObjectPtr Initial##ClassName() \ { \ ClassNamePtr obj = std::make_shared(); \ return obj; \ }