From 40c7cba8dae4b121bd39e8e0efe5515130f75483 Mon Sep 17 00:00:00 2001
From: Raphael Grimm <raphael.grimm@kit.edu>
Date: Thu, 3 May 2018 11:58:26 +0200
Subject: [PATCH] Change the RobotUnit to use IceUtil::Time instead of
 std::chrono

---
 .../Devices/RTThreadTimingsSensorDevice.h     | 35 ++++++++----------
 .../RobotUnitModules/RobotUnitModuleBase.h    | 16 ---------
 .../RobotUnitModules/RobotUnitModuleBase.ipp  | 13 -------
 .../RobotUnitModuleControlThread.cpp          | 12 +++----
 .../RobotUnitModuleDevices.cpp                |  4 +--
 .../RobotUnitModulePublisher.cpp              |  8 ++---
 .../RobotUnitModulePublisher.h                |  2 +-
 .../RobotUnitModules/RobotUnitModuleUnits.cpp |  4 +--
 .../SensorValues/SensorValueRTThreadTimings.h | 36 +++++++++----------
 9 files changed, 48 insertions(+), 82 deletions(-)

diff --git a/source/RobotAPI/components/units/RobotUnit/Devices/RTThreadTimingsSensorDevice.h b/source/RobotAPI/components/units/RobotUnit/Devices/RTThreadTimingsSensorDevice.h
index b7b0778f6..971935730 100644
--- a/source/RobotAPI/components/units/RobotUnit/Devices/RTThreadTimingsSensorDevice.h
+++ b/source/RobotAPI/components/units/RobotUnit/Devices/RTThreadTimingsSensorDevice.h
@@ -90,40 +90,35 @@ namespace armarx
 
         void rtMarkRtLoopStart() override
         {
-            std::chrono::microseconds now = MicroNow();
+            const IceUtil::Time now = TimeUtil::GetTime(true);
             value.rtLoopRoundTripTime = now - rtLoopStart;
             rtLoopStart = now;
         }
         void rtMarkRtLoopPreSleep() override
         {
-            value.rtLoopDuration = MicroNow() - rtLoopStart;
+            value.rtLoopDuration = TimeUtil::GetTime(true) - rtLoopStart;
         }
         void rtMarkRtBusSendReceiveStart() override
         {
-            std::chrono::microseconds now = MicroNow();
+            const IceUtil::Time now = TimeUtil::GetTime(true);
             value.rtBusSendReceiveRoundTripTime = now - rtBusSendReceiveStart;
             rtBusSendReceiveStart = now;
         }
         void rtMarkRtBusSendReceiveEnd() override
         {
-            value.rtBusSendReceiveDuration = MicroNow() - rtBusSendReceiveStart;
-        }
-
-        static std::chrono::microseconds MicroNow()
-        {
-            return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now().time_since_epoch());
+            value.rtBusSendReceiveDuration = TimeUtil::GetTime(true) - rtBusSendReceiveStart;
         }
     protected:
 #define make_markRT_X_Start_End(name)                           \
     virtual void rtMarkRt##name##Start() override               \
     {                                                           \
-        std::chrono::microseconds now = MicroNow();             \
+        const IceUtil::Time now = TimeUtil::GetTime(true);      \
         value.rt##name##RoundTripTime = now - rt##name##Start;  \
         rt##name##Start=now;                                    \
     }                                                           \
     virtual void rtMarkRt##name##End() override                 \
     {                                                           \
-        value.rt##name##Duration=MicroNow() - rt##name##Start;  \
+        value.rt##name##Duration=TimeUtil::GetTime(true) - rt##name##Start;  \
     }
 
         make_markRT_X_Start_End(SwitchControllerSetup)
@@ -135,15 +130,15 @@ namespace armarx
         make_markRT_X_Start_End(ResetAllTargets)
 #undef make_markRT_X_Start_End
     protected:
-        std::chrono::microseconds rtSwitchControllerSetupStart;
-        std::chrono::microseconds rtRunNJointControllersStart;
-        std::chrono::microseconds rtHandleInvalidTargetsStart;
-        std::chrono::microseconds rtRunJointControllersStart;
-        std::chrono::microseconds rtBusSendReceiveStart;
-        std::chrono::microseconds rtReadSensorDeviceValuesStart;
-        std::chrono::microseconds rtUpdateSensorAndControlBufferStart;
-        std::chrono::microseconds rtResetAllTargetsStart;
-        std::chrono::microseconds rtLoopStart;
+        IceUtil::Time rtSwitchControllerSetupStart;
+        IceUtil::Time rtRunNJointControllersStart;
+        IceUtil::Time rtHandleInvalidTargetsStart;
+        IceUtil::Time rtRunJointControllersStart;
+        IceUtil::Time rtBusSendReceiveStart;
+        IceUtil::Time rtReadSensorDeviceValuesStart;
+        IceUtil::Time rtUpdateSensorAndControlBufferStart;
+        IceUtil::Time rtResetAllTargetsStart;
+        IceUtil::Time rtLoopStart;
     };
 
 }
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.h
index 6bb56b528..f402596d7 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.h
@@ -597,22 +597,6 @@ namespace armarx
              * @throw throws If called in the \ref ControlThread or on shutdown.
              */
             GuardType getGuard() const;
-            /**
-             * @brief Returns the current Time
-             * @return The current Time
-             */
-            static TimePointType Now();
-            /**
-             * @brief Returns the microseconds since the given start timepoint.
-             * @param last Start timepoint
-             * @return The microseconds since the given start timepoint.
-             */
-            static std::chrono::microseconds MicroToNow(TimePointType last);
-            /**
-             * @brief Returns the microseconds since epoch.
-             * @return The microseconds since epoch.
-             */
-            static std::chrono::microseconds MicroNow();
             // //////////////////////////////////////////////////////////////////////////////////////// //
             // ///////////////////////////////////////// Data ///////////////////////////////////////// //
             // //////////////////////////////////////////////////////////////////////////////////////// //
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.ipp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.ipp
index 7f8a977b0..4980c7fb7 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.ipp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.ipp
@@ -28,19 +28,6 @@ namespace armarx
 {
     namespace RobotUnitModule
     {
-        inline ModuleBase::TimePointType ModuleBase::Now()
-        {
-            return ClockType::now();
-        }
-        inline std::chrono::microseconds ModuleBase::MicroToNow(ModuleBase::TimePointType last)
-        {
-            return std::chrono::duration_cast<std::chrono::microseconds>(Now() - last);
-        }
-        inline std::chrono::microseconds ModuleBase::MicroNow()
-        {
-            return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now().time_since_epoch());
-        }
-
         inline RobotUnitState ModuleBase::getRobotUnitState() const
         {
             return state;
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp
index 08816b35a..079f15c44 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp
@@ -322,16 +322,16 @@ namespace armarx
                 {
                     if (nJointCtrl)
                     {
-                        auto start = MicroNow();
+                        auto start = TimeUtil::GetTime(true);
                         nJointCtrl->rtSwapBufferAndRun(sensorValuesTimestamp, timeSinceLastIteration);
-                        auto duration = MicroNow() - start;
-                        if (duration.count() > 500)
+                        auto duration = TimeUtil::GetTime(true) - start;
+                        if (duration.toMicroSeconds() > 500)
                         {
-                            ARMARX_ERROR << deactivateSpam(5) << "The NJointController " << nJointCtrl->getClassName() << " took " << duration.count() << " µs to run!";
+                            ARMARX_ERROR << deactivateSpam(5) << "The NJointController " << nJointCtrl->getClassName() << " took " << duration.toMicroSeconds() << " µs to run!";
                         }
-                        else if (duration.count() > 50)
+                        else if (duration.toMicroSeconds() > 50)
                         {
-                            ARMARX_WARNING << deactivateSpam(5) << "The NJointController " << nJointCtrl->getClassName() << " took " << duration.count() << " µs to run!";
+                            ARMARX_WARNING << deactivateSpam(5) << "The NJointController " << nJointCtrl->getClassName() << " took " << duration.toMicroSeconds() << " µs to run!";
                         }
                     }
                 }
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleDevices.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleDevices.cpp
index 87bc3b2aa..93d5d8280 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleDevices.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleDevices.cpp
@@ -153,7 +153,7 @@ namespace armarx
             {
                 status.controlTargetValues[targ->getControlMode()] = targ->toVariants(_module<ControlThreadDataBuffer>().getSensorAndControlBuffer().sensorValuesTimestamp);
             }
-            status.timestampUSec = MicroNow().count();
+            status.timestampUSec = TimeUtil::GetTime(true).toMicroSeconds();
             throwIfDevicesNotReady(__FUNCTION__);
             return status;
         }
@@ -221,7 +221,7 @@ namespace armarx
             SensorDeviceStatus status;
             status.deviceName = sensorDevice->getDeviceName();
             status.sensorValue = _module<ControlThreadDataBuffer>().getSensorAndControlBuffer().sensors.at(idx)->toVariants(_module<ControlThreadDataBuffer>().getSensorAndControlBuffer().sensorValuesTimestamp);
-            status.timestampUSec = MicroNow().count();
+            status.timestampUSec = TimeUtil::GetTime(true).toMicroSeconds();
             throwIfDevicesNotReady(__FUNCTION__);
             return status;
         }
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.cpp
index b6aa80e65..8e0176897 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.cpp
@@ -244,7 +244,7 @@ namespace armarx
                 ARMARX_CHECK_EXPRESSION(requestedJointControllers.at(ctrlidx));
                 status.requestedControlMode = requestedJointControllers.at(ctrlidx)->getControlMode();
                 status.controlTargetValues = std::move(variants);
-                status.timestampUSec = MicroNow().count();
+                status.timestampUSec = TimeUtil::GetTime(true).toMicroSeconds();
                  listenerPrx->controlDeviceStatusChanged(status);
             }
             if (robotUnitObserver->getState() >= eManagedIceObjectStarted)
@@ -285,7 +285,7 @@ namespace armarx
                     }
 
                     status.sensorValue = std::move(variants);
-                    status.timestampUSec = MicroNow().count();
+                    status.timestampUSec = TimeUtil::GetTime(true).toMicroSeconds();
                     listenerPrx->sensorDeviceStatusChanged(status);
                 }
             }
@@ -493,7 +493,7 @@ namespace armarx
 
             if (publishToObserver)
             {
-                timingMap["LastPublishLoop"] = new TimedVariant {TimestampVariant{lastPublishLoop.count()}, timestamp};
+                timingMap["LastPublishLoop"] = new TimedVariant {TimestampVariant{lastPublishLoop}, timestamp};
                 if (robotUnitObserver->getState() >= eManagedIceObjectStarted)
                 {
                     robotUnitObserver->offerOrUpdateDataFieldsFlatCopy(robotUnitObserver->additionalChannel, additionalMap);
@@ -517,7 +517,7 @@ namespace armarx
                 }
             }
             ++publishIterationCount;
-            lastPublishLoop = MicroToNow(begPublish);
+            lastPublishLoop = TimeUtil::GetTime(true) - begPublish;
         }
     }
 }
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.h
index c59dcd9a5..bac3769ac 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModulePublisher.h
@@ -280,7 +280,7 @@ namespace armarx
             std::atomic<std::uint64_t> debugObserverSkipIterations;
 
             /// @brief The time required by the last iteration of \ref publish
-            std::chrono::microseconds lastPublishLoop;
+            IceUtil::Time lastPublishLoop;
 
             /// @brief The used RobotUnitObserver
             RobotUnitObserverPtr robotUnitObserver;
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
index d2ac94760..cb344901d 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
@@ -130,7 +130,7 @@ namespace armarx
 
         void Units::initializeDefaultUnits()
         {
-            auto beg = MicroNow();
+            auto beg = TimeUtil::GetTime(true);
             {
                 auto guard = getGuard();
                 throwIfStateIsNot(RobotUnitState::InitializingUnits, __FUNCTION__);
@@ -148,7 +148,7 @@ namespace armarx
                 initializeTcpControllerUnit();
                 ARMARX_DEBUG << "TcpControllerUnit initialized";
             }
-            ARMARX_INFO << "initializing default units...done! " << (MicroNow() - beg).count() << " us";
+            ARMARX_INFO << "initializing default units...done! " << (TimeUtil::GetTime(true) - beg).toMicroSeconds() << " us";
         }
 
 
diff --git a/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueRTThreadTimings.h b/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueRTThreadTimings.h
index 7c1ff7bae..0c2816773 100644
--- a/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueRTThreadTimings.h
+++ b/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueRTThreadTimings.h
@@ -34,32 +34,32 @@ namespace armarx
     public:
         DETAIL_SensorValueBase_DEFAULT_METHOD_IMPLEMENTATION
 
-        std::chrono::microseconds rtSwitchControllerSetupDuration;
-        std::chrono::microseconds rtSwitchControllerSetupRoundTripTime;
+        IceUtil::Time rtSwitchControllerSetupDuration;
+        IceUtil::Time rtSwitchControllerSetupRoundTripTime;
 
-        std::chrono::microseconds rtRunNJointControllersDuration;
-        std::chrono::microseconds rtRunNJointControllersRoundTripTime;
+        IceUtil::Time rtRunNJointControllersDuration;
+        IceUtil::Time rtRunNJointControllersRoundTripTime;
 
-        std::chrono::microseconds rtHandleInvalidTargetsDuration;
-        std::chrono::microseconds rtHandleInvalidTargetsRoundTripTime;
+        IceUtil::Time rtHandleInvalidTargetsDuration;
+        IceUtil::Time rtHandleInvalidTargetsRoundTripTime;
 
-        std::chrono::microseconds rtRunJointControllersDuration;
-        std::chrono::microseconds rtRunJointControllersRoundTripTime;
+        IceUtil::Time rtRunJointControllersDuration;
+        IceUtil::Time rtRunJointControllersRoundTripTime;
 
-        std::chrono::microseconds rtBusSendReceiveDuration;
-        std::chrono::microseconds rtBusSendReceiveRoundTripTime;
+        IceUtil::Time rtBusSendReceiveDuration;
+        IceUtil::Time rtBusSendReceiveRoundTripTime;
 
-        std::chrono::microseconds rtReadSensorDeviceValuesDuration;
-        std::chrono::microseconds rtReadSensorDeviceValuesRoundTripTime;
+        IceUtil::Time rtReadSensorDeviceValuesDuration;
+        IceUtil::Time rtReadSensorDeviceValuesRoundTripTime;
 
-        std::chrono::microseconds rtUpdateSensorAndControlBufferDuration;
-        std::chrono::microseconds rtUpdateSensorAndControlBufferRoundTripTime;
+        IceUtil::Time rtUpdateSensorAndControlBufferDuration;
+        IceUtil::Time rtUpdateSensorAndControlBufferRoundTripTime;
 
-        std::chrono::microseconds rtResetAllTargetsDuration;
-        std::chrono::microseconds rtResetAllTargetsRoundTripTime;
+        IceUtil::Time rtResetAllTargetsDuration;
+        IceUtil::Time rtResetAllTargetsRoundTripTime;
 
-        std::chrono::microseconds rtLoopDuration;
-        std::chrono::microseconds rtLoopRoundTripTime;
+        IceUtil::Time rtLoopDuration;
+        IceUtil::Time rtLoopRoundTripTime;
 
         static SensorValueInfo<SensorValueRTThreadTimings> GetClassMemberInfo()
         {
-- 
GitLab