STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
MonotonicTime.hpp
Go to the documentation of this file.
1#ifndef FSW_MONOTONIC_TIME_HPP
2#define FSW_MONOTONIC_TIME_HPP
3
4/**
5 * @file MonotonicTime.hpp
6 * @brief Centralized monotonic timestamp utilities for all FSW services.
7 *
8 * ALL services MUST use these functions for timestamps written to Elodin DB.
9 * This ensures consistent time correlation across daq_bridge, calibration_service,
10 * controller_service, sequencer_service, and data_logger_service.
11 *
12 * Uses CLOCK_MONOTONIC (via std::chrono::steady_clock) which:
13 * - Never jumps backward (unlike system_clock / NTP)
14 * - Survives NTP corrections
15 * - Matches Elodin DB's internal monotonic timestamp
16 */
17
18#include <chrono>
19#include <cstdint>
20#include <ctime>
21
22namespace fsw {
23namespace time {
24
25/**
26 * @brief Get current monotonic time in nanoseconds since boot.
27 * Use this for ALL Elodin DB timestamp_ns fields.
28 */
29inline uint64_t monotonic_ns() {
30 return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::nanoseconds>(
31 std::chrono::steady_clock::now().time_since_epoch())
32 .count());
33}
34
35/**
36 * @brief Get current monotonic time in microseconds since boot.
37 */
38inline uint64_t monotonic_us() {
39 return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::microseconds>(
40 std::chrono::steady_clock::now().time_since_epoch())
41 .count());
42}
43
44/**
45 * @brief Get current monotonic time in milliseconds since boot.
46 */
47inline uint64_t monotonic_ms() {
48 return static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::milliseconds>(
49 std::chrono::steady_clock::now().time_since_epoch())
50 .count());
51}
52
53/**
54 * @brief Get current monotonic time as a steady_clock time_point.
55 */
56inline std::chrono::steady_clock::time_point monotonic_now() {
57 return std::chrono::steady_clock::now();
58}
59
60/**
61 * @brief Convert steady_clock time_point to nanoseconds since boot.
62 */
63inline uint64_t to_ns(std::chrono::steady_clock::time_point tp) {
64 return static_cast<uint64_t>(
65 std::chrono::duration_cast<std::chrono::nanoseconds>(tp.time_since_epoch()).count());
66}
67
68/**
69 * @brief Compute elapsed nanoseconds between two time points.
70 */
71inline uint64_t elapsed_ns(std::chrono::steady_clock::time_point start,
72 std::chrono::steady_clock::time_point end) {
73 return static_cast<uint64_t>(
74 std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count());
75}
76
77} // namespace time
78} // namespace fsw
79
80#endif // FSW_MONOTONIC_TIME_HPP
static void start(gnss_frame_parser_t *p, uint8_t byte)
Definition gnss_frame.c:45
*brief create JSON pointer *sa reference_tokens end()
uint64_t to_ns(std::chrono::steady_clock::time_point tp)
Convert steady_clock time_point to nanoseconds since boot.
uint64_t elapsed_ns(std::chrono::steady_clock::time_point start, std::chrono::steady_clock::time_point end)
Compute elapsed nanoseconds between two time points.
uint64_t monotonic_ns()
Get current monotonic time in nanoseconds since boot.
uint64_t monotonic_ms()
Get current monotonic time in milliseconds since boot.
std::chrono::steady_clock::time_point monotonic_now()
Get current monotonic time as a steady_clock time_point.
uint64_t monotonic_us()
Get current monotonic time in microseconds since boot.
Motorized ball valve position: raw ADC counts -> % open.