libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
monotonic_time.hpp
1#pragma once
2
3#include <time.h>
4
5#include <cstdint>
6
7extern struct timespec libxr_linux_start_time_spec;
8
9namespace LibXR
10{
11namespace MonotonicTime
12{
13inline uint64_t SpecMicroseconds(const timespec& ts)
14{
15 return static_cast<uint64_t>(ts.tv_sec) * 1000000ULL +
16 static_cast<uint64_t>(ts.tv_nsec) / 1000ULL;
17}
18
19inline timespec NowSpec()
20{
21 timespec ts = {};
22 clock_gettime(CLOCK_MONOTONIC, &ts);
23 return ts;
24}
25
26inline uint64_t NowMicroseconds()
27{
28 return SpecMicroseconds(NowSpec());
29}
30
31inline uint64_t NowMilliseconds()
32{
33 return NowMicroseconds() / 1000ULL;
34}
35
36inline uint64_t XrToSharedMicroseconds(uint64_t timestamp_us)
37{
38 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
39 return UINT64_MAX - start_us < timestamp_us ? UINT64_MAX : start_us + timestamp_us;
40}
41
42inline uint64_t SharedToXrMicroseconds(uint64_t timestamp_us)
43{
44 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
45 return timestamp_us >= start_us ? timestamp_us - start_us : 0;
46}
47
48inline timespec RelativeFromMilliseconds(uint32_t milliseconds)
49{
50 timespec ts = {};
51 ts.tv_sec = static_cast<time_t>(milliseconds / 1000U);
52 ts.tv_nsec = static_cast<long>(milliseconds % 1000U) * 1000000L;
53 return ts;
54}
55
56inline timespec AddMilliseconds(timespec base, uint64_t milliseconds)
57{
58 base.tv_sec += static_cast<time_t>(milliseconds / 1000ULL);
59 base.tv_nsec += static_cast<long>(milliseconds % 1000ULL) * 1000000L;
60 if (base.tv_nsec >= 1000000000L)
61 {
62 base.tv_sec += base.tv_nsec / 1000000000L;
63 base.tv_nsec %= 1000000000L;
64 }
65 return base;
66}
67
68inline uint32_t RemainingMilliseconds(uint64_t deadline_ms)
69{
70 const uint64_t now_ms = NowMilliseconds();
71 if (now_ms >= deadline_ms)
72 {
73 return 0;
74 }
75 return static_cast<uint32_t>(deadline_ms - now_ms);
76}
77
78inline int64_t ElapsedMicroseconds(const timespec& start)
79{
80 const timespec now = NowSpec();
81 return static_cast<int64_t>(now.tv_sec - start.tv_sec) * 1000000LL +
82 static_cast<int64_t>(now.tv_nsec - start.tv_nsec) / 1000LL;
83}
84
85inline uint32_t WaitSliceMilliseconds(uint32_t remaining_ms)
86{
87 return remaining_ms;
88}
89
90} // namespace MonotonicTime
91} // namespace LibXR
LibXR 命名空间
Definition ch32_can.hpp:14