From 614f5be54dc51540e9ab5856c125de716d807e7e Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 14 Jun 2021 18:43:05 +0200
Subject: [PATCH] Fix empty provider name in ArticulatedObject Example

---
 .../ArticulatedObjectLocalizerExample.cpp     |  7 ++-
 .../client/articulated_object/Reader.cpp      | 10 ++++
 .../client/articulated_object/Reader.h        |  3 ++
 .../client/articulated_object/Writer.cpp      | 46 ++++++++++++++-----
 .../client/articulated_object/Writer.h        |  8 +++-
 5 files changed, 59 insertions(+), 15 deletions(-)

diff --git a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
index b41d385f3..7009a9267 100644
--- a/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
+++ b/source/RobotAPI/components/ArticulatedObjectLocalizerExample/ArticulatedObjectLocalizerExample.cpp
@@ -66,6 +66,7 @@ namespace armarx::articulated_object
 
         defs->optional(p.updateFrequency, "updateFrequency", "Memory update frequency (write).");
 
+        // Reader will override some properties of writer.
         articulatedObjectWriter->registerPropertyDefinitions(defs);
         articulatedObjectReader->registerPropertyDefinitions(defs);
 
@@ -77,7 +78,11 @@ namespace armarx::articulated_object
         return "ArticulatedObjectLocalizerExample";
     }
 
-    void ArticulatedObjectLocalizerExample::onInitComponent() {}
+    void ArticulatedObjectLocalizerExample::onInitComponent()
+    {
+        // Reader overwrote property registered property of articulatedObjectWriter.
+        articulatedObjectWriter->setProviderName(articulatedObjectReader->getProviderName());
+    }
 
     void ArticulatedObjectLocalizerExample::onConnectComponent()
     {
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
index e94cfbc11..f7ba4898f 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp
@@ -162,6 +162,16 @@ namespace armarx::armem::articulated_object
         return getRobotDescriptions(qResult.memory);
     }
 
+    std::string Reader::getProviderName() const
+    {
+        return properties.providerName;
+    }
+
+    void Reader::setProviderName(const std::string& providerName)
+    {
+        this->properties.providerName = providerName;
+    }
+
     std::optional<robot::RobotDescription> Reader::queryDescription(const std::string& name,
             const armem::Time& timestamp)
     {
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
index d7a0d3c75..5bc5efc3e 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h
@@ -54,6 +54,9 @@ namespace armarx::armem::articulated_object
 
         std::vector<robot::RobotDescription> queryDescriptions(const armem::Time& timestamp);
 
+        std::string getProviderName() const;
+        void setProviderName(const std::string& providerName);
+
         // TODO(fabian.reister): register property defs
 
     protected:
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
index 04dc6d4bf..ec87004d5 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp
@@ -38,6 +38,8 @@ namespace armarx::armem::articulated_object
         def->optional(properties.coreClassSegmentName,
                       prefix + "CoreSegment",
                       "Name of the memory core segment to use for object classes.");
+
+        ARMARX_IMPORTANT << "Writer: add property '" << prefix << "ProviderName'";
         def->required(properties.providerName, prefix + "ProviderName", "Name of this provider");
     }
 
@@ -159,31 +161,51 @@ namespace armarx::armem::articulated_object
         return updateResult.snapshotID;
     }
 
+    std::string Writer::getProviderName() const
+    {
+        return properties.providerName;
+    }
+
+    void Writer::setProviderName(const std::string& providerName)
+    {
+        this->properties.providerName = providerName;
+    }
+
     bool Writer::storeInstance(const ArticulatedObject& obj)
     {
         std::lock_guard g{memoryWriterMutex};
 
         ARMARX_DEBUG << "Trying to create core segment + provider segment";
 
-        const auto result =
-            memoryWriter.addSegment(properties.coreInstanceSegmentName, properties.providerName);
-
-        if (not result.success)
+        // Provider segments are now added when necessary.
+        // Adding them explicitly is only needed to set a deriving provider segment type.
+        if (false)
         {
-            ARMARX_ERROR << "Creating core segment failed. Reason: " << result.errorMessage;
-            return false;
+            const auto result =
+                memoryWriter.addSegment(properties.coreInstanceSegmentName, properties.providerName);
+
+            if (not result.success)
+            {
+                ARMARX_ERROR << "Creating core segment failed. Reason: " << result.errorMessage;
+                return false;
+            }
+            else
+            {
+                ARMARX_IMPORTANT << VAROUT(result.segmentID);
+            }
         }
 
         const auto& timestamp = obj.timestamp;
 
-        const auto providerId = armem::MemoryID(result.segmentID);
-        const auto entityID =
-            providerId
-            .withEntityName(obj.description.name)
-            .withTimestamp(timestamp);
+        const auto providerId = armem::MemoryID()
+                                .withMemoryName(properties.memoryName)
+                                .withCoreSegmentName(properties.coreInstanceSegmentName)
+                                .withProviderSegmentName(properties.providerName);
+        ARMARX_IMPORTANT << VAROUT(providerId) << " | " << VAROUT(properties.providerName);
 
         armem::EntityUpdate update;
-        update.entityID = entityID;
+        update.entityID = providerId.withEntityName(obj.description.name);
+        // .withTimestamp(timestamp); // You only need to specify the entity ID, not the snapshot ID
 
         arondto::Robot aronArticulatedObject;
         robot::toAron(aronArticulatedObject, obj);
diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
index 62629b674..c5fa97dd6 100644
--- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
+++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h
@@ -42,7 +42,6 @@ namespace armarx::armem::articulated_object
         Writer(armem::client::MemoryNameSystem& memoryNameSystem);
         virtual ~Writer() = default;
 
-
         void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
         void connect();
 
@@ -54,7 +53,12 @@ namespace armarx::armem::articulated_object
 
         // const std::string& getPropertyPrefix() const override;
 
+        std::string getProviderName() const;
+        void setProviderName(const std::string& providerName);
+
+
     private:
+
         std::optional<armem::MemoryID> storeOrGetClass(const ArticulatedObject& obj);
 
         void updateKnownObjects(const armem::MemoryID& subscriptionID, const std::vector<armem::MemoryID>& snapshotIDs);
@@ -72,7 +76,7 @@ namespace armarx::armem::articulated_object
             std::string memoryName              = "Object";
             std::string coreInstanceSegmentName = "ArticulatedObjectInstance";
             std::string coreClassSegmentName    = "ArticulatedObjectClass";
-            std::string providerName;
+            std::string providerName            = "";
 
             bool allowClassCreation             = false;
         } properties;
-- 
GitLab