Clock.cpp
Go to the documentation of this file.
1 #include "Clock.h"
2 
3 #include <limits.h>
4 
5 #include <chrono>
6 
7 #include <unistd.h>
8 
12 
14 {
15 
16  Clock::Clock(ClockType clockType) : _clockType{clockType}
17  {
18  ;
19  }
20 
21  DateTime
22  Clock::now() const
23  {
25 
26  std::chrono::microseconds timestamp_usec;
27 
28  switch (_clockType)
29  {
30  case ClockType::Virtual:
31  {
32  if (timeServer)
33  {
34  timestamp_usec = std::chrono::milliseconds{timeServer->getTime()};
35  break;
36  }
37  else
38  {
39  // If no time server is set, use realtime instead.
40  [[fallthrough]];
41  }
42  }
44  {
45  timestamp_usec = std::chrono::time_point_cast<std::chrono::microseconds>(
46  std::chrono::system_clock::now())
47  .time_since_epoch();
48  break;
49  }
51  {
52  timestamp_usec = std::chrono::time_point_cast<std::chrono::microseconds>(
53  std::chrono::steady_clock::now())
54  .time_since_epoch();
55  break;
56  }
57  case ClockType::Unknown:
58  {
59  throw std::runtime_error{"Cannot asses current time from unknown clock."};
60  }
61  }
62 
63  const std::string hostname = []
64  {
65  char hostname[HOST_NAME_MAX];
66  gethostname(hostname, HOST_NAME_MAX);
67  return std::string(hostname);
68  }();
69 
70  return DateTime(Duration::MicroSeconds(timestamp_usec.count()), _clockType, hostname);
71  }
72 
73  void
74  Clock::waitFor(const Duration& duration) const
75  {
77  }
78 
79  Duration
80  Clock::waitUntil(const DateTime& time) const
81  {
82  const Duration difference = time - now();
83  if (difference.isPositive())
84  {
85  waitFor(difference);
86  }
87  return difference;
88  }
89 
90  Clock Clock::_virtualClock = Clock(ClockType::Virtual);
91 
92  DateTime
94  {
95  return Clock::_virtualClock.now();
96  }
97 
98  void
99  Clock::WaitFor(const Duration& duration)
100  {
101  Clock::_virtualClock.waitFor(duration);
102  }
103 
104  Duration
105  Clock::WaitUntil(const DateTime& dateTime)
106  {
107  return Clock::_virtualClock.waitUntil(dateTime);
108  }
109 
110 } // namespace armarx::core::time
armarx::TimeUtil::SleepUS
static void SleepUS(float microseconds)
Definition: TimeUtil.h:209
armarx::core::time::Clock::WaitFor
static void WaitFor(const Duration &duration)
Wait for a certain duration on the virtual clock.
Definition: Clock.cpp:99
armarx::core::time
Definition: Clock.cpp:13
armarx::core::time::Clock::waitUntil
Duration waitUntil(const DateTime &dateTime) const
Wait and block until the given date/time is surpassed.
Definition: Clock.cpp:80
ice_conversions.h
armarx::core::time::Clock
Clock to get date/time from a specific clock type or wait for certain durations or until certain date...
Definition: Clock.h:25
armarx::core::time::Duration::isPositive
bool isPositive() const
Tests whether the duration is positive (value in µs > 0).
Definition: Duration.cpp:168
Clock.h
armarx::TimeUtil::GetTimeServer
static LocalTimeServerPtr GetTimeServer()
Definition: TimeUtil.cpp:118
IceInternal::Handle
Definition: forward_declarations.h:8
LocalTimeServer.h
armarx::core::time::ClockType
ClockType
Describes the type of clock.
Definition: ClockType.h:9
armarx::core::time::ClockType::Unknown
@ Unknown
Unknown source of time.
armarx::core::time::ClockType::Realtime
@ Realtime
Normalized time as reported by the operating system.
armarx::core::time::Clock::Clock
Clock(ClockType clockType=ClockType::Virtual)
Constructs a new clock of given clock type (virtual by default).
Definition: Clock.cpp:16
armarx::core::time::Clock::waitFor
void waitFor(const Duration &duration) const
Wait for a certain duration.
Definition: Clock.cpp:74
armarx::core::time::ClockType::Virtual
@ Virtual
Time given by time server if configured, realtime otherwise.
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
TimeUtil.h
armarx::core::time::Duration
Represents a duration.
Definition: Duration.h:16
armarx::core::time::Clock::WaitUntil
static Duration WaitUntil(const DateTime &dateTime)
Wait and block until the given date/time is surpassed on the virtual clock.
Definition: Clock.cpp:105
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:93
armarx::core::time::Duration::toMicroSeconds
std::int64_t toMicroSeconds() const
Returns the amount of microseconds.
Definition: Duration.cpp:36
armarx::core::time::Duration::MicroSeconds
static Duration MicroSeconds(std::int64_t microSeconds)
Constructs a duration in microseconds.
Definition: Duration.cpp:24
armarx::core::time::ClockType::Monotonic
@ Monotonic
Monotonic/steady clock of the operating system.
stopwatch::Clock
std::chrono::system_clock Clock
Definition: Stopwatch.h:10
armarx::core::time::Clock::now
DateTime now() const
Current date/time of the clock.
Definition: Clock.cpp:22