INSTINCT Code Coverage Report


Directory: src/
File: Navigation/GNSS/Core/Frequency.hpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 93 98 94.9%
Functions: 20 22 90.9%
Branches: 32 37 86.5%

Line Branch Exec Source
1 // This file is part of INSTINCT, the INS Toolkit for Integrated
2 // Navigation Concepts and Training by the Institute of Navigation of
3 // the University of Stuttgart, Germany.
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9 /// @file Frequency.hpp
10 /// @brief Frequency definition for different satellite systems
11 /// @author T. Topp (topp@ins.uni-stuttgart.de)
12 /// @date 2022-04-26
13
14 #pragma once
15
16 #include <string>
17 #include <fmt/format.h>
18
19 #include "Navigation/GNSS/Core/SatelliteSystem.hpp"
20
21 namespace NAV
22 {
23
24 /// Enumerate for GNSS frequencies
25 enum Frequency_ : uint64_t
26 { // clang-format off
27 Freq_None = 0x0000'0000'0000'0000, ///< None
28 G01 = 0x0000'0000'0000'0001, ///< GPS L1 (1575.42 MHz).
29 G02 = 0x0000'0000'0000'0002, ///< GPS L2 (1227.6 MHz).
30 G05 = 0x0000'0000'0000'0004, ///< GPS L5 (1176.45 MHz).
31 E01 = 0x0000'0000'0000'0100, ///< Galileo, "E1" (1575.42 MHz).
32 E05 = 0x0000'0000'0000'0200, ///< Galileo E5a (1176.45 MHz).
33 E06 = 0x0000'0000'0000'0400, ///< Galileo E6 (1278.75 MHz).
34 E07 = 0x0000'0000'0000'0800, ///< Galileo E5b (1207.14 MHz).
35 E08 = 0x0000'0000'0000'1000, ///< Galileo E5 (E5a + E5b) (1191.795MHz).
36 R01 = 0x0000'0000'0001'0000, ///< GLONASS, "G1" (1602 MHZ).
37 R02 = 0x0000'0000'0002'0000, ///< GLONASS, "G2" (1246 MHz).
38 R03 = 0x0000'0000'0004'0000, ///< GLONASS, "G3" (1202.025 MHz).
39 R04 = 0x0000'0000'0008'0000, ///< GLONASS, "G1a" (1600.995 MHZ).
40 R06 = 0x0000'0000'0010'0000, ///< GLONASS, "G2a" (1248.06 MHz).
41 B01 = 0x0000'0000'0100'0000, ///< Beidou B1 (1575.42 MHz).
42 B02 = 0x0000'0000'0200'0000, ///< Beidou B1-2 (B1I) (1561.098 MHz).
43 B05 = 0x0000'0000'0400'0000, ///< Beidou B2a (1176.45 MHz).
44 B06 = 0x0000'0000'0800'0000, ///< Beidou B3 (1268.52 MHz).
45 B07 = 0x0000'0000'1000'0000, ///< Beidou B2b (B2I) (1207.14 MHz).
46 B08 = 0x0000'0000'2000'0000, ///< Beidou B2 (B2a + B2b) (1191.795MHz).
47 J01 = 0x0000'0001'0000'0000, ///< QZSS L1 (1575.42 MHz).
48 J02 = 0x0000'0002'0000'0000, ///< QZSS L2 (1227.6 MHz).
49 J05 = 0x0000'0004'0000'0000, ///< QZSS L5 (1176.45 MHz).
50 J06 = 0x0000'0008'0000'0000, ///< QZSS L6 / LEX (1278.75 MHz).
51 I05 = 0x0000'0100'0000'0000, ///< IRNSS L5 (1176.45 MHz).
52 I09 = 0x0000'0200'0000'0000, ///< IRNSS S (2492.028 MHz).
53 S01 = 0x0001'0000'0000'0000, ///< SBAS L1 (1575.42 MHz).
54 S05 = 0x0002'0000'0000'0000, ///< SBAS L5 (1176.45 MHz).
55 }; // clang-format on
56
57 /// @brief Frequency definition for different satellite systems
58 class Frequency
59 {
60 public:
61 /// @brief Satellite System enumeration with continuous range. Not usable as a mask
62 enum Enum : uint8_t
63 {
64 Enum_G01, ///< GPS L1 (1575.42 MHz).
65 Enum_G02, ///< GPS L2 (1227.6 MHz).
66 Enum_G05, ///< GPS L5 (1176.45 MHz).
67 Enum_E01, ///< Galileo, "E1" (1575.42 MHz).
68 Enum_E05, ///< Galileo E5a (1176.45 MHz).
69 Enum_E06, ///< Galileo E6 (1278.75 MHz).
70 Enum_E07, ///< Galileo E5b (1207.14 MHz).
71 Enum_E08, ///< Galileo E5 (E5a + E5b) (1191.795MHz).
72 Enum_R01, ///< GLONASS, "G1" (1602 MHZ).
73 Enum_R02, ///< GLONASS, "G2" (1246 MHz).
74 Enum_R03, ///< GLONASS, "G3" (1202.025 MHz).
75 Enum_R04, ///< GLONASS, "G1a" (1600.995 MHZ).
76 Enum_R06, ///< GLONASS, "G2a" (1248.06 MHz).
77 Enum_B01, ///< Beidou B1 (1575.42 MHz).
78 Enum_B02, ///< Beidou B1-2 (1561.098 MHz).
79 Enum_B05, ///< Beidou B2a (1176.45 MHz).
80 Enum_B06, ///< Beidou B3 (1268.52 MHz).
81 Enum_B07, ///< Beidou B2b (1207.14 MHz).
82 Enum_B08, ///< Beidou B2 (B2a + B2b) (1191.795MHz).
83 Enum_J01, ///< QZSS L1 (1575.42 MHz).
84 Enum_J02, ///< QZSS L2 (1227.6 MHz).
85 Enum_J05, ///< QZSS L5 (1176.45 MHz).
86 Enum_J06, ///< QZSS L6 / LEX (1278.75 MHz).
87 Enum_I05, ///< IRNSS L5 (1176.45 MHz).
88 Enum_I09, ///< IRNSS S (2492.028 MHz).
89 Enum_S01, ///< SBAS L1 (1575.42 MHz).
90 Enum_S05, ///< SBAS L5 (1176.45 MHz).
91 Enum_COUNT, ///< Count variable
92 Enum_None, ///< No Frequency
93 };
94
95 /// @brief Default Constructor
96 constexpr Frequency() = default;
97
98 /// @brief Implicit Constructor from Value type
99 /// @param[in] type Value type to construct from
100 11513514 constexpr Frequency(Frequency_ type) // NOLINT(hicpp-explicit-conversions, google-explicit-constructor)
101 11513514 : value(type)
102 11513514 {}
103
104 /// @brief Implicit Constructor from Enum type
105 /// @param[in] enumeration Enum type to construct from
106 Frequency(Enum enumeration) // NOLINT(hicpp-explicit-conversions, google-explicit-constructor)
107 : value(Frequency::fromEnum(enumeration))
108 {}
109
110 /// @brief Construct new object from std::string
111 /// @param[in] typeString String representation of the frequency
112 static Frequency fromString(const std::string& typeString);
113
114 /// @brief Constructs a new object from continuous enumeration
115 /// @param[in] enumeration Continuous enumeration of the frequency
116 static Frequency fromEnum(Enum enumeration);
117
118 /// @brief Assignment operator from Value type
119 /// @param[in] v Value type to construct from
120 /// @return The Type type from the value type
121 1908371 constexpr Frequency& operator=(Frequency_ v)
122 {
123 1908371 value = v;
124 1908371 return *this;
125 }
126
127 friend constexpr bool operator==(const Frequency& lhs, const Frequency& rhs);
128
129 /// @brief Less than comparison (needed for map)
130 /// @param[in] rhs Right hand side of the operator
131 /// @return True if lhs < rhs
132 89716 constexpr bool operator<(const Frequency& rhs) const { return value < rhs.value; }
133
134 /// @brief Allow switch(Frequency_(type)) and comparisons
135 5322865 constexpr explicit operator Frequency_() const { return value; }
136 /// @brief Prevent usage: if(...)
137 constexpr explicit operator bool() = delete;
138
139 /// @brief int conversion operator
140 /// @return A int representation of the type
141 28289930 constexpr explicit operator uint64_t() const { return uint64_t(value); }
142
143 /// @brief std::string conversion operator
144 /// @return A std::string representation of the type
145 explicit operator std::string() const;
146
147 /// @brief Get the Time System of the specified Frequency
148 /// @param[in] freq Frequency to get the satellite system for
149 static SatelliteSystem GetSatelliteSystemForFrequency(Frequency freq);
150
151 /// @brief Get the satellite system for which this frequency is defined
152 4049176 [[nodiscard]] SatelliteSystem getSatSys() const
153 {
154
1/2
✓ Branch 2 taken 4048256 times.
✗ Branch 3 not taken.
4049176 return GetSatelliteSystemForFrequency(value);
155 }
156
157 /// @brief Get the frequency in [Hz]
158 /// @param[in] freq Frequency to get the value for
159 /// @param[in] num Frequency number. Only used for GLONASS G1 and G2
160 static double GetFrequency(Frequency freq, int8_t num);
161
162 /// @brief Get the frequency in [Hz]
163 /// @param[in] num Frequency number. Only used for GLONASS G1 and G2
164 289990 [[nodiscard]] double getFrequency(int8_t num) const
165 {
166
1/2
✓ Branch 2 taken 289990 times.
✗ Branch 3 not taken.
289990 return GetFrequency(value, num);
167 }
168
169 /// @brief Returns the L1 Frequency for each constellation
170 /// @param[in] freq Frequency to get the value for
171 static Frequency GetL1(Frequency freq);
172
173 /// @brief Returns the L1 Frequency for each constellation
174 41798 [[nodiscard]] Frequency getL1() const
175 {
176
1/2
✓ Branch 2 taken 41798 times.
✗ Branch 3 not taken.
41798 return GetL1(value);
177 }
178
179 /// Counts the amount of frequencies contained
180 [[nodiscard]] size_t count() const;
181
182 /// @brief Returns a list with all possible frequencies
183 constexpr static std::array<Frequency, 27> GetAll()
184 {
185 return { G01, G02, G05,
186 E01, E05, E06, E07, E08,
187 R01, R02, R03, R04, R06,
188 B01, B02, B05, B06, B07, B08,
189 J01, J02, J05, J06,
190 I05, I09,
191 S01, S05 };
192 }
193
194 /// @brief Get the continuous enumeration of the specified frequency
195 /// @param[in] freq Frequency to get the continuous enumeration for
196 static Enum ToEnumeration(Frequency freq);
197
198 /// @brief Returns a continuous enumeration of the object
199 [[nodiscard]] Enum toEnumeration() const;
200
201 /// @brief Get a vector representation of the specified Frequency
202 /// @param[in] freq Frequency to get the vector for
203 static std::vector<Frequency> ToVector(Frequency freq);
204
205 /// @brief Get a vector representation of the specified Frequency
206 [[nodiscard]] std::vector<Frequency> toVector() const;
207
208 /// @brief Checks wether the given frequency is the first in the filter (per system)
209 /// @param[in] freq Single Frequency
210 /// @param[in] filter Filter of multiple frequencies
211 static bool IsFirstFrequency(const Frequency& freq, const Frequency& filter);
212
213 /// @brief Checks wether the frequency is the first in the filter (per system)
214 /// @param[in] filter Filter of multiple frequencies
215 [[nodiscard]] bool isFirstFrequency(const Frequency& filter) const;
216
217 private:
218 /// @brief Internal value
219 Frequency_ value = Frequency_::Freq_None;
220 };
221
222 // #########################################################################################################################################
223
224 /// @brief Converts the provided link into a json object
225 /// @param[out] j Json object which gets filled with the info
226 /// @param[in] data Data to convert into json
227 void to_json(json& j, const Frequency& data);
228 /// @brief Converts the provided json object into a link object
229 /// @param[in] j Json object with the needed values
230 /// @param[out] data Object to fill from the json
231 void from_json(const json& j, Frequency& data);
232
233 // #########################################################################################################################################
234
235 /// @brief Allows combining flags of the Frequency enum.
236 /// @param[in] lhs Left-hand side enum value.
237 /// @param[in] rhs Right-hand side enum value.
238 /// @return The binary ORed value.
239 2015380 constexpr Frequency_ operator|(Frequency_ lhs, Frequency_ rhs)
240 {
241 2015380 return Frequency_(uint64_t(lhs) | uint64_t(rhs));
242 }
243 /// @brief Allows combining flags of the Frequency enum.
244 /// @param[in] lhs Left-hand side enum value.
245 /// @param[in] rhs Right-hand side enum value.
246 /// @return The binary ORed value.
247 1908201 constexpr Frequency_ operator|(Frequency lhs, Frequency rhs)
248 {
249 1908201 return Frequency_(lhs) | Frequency_(rhs);
250 }
251 /// @brief Allows combining flags of the Frequency enum.
252 /// @param[in] lhs Left-hand side enum value.
253 /// @param[in] rhs Right-hand side enum value.
254 /// @return The binary ORed value.
255 constexpr Frequency_ operator|(Frequency_ lhs, Frequency rhs)
256 {
257 return lhs | Frequency_(rhs);
258 }
259 /// @brief Allows combining flags of the Frequency enum.
260 /// @param[in] lhs Left-hand side enum value.
261 /// @param[in] rhs Right-hand side enum value.
262 /// @return The binary ORed value.
263 constexpr Frequency_ operator|(Frequency lhs, Frequency_ rhs)
264 {
265 return Frequency_(lhs) | rhs;
266 }
267
268 /// @brief Allows combining flags of the Frequency enum.
269 /// @param[in] lhs Left-hand side enum value.
270 /// @param[in] rhs Right-hand side enum value.
271 /// @return The binary ORed value.
272 constexpr Frequency_& operator|=(Frequency_& lhs, const Frequency_& rhs)
273 {
274 lhs = lhs | rhs;
275 return lhs;
276 }
277 /// @brief Allows combining flags of the Frequency enum.
278 /// @param[in] lhs Left-hand side enum value.
279 /// @param[in] rhs Right-hand side enum value.
280 /// @return The binary ORed value.
281 1908209 constexpr Frequency& operator|=(Frequency& lhs, const Frequency& rhs)
282 {
283 1908209 lhs = lhs | rhs;
284 1908198 return lhs;
285 }
286 /// @brief Allows combining flags of the Frequency enum.
287 /// @param[in] lhs Left-hand side enum value.
288 /// @param[in] rhs Right-hand side enum value.
289 /// @return The binary ORed value.
290 constexpr Frequency_& operator|=(Frequency_& lhs, const Frequency& rhs)
291 {
292 lhs = lhs | Frequency_(rhs);
293 return lhs;
294 }
295 /// @brief Allows combining flags of the Frequency enum.
296 /// @param[in] lhs Left-hand side enum value.
297 /// @param[in] rhs Right-hand side enum value.
298 /// @return The binary ORed value.
299 constexpr Frequency& operator|=(Frequency& lhs, const Frequency_& rhs)
300 {
301 lhs = lhs | rhs;
302 return lhs;
303 }
304
305 /// @brief Allows combining flags of the Frequency enum.
306 /// @param[in] lhs Left-hand side enum value.
307 /// @param[in] rhs Right-hand side enum value.
308 /// @return The binary ANDed value.
309 5033336 constexpr Frequency_ operator&(Frequency_ lhs, Frequency_ rhs)
310 {
311 5033336 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
312 }
313 /// @brief Allows combining flags of the Frequency enum.
314 /// @param[in] lhs Left-hand side enum value.
315 /// @param[in] rhs Right-hand side enum value.
316 /// @return The binary ANDed value.
317 194375 constexpr Frequency_ operator&(Frequency lhs, Frequency rhs)
318 {
319 194375 return Frequency_(lhs) & Frequency_(rhs);
320 }
321 /// @brief Allows combining flags of the Frequency enum.
322 /// @param[in] lhs Left-hand side enum value.
323 /// @param[in] rhs Right-hand side enum value.
324 /// @return The binary ANDed value.
325 106354 constexpr Frequency_ operator&(Frequency lhs, Frequency_ rhs)
326 {
327 106354 return Frequency_(lhs) & rhs;
328 }
329 /// @brief Allows combining flags of the Frequency enum.
330 /// @param[in] lhs Left-hand side enum value.
331 /// @param[in] rhs Right-hand side enum value.
332 /// @return The binary ANDed value.
333 constexpr Frequency_ operator&(Frequency_ lhs, Frequency rhs)
334 {
335 return lhs & Frequency_(rhs);
336 }
337
338 /// @brief Allows combining flags of the Frequency enum.
339 /// @param[in] lhs Left-hand side enum value.
340 /// @param[in] rhs Right-hand side enum value.
341 /// @return The binary ANDed value.
342 constexpr Frequency_& operator&=(Frequency_& lhs, const Frequency_& rhs)
343 {
344 lhs = lhs & rhs;
345 return lhs;
346 }
347 /// @brief Allows combining flags of the Frequency enum.
348 /// @param[in] lhs Left-hand side enum value.
349 /// @param[in] rhs Right-hand side enum value.
350 /// @return The binary ANDed value.
351 constexpr Frequency& operator&=(Frequency& lhs, const Frequency& rhs)
352 {
353 lhs = lhs & rhs;
354 return lhs;
355 }
356 /// @brief Allows combining flags of the Frequency enum.
357 /// @param[in] lhs Left-hand side enum value.
358 /// @param[in] rhs Right-hand side enum value.
359 /// @return The binary ANDed value.
360 constexpr Frequency_& operator&=(Frequency_& lhs, const Frequency& rhs)
361 {
362 lhs = lhs & Frequency_(rhs);
363 return lhs;
364 }
365 /// @brief Allows combining flags of the Frequency enum.
366 /// @param[in] lhs Left-hand side enum value.
367 /// @param[in] rhs Right-hand side enum value.
368 /// @return The binary ANDed value.
369 constexpr Frequency& operator&=(Frequency& lhs, const Frequency_& rhs)
370 {
371 lhs = lhs & rhs;
372 return lhs;
373 }
374
375 /// @brief Allows negating flags of the Frequency enum.
376 /// @param[in] rhs Right-hand side enum value.
377 /// @return The binary NEGed value.
378 constexpr Frequency_ operator~(Frequency_ rhs)
379 {
380 return Frequency_(~uint64_t(rhs));
381 }
382 /// @brief Allows negating flags of the Frequency enum.
383 /// @param[in] rhs Right-hand side enum value.
384 /// @return The binary NEGed value.
385 constexpr Frequency_ operator~(Frequency rhs)
386 {
387 return Frequency_(~uint64_t(rhs));
388 }
389
390 /// @brief Equal compares values
391 /// @param[in] lhs Left-hand side of the operator
392 /// @param[in] rhs Right-hand side of the operator
393 /// @return Whether the comparison was successful
394 281727 constexpr bool operator==(const Frequency& lhs, const Frequency& rhs) { return lhs.value == rhs.value; }
395 /// @brief Equal compares values
396 /// @param[in] lhs Left-hand side of the operator
397 /// @param[in] rhs Right-hand side of the operator
398 /// @return Whether the comparison was successful
399 14836 constexpr bool operator==(const Frequency& lhs, const Frequency_& rhs) { return lhs == Frequency(rhs); }
400 /// @brief Equal compares values
401 /// @param[in] lhs Left-hand side of the operator
402 /// @param[in] rhs Right-hand side of the operator
403 /// @return Whether the comparison was successful
404 constexpr bool operator==(const Frequency_& lhs, const Frequency& rhs) { return Frequency(lhs) == rhs; }
405
406 /// @brief Inequal compares values
407 /// @param[in] lhs Left-hand side of the operator
408 /// @param[in] rhs Right-hand side of the operator
409 /// @return Whether the comparison was successful
410 constexpr bool operator!=(const Frequency& lhs, const Frequency& rhs) { return !(lhs == rhs); }
411 /// @brief Inequal compares values
412 /// @param[in] lhs Left-hand side of the operator
413 /// @param[in] rhs Right-hand side of the operator
414 /// @return Whether the comparison was successful
415 constexpr bool operator!=(const Frequency& lhs, const Frequency_& rhs) { return !(lhs == rhs); }
416 /// @brief Inequal compares values
417 /// @param[in] lhs Left-hand side of the operator
418 /// @param[in] rhs Right-hand side of the operator
419 /// @return Whether the comparison was successful
420 constexpr bool operator!=(const Frequency_& lhs, const Frequency& rhs) { return !(lhs == rhs); }
421
422 // #########################################################################################################################################
423
424 /// @brief Allows filtering Frequency with SatelliteSystem.
425 /// @param[in] lhs Left-hand side enum value.
426 /// @param[in] rhs Right-hand side enum value.
427 /// @return The binary ANDed value.
428 constexpr Frequency_ operator&(Frequency_ lhs, SatelliteSystem_ rhs)
429 {
430 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
431 }
432 /// @brief Allows filtering Frequency with SatelliteSystem.
433 /// @param[in] lhs Left-hand side enum value.
434 /// @param[in] rhs Right-hand side enum value.
435 /// @return The binary ANDed value.
436 constexpr Frequency_ operator&(SatelliteSystem_ lhs, Frequency_ rhs)
437 {
438 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
439 }
440 /// @brief Allows filtering Frequency with SatelliteSystem.
441 /// @param[in] lhs Left-hand side enum value.
442 /// @param[in] rhs Right-hand side enum value.
443 /// @return The binary ANDed value.
444 constexpr Frequency_& operator&=(Frequency_& lhs, const SatelliteSystem_& rhs)
445 {
446 lhs = lhs & rhs;
447 return lhs;
448 }
449
450 /// @brief Allows filtering Frequency with SatelliteSystem.
451 /// @param[in] lhs Left-hand side enum value.
452 /// @param[in] rhs Right-hand side enum value.
453 /// @return The binary ANDed value.
454 constexpr Frequency_ operator&(Frequency_ lhs, SatelliteSystem rhs)
455 {
456 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
457 }
458 /// @brief Allows filtering Frequency with SatelliteSystem.
459 /// @param[in] lhs Left-hand side enum value.
460 /// @param[in] rhs Right-hand side enum value.
461 /// @return The binary ANDed value.
462 constexpr Frequency_ operator&(SatelliteSystem lhs, Frequency_ rhs)
463 {
464 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
465 }
466 /// @brief Allows filtering Frequency with SatelliteSystem.
467 /// @param[in] lhs Left-hand side enum value.
468 /// @param[in] rhs Right-hand side enum value.
469 /// @return The binary ANDed value.
470 constexpr Frequency_& operator&=(Frequency_& lhs, const SatelliteSystem& rhs)
471 {
472 lhs = lhs & rhs;
473 return lhs;
474 }
475
476 /// @brief Allows filtering Frequency with SatelliteSystem.
477 /// @param[in] lhs Left-hand side enum value.
478 /// @param[in] rhs Right-hand side enum value.
479 /// @return The binary ANDed value.
480 constexpr Frequency_ operator&(Frequency lhs, SatelliteSystem_ rhs)
481 {
482 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
483 }
484 /// @brief Allows filtering Frequency with SatelliteSystem.
485 /// @param[in] lhs Left-hand side enum value.
486 /// @param[in] rhs Right-hand side enum value.
487 /// @return The binary ANDed value.
488 constexpr Frequency_ operator&(SatelliteSystem_ lhs, Frequency rhs)
489 {
490 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
491 }
492 /// @brief Allows filtering Frequency with SatelliteSystem.
493 /// @param[in] lhs Left-hand side enum value.
494 /// @param[in] rhs Right-hand side enum value.
495 /// @return The binary ANDed value.
496 constexpr Frequency& operator&=(Frequency& lhs, const SatelliteSystem_& rhs)
497 {
498 lhs = lhs & rhs;
499 return lhs;
500 }
501
502 /// @brief Allows filtering Frequency with SatelliteSystem.
503 /// @param[in] lhs Left-hand side enum value.
504 /// @param[in] rhs Right-hand side enum value.
505 /// @return The binary ANDed value.
506 28294004 constexpr Frequency_ operator&(Frequency lhs, SatelliteSystem rhs)
507 {
508 28294004 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
509 }
510 /// @brief Allows filtering Frequency with SatelliteSystem.
511 /// @param[in] lhs Left-hand side enum value.
512 /// @param[in] rhs Right-hand side enum value.
513 /// @return The binary ANDed value.
514 constexpr Frequency_ operator&(SatelliteSystem lhs, Frequency rhs)
515 {
516 return Frequency_(uint64_t(lhs) & uint64_t(rhs));
517 }
518 /// @brief Allows filtering Frequency with SatelliteSystem.
519 /// @param[in] lhs Left-hand side enum value.
520 /// @param[in] rhs Right-hand side enum value.
521 /// @return The binary ANDed value.
522 constexpr Frequency& operator&=(Frequency& lhs, const SatelliteSystem& rhs)
523 {
524 lhs = lhs & rhs;
525 return lhs;
526 }
527
528 /// All Frequencies
529 constexpr Frequency_ Freq_All = G01 | G02 | G05
530 | E01 | E05 | E06 | E07 | E08
531 | R01 | R02 | R03 | R04 | R06
532 | B01 | B02 | B05 | B06 | B07 | B08
533 | J01 | J02 | J05 | J06
534 | I05 | I09
535 | S01 | S05;
536
537 /// @brief Shows a ComboBox to select GNSS frequencies
538 /// @param[in] label Label to show beside the combo box. This has to be a unique id for ImGui.
539 /// @param[in, out] frequency Reference to the frequency object to select
540 /// @param[in] singleSelect If true, only one code can be selected at a time
541 bool ShowFrequencySelector(const char* label, Frequency& frequency, bool singleSelect = false);
542
543 } // namespace NAV
544
545 /// @brief Stream insertion operator overload
546 /// @param[in, out] os Output stream object to stream the time into
547 /// @param[in] obj Object to print
548 /// @return Returns the output stream object in order to chain stream insertions
549 std::ostream& operator<<(std::ostream& os, const NAV::Frequency& obj);
550
551 namespace std
552 {
553 /// @brief Hash function for Frequency (needed for unordered_map)
554 template<>
555 struct hash<NAV::Frequency_>
556 {
557 /// @brief Hash function for Frequency
558 /// @param[in] f Satellite frequency
559 /// @return Has value for the frequency
560 23998158 std::size_t operator()(const NAV::Frequency_& f) const
561 {
562 using namespace NAV; // NOLINT(google-build-using-namespace)
563
28/29
✗ Branch 0 not taken.
✓ Branch 1 taken 2482527 times.
✓ Branch 2 taken 2538704 times.
✓ Branch 3 taken 821960 times.
✓ Branch 4 taken 1049321 times.
✓ Branch 5 taken 1019018 times.
✓ Branch 6 taken 938938 times.
✓ Branch 7 taken 973518 times.
✓ Branch 8 taken 918190 times.
✓ Branch 9 taken 1981434 times.
✓ Branch 10 taken 1979705 times.
✓ Branch 11 taken 41496 times.
✓ Branch 12 taken 318136 times.
✓ Branch 13 taken 318136 times.
✓ Branch 14 taken 782782 times.
✓ Branch 15 taken 729365 times.
✓ Branch 16 taken 334061 times.
✓ Branch 17 taken 690235 times.
✓ Branch 18 taken 704067 times.
✓ Branch 19 taken 223405 times.
✓ Branch 20 taken 795886 times.
✓ Branch 21 taken 796341 times.
✓ Branch 22 taken 768677 times.
✓ Branch 23 taken 630357 times.
✓ Branch 24 taken 630998 times.
✓ Branch 25 taken 2459 times.
✓ Branch 26 taken 774592 times.
✓ Branch 27 taken 753844 times.
✓ Branch 28 taken 6 times.
23998158 switch (f)
564 {
565 case Freq_None:
566 return 2;
567 2482527 case G01:
568 2482527 return 101;
569 2538704 case G02:
570 2538704 return 102;
571 821960 case G05:
572 821960 return 103;
573 1049321 case E01:
574 1049321 return 201;
575 1019018 case E05:
576 1019018 return 202;
577 938938 case E06:
578 938938 return 203;
579 973518 case E07:
580 973518 return 204;
581 918190 case E08:
582 918190 return 205;
583 1981434 case R01:
584 1981434 return 301;
585 1979705 case R02:
586 1979705 return 302;
587 41496 case R03:
588 41496 return 303;
589 318136 case R04:
590 318136 return 304;
591 318136 case R06:
592 318136 return 305;
593 782782 case B01:
594 782782 return 401;
595 729365 case B02:
596 729365 return 402;
597 334061 case B05:
598 334061 return 403;
599 690235 case B06:
600 690235 return 404;
601 704067 case B07:
602 704067 return 405;
603 223405 case B08:
604 223405 return 406;
605 795886 case J01:
606 795886 return 501;
607 796341 case J02:
608 796341 return 502;
609 768677 case J05:
610 768677 return 503;
611 630357 case J06:
612 630357 return 504;
613 630998 case I05:
614 630998 return 601;
615 2459 case I09:
616 2459 return 602;
617 774592 case S01:
618 774592 return 701;
619 753844 case S05:
620 753844 return 702;
621 }
622
623 6 return 0;
624 }
625 };
626 /// @brief Hash function for Frequency (needed for unordered_map)
627 template<>
628 struct hash<NAV::Frequency>
629 {
630 /// @brief Hash function for Frequency
631 /// @param[in] f Satellite frequency
632 /// @return Has value for the frequency
633 173273 std::size_t operator()(const NAV::Frequency& f) const
634 {
635 173273 return std::hash<NAV::Frequency_>()(NAV::Frequency_(f));
636 }
637 };
638 } // namespace std
639
640 #ifndef DOXYGEN_IGNORE
641
642 /// @brief Formatter for Frequency
643 template<>
644 struct fmt::formatter<NAV::Frequency> : fmt::formatter<std::string>
645 {
646 /// @brief Defines how to format Frequency structs
647 /// @param[in] freq Struct to format
648 /// @param[in, out] ctx Format context
649 /// @return Output iterator
650 template<typename FormatContext>
651 173384 auto format(const NAV::Frequency& freq, FormatContext& ctx) const
652 {
653
1/2
✓ Branch 1 taken 173414 times.
✗ Branch 2 not taken.
346774 return fmt::formatter<std::string>::format(std::string(freq), ctx);
654 }
655 };
656
657 #endif
658