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() { return SpecMicroseconds(NowSpec()); }
27
28inline uint64_t NowMilliseconds() { return NowMicroseconds() / 1000ULL; }
29
30inline uint64_t XrToSharedMicroseconds(uint64_t timestamp_us)
31{
32 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
33 return UINT64_MAX - start_us < timestamp_us ? UINT64_MAX : start_us + timestamp_us;
34}
35
36inline uint64_t SharedToXrMicroseconds(uint64_t timestamp_us)
37{
38 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
39 return timestamp_us >= start_us ? timestamp_us - start_us : 0;
40}
41
42inline timespec RelativeFromMilliseconds(uint32_t milliseconds)
43{
44 timespec ts = {};
45 ts.tv_sec = static_cast<time_t>(milliseconds / 1000U);
46 ts.tv_nsec = static_cast<long>(milliseconds % 1000U) * 1000000L;
47 return ts;
48}
49
50inline timespec AddMilliseconds(timespec base, uint64_t milliseconds)
51{
52 base.tv_sec += static_cast<time_t>(milliseconds / 1000ULL);
53 base.tv_nsec += static_cast<long>(milliseconds % 1000ULL) * 1000000L;
54 if (base.tv_nsec >= 1000000000L)
55 {
56 base.tv_sec += base.tv_nsec / 1000000000L;
57 base.tv_nsec %= 1000000000L;
58 }
59 return base;
60}
61
62inline uint32_t RemainingMilliseconds(uint64_t deadline_ms)
63{
64 const uint64_t now_ms = NowMilliseconds();
65 if (now_ms >= deadline_ms)
66 {
67 return 0;
68 }
69 return static_cast<uint32_t>(deadline_ms - now_ms);
70}
71
72inline int64_t ElapsedMicroseconds(const timespec& start)
73{
74 const timespec now = NowSpec();
75 return static_cast<int64_t>(now.tv_sec - start.tv_sec) * 1000000LL +
76 static_cast<int64_t>(now.tv_nsec - start.tv_nsec) / 1000LL;
77}
78
79inline uint32_t WaitSliceMilliseconds(uint32_t remaining_ms) { return remaining_ms; }
80
81} // namespace MonotonicTime
82} // namespace LibXR
LibXR 命名空间
Definition ch32_can.hpp:14