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
27UNIT_FUNC_MODIFIERS
28fahrenheit_t fahrenheit_from(celsius_t c) {
29 return (fahrenheit_t){ .value = (c.value * 9.0f / 5.0f) + 32.0f };
30}
31
32UNIT_FUNC_MODIFIERS
33celsius_t celsius_from(fahrenheit_t f) {
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
52UNIT_FUNC_MODIFIERS
53meters_t meters_from_centimeters(centimeters_t cm) {
54 return (meters_t){ .value = cm.value / 100.0f };
55}
56
57UNIT_FUNC_MODIFIERS
58meters_t meters_from_millimeters(millimeters_t mm) {
59 return (meters_t){ .value = mm.value / 1000.0f };
60}
61
62UNIT_FUNC_MODIFIERS
63meters_t meters_from_inches(inches_t in) {
64 return (meters_t){ .value = in.value * 0.0254f };
65}
66
67UNIT_FUNC_MODIFIERS
68meters_t meters_from_feet(feet_t ft) {
69 return (meters_t){ .value = ft.value * 0.3048f };
70}
71
72UNIT_FUNC_MODIFIERS
73meters_t meters_from_miles(miles_t mi) {
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
98UNIT_FUNC_MODIFIERS
99seconds_t seconds_from_milliseconds(milliseconds_t ms) {
100 return (seconds_t){ .value = ms.value / 1000.0f };
101}
102
103UNIT_FUNC_MODIFIERS
104seconds_t seconds_from_minutes(minutes_t min) {
105 return (seconds_t){ .value = min.value * 60.0f };
106}
107
108UNIT_FUNC_MODIFIERS
109seconds_t seconds_from_hours(hours_t hr) {
110 return (seconds_t){ .value = hr.value * 3600.0f };
111}
112
113UNIT_FUNC_MODIFIERS
114seconds_t seconds_from_days(days_t d) {
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
132UNIT_FUNC_MODIFIERS
133radians_t radians_from(degrees_t deg) {
134 return (radians_t){ .value = deg.value * PI_F / 180.0f };
135}
136
137UNIT_FUNC_MODIFIERS
138degrees_t degrees_from(radians_t rad) {
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
151UNIT_FUNC_MODIFIERS
152kilograms_t kilograms_from_grams(grams_t g) {
153 return (kilograms_t){ .value = g.value / 1000.0f };
154}
155
156UNIT_FUNC_MODIFIERS
157kilograms_t kilograms_from_pounds(pounds_t lb) {
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
175UNIT_FUNC_MODIFIERS
176pascals_t pascals_from_psi(psi_t p) {
177 return (pascals_t){ .value = p.value * 6894.75729f };
178}
179
180UNIT_FUNC_MODIFIERS
181pascals_t pascals_from_bar(bar_t b) {
182 return (pascals_t){ .value = b.value * 100000.0f };
183}
184
185UNIT_FUNC_MODIFIERS
186psi_t psi_from_pascals(pascals_t p) {
187 return (psi_t){ .value = p.value / 6894.75729f };
188}
189
190UNIT_FUNC_MODIFIERS
191bar_t bar_from_pascals(pascals_t p) {
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
204UNIT_FUNC_MODIFIERS
205mps_t mps_from_kph(kph_t k) {
206 return (mps_t){ .value = k.value / 3.6f };
207}
208
209UNIT_FUNC_MODIFIERS
210mps_t mps_from_mph(mph_t m) {
211 return (mps_t){ .value = m.value * 0.44704f };
212}
213
214UNIT_FUNC_MODIFIERS
215kph_t kph_from_mps(mps_t m) {
216 return (kph_t){ .value = m.value * 3.6f };
217}
218
219UNIT_FUNC_MODIFIERS
220mph_t mph_from_mps(mps_t m) {
221 return (mph_t){ .value = m.value / 0.44704f };
222}
223
224#endif // UNITS_H
Definition units.h:169
Definition units.h:21
Definition units.h:39
Definition units.h:90
Definition units.h:126
Definition units.h:22
Definition units.h:42
Definition units.h:143
Definition units.h:89
Definition units.h:41
Definition units.h:144
Definition units.h:197
Definition units.h:38
Definition units.h:43
Definition units.h:40
Definition units.h:86
Definition units.h:88
Definition units.h:198
Definition units.h:196
Definition units.h:167
Definition units.h:145
Definition units.h:168
Definition units.h:127
Definition units.h:87