libuavcan/libuavcan/test/clock.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 <pavel.kirienko@gmail.com>
3  */
4 
5 #pragma once
6 
7 #include <cassert>
8 #include <time.h>
9 #include <sys/time.h>
11 
13 {
14 public:
16  mutable uint64_t utc;
20 
22  : monotonic(initial)
23  , utc(initial)
25  , preserve_utc(false)
26  { }
27 
28  void advance(uint64_t usec) const
29  {
30  monotonic += usec;
31  if (!preserve_utc)
32  {
33  utc += usec;
34  }
35  }
36 
38  {
39  assert(this);
40  const uint64_t res = monotonic;
43  }
44 
45  virtual uavcan::UtcTime getUtc() const
46  {
47  assert(this);
49  }
50 
51  virtual void adjustUtc(uavcan::UtcDuration adjustment)
52  {
53  assert(this);
54  const uint64_t prev_utc = utc;
55  utc = uint64_t(int64_t(utc) + adjustment.toUSec());
56  last_adjustment = adjustment;
57  std::cout << "Clock adjustment " << prev_utc << " --> " << utc << std::endl;
58  }
59 };
60 
61 
63 {
64 public:
66 
68  {
69  struct timespec ts;
70  const int ret = clock_gettime(CLOCK_MONOTONIC, &ts);
71  if (ret != 0)
72  {
73  assert(0);
74  return uavcan::MonotonicTime();
75  }
76  return uavcan::MonotonicTime::fromUSec(uint64_t(int64_t(ts.tv_sec) * 1000000L + int64_t(ts.tv_nsec / 1000L)));
77  }
78 
79  virtual uavcan::UtcTime getUtc() const
80  {
81  struct timeval tv;
82  const int ret = gettimeofday(&tv, UAVCAN_NULLPTR);
83  if (ret != 0)
84  {
85  assert(0);
86  return uavcan::UtcTime();
87  }
88  return uavcan::UtcTime::fromUSec(uint64_t(int64_t(tv.tv_sec) * 1000000L + tv.tv_usec)) + utc_adjustment;
89  }
90 
91  virtual void adjustUtc(uavcan::UtcDuration adjustment)
92  {
93  utc_adjustment += adjustment;
94  }
95 };
96 
99 
101 
102 template <typename T>
103 static bool areTimestampsClose(const T& a, const T& b, int64_t precision_usec = 100000)
104 {
105  return (a - b).getAbs().toUSec() < precision_usec;
106 }
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
uavcan::UtcTime
Implicitly convertible to/from uavcan.Timestamp.
Definition: time.hpp:191
uavcan::UtcDuration
Definition: time.hpp:189
SystemClockDriver::getMonotonic
virtual uavcan::MonotonicTime getMonotonic() const
Definition: libuavcan/libuavcan/test/clock.hpp:67
SystemClockMock::advance
void advance(uint64_t usec) const
Definition: libuavcan/libuavcan/test/clock.hpp:28
time.h
system_clock.hpp
SystemClockMock::monotonic
uint64_t monotonic
Definition: libuavcan/libuavcan/test/clock.hpp:15
SystemClockDriver::adjustUtc
virtual void adjustUtc(uavcan::UtcDuration adjustment)
Definition: libuavcan/libuavcan/test/clock.hpp:91
uavcan::int64_t
std::int64_t int64_t
Definition: std.hpp:32
uavcan::MonotonicDuration
Definition: time.hpp:182
SystemClockMock::SystemClockMock
SystemClockMock(uint64_t initial=0)
Definition: libuavcan/libuavcan/test/clock.hpp:21
SystemClockMock::last_adjustment
uavcan::UtcDuration last_adjustment
Definition: libuavcan/libuavcan/test/clock.hpp:17
uavcan::TimeBase< MonotonicTime, MonotonicDuration >::fromUSec
static MonotonicTime fromUSec(uint64_t us)
Definition: time.hpp:112
SystemClockDriver::utc_adjustment
uavcan::UtcDuration utc_adjustment
Definition: libuavcan/libuavcan/test/clock.hpp:65
areTimestampsClose
static bool areTimestampsClose(const T &a, const T &b, int64_t precision_usec=100000)
Definition: libuavcan/libuavcan/test/clock.hpp:103
SystemClockMock::preserve_utc
bool preserve_utc
Definition: libuavcan/libuavcan/test/clock.hpp:19
SystemClockDriver::getUtc
virtual uavcan::UtcTime getUtc() const
Definition: libuavcan/libuavcan/test/clock.hpp:79
SystemClockMock::getUtc
virtual uavcan::UtcTime getUtc() const
Definition: libuavcan/libuavcan/test/clock.hpp:45
tsMono
uavcan::MonotonicTime tsMono(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:97
tsUtc
uavcan::UtcTime tsUtc(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:98
durMono
uavcan::MonotonicDuration durMono(int64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:100
SystemClockDriver
Definition: libuavcan/libuavcan/test/clock.hpp:62
SystemClockMock
Definition: libuavcan/libuavcan/test/clock.hpp:12
uavcan::MonotonicTime
Definition: time.hpp:184
SystemClockMock::getMonotonic
virtual uavcan::MonotonicTime getMonotonic() const
Definition: libuavcan/libuavcan/test/clock.hpp:37
SystemClockMock::utc
uint64_t utc
Definition: libuavcan/libuavcan/test/clock.hpp:16
uavcan::ISystemClock
Definition: system_clock.hpp:19
SystemClockMock::adjustUtc
virtual void adjustUtc(uavcan::UtcDuration adjustment)
Definition: libuavcan/libuavcan/test/clock.hpp:51
SystemClockMock::monotonic_auto_advance
uint64_t monotonic_auto_advance
Definition: libuavcan/libuavcan/test/clock.hpp:18
uavcan::DurationBase::toUSec
int64_t toUSec() const
Definition: time.hpp:43
uavcan::DurationBase< MonotonicDuration >::fromUSec
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02