PER Firmware
Loading...
Searching...
No Matches
units.h
Go to the documentation of this file.
1#ifndef UNITS_H
2#define UNITS_H
3
14// Global Constants
15static constexpr float PI_F = 3.1415926535f;
16
17// Function modifiers for unit conversion functions
18#define UNIT_FUNC_MODIFIERS [[nodiscard, gnu::always_inline]] static inline
19
20// Temperature units
21typedef struct { float value; } celsius_t;
22typedef struct { float value; } fahrenheit_t;
23
24static_assert(sizeof(celsius_t) == sizeof(float));
25static_assert(sizeof(fahrenheit_t) == sizeof(float));
26
29 return (fahrenheit_t){ .value = (c.value * 9.0f / 5.0f) + 32.0f };
30}
31
34 return (celsius_t){ .value = (f.value - 32.0f) * 5.0f / 9.0f };
35}
36
37// Distance units
38typedef struct { float value; } meters_t;
39typedef struct { float value; } centimeters_t;
40typedef struct { float value; } millimeters_t;
41typedef struct { float value; } inches_t;
42typedef struct { float value; } feet_t;
43typedef struct { float value; } miles_t;
44
45static_assert(sizeof(meters_t) == sizeof(float));
46static_assert(sizeof(centimeters_t) == sizeof(float));
47static_assert(sizeof(millimeters_t) == sizeof(float));
48static_assert(sizeof(inches_t) == sizeof(float));
49static_assert(sizeof(feet_t) == sizeof(float));
50static_assert(sizeof(miles_t) == sizeof(float));
51
54 return (meters_t){ .value = cm.value / 100.0f };
55}
56
59 return (meters_t){ .value = mm.value / 1000.0f };
60}
61
64 return (meters_t){ .value = in.value * 0.0254f };
65}
66
69 return (meters_t){ .value = ft.value * 0.3048f };
70}
71
74 return (meters_t){ .value = mi.value * 1609.34f };
75}
76
77#define meters_from(x) _Generic((x), \
78 centimeters_t: meters_from_centimeters, \
79 millimeters_t: meters_from_millimeters, \
80 inches_t: meters_from_inches, \
81 feet_t: meters_from_feet, \
82 miles_t: meters_from_miles \
83)(x)
84
85// Time units
86typedef struct { float value; } milliseconds_t;
87typedef struct { float value; } seconds_t;
88typedef struct { float value; } minutes_t;
89typedef struct { float value; } hours_t;
90typedef struct { float value; } days_t;
91
92static_assert(sizeof(milliseconds_t) == sizeof(float));
93static_assert(sizeof(seconds_t) == sizeof(float));
94static_assert(sizeof(minutes_t) == sizeof(float));
95static_assert(sizeof(hours_t) == sizeof(float));
96static_assert(sizeof(days_t) == sizeof(float));
97
100 return (seconds_t){ .value = ms.value / 1000.0f };
101}
102
105 return (seconds_t){ .value = min.value * 60.0f };
106}
107
110 return (seconds_t){ .value = hr.value * 3600.0f };
111}
112
115 return (seconds_t){ .value = d.value * 86400.0f };
116}
117
118#define seconds_from(x) _Generic((x), \
119 milliseconds_t: seconds_from_milliseconds, \
120 minutes_t: seconds_from_minutes, \
121 hours_t: seconds_from_hours, \
122 days_t: seconds_from_days \
123)(x)
124
125// Angular units
126typedef struct { float value; } degrees_t;
127typedef struct { float value; } radians_t;
128
129static_assert(sizeof(degrees_t) == sizeof(float));
130static_assert(sizeof(radians_t) == sizeof(float));
131
134 return (radians_t){ .value = deg.value * PI_F / 180.0f };
135}
136
139 return (degrees_t){ .value = rad.value * 180.0f / PI_F };
140}
141
142// Mass units
143typedef struct { float value; } grams_t;
144typedef struct { float value; } kilograms_t;
145typedef struct { float value; } pounds_t;
146
147static_assert(sizeof(grams_t) == sizeof(float));
148static_assert(sizeof(kilograms_t) == sizeof(float));
149static_assert(sizeof(pounds_t) == sizeof(float));
150
153 return (kilograms_t){ .value = g.value / 1000.0f };
154}
155
158 return (kilograms_t){ .value = lb.value * 0.453592f };
159}
160
161#define kilograms_from(x) _Generic((x), \
162 grams_t: kilograms_from_grams, \
163 pounds_t: kilograms_from_pounds \
164)(x)
165
166// Pressure units
167typedef struct { float value; } pascals_t;
168typedef struct { float value; } psi_t;
169typedef struct { float value; } bar_t;
170
171static_assert(sizeof(pascals_t) == sizeof(float));
172static_assert(sizeof(psi_t) == sizeof(float));
173static_assert(sizeof(bar_t) == sizeof(float));
174
177 return (pascals_t){ .value = p.value * 6894.75729f };
178}
179
182 return (pascals_t){ .value = b.value * 100000.0f };
183}
184
187 return (psi_t){ .value = p.value / 6894.75729f };
188}
189
192 return (bar_t){ .value = p.value / 100000.0f };
193}
194
195// Velocity units
196typedef struct { float value; } mps_t;
197typedef struct { float value; } kph_t;
198typedef struct { float value; } mph_t;
199
200static_assert(sizeof(mps_t) == sizeof(float));
201static_assert(sizeof(kph_t) == sizeof(float));
202static_assert(sizeof(mph_t) == sizeof(float));
203
206 return (mps_t){ .value = k.value / 3.6f };
207}
208
211 return (mps_t){ .value = m.value * 0.44704f };
212}
213
216 return (kph_t){ .value = m.value * 3.6f };
217}
218
221 return (mph_t){ .value = m.value / 0.44704f };
222}
223
224#endif // UNITS_H
Definition units.h:169
float value
Definition units.h:169
Definition units.h:21
float value
Definition units.h:21
Definition units.h:39
float value
Definition units.h:39
Definition units.h:90
float value
Definition units.h:90
Definition units.h:126
float value
Definition units.h:126
Definition units.h:22
float value
Definition units.h:22
Definition units.h:42
float value
Definition units.h:42
Definition units.h:143
float value
Definition units.h:143
Definition units.h:89
float value
Definition units.h:89
Definition units.h:41
float value
Definition units.h:41
Definition units.h:144
float value
Definition units.h:144
Definition units.h:197
float value
Definition units.h:197
Definition units.h:38
float value
Definition units.h:38
Definition units.h:43
float value
Definition units.h:43
Definition units.h:40
float value
Definition units.h:40
Definition units.h:86
float value
Definition units.h:86
Definition units.h:88
float value
Definition units.h:88
Definition units.h:198
float value
Definition units.h:198
Definition units.h:196
float value
Definition units.h:196
Definition units.h:167
float value
Definition units.h:167
Definition units.h:145
float value
Definition units.h:145
Definition units.h:168
float value
Definition units.h:168
Definition units.h:127
float value
Definition units.h:127
Definition units.h:87
float value
Definition units.h:87
UNIT_FUNC_MODIFIERS fahrenheit_t fahrenheit_from(celsius_t c)
Definition units.h:28
UNIT_FUNC_MODIFIERS degrees_t degrees_from(radians_t rad)
Definition units.h:138
UNIT_FUNC_MODIFIERS mps_t mps_from_mph(mph_t m)
Definition units.h:210
UNIT_FUNC_MODIFIERS kph_t kph_from_mps(mps_t m)
Definition units.h:215
UNIT_FUNC_MODIFIERS radians_t radians_from(degrees_t deg)
Definition units.h:133
static constexpr float PI_F
Definition units.h:15
UNIT_FUNC_MODIFIERS meters_t meters_from_miles(miles_t mi)
Definition units.h:73
UNIT_FUNC_MODIFIERS pascals_t pascals_from_bar(bar_t b)
Definition units.h:181
UNIT_FUNC_MODIFIERS seconds_t seconds_from_minutes(minutes_t min)
Definition units.h:104
UNIT_FUNC_MODIFIERS psi_t psi_from_pascals(pascals_t p)
Definition units.h:186
UNIT_FUNC_MODIFIERS seconds_t seconds_from_hours(hours_t hr)
Definition units.h:109
UNIT_FUNC_MODIFIERS celsius_t celsius_from(fahrenheit_t f)
Definition units.h:33
UNIT_FUNC_MODIFIERS kilograms_t kilograms_from_pounds(pounds_t lb)
Definition units.h:157
UNIT_FUNC_MODIFIERS mps_t mps_from_kph(kph_t k)
Definition units.h:205
UNIT_FUNC_MODIFIERS seconds_t seconds_from_days(days_t d)
Definition units.h:114
UNIT_FUNC_MODIFIERS meters_t meters_from_millimeters(millimeters_t mm)
Definition units.h:58
UNIT_FUNC_MODIFIERS bar_t bar_from_pascals(pascals_t p)
Definition units.h:191
UNIT_FUNC_MODIFIERS meters_t meters_from_feet(feet_t ft)
Definition units.h:68
UNIT_FUNC_MODIFIERS pascals_t pascals_from_psi(psi_t p)
Definition units.h:176
#define UNIT_FUNC_MODIFIERS
Definition units.h:18
UNIT_FUNC_MODIFIERS mph_t mph_from_mps(mps_t m)
Definition units.h:220
UNIT_FUNC_MODIFIERS kilograms_t kilograms_from_grams(grams_t g)
Definition units.h:152
UNIT_FUNC_MODIFIERS meters_t meters_from_centimeters(centimeters_t cm)
Definition units.h:53
UNIT_FUNC_MODIFIERS meters_t meters_from_inches(inches_t in)
Definition units.h:63
UNIT_FUNC_MODIFIERS seconds_t seconds_from_milliseconds(milliseconds_t ms)
Definition units.h:99