diff --git a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt index 29e894703a635024b3f31bffd08f447ad26dc2e3..3871efdea26b84c0cda4bea7db68dee8fc80afd6 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt +++ b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt @@ -10,11 +10,13 @@ set(COMPONENT_LIBS set(SOURCES ObjectPoseObserver.cpp + ObjectPoseProviderPlugin.cpp ObjectFinder.cpp ) set(HEADERS ObjectPoseObserver.h + ObjectPoseProviderPlugin.h ObjectFinder.h ) diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseProviderPlugin.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseProviderPlugin.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d614e214f0c9ad5505ece0680ed3766469859752 --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseProviderPlugin.cpp @@ -0,0 +1,61 @@ +#include "ObjectPoseProviderPlugin.h" + +namespace armarx::plugins +{ + + void ObjectPoseProviderPlugin::postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) + { + if (!properties->hasDefinition(makePropertyName(PROPERTY_NAME))) + { + properties->defineOptionalProperty<std::string>( + makePropertyName(PROPERTY_NAME), + "ObjectPoseTopic", + "Name of the object pose topic."); + } + } + + void ObjectPoseProviderPlugin::preOnInitComponent() + { + parent<Component>().offeringTopicFromProperty(makePropertyName(PROPERTY_NAME)); + } + + void ObjectPoseProviderPlugin::preOnConnectComponent() + { + parent<ObjectPoseProviderPluginUser>().objectPoseTopic = createObjectPoseTopic(); + } + + void ObjectPoseProviderPlugin::postOnConnectComponent() + { + objpose::ObjectPoseTopicPrx& topic = parent<ObjectPoseProviderPluginUser>().objectPoseTopic; + if (topic) + { + topic->reportProviderAvailable(parent<Component>().getName()); + } + else + { + ARMARX_WARNING << "Object pose topic not ready."; + } + } + + objpose::ObjectPoseTopicPrx ObjectPoseProviderPlugin::createObjectPoseTopic() + { + return parent<Component>().getTopicFromProperty<objpose::ObjectPoseTopicPrx>(makePropertyName(PROPERTY_NAME)); + } + +} + + +namespace armarx +{ + + ObjectPoseProviderPluginUser::ObjectPoseProviderPluginUser() + { + addPlugin(plugin); + } + + objpose::ObjectPoseTopicPrx ObjectPoseProviderPluginUser::createObjectPoseTopic() + { + return plugin->createObjectPoseTopic(); + } + +} diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseProviderPlugin.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseProviderPlugin.h new file mode 100644 index 0000000000000000000000000000000000000000..698c7d37592c76b9eb9f1b2aa52ea9b4cec65499 --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseProviderPlugin.h @@ -0,0 +1,57 @@ +#pragma once + +#include <ArmarXCore/core/Component.h> + +#include <RobotAPI/interface/objectpose/ObjectPoseProvider.h> + + +namespace armarx::plugins +{ + + class ObjectPoseProviderPlugin : public ComponentPlugin + { + public: + using ComponentPlugin::ComponentPlugin; + + void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override; + + void preOnInitComponent() override; + void preOnConnectComponent() override; + void postOnConnectComponent() override; + + objpose::ObjectPoseTopicPrx createObjectPoseTopic(); + + + private: + + static constexpr const char* PROPERTY_NAME = "ObjectPoseTopicName"; + + }; + +} + + +namespace armarx +{ + + /** + * @brief Provides an `objpose::ObjectPoseTopicPrx objectPoseTopic` as member variable. + */ + class ObjectPoseProviderPluginUser : + virtual public ManagedIceObject + , virtual objpose::ObjectPoseProvider + { + public: + + ObjectPoseProviderPluginUser(); + + objpose::ObjectPoseTopicPrx createObjectPoseTopic(); + + objpose::ObjectPoseTopicPrx objectPoseTopic; + + private: + + armarx::plugins::ObjectPoseProviderPlugin* plugin = nullptr; + + }; +}