diff --git a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp index 1559cd1cd6e29dc17397c48f20848759620a39d9..14343e6b918853b7b5e36ca4cb07789d8ece238f 100644 --- a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp +++ b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp @@ -20,6 +20,7 @@ namespace armarx::armem::client MemoryNameSystem::MemoryNameSystem(mns::MemoryNameSystemInterfacePrx mns, ManagedIceObject* component) : + util::MemoryListener(component), mns(mns), component(component) { } @@ -28,7 +29,7 @@ namespace armarx::armem::client void MemoryNameSystem::initialize(mns::MemoryNameSystemInterfacePrx mns, ManagedIceObject* component) { this->mns = mns; - this->component = component; + setComponent(component); } @@ -407,8 +408,10 @@ namespace armarx::armem::client this->mns = mns; } + void MemoryNameSystem::setComponent(ManagedIceObject* component) { + util::MemoryListener::setComponent(component); this->component = component; } diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp index 463c6443e11ddd0ec92d6c5bb4b1001e4e97dfed..96126b71241148187068990a18e61776cef5ba4a 100644 --- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp +++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp @@ -14,8 +14,9 @@ namespace armarx::armem::client::plugins void ListeningPlugin::postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties) { + // This is now done by the client::util::MemoryListener class on subscription of a memory ID. // Subscribe topics by single servers, use this as a prefix. - properties->topic<MemoryListenerInterface>("MemoryUpdates"); + // properties->topic<MemoryListenerInterface>("MemoryUpdates"); } } diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp index 3a40a9ffe27b1116fe5a78f5d1a3088652818b38..95eed974f77513f9186aed0d8b2633394b73f3be 100644 --- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp +++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp @@ -26,4 +26,3 @@ namespace armarx::armem::client::plugins } } - diff --git a/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp b/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp index a4aa21483fa16ddf471466ec6c1f2ba6da0d8bce..c8a7c6c683467194d6e2248edc0e5be57d3b547b 100644 --- a/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp +++ b/source/RobotAPI/libraries/armem/client/util/MemoryListener.cpp @@ -5,6 +5,7 @@ #include <ArmarXCore/core/exceptions/LocalException.h> #include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h> +#include <ArmarXCore/core/ManagedIceObject.h> #include <RobotAPI/libraries/armem/core/ice_conversions.h> #include <RobotAPI/libraries/armem/core/error.h> @@ -13,8 +14,21 @@ namespace armarx::armem::client::util { - MemoryListener::MemoryListener() + std::string MemoryListener::MakeMemoryTopicName(const MemoryID& memoryID) { + return "MemoryUpdates." + memoryID.memoryName; + } + + + MemoryListener::MemoryListener(ManagedIceObject* component) : + component(component) + { + } + + + void MemoryListener::setComponent(ManagedIceObject* component) + { + this->component = component; } @@ -109,6 +123,10 @@ namespace armarx::armem::client::util MemoryListener::subscribe(const MemoryID& id, Callback callback) { callbacks[id].push_back(callback); + if (component) + { + component->usingTopic(MakeMemoryTopicName(id)); + } } diff --git a/source/RobotAPI/libraries/armem/client/util/MemoryListener.h b/source/RobotAPI/libraries/armem/client/util/MemoryListener.h index 2d530097ce6394ddcf4cc815f8e44f93e057d916..ceb765e60db13404fbe170900342cff554b3affe 100644 --- a/source/RobotAPI/libraries/armem/client/util/MemoryListener.h +++ b/source/RobotAPI/libraries/armem/client/util/MemoryListener.h @@ -11,6 +11,12 @@ #include <RobotAPI/libraries/armem/core/MemoryID.h> + +namespace armarx +{ + class ManagedIceObject; +} + namespace armarx::armem::client::util { @@ -20,6 +26,7 @@ namespace armarx::armem::client::util */ class MemoryListener { + public: using Callback = std::function<void(const MemoryID& subscriptionID, const std::vector<MemoryID>& updatedSnapshotIDs)>; using CallbackUpdatedOnly = std::function<void(const std::vector<MemoryID>& updatedSnapshotIDs)>; @@ -29,11 +36,14 @@ namespace armarx::armem::client::util template <class CalleeT> using MemberCallbackUpdatedOnly = void(CalleeT::*)(const std::vector<MemoryID>& updatedSnapshotIDs); + static std::string MakeMemoryTopicName(const MemoryID& memoryID); + public: - MemoryListener(); + MemoryListener(ManagedIceObject* component = nullptr); + void setComponent(ManagedIceObject* component); void subscribe(const MemoryID& subscriptionID, Callback Callback); void subscribe(const MemoryID& subscriptionID, CallbackUpdatedOnly Callback); @@ -73,6 +83,10 @@ namespace armarx::armem::client::util std::unordered_map<MemoryID, std::vector<Callback>> callbacks; + private: + + armarx::ManagedIceObject* component; + }; } diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 2b2e744a426898c575ce9468b5fcd64d3e3d7673..1400107eaa926207ce2cc7b1a07f508897038c88 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -123,7 +123,7 @@ namespace armarx::armem::server armem::Commit commit; try { - fromIce(commitIce, commit, timeArrived); + ::armarx::armem::fromIce(commitIce, commit, timeArrived); } catch (const aron::error::AronNotValidException& e) { diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp index 298983e478fbc03f5ec6187e9394da128e2a5171..40d22cead44dea33a993364415ea6cbe59d6413a 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp @@ -1,6 +1,7 @@ #include "Plugin.h" #include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/client/util/MemoryListener.h> #include <RobotAPI/libraries/armem/client/plugins/Plugin.h> #include <ArmarXCore/core/Component.h> @@ -37,9 +38,13 @@ namespace armarx::armem::server::plugins properties->optional(longtermMemory.enabled, prefix + "ltm.enabled"); } longtermMemory.createPropertyDefinitions(properties, prefix + "ltm."); + } + - // Publish memory updates topic - properties->topic(memoryTopic, memoryTopicDefaultName); + void Plugin::preOnInitComponent() + { + memoryTopicName = client::util::MemoryListener::MakeMemoryTopicName(MemoryID(workingMemory.name())); + parent().offeringTopic(memoryTopicName); } @@ -52,6 +57,7 @@ namespace armarx::armem::server::plugins { registerServer(parent); } + parent.getTopic(memoryTopic, memoryTopicName); iceAdapter.setMemoryListener(memoryTopic); } diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h index 8a5a68934003997a9588117ecc985f2fa9dfe456..dcbe7adc4c3b519a55da2b234f6f3b28338fd74f 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h @@ -33,6 +33,7 @@ namespace armarx::armem::server::plugins virtual void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override; + virtual void preOnInitComponent() override; virtual void postOnConnectComponent() override; virtual void preOnDisconnectComponent() override; @@ -74,7 +75,9 @@ namespace armarx::armem::server::plugins // Working Memory Updates (publishing) - std::string memoryTopicDefaultName = "MemoryUpdates"; + /// Available at onInit(). + std::string memoryTopicName; + /// Available after onConnect(). client::MemoryListenerInterfacePrx memoryTopic;