From b8b9bdf45ccf7ae59f38c19904b837912e061eed Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 3 Aug 2020 15:24:14 +0200
Subject: [PATCH] Pass provider info directly in reportProviderAvailable()

---
 .../ObjectPoseObserver/ObjectPoseObserver.cpp | 27 +++---------
 .../ObjectPoseObserver/ObjectPoseObserver.h   |  4 +-
 .../plugins/ObjectPoseProviderPlugin.cpp      |  7 +++-
 .../ObjectPoseProviderExample.cpp             | 42 ++++++++++---------
 .../ObjectPoseProviderExample.h               |  6 ++-
 .../objectpose/ObjectPoseProvider.ice         |  6 ++-
 6 files changed, 46 insertions(+), 46 deletions(-)

diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
index 38845b938..d5a7b55c3 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
+++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp
@@ -126,11 +126,9 @@ namespace armarx
     }
 
 
-    void ObjectPoseObserver::reportProviderAvailable(
-        const std::string& providerName, const objpose::ObjectPoseProviderPrx& provider, const Ice::Current&)
+    void ObjectPoseObserver::reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, const Ice::Current&)
     {
-        static const bool refresh = true;
-        fetchProviderInfo(providerName, provider, refresh);
+        updateProviderInfo(providerName, info);
     }
 
     void ObjectPoseObserver::reportObjectPoses(
@@ -138,9 +136,6 @@ namespace armarx
     {
         ARMARX_VERBOSE << "Received object poses from '" << providerName << "'.";
 
-        // static const bool refresh = false;
-        // fetchProviderInfo(providerName, refresh);
-
         objpose::ObjectPoseSeq objectPoses;
         {
             std::scoped_lock lock(dataMutex);
@@ -180,24 +175,14 @@ namespace armarx
     }
 
 
-    void ObjectPoseObserver::fetchProviderInfo(const std::string& providerName, objpose::ObjectPoseProviderPrx provider, bool refresh)
+    void ObjectPoseObserver::updateProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info)
     {
-        {
-            std::scoped_lock lock(dataMutex);
-            if (!refresh && providers.count(providerName) > 0)
-            {
-                return;  // Do nothing.
-            }
-        }
-
-        if (!provider)
+        if (!info.proxy)
         {
             ARMARX_WARNING << "Received availability signal from provider '" << providerName << "' "
-                           << "with invalid provider proxy.";
+                           << "with invalid provider proxy.\nIgnoring provider '" << providerName << "'.";
             return;
         }
-        objpose::ProviderInfo info = provider->getProviderInfo();
-
         {
             std::scoped_lock lock(dataMutex);
             if (providers.count(providerName) == 0)
@@ -346,7 +331,7 @@ namespace armarx
             offerChannel(providerName, "Channel of provider '" + providerName + "'.");
         }
         offerOrUpdateDataField(providerName, "updateCounter", Variant(updateCounters.at(providerName)), "Counter incremented for each update.");
-        offerOrUpdateDataField(providerName, "candidateCount", Variant(int(objectPoses.at(providerName).size())), "Number of provided object poses.");
+        offerOrUpdateDataField(providerName, "objectCount", Variant(int(objectPoses.at(providerName).size())), "Number of provided object poses.");
 
         if (visu.enabled)
         {
diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
index 23017441d..894bf651a 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
+++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h
@@ -82,7 +82,7 @@ namespace armarx
 
         // ObjectPoseTopic interface
     public:
-        void reportProviderAvailable(const std::string& providerName, const objpose::ObjectPoseProviderPrx& provider, ICE_CURRENT_ARG) override;
+        void reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, ICE_CURRENT_ARG) override;
         void reportObjectPoses(const std::string& providerName, const objpose::data::ProvidedObjectPoseSeq& objectPoses, ICE_CURRENT_ARG) override;
 
         // ObjectPoseObserverInterface interface
@@ -120,7 +120,7 @@ namespace armarx
 
     private:
 
-        void fetchProviderInfo(const std::string& providerName, objpose::ObjectPoseProviderPrx provider, bool refresh = false);
+        void updateProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info);
         void handleProviderUpdate(const std::string& providerName);
         void visProviderUpdate(const std::string& providerName);
 
diff --git a/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp b/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp
index 38b31297e..3112560f3 100644
--- a/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp
+++ b/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp
@@ -30,7 +30,12 @@ namespace armarx::plugins
         objpose::ObjectPoseTopicPrx& topic = parent.objectPoseTopic;
         if (topic)
         {
-            topic->reportProviderAvailable(parent.getName(), ::armarx::objpose::ObjectPoseProviderPrx::checkedCast(parent.getProxy()));
+            objpose::ProviderInfo info = parent.getProviderInfo();
+            if (!info.proxy)
+            {
+                info.proxy = ::armarx::objpose::ObjectPoseProviderPrx::checkedCast(parent.getProxy());
+            }
+            topic->reportProviderAvailable(parent.getName(), info);
         }
         else
         {
diff --git a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp
index e29c39a9e..4fba5d596 100644
--- a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp
+++ b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp
@@ -54,25 +54,6 @@ namespace armarx
         return "ObjectPoseProviderExample";
     }
 
-    objpose::ProviderInfo ObjectPoseProviderExample::getProviderInfo(const Ice::Current&)
-    {
-        objpose::ProviderInfo info;
-        info.objectType = objpose::ObjectTypeEnum::KnownObject;
-        std::vector<ObjectInfo> objects = objectFinder.findAllObjectsOfDataset("KIT");
-        for (const auto& obj : objects)
-        {
-            info.supportedObjects.push_back(objpose::ObjectID{obj.id().dataset(), obj.id().className(), obj.id().instanceName()});
-        }
-        return info;
-    }
-
-    void ObjectPoseProviderExample::requestObjects(
-        const objpose::ObjectIDSeq& objectIDs, Ice::Long relativeTimeoutMS, const Ice::Current&)
-    {
-        std::scoped_lock lock(requestedObjectsMutex);
-        requestedObjects.requestObjects(objectIDs, relativeTimeoutMS);
-    }
-
 
     void ObjectPoseProviderExample::onInitComponent()
     {
@@ -81,6 +62,15 @@ namespace armarx
             // -1 -> infinitely
             requestedObjects.requestObjects({ObjectID(initial)}, -1);
         }
+
+        {
+            providerInfo.objectType = objpose::ObjectTypeEnum::KnownObject;
+            std::vector<ObjectInfo> objects = objectFinder.findAllObjectsOfDataset("KIT");
+            for (const auto& obj : objects)
+            {
+                providerInfo.supportedObjects.push_back(objpose::ObjectID{obj.id().dataset(), obj.id().className(), obj.id().instanceName()});
+            }
+        }
     }
 
 
@@ -102,6 +92,20 @@ namespace armarx
     {
     }
 
+
+    objpose::ProviderInfo ObjectPoseProviderExample::getProviderInfo(const Ice::Current&)
+    {
+        return providerInfo;
+    }
+
+    void ObjectPoseProviderExample::requestObjects(
+        const objpose::ObjectIDSeq& objectIDs, Ice::Long relativeTimeoutMS, const Ice::Current&)
+    {
+        std::scoped_lock lock(requestedObjectsMutex);
+        requestedObjects.requestObjects(objectIDs, relativeTimeoutMS);
+    }
+
+
     void ObjectPoseProviderExample::poseEstimationTaskRun()
     {
         CycleUtil cycle(50);
diff --git a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h
index 0d1cf3ad3..46fc68b8e 100644
--- a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h
+++ b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h
@@ -107,11 +107,15 @@ namespace armarx
 
     private:
 
+        // To be moved to plugin
         std::mutex requestedObjectsMutex;
         objpose::RequestedObjects requestedObjects;
 
-        std::vector<std::string> initialObjectIDs = { "KIT/Amicelli", "KIT/YellowSaltCylinder" };
+
+        objpose::ProviderInfo providerInfo;
+
         armarx::ObjectFinder objectFinder;
+        std::vector<std::string> initialObjectIDs = { "KIT/Amicelli", "KIT/YellowSaltCylinder" };
 
         armarx::SimpleRunningTask<>::pointer_type poseEstimationTask;
 
diff --git a/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice b/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice
index 63a309c93..b3b474927 100644
--- a/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice
+++ b/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice
@@ -33,8 +33,10 @@ module armarx
     // A struct's name cannot cannot differ only in capitalization from its immediately enclosing module name.
     module objpose
     {
+        interface ObjectPoseProvider;
         struct ProviderInfo
         {
+            ObjectPoseProvider* proxy;
             ObjectTypeEnum objectType = AnyObject;
             ObjectIDSeq supportedObjects;
         };
@@ -51,8 +53,8 @@ module armarx
 
         interface ObjectPoseTopic
         {
-            /// Signal that a new provider is now available (and ready for `getProviderInfo()`.
-            void reportProviderAvailable(string providerName, ObjectPoseProvider* provider);
+            /// Signal that a new provider is now available.
+            void reportProviderAvailable(string providerName, ProviderInfo info);
             void reportObjectPoses(string providerName, data::ProvidedObjectPoseSeq candidates);
         };
     };
-- 
GitLab