1/* @title: Time */
2#pragma once
3#include <stdint.h>
4#include <types/types.h>
5
6#define NS_PER_US 1000LL
7#define NS_PER_MS 1000000LL
8#define NS_PER_S 1000000000LL
9#define NS_PER_MIN 60000000000LL
10#define NS_PER_HOUR 3600000000000LL
11#define NS_PER_DAY 86400000000000LL
12
13#define US_PER_MS 1000LL
14#define US_PER_S 1000000LL
15#define US_PER_MIN 60000000LL
16#define US_PER_HOUR 3600000000LL
17#define US_PER_DAY 86400000000LL
18
19#define MS_PER_S 1000LL
20#define MS_PER_MIN 60000LL
21#define MS_PER_HOUR 3600000LL
22#define MS_PER_DAY 86400000LL
23
24#define S_PER_MIN 60LL
25#define S_PER_HOUR 3600LL
26#define S_PER_DAY 86400LL
27
28#define MIN_PER_HOUR 60LL
29#define MIN_PER_DAY 1440LL
30
31#define HOURS_PER_DAY 24LL
32
33#define NS_TO_US(ns) ((ns) / NS_PER_US)
34#define NS_TO_MS(ns) ((ns) / NS_PER_MS)
35#define NS_TO_SECONDS(ns) ((ns) / NS_PER_S)
36#define NS_TO_MINUTES(ns) ((ns) / NS_PER_MIN)
37#define NS_TO_HOURS(ns) ((ns) / NS_PER_HOUR)
38#define NS_TO_DAYS(ns) ((ns) / NS_PER_DAY)
39
40#define US_TO_NS(us) ((us) * NS_PER_US)
41#define US_TO_MS(us) ((us) / US_PER_MS)
42#define US_TO_SECONDS(us) ((us) / US_PER_S)
43#define US_TO_MINUTES(us) ((us) / US_PER_MIN)
44#define US_TO_HOURS(us) ((us) / US_PER_HOUR)
45#define US_TO_DAYS(us) ((us) / US_PER_DAY)
46
47#define MS_TO_NS(ms) ((ms) * NS_PER_MS)
48#define MS_TO_US(ms) ((ms) * US_PER_MS)
49#define MS_TO_SECONDS(ms) ((ms) / MS_PER_S)
50#define MS_TO_MINUTES(ms) ((ms) / MS_PER_MIN)
51#define MS_TO_HOURS(ms) ((ms) / MS_PER_HOUR)
52#define MS_TO_DAYS(ms) ((ms) / MS_PER_DAY)
53
54#define SECONDS_TO_NS(s) ((s) * NS_PER_S)
55#define SECONDS_TO_US(s) ((s) * US_PER_S)
56#define SECONDS_TO_MS(s) ((s) * MS_PER_S)
57#define SECONDS_TO_MINUTES(s) ((s) / S_PER_MIN)
58#define SECONDS_TO_HOURS(s) ((s) / S_PER_HOUR)
59#define SECONDS_TO_DAYS(s) ((s) / S_PER_DAY)
60
61#define MINUTES_TO_NS(m) ((m) * NS_PER_MIN)
62#define MINUTES_TO_US(m) ((m) * US_PER_MIN)
63#define MINUTES_TO_MS(m) ((m) * MS_PER_MIN)
64#define MINUTES_TO_SECONDS(m) ((m) * S_PER_MIN)
65#define MINUTES_TO_HOURS(m) ((m) / MIN_PER_HOUR)
66#define MINUTES_TO_DAYS(m) ((m) / MIN_PER_DAY)
67
68#define HOURS_TO_NS(h) ((h) * NS_PER_HOUR)
69#define HOURS_TO_US(h) ((h) * US_PER_HOUR)
70#define HOURS_TO_MS(h) ((h) * MS_PER_HOUR)
71#define HOURS_TO_SECONDS(h) ((h) * S_PER_HOUR)
72#define HOURS_TO_MINUTES(h) ((h) * MIN_PER_HOUR)
73#define HOURS_TO_DAYS(h) ((h) / HOURS_PER_DAY)
74
75#define DAYS_TO_NS(d) ((d) * NS_PER_DAY)
76#define DAYS_TO_US(d) ((d) * US_PER_DAY)
77#define DAYS_TO_MS(d) ((d) * MS_PER_DAY)
78#define DAYS_TO_SECONDS(d) ((d) * S_PER_DAY)
79#define DAYS_TO_MINUTES(d) ((d) * MIN_PER_DAY)
80#define DAYS_TO_HOURS(d) ((d) * HOURS_PER_DAY)
81
82void time_print_unix(time_s_t timestamp);
83void time_print_current();
84uint32_t time_get_unix();
85uint8_t time_get_second();
86uint8_t time_get_minute();
87uint8_t time_get_hour();
88uint8_t time_get_day();
89uint8_t time_get_month();
90uint8_t time_get_year();
91uint8_t time_get_century();
92time_ms_t time_get_ms(void);
93
94/* Non-blocking variant when spinning on the timekeeper is disallowed */
95bool time_try_get_ms(time_ms_t *out);
96time_ns_t time_get_ns();
97time_us_t time_get_us(void);
98freq_hz_t tsc_calibrate(void);
99