diff --git a/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp b/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp index 284e15c1df85810c77b029c434f913d2f25fa4d9..397b5e3b83ad4aa3b43c0f095cc6813c64f15717 100644 --- a/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp +++ b/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp @@ -88,14 +88,9 @@ namespace armarx::armem MemoryRemoteGui::GroupBox MemoryRemoteGui::makeGroupBox(const EntitySnapshot& snapshot) const { - static const char* mu = "\u03BC"; - (void) mu; GroupBox group; std::stringstream ss; - ss << "t = " << snapshot.time.toString("%Y-%m-%d %H:%M:%S") - << "." << snapshot.time.toMicroSeconds() % 1000 - // << " (" << snapshot.time.toMicroSeconds() << " " << mu << "s" << ")" - ; + ss << "t = " << armem::toDateTimeMilliSeconds(snapshot.time); group.setLabel(ss.str()); for (const auto& instance : snapshot.instances) diff --git a/source/RobotAPI/libraries/armem/core/Time.cpp b/source/RobotAPI/libraries/armem/core/Time.cpp index 4f20811811e4520188ac778d33831d91d9ad508c..40f25dc9fefead472651349ef3b20da0c0ee6a25 100644 --- a/source/RobotAPI/libraries/armem/core/Time.cpp +++ b/source/RobotAPI/libraries/armem/core/Time.cpp @@ -1,2 +1,48 @@ #include "Time.h" +#include <cmath> + + +namespace armarx +{ + + + std::string armem::toStringMilliSeconds(const Time& time, int decimals) + { + std::stringstream ss; + ss << time.toMilliSeconds(); + if (decimals > 0) + { + int div = int(std::pow(10, 3 - decimals)); + ss << "." << (time.toMicroSeconds() % 1000) / div; + } + ss << " ms"; + return ss.str(); + } + + + std::string armem::toStringMicroSeconds(const Time& time) + { + static const char* mu = "\u03BC"; + std::stringstream ss; + ss << time.toMicroSeconds() << " " << mu << "s"; + return ss.str(); + } + + + std::string armem::toDateTimeMilliSeconds(const Time& time, int decimals) + { + std::stringstream ss; + ss << time.toString("%Y-%m-%d %H:%M:%S"); + if (decimals > 0) + { + int div = int(std::pow(10, 6 - decimals)); + ss << "." << (time.toMicroSeconds() % int(1e6)) / div; + } + + return ss.str(); + } + +} + + diff --git a/source/RobotAPI/libraries/armem/core/Time.h b/source/RobotAPI/libraries/armem/core/Time.h index caf4342467243336fe7868292abcc6843c11d371..01a420f14e67d06fdbb555d5553f8a69cc6263c8 100644 --- a/source/RobotAPI/libraries/armem/core/Time.h +++ b/source/RobotAPI/libraries/armem/core/Time.h @@ -1,3 +1,5 @@ +#pragma once + #include <IceUtil/Time.h> @@ -6,4 +8,22 @@ namespace armarx::armem using Time = IceUtil::Time; + /** + * @brief Returns `time` as e.g. "123456789.012 ms". + * @param decimals How many sub-millisecond decimals to include. + */ + std::string toStringMilliSeconds(const Time& time, int decimals = 3); + + /** + * @brief Returns `time` as e.g. "123456789012 `mu`s". + * The output string contains the actual greek letter `mu`. + */ + std::string toStringMicroSeconds(const Time& time); + + /** + * @brief Returns `time`as e.g. "2020-11-16 17:01:54.123". + * @param decimals How many sub-second decimals to include. + */ + std::string toDateTimeMilliSeconds(const Time& time, int decimals = 6); + } diff --git a/source/RobotAPI/libraries/armem/memory/Entity.cpp b/source/RobotAPI/libraries/armem/memory/Entity.cpp index 7bd983e372246abd11bcd5f0c16bf45fdc3f91c8..502c29fb5868690c7630b7649aad794acb61222f 100644 --- a/source/RobotAPI/libraries/armem/memory/Entity.cpp +++ b/source/RobotAPI/libraries/armem/memory/Entity.cpp @@ -31,7 +31,7 @@ namespace armarx::armem } else { - throw error::MissingEntry("entity snapshot", std::to_string(time.toMilliSeconds()), + throw error::MissingEntry("entity snapshot", toDateTimeMilliSeconds(time), "entity", this->name); } } diff --git a/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp index 99c3afc7cfa6edec443f56b5a3d81b535c2c21c3..b55c477c5480966908a929c5c99388e1fc671c17 100644 --- a/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp +++ b/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp @@ -32,7 +32,7 @@ namespace armarx::armem else { throw armem::error::MissingEntry("instance", std::to_string(index), - "entity snapshot", std::to_string(time.toMicroSeconds())); + "entity snapshot", toDateTimeMilliSeconds(time)); } } diff --git a/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp b/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp index 33bc05703ac6689e03c7585cc93348db383fb677..222e528acd236de67a356a5cb432cf9866873e74 100644 --- a/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp +++ b/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp @@ -35,6 +35,26 @@ namespace armem = armarx::armem; namespace aron = armarx::aron; +BOOST_AUTO_TEST_CASE(test_time_to_string) +{ + // 1: seconds, 2: milliseconds, 3: microseconds + armem::Time time = armem::Time::microSeconds(111111345789); + + BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time), "111111345.789 ms"); + BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 0), "111111345 ms"); + BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 1), "111111345.7 ms"); + BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 2), "111111345.78 ms"); + BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 3), "111111345.789 ms"); + + BOOST_CHECK_EQUAL(armem::toStringMicroSeconds(time), "111111345789 " "\u03BC" "s"); + + BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time), "1970-01-02 07:51:51.345"); + BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time, 0), "1970-01-02 07:51:51"); + BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time, 3), "1970-01-02 07:51:51.345"); + BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time, 6), "1970-01-02 07:51:51.345789"); +} + + BOOST_AUTO_TEST_CASE(test_segment_setup) { armem::InternalEntityUpdate update;