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)
24  , monotonic_auto_advance(0)
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;
41  advance(monotonic_auto_advance);
43  }
44 
45  virtual uavcan::UtcTime getUtc() const
46  {
47  assert(this);
48  return uavcan::UtcTime::fromUSec(utc);
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 }
virtual uavcan::MonotonicTime getMonotonic() const
static MonotonicTime fromUSec(uint64_t us)
Definition: time.hpp:112
uavcan::UtcTime tsUtc(uint64_t usec)
virtual void adjustUtc(uavcan::UtcDuration adjustment)
void advance(uint64_t usec) const
int64_t toUSec() const
Definition: time.hpp:43
virtual void adjustUtc(uavcan::UtcDuration adjustment)
Implicitly convertible to/from uavcan.Timestamp.
Definition: time.hpp:191
virtual uavcan::MonotonicTime getMonotonic() const
SystemClockMock(uint64_t initial=0)
virtual uavcan::UtcTime getUtc() const
virtual uavcan::UtcTime getUtc() const
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35
std::uint64_t uint64_t
Definition: std.hpp:27
static bool areTimestampsClose(const T &a, const T &b, int64_t precision_usec=100000)
uavcan::MonotonicTime tsMono(uint64_t usec)
uavcan::UtcDuration last_adjustment
std::int64_t int64_t
Definition: std.hpp:32
uavcan::MonotonicDuration durMono(int64_t usec)


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39