From 634efb743e5ec99ab757e0113435266962917d2a Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Tue, 22 Mar 2022 14:13:52 +0100
Subject: [PATCH] Update usage of time in armem/core

---
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  1 +
 .../libraries/armem/client/Writer.cpp         |  5 +--
 source/RobotAPI/libraries/armem/core/Commit.h |  8 ++---
 .../libraries/armem/core/MemoryID.cpp         | 10 +++---
 .../RobotAPI/libraries/armem/core/MemoryID.h  | 23 ++++++------
 .../libraries/armem/core/aron_conversions.cpp |  5 +--
 .../libraries/armem/core/aron_conversions.h   |  8 +++--
 .../libraries/armem/core/base/EntityBase.h    | 10 +++---
 .../armem/core/base/ice_conversions.cpp       | 15 ++++----
 .../armem/core/base/ice_conversions.h         |  2 +-
 .../armem/core/forward_declarations.h         | 22 ++++++++++++
 .../libraries/armem/core/ice_conversions.cpp  | 35 ++++++++++---------
 .../libraries/armem/core/ice_conversions.h    | 20 ++---------
 .../libraries/armem/core/json_conversions.cpp |  4 +--
 .../armem/core/wm/aron_conversions.cpp        | 14 ++++----
 .../armem/core/wm/ice_conversions.cpp         |  1 +
 16 files changed, 102 insertions(+), 81 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 5feda749b..afd231ffb 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -9,6 +9,7 @@ set(LIBS
     ArmarXCore
     RemoteGui
     aron
+    aroncommon
 )
 
 set(LIB_FILES
diff --git a/source/RobotAPI/libraries/armem/client/Writer.cpp b/source/RobotAPI/libraries/armem/client/Writer.cpp
index 7ffeeca7a..3c4edce62 100644
--- a/source/RobotAPI/libraries/armem/client/Writer.cpp
+++ b/source/RobotAPI/libraries/armem/client/Writer.cpp
@@ -1,6 +1,7 @@
 #include "Writer.h"
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/time/ice_conversions.h>
 
 #include "../error.h"
 
@@ -111,10 +112,10 @@ namespace armarx::armem::client
          * anyway.
          */
 
-        const Time timeSent = armem::Time::now();
+        const Time timeSent = armem::Time::Now();
         for (data::EntityUpdate& update : commit.updates)
         {
-            update.timeSentMicroSeconds = timeSent.toMicroSeconds();
+            toIce(update.timeSent, timeSent);
         }
 
         data::CommitResult result;
diff --git a/source/RobotAPI/libraries/armem/core/Commit.h b/source/RobotAPI/libraries/armem/core/Commit.h
index 433703a5a..8a1da2075 100644
--- a/source/RobotAPI/libraries/armem/core/Commit.h
+++ b/source/RobotAPI/libraries/armem/core/Commit.h
@@ -36,7 +36,7 @@ namespace armarx::armem
          * @brief Time when this entity update was created (e.g. time of image recording).
          * This is the key of the entity's history.
          */
-        Time timeCreated = Time::microSeconds(-1);
+        Time timeCreated = Time::Invalid();
 
 
         // OPTIONAL
@@ -52,14 +52,14 @@ namespace armarx::armem
          *
          * Set automatically when sending the commit.
          */
-        Time timeSent = Time::microSeconds(-1);
+        Time timeSent = Time::Invalid();
 
         /**
          * @brief Time when this update arrived at the memory server.
          *
          * Set by memory server on arrival.
          */
-        Time timeArrived = Time::microSeconds(-1);
+        Time timeArrived = Time::Invalid();
 
 
         friend std::ostream& operator<<(std::ostream& os, const EntityUpdate& rhs);
@@ -74,7 +74,7 @@ namespace armarx::armem
         bool success = false;
 
         MemoryID snapshotID;
-        Time timeArrived = Time::microSeconds(-1);
+        Time timeArrived = Time::Invalid();
 
         std::string errorMessage;
 
diff --git a/source/RobotAPI/libraries/armem/core/MemoryID.cpp b/source/RobotAPI/libraries/armem/core/MemoryID.cpp
index f3b8c662d..5757bf196 100644
--- a/source/RobotAPI/libraries/armem/core/MemoryID.cpp
+++ b/source/RobotAPI/libraries/armem/core/MemoryID.cpp
@@ -251,7 +251,7 @@ namespace armarx::armem
         {
             return getEntitySnapshotID();
         }
-        if (timestamp != Time::microSeconds(-1))
+        if (timestamp.isValid())
         {
             return getEntityID();
         }
@@ -350,7 +350,7 @@ namespace armarx::armem
 
     std::string MemoryID::timestampStr() const
     {
-        return hasTimestamp() ? std::to_string(timestamp.toMicroSeconds()) : "";
+        return hasTimestamp() ? std::to_string(timestamp.toMicroSecondsSinceEpoch()) : "";
     }
 
     std::string MemoryID::instanceIndexStr() const
@@ -358,9 +358,9 @@ namespace armarx::armem
         return hasInstanceIndex() ? std::to_string(instanceIndex) : "";
     }
 
-    IceUtil::Time MemoryID::timestampFromStr(const std::string& string)
+    Time MemoryID::timestampFromStr(const std::string& string)
     {
-        return Time::microSeconds(parseInteger(string, "timestamp"));
+        return Time(Duration::MicroSeconds(parseInteger(string, "timestamp")));
     }
 
     int MemoryID::instanceIndexFromStr(const std::string& string)
@@ -506,7 +506,7 @@ namespace armarx::armem
             return false;
         }
 
-        if (general.timestamp.toMicroSeconds() < 0)
+        if (general.timestamp.isInvalid())
         {
             return true;
         }
diff --git a/source/RobotAPI/libraries/armem/core/MemoryID.h b/source/RobotAPI/libraries/armem/core/MemoryID.h
index d583e7522..64850ddef 100644
--- a/source/RobotAPI/libraries/armem/core/MemoryID.h
+++ b/source/RobotAPI/libraries/armem/core/MemoryID.h
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <functional>  // for std::hash
 #include <string>
 #include <vector>
 
@@ -52,7 +53,7 @@ namespace armarx::armem
         std::string coreSegmentName = "";
         std::string providerSegmentName = "";
         std::string entityName = "";
-        Time timestamp = Time::microSeconds(-1);
+        Time timestamp = Time::Invalid();
         int instanceIndex = -1;
 
 
@@ -67,7 +68,7 @@ namespace armarx::armem
                  const std::string& coreSegmentName,
                  const std::string& providerSegmentName = "",
                  const std::string& entityName = "",
-                 Time timestamp = Time::microSeconds(-1),
+                 Time timestamp = Time::Invalid(),
                  int instanceIndex = -1);
 
 
@@ -97,27 +98,27 @@ namespace armarx::armem
 
         bool hasMemoryName() const
         {
-            return !memoryName.empty();
+            return not memoryName.empty();
         }
         bool hasCoreSegmentName() const
         {
-            return !coreSegmentName.empty();
+            return not coreSegmentName.empty();
         }
         bool hasProviderSegmentName() const
         {
-            return !providerSegmentName.empty();
+            return not providerSegmentName.empty();
         }
         bool hasEntityName() const
         {
-            return !entityName.empty();
+            return not entityName.empty();
         }
         bool hasTimestamp() const
         {
-            return timestamp.toMicroSeconds() >= 0;
+            return timestamp.isValid();
         }
         void clearTimestamp()
         {
-            timestamp = Time::microSeconds(-1);
+            timestamp = Time::Invalid();
         }
         bool hasInstanceIndex() const
         {
@@ -208,7 +209,7 @@ namespace armarx::armem
         bool operator ==(const MemoryID& other) const;
         inline bool operator !=(const MemoryID& other) const
         {
-            return !(*this == other);
+            return not (*this == other);
         }
 
         bool operator< (const MemoryID& rhs) const;
@@ -218,11 +219,11 @@ namespace armarx::armem
         }
         inline bool operator<=(const MemoryID& rhs) const
         {
-            return !operator> (rhs);
+            return not operator> (rhs);
         }
         inline bool operator>=(const MemoryID& rhs) const
         {
-            return !operator< (rhs);
+            return not operator< (rhs);
         }
 
         friend std::ostream& operator<<(std::ostream& os, const MemoryID id);
diff --git a/source/RobotAPI/libraries/armem/core/aron_conversions.cpp b/source/RobotAPI/libraries/armem/core/aron_conversions.cpp
index 4eafef35a..62ff85270 100644
--- a/source/RobotAPI/libraries/armem/core/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/aron_conversions.cpp
@@ -1,5 +1,6 @@
 #include "aron_conversions.h"
 
+#include <RobotAPI/libraries/aron/common/aron_conversions/armarx.h>
 #include <RobotAPI/libraries/armem/core/MemoryID.h>
 #include <RobotAPI/libraries/armem/aron/MemoryID.aron.generated.h>
 
@@ -10,7 +11,7 @@ void armarx::armem::fromAron(const arondto::MemoryID& dto, MemoryID& bo)
     bo.coreSegmentName = dto.coreSegmentName;
     bo.providerSegmentName = dto.providerSegmentName;
     bo.entityName = dto.entityName;
-    bo.timestamp = dto.timestamp;
+    fromAron(dto.timestamp, bo.timestamp);
     bo.instanceIndex = dto.instanceIndex;
 }
 
@@ -20,7 +21,7 @@ void armarx::armem::toAron(arondto::MemoryID& dto, const MemoryID& bo)
     dto.coreSegmentName = bo.coreSegmentName;
     dto.providerSegmentName = bo.providerSegmentName;
     dto.entityName = bo.entityName;
-    dto.timestamp = bo.timestamp;
+    toAron(dto.timestamp, bo.timestamp);
     dto.instanceIndex = bo.instanceIndex;
 }
 
diff --git a/source/RobotAPI/libraries/armem/core/aron_conversions.h b/source/RobotAPI/libraries/armem/core/aron_conversions.h
index 064aafe8d..f0b1a2659 100644
--- a/source/RobotAPI/libraries/armem/core/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem/core/aron_conversions.h
@@ -1,12 +1,16 @@
 #pragma once
 
-#include "forward_declarations.h"
-
 #include <ostream>
 
+#include "forward_declarations.h"
+
 
 namespace armarx::armem
 {
+    // Implemented in <RobotAPI/libraries/aron/common/aron_conversions/armarx.h>
+    // void fromAron(const IceUtil::Time& dto, Time& bo);
+    // void toAron(IceUtil::Time& dto, const Time& bo);
+
     void fromAron(const arondto::MemoryID& dto, MemoryID& bo);
     void toAron(arondto::MemoryID& dto, const MemoryID& bo);
 }
diff --git a/source/RobotAPI/libraries/armem/core/base/EntityBase.h b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
index 9b34e11bd..5a3b55a80 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityBase.h
@@ -311,7 +311,7 @@ namespace armarx::armem::base
          */
         const EntitySnapshotT* findLatestSnapshotBeforeOrAt(const Time& time) const
         {
-            return findLatestSnapshotBefore(time + Time::microSeconds(1));
+            return findLatestSnapshotBefore(time + Duration::MicroSeconds(1));
         }
 
         /**
@@ -339,7 +339,7 @@ namespace armarx::armem::base
          */
         const EntitySnapshotT* findFirstSnapshotAfter(const Time& time) const
         {
-            return findFirstSnapshotAfter(time - Time::microSeconds(1));
+            return findFirstSnapshotAfter(time - Duration::MicroSeconds(1));
         }
 
 
@@ -418,7 +418,7 @@ namespace armarx::armem::base
         template <class FunctionT>
         void forEachSnapshotBeforeOrAt(const Time& time, FunctionT&& func) const
         {
-            getSnapshotsBefore(time + Time::microSeconds(1), func);
+            getSnapshotsBefore(time + Duration::MicroSeconds(1), func);
         }
 
 
@@ -432,9 +432,9 @@ namespace armarx::armem::base
         void forEachSnapshotInTimeRange(const Time& min, const Time& max, FunctionT&& func) const
         {
             // Returns an iterator pointing to the first element that is not less than (i.e. greater or equal to) key.
-            auto begin = min.toMicroSeconds() > 0 ? this->_container.lower_bound(min) : this->_container.begin();
+            auto begin = min.isValid() ? this->_container.lower_bound(min) : this->_container.begin();
             // Returns an iterator pointing to the first element that is *greater than* key.
-            auto end = max.toMicroSeconds() > 0 ? this->_container.upper_bound(max) : this->_container.end();
+            auto end = max.isValid() ? this->_container.upper_bound(max) : this->_container.end();
 
             for (auto it = begin; it != end && it != this->_container.end(); ++it)
             {
diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
index 1e19f25a7..a71881a57 100644
--- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp
@@ -1,5 +1,7 @@
 #include "ice_conversions.h"
 
+#include <ArmarXCore/core/time/ice_conversions.h>
+
 #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 #include <RobotAPI/libraries/aron/core/type/variant/container/Object.h>
 
@@ -50,19 +52,20 @@ namespace armarx::armem::base
 }
 namespace armarx::armem
 {
+
     void base::toIce(data::EntityInstanceMetadata& ice, const EntityInstanceMetadata& metadata)
     {
         ice.confidence = metadata.confidence;
-        toIce(ice.timeArrivedMicroSeconds, metadata.timeArrived);
-        toIce(ice.timeCreatedMicroSeconds, metadata.timeCreated);
-        toIce(ice.timeSentMicroSeconds, metadata.timeSent);
+        toIce(ice.timeArrived, metadata.timeArrived);
+        toIce(ice.timeCreated, metadata.timeCreated);
+        toIce(ice.timeSent, metadata.timeSent);
     }
     void base::fromIce(const data::EntityInstanceMetadata& ice, EntityInstanceMetadata& metadata)
     {
         metadata.confidence = ice.confidence;
-        fromIce(ice.timeArrivedMicroSeconds, metadata.timeArrived);
-        fromIce(ice.timeCreatedMicroSeconds, metadata.timeCreated);
-        fromIce(ice.timeSentMicroSeconds, metadata.timeSent);
+        fromIce(ice.timeArrived, metadata.timeArrived);
+        fromIce(ice.timeCreated, metadata.timeCreated);
+        fromIce(ice.timeSent, metadata.timeSent);
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.h b/source/RobotAPI/libraries/armem/core/base/ice_conversions.h
index 21316623c..a660ad488 100644
--- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.h
+++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.h
@@ -86,7 +86,7 @@ namespace armarx::armem::base
         ice.history.clear();
         entity.forEachSnapshot([&ice](const auto & snapshot)
         {
-            armem::toIce(ice.history[armem::toIce<long>(snapshot.time())], snapshot);
+            armem::toIce(ice.history[toIce<armarx::core::time::dto::DateTime>(snapshot.time())], snapshot);
         });
     }
     template <class ...Args>
diff --git a/source/RobotAPI/libraries/armem/core/forward_declarations.h b/source/RobotAPI/libraries/armem/core/forward_declarations.h
index 9a2bbf881..4b6d38266 100644
--- a/source/RobotAPI/libraries/armem/core/forward_declarations.h
+++ b/source/RobotAPI/libraries/armem/core/forward_declarations.h
@@ -2,7 +2,10 @@
 
 #include <ArmarXCore/core/time/forward_declarations.h>
 
+
+namespace IceInternal
 {
+    template<typename T> class Handle;
 }
 
 namespace armarx::armem
@@ -61,3 +64,22 @@ namespace armarx::armem::server::wm
     class Memory;
 }
 
+namespace armarx::armem::data
+{
+    struct MemoryID;
+    struct Commit;
+    struct CommitResult;
+    struct EntityUpdate;
+    struct EntityUpdateResult;
+}
+
+namespace armarx::armem::actions
+{
+    class Menu;
+}
+
+namespace armarx::armem::actions::data
+{
+    class Menu;
+    using MenuPtr = ::IceInternal::Handle<Menu>;
+}
diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
index 20df9176b..1dd76ae47 100644
--- a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp
@@ -1,17 +1,20 @@
 #include "ice_conversions.h"
 
+#include <ArmarXCore/core/time/ice_conversions.h>
+
 #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 
+#include <RobotAPI/interface/armem/actions.h>
+#include <RobotAPI/interface/armem/commit.h>
+#include <RobotAPI/interface/armem/memory.h>
 
-void IceUtil::toIce(long& ice, const IceUtil::Time& time)
-{
-    ice = time.toMicroSeconds();
-}
+#include "ice_conversions_templates.h"
+
+#include "actions.h"
+#include "Commit.h"
+#include "MemoryID.h"
+#include "Time.h"
 
-void IceUtil::fromIce(const long& ice, IceUtil::Time& time)
-{
-    time = Time::microSeconds(ice);
-}
 
 namespace armarx
 {
@@ -22,7 +25,7 @@ namespace armarx
         ice.coreSegmentName = id.coreSegmentName;
         ice.providerSegmentName = id.providerSegmentName;
         ice.entityName = id.entityName;
-        toIce(ice.timestampMicroSeconds, id.timestamp);
+        toIce(ice.timestamp, id.timestamp);
         ice.instanceIndex = id.instanceIndex;
     }
 
@@ -32,7 +35,7 @@ namespace armarx
         id.coreSegmentName = ice.coreSegmentName;
         id.providerSegmentName = ice.providerSegmentName;
         id.entityName = ice.entityName;
-        fromIce(ice.timestampMicroSeconds, id.timestamp);
+        fromIce(ice.timestamp, id.timestamp);
         id.instanceIndex = ice.instanceIndex;
     }
 
@@ -85,10 +88,10 @@ namespace armarx
         std::transform(ice.instancesData.begin(), ice.instancesData.end(), std::back_inserter(update.instancesData),
                        aron::data::Dict::FromAronDictDTO);
 
-        update.timeCreated = Time::microSeconds(ice.timeCreatedMicroSeconds);
+        fromIce(ice.timeCreated, update.timeCreated);
 
         update.confidence = ice.confidence;
-        update.timeSent = Time::microSeconds(ice.timeSentMicroSeconds);
+        fromIce(ice.timeSent, update.timeSent);
     }
 
     void armem::toIce(data::EntityUpdate& ice, const EntityUpdate& update)
@@ -100,17 +103,17 @@ namespace armarx
         std::transform(update.instancesData.begin(), update.instancesData.end(), std::back_inserter(ice.instancesData),
                        aron::data::Dict::ToAronDictDTO);
 
-        ice.timeCreatedMicroSeconds = update.timeCreated.toMicroSeconds();
+        toIce(ice.timeCreated, update.timeCreated);
 
         ice.confidence = update.confidence;
-        ice.timeSentMicroSeconds = update.timeSent.toMicroSeconds();
+        toIce(ice.timeSent, update.timeSent);
     }
 
     void armem::fromIce(const data::EntityUpdateResult& ice, EntityUpdateResult& result)
     {
         result.success = ice.success;
         fromIce(ice.snapshotID, result.snapshotID);
-        result.timeArrived = Time::microSeconds(ice.timeArrivedMicroSeconds);
+        fromIce(ice.timeArrived, result.timeArrived);
         result.errorMessage = ice.errorMessage;
     }
 
@@ -118,7 +121,7 @@ namespace armarx
     {
         ice.success = result.success;
         toIce(ice.snapshotID, result.snapshotID);
-        ice.timeArrivedMicroSeconds = result.timeArrived.toMicroSeconds();
+        toIce(ice.timeArrived, result.timeArrived);
         ice.errorMessage = result.errorMessage;
     }
 
diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.h b/source/RobotAPI/libraries/armem/core/ice_conversions.h
index a8ef35e79..2a4daf725 100644
--- a/source/RobotAPI/libraries/armem/core/ice_conversions.h
+++ b/source/RobotAPI/libraries/armem/core/ice_conversions.h
@@ -1,23 +1,6 @@
 #pragma once
 
-#include <RobotAPI/interface/armem/actions.h>
-#include <RobotAPI/interface/armem/commit.h>
-#include <RobotAPI/interface/armem/memory.h>
-
-#include "ice_conversions_templates.h"
-
-#include "actions.h"
-#include "Commit.h"
-#include "MemoryID.h"
-#include "Time.h"
-
-
-namespace IceUtil
-{
-    // Define in original namespace to allow ADL.
-    void toIce(long& ice, const Time& time);
-    void fromIce(const long& ice, Time& time);
-}
+#include "forward_declarations.h"
 
 
 namespace armarx::armem
@@ -48,5 +31,6 @@ namespace armarx::armem
 
     void fromIce(const actions::data::MenuPtr& ice, actions::Menu& menu);
     void toIce(actions::data::MenuPtr& ice, const actions::Menu& menu);
+
 }
 
diff --git a/source/RobotAPI/libraries/armem/core/json_conversions.cpp b/source/RobotAPI/libraries/armem/core/json_conversions.cpp
index e4da9d89b..2a6f2a1f6 100644
--- a/source/RobotAPI/libraries/armem/core/json_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/json_conversions.cpp
@@ -9,7 +9,7 @@ void armarx::armem::to_json(nlohmann::json& j, const MemoryID& bo)
     j["coreSegmentName"] = bo.coreSegmentName;
     j["providerSegmentName"] = bo.providerSegmentName;
     j["entityName"] = bo.entityName;
-    j["timestamp_usec"] = bo.timestamp.toMicroSeconds();
+    j["timestamp_usec"] = bo.timestamp.toMicroSecondsSinceEpoch();
     j["timestamp_datetime"] = toDateTimeMilliSeconds(bo.timestamp);
     j["instanceIndex"] = bo.instanceIndex;
 }
@@ -20,7 +20,7 @@ void armarx::armem::from_json(const nlohmann::json& j, MemoryID& bo)
     j.at("coreSegmentName").get_to(bo.coreSegmentName);
     j.at("providerSegmentName").get_to(bo.providerSegmentName);
     j.at("entityName").get_to(bo.entityName);
-    bo.timestamp = Time::microSeconds(j.at("timestamp_usec").get<int64_t>());
+    bo.timestamp = Time(Duration::MicroSeconds(j.at("timestamp_usec").get<int64_t>()));
     // j.at("timestamp_datetime").get_to(toDateTimeMilliSeconds(bo.timestamp));
     j.at("instanceIndex").get_to(bo.instanceIndex);
 }
diff --git a/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp b/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp
index dacedd5e0..d24ce36b5 100644
--- a/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/wm/aron_conversions.cpp
@@ -23,13 +23,13 @@ void armarx::armem::from_aron(const aron::data::DictPtr& metadata, const aron::d
     e.data() = data;
 
     auto timeCreated = aron::data::Long::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_TIME_CREATED_FIELD));
-    m.timeCreated = Time::microSeconds(timeCreated->toAronLongDTO()->value);
+    m.timeCreated = Time(Duration::MicroSeconds(timeCreated->toAronLongDTO()->value));
 
     auto timeSent = aron::data::Long::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_TIME_SENT_FIELD));
-    m.timeSent = Time::microSeconds(timeSent->toAronLongDTO()->value);
+    m.timeSent = Time(Duration::MicroSeconds(timeSent->toAronLongDTO()->value));
 
     auto timeArrived = aron::data::Long::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_TIME_ARRIVED_FIELD));
-    m.timeArrived = Time::microSeconds(timeArrived->toAronLongDTO()->value);
+    m.timeArrived = Time(Duration::MicroSeconds(timeArrived->toAronLongDTO()->value));
 
     auto confidence = aron::data::Double::DynamicCastAndCheck(metadata->getElement(DATA_WRAPPER_CONFIDENCE_FIELD));
     m.confidence = static_cast<float>(confidence->toAronDoubleDTO()->value);
@@ -42,20 +42,20 @@ void armarx::armem::to_aron(aron::data::DictPtr& metadata, aron::data::DictPtr&
     metadata = std::make_shared<aron::data::Dict>();
 
     auto timeWrapped = std::make_shared<aron::data::Long>();
-    timeWrapped->setValue(Time::now().toMicroSeconds());
+    timeWrapped->setValue(Time::Now().toMicroSecondsSinceEpoch());
     metadata->addElement(DATA_WRAPPER_TIME_STORED_FIELD, timeWrapped);
 
     const wm::EntityInstanceMetadata& m = e.metadata();
     auto timeCreated = std::make_shared<aron::data::Long>();
-    timeCreated->setValue(m.timeCreated.toMicroSeconds());
+    timeCreated->setValue(m.timeCreated.toMicroSecondsSinceEpoch());
     metadata->addElement(DATA_WRAPPER_TIME_CREATED_FIELD, timeCreated);
 
     auto timeSent = std::make_shared<aron::data::Long>();
-    timeSent->setValue(m.timeSent.toMicroSeconds());
+    timeSent->setValue(m.timeSent.toMicroSecondsSinceEpoch());
     metadata->addElement(DATA_WRAPPER_TIME_SENT_FIELD, timeSent);
 
     auto timeArrived = std::make_shared<aron::data::Long>();
-    timeArrived->setValue(m.timeArrived.toMicroSeconds());
+    timeArrived->setValue(m.timeArrived.toMicroSecondsSinceEpoch());
     metadata->addElement(DATA_WRAPPER_TIME_ARRIVED_FIELD, timeArrived);
 
     auto confidence = std::make_shared<aron::data::Double>();
diff --git a/source/RobotAPI/libraries/armem/core/wm/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/wm/ice_conversions.cpp
index ba6c9782e..826bf6d9f 100644
--- a/source/RobotAPI/libraries/armem/core/wm/ice_conversions.cpp
+++ b/source/RobotAPI/libraries/armem/core/wm/ice_conversions.cpp
@@ -1,5 +1,6 @@
 #include "ice_conversions.h"
 
+#include <RobotAPI/libraries/armem/core/ice_conversions.h>
 #include <RobotAPI/libraries/armem/core/base/ice_conversions.h>
 
 
-- 
GitLab