From 63502511dea7e2cb4124d28c8378fb14483a066b Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 14 Jun 2021 13:35:51 +0200
Subject: [PATCH] Fix Writer setting the timeCreated instead of timeSent

---
 .../libraries/armem/client/Writer.cpp         | 79 +++++++++++--------
 .../RobotAPI/libraries/armem/client/Writer.h  |  8 +-
 2 files changed, 53 insertions(+), 34 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/client/Writer.cpp b/source/RobotAPI/libraries/armem/client/Writer.cpp
index 9b841c6d1..2021f3a18 100644
--- a/source/RobotAPI/libraries/armem/client/Writer.cpp
+++ b/source/RobotAPI/libraries/armem/client/Writer.cpp
@@ -48,7 +48,7 @@ namespace armarx::armem::client
         data::Commit commitIce;
         toIce(commitIce, commit);
 
-        data::CommitResult resultIce = this->commit(commitIce);
+        data::CommitResult resultIce = this->_commit(commitIce);
 
         armem::CommitResult result;
         fromIce(resultIce, result);
@@ -58,15 +58,57 @@ namespace armarx::armem::client
 
 
     data::CommitResult Writer::commit(const data::Commit& _commit)
+    {
+        data::Commit commit = _commit;
+        return this->_commit(commit);
+    }
+
+
+    EntityUpdateResult Writer::commit(const EntityUpdate& update)
+    {
+        armem::Commit commit;
+        commit.updates.push_back(update);
+
+        armem::CommitResult result = this->commit(commit);
+        ARMARX_CHECK_EQUAL(result.results.size(), 1);
+        return result.results.at(0);
+    }
+
+    EntityUpdateResult Writer::commit(
+        const MemoryID& entityID,
+        const std::vector<aron::datanavigator::DictNavigatorPtr>& instancesData,
+        Time timeCreated)
+    {
+        EntityUpdate update;
+        update.entityID = entityID;
+        update.instancesData = instancesData;
+        update.timeCreated = timeCreated;
+        return commit(update);
+    }
+
+    void
+    Writer::setWritingMemory(server::WritingMemoryInterfacePrx memory)
+    {
+        this->memory = memory;
+    }
+
+    data::CommitResult Writer::_commit(data::Commit& commit)
     {
         ARMARX_CHECK_NOT_NULL(memory);
 
-        data::Commit commit = _commit;
+        /*
+         * This function sets the `timeSent` of each `EntityUpdate` before
+         * sending the data. To allow that, `commit` needs to bo non-const.
+         * Otherwise, the function would need to make a copy of `commit`,
+         * which is not necessary in all cases; e.g. when called by
+         * `commit(Const Commit&)`, which converts the commit to ice types
+         * anyway.
+         */
 
-        Time timeSent = armem::Time::now();
+        const Time timeSent = armem::Time::now();
         for (data::EntityUpdate& update : commit.updates)
         {
-            update.timeCreatedMicroSeconds = timeSent.toMicroSeconds();
+            update.timeSentMicroSeconds = timeSent.toMicroSeconds();
         }
 
         data::CommitResult result;
@@ -100,35 +142,6 @@ namespace armarx::armem::client
 
         return result;
     }
-
-
-    EntityUpdateResult Writer::commit(const EntityUpdate& update)
-    {
-        armem::Commit commit;
-        commit.updates.push_back(update);
-
-        armem::CommitResult result = this->commit(commit);
-        ARMARX_CHECK_EQUAL(result.results.size(), 1);
-        return result.results.at(0);
-    }
-
-    EntityUpdateResult Writer::commit(
-        const MemoryID& entityID,
-        const std::vector<aron::datanavigator::DictNavigatorPtr>& instancesData,
-        Time timeCreated)
-    {
-        EntityUpdate update;
-        update.entityID = entityID;
-        update.instancesData = instancesData;
-        update.timeCreated = timeCreated;
-        return commit(update);
-    }
-
-    void
-    Writer::setWritingMemory(server::WritingMemoryInterfacePrx memory)
-    {
-        this->memory = memory;
-    }
 }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/Writer.h b/source/RobotAPI/libraries/armem/client/Writer.h
index 9c6e8851e..dd953fa36 100644
--- a/source/RobotAPI/libraries/armem/client/Writer.h
+++ b/source/RobotAPI/libraries/armem/client/Writer.h
@@ -50,6 +50,10 @@ namespace armarx::armem::client
             const std::vector<aron::datanavigator::DictNavigatorPtr>& instancesData,
             Time timeCreated);
 
+        // with bare-ice types
+        data::CommitResult commit(const data::Commit& commit);
+
+
         void setWritingMemory(server::WritingMemoryInterfacePrx memory);
 
         operator bool() const
@@ -59,7 +63,9 @@ namespace armarx::armem::client
 
     private:
 
-        data::CommitResult commit(const data::Commit& commit);
+        /// Sets `timeSent` on all entity updates and performs the commit,
+        data::CommitResult _commit(data::Commit& commit);
+
 
     public:
 
-- 
GitLab