MIP_SDK  v3.0.0-208-gdb90bae
MicroStrain Communications Library for embedded systems
data_gnss.hpp
Go to the documentation of this file.
1 #pragma once
2 
5 
7 
8 namespace mip::metadata
9 {
10 
11 
12 template<>
13 struct MetadataFor<data_gnss::PosLlh::ValidFlags>
14 {
16 
17  static constexpr inline BitfieldInfo::Entry entries[] = {
18  { uint32_t(1), "lat_lon", "" },
19  { uint32_t(2), "ellipsoid_height", "" },
20  { uint32_t(4), "msl_height", "" },
21  { uint32_t(8), "horizontal_accuracy", "" },
22  { uint32_t(16), "vertical_accuracy", "" },
23  { uint32_t(31), "flags", "" },
24  };
25 
26  static constexpr inline BitfieldInfo value = {
27  /* .name = */ "ValidFlags",
28  /* .docs = */ "",
29  /* .type = */ Type::U16,
30  /* .entries = */ entries,
31  };
32 
33 };
34 
35 template<>
36 struct MetadataFor<data_gnss::PosLlh>
37 {
39 
40  static constexpr inline ParameterInfo parameters[] = {
41  {
42  /* .name = */ "latitude",
43  /* .docs = */ "[degrees]",
44  /* .type = */ {Type::DOUBLE, nullptr},
45  /* .accessor = */ nullptr, //utils::access<type, double, &type::latitude>,
46  /* .attributes = */ {true, false, false, false, false},
47  /* .count = */ 1,
48  /* .condition = */ {},
49  },
50  {
51  /* .name = */ "longitude",
52  /* .docs = */ "[degrees]",
53  /* .type = */ {Type::DOUBLE, nullptr},
54  /* .accessor = */ nullptr, //utils::access<type, double, &type::longitude>,
55  /* .attributes = */ {true, false, false, false, false},
56  /* .count = */ 1,
57  /* .condition = */ {},
58  },
59  {
60  /* .name = */ "ellipsoid_height",
61  /* .docs = */ "[meters]",
62  /* .type = */ {Type::DOUBLE, nullptr},
63  /* .accessor = */ nullptr, //utils::access<type, double, &type::ellipsoid_height>,
64  /* .attributes = */ {true, false, false, false, false},
65  /* .count = */ 1,
66  /* .condition = */ {},
67  },
68  {
69  /* .name = */ "msl_height",
70  /* .docs = */ "[meters]",
71  /* .type = */ {Type::DOUBLE, nullptr},
72  /* .accessor = */ nullptr, //utils::access<type, double, &type::msl_height>,
73  /* .attributes = */ {true, false, false, false, false},
74  /* .count = */ 1,
75  /* .condition = */ {},
76  },
77  {
78  /* .name = */ "horizontal_accuracy",
79  /* .docs = */ "[meters]",
80  /* .type = */ {Type::FLOAT, nullptr},
81  /* .accessor = */ nullptr, //utils::access<type, float, &type::horizontal_accuracy>,
82  /* .attributes = */ {true, false, false, false, false},
83  /* .count = */ 1,
84  /* .condition = */ {},
85  },
86  {
87  /* .name = */ "vertical_accuracy",
88  /* .docs = */ "[meters]",
89  /* .type = */ {Type::FLOAT, nullptr},
90  /* .accessor = */ nullptr, //utils::access<type, float, &type::vertical_accuracy>,
91  /* .attributes = */ {true, false, false, false, false},
92  /* .count = */ 1,
93  /* .condition = */ {},
94  },
95  {
96  /* .name = */ "valid_flags",
97  /* .docs = */ "",
99  /* .accessor = */ nullptr, //utils::access<type, data_gnss::PosLlh::ValidFlags, &type::valid_flags>,
100  /* .attributes = */ {true, false, false, false, false},
101  /* .count = */ 1,
102  /* .condition = */ {},
103  },
104  };
105 
106  static constexpr inline FieldInfo value = {
107  {
108  /* .name = */ "data_gnss::PosLlh",
109  /* .title = */ "GNSS LLH Position",
110  /* .docs = */ "GNSS reported position in the WGS84 geodetic frame",
111  /* .parameters = */ parameters,
112  },
113  /* .descriptor = */ type::DESCRIPTOR,
114  /* .functions = */ NO_FUNCTIONS,
115  /* .response = */ nullptr,
116  };
117 };
118 
119 template<>
120 struct MetadataFor<data_gnss::PosEcef::ValidFlags>
121 {
123 
124  static constexpr inline BitfieldInfo::Entry entries[] = {
125  { uint32_t(1), "position", "" },
126  { uint32_t(2), "position_accuracy", "" },
127  { uint32_t(3), "flags", "" },
128  };
129 
130  static constexpr inline BitfieldInfo value = {
131  /* .name = */ "ValidFlags",
132  /* .docs = */ "",
133  /* .type = */ Type::U16,
134  /* .entries = */ entries,
135  };
136 
137 };
138 
139 template<>
140 struct MetadataFor<data_gnss::PosEcef>
141 {
143 
144  static constexpr inline ParameterInfo parameters[] = {
145  {
146  /* .name = */ "x",
147  /* .docs = */ "[meters]",
148  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3d>::value},
149  /* .accessor = */ nullptr, //utils::access<type, Vector3d, &type::x>,
150  /* .attributes = */ {true, false, false, false, false},
151  /* .count = */ 1,
152  /* .condition = */ {},
153  },
154  {
155  /* .name = */ "x_accuracy",
156  /* .docs = */ "[meters]",
157  /* .type = */ {Type::FLOAT, nullptr},
158  /* .accessor = */ nullptr, //utils::access<type, float, &type::x_accuracy>,
159  /* .attributes = */ {true, false, false, false, false},
160  /* .count = */ 1,
161  /* .condition = */ {},
162  },
163  {
164  /* .name = */ "valid_flags",
165  /* .docs = */ "",
167  /* .accessor = */ nullptr, //utils::access<type, data_gnss::PosEcef::ValidFlags, &type::valid_flags>,
168  /* .attributes = */ {true, false, false, false, false},
169  /* .count = */ 1,
170  /* .condition = */ {},
171  },
172  };
173 
174  static constexpr inline FieldInfo value = {
175  {
176  /* .name = */ "data_gnss::PosEcef",
177  /* .title = */ "GNSS ECEF Position",
178  /* .docs = */ "GNSS reported position in the Earth-centered, Earth-Fixed (ECEF) frame",
179  /* .parameters = */ parameters,
180  },
181  /* .descriptor = */ type::DESCRIPTOR,
182  /* .functions = */ NO_FUNCTIONS,
183  /* .response = */ nullptr,
184  };
185 };
186 
187 template<>
188 struct MetadataFor<data_gnss::VelNed::ValidFlags>
189 {
191 
192  static constexpr inline BitfieldInfo::Entry entries[] = {
193  { uint32_t(1), "velocity", "" },
194  { uint32_t(2), "speed_3d", "" },
195  { uint32_t(4), "ground_speed", "" },
196  { uint32_t(8), "heading", "" },
197  { uint32_t(16), "speed_accuracy", "" },
198  { uint32_t(32), "heading_accuracy", "" },
199  { uint32_t(63), "flags", "" },
200  };
201 
202  static constexpr inline BitfieldInfo value = {
203  /* .name = */ "ValidFlags",
204  /* .docs = */ "",
205  /* .type = */ Type::U16,
206  /* .entries = */ entries,
207  };
208 
209 };
210 
211 template<>
212 struct MetadataFor<data_gnss::VelNed>
213 {
215 
216  static constexpr inline ParameterInfo parameters[] = {
217  {
218  /* .name = */ "v",
219  /* .docs = */ "[meters/second]",
220  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
221  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::v>,
222  /* .attributes = */ {true, false, false, false, false},
223  /* .count = */ 1,
224  /* .condition = */ {},
225  },
226  {
227  /* .name = */ "speed",
228  /* .docs = */ "[meters/second]",
229  /* .type = */ {Type::FLOAT, nullptr},
230  /* .accessor = */ nullptr, //utils::access<type, float, &type::speed>,
231  /* .attributes = */ {true, false, false, false, false},
232  /* .count = */ 1,
233  /* .condition = */ {},
234  },
235  {
236  /* .name = */ "ground_speed",
237  /* .docs = */ "[meters/second]",
238  /* .type = */ {Type::FLOAT, nullptr},
239  /* .accessor = */ nullptr, //utils::access<type, float, &type::ground_speed>,
240  /* .attributes = */ {true, false, false, false, false},
241  /* .count = */ 1,
242  /* .condition = */ {},
243  },
244  {
245  /* .name = */ "heading",
246  /* .docs = */ "[degrees]",
247  /* .type = */ {Type::FLOAT, nullptr},
248  /* .accessor = */ nullptr, //utils::access<type, float, &type::heading>,
249  /* .attributes = */ {true, false, false, false, false},
250  /* .count = */ 1,
251  /* .condition = */ {},
252  },
253  {
254  /* .name = */ "speed_accuracy",
255  /* .docs = */ "[meters/second]",
256  /* .type = */ {Type::FLOAT, nullptr},
257  /* .accessor = */ nullptr, //utils::access<type, float, &type::speed_accuracy>,
258  /* .attributes = */ {true, false, false, false, false},
259  /* .count = */ 1,
260  /* .condition = */ {},
261  },
262  {
263  /* .name = */ "heading_accuracy",
264  /* .docs = */ "[degrees]",
265  /* .type = */ {Type::FLOAT, nullptr},
266  /* .accessor = */ nullptr, //utils::access<type, float, &type::heading_accuracy>,
267  /* .attributes = */ {true, false, false, false, false},
268  /* .count = */ 1,
269  /* .condition = */ {},
270  },
271  {
272  /* .name = */ "valid_flags",
273  /* .docs = */ "",
275  /* .accessor = */ nullptr, //utils::access<type, data_gnss::VelNed::ValidFlags, &type::valid_flags>,
276  /* .attributes = */ {true, false, false, false, false},
277  /* .count = */ 1,
278  /* .condition = */ {},
279  },
280  };
281 
282  static constexpr inline FieldInfo value = {
283  {
284  /* .name = */ "data_gnss::VelNed",
285  /* .title = */ "NED Velocity",
286  /* .docs = */ "GNSS reported velocity in the NED frame",
287  /* .parameters = */ parameters,
288  },
289  /* .descriptor = */ type::DESCRIPTOR,
290  /* .functions = */ NO_FUNCTIONS,
291  /* .response = */ nullptr,
292  };
293 };
294 
295 template<>
296 struct MetadataFor<data_gnss::VelEcef::ValidFlags>
297 {
299 
300  static constexpr inline BitfieldInfo::Entry entries[] = {
301  { uint32_t(1), "velocity", "" },
302  { uint32_t(2), "velocity_accuracy", "" },
303  { uint32_t(3), "flags", "" },
304  };
305 
306  static constexpr inline BitfieldInfo value = {
307  /* .name = */ "ValidFlags",
308  /* .docs = */ "",
309  /* .type = */ Type::U16,
310  /* .entries = */ entries,
311  };
312 
313 };
314 
315 template<>
316 struct MetadataFor<data_gnss::VelEcef>
317 {
319 
320  static constexpr inline ParameterInfo parameters[] = {
321  {
322  /* .name = */ "v",
323  /* .docs = */ "[meters/second]",
324  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
325  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::v>,
326  /* .attributes = */ {true, false, false, false, false},
327  /* .count = */ 1,
328  /* .condition = */ {},
329  },
330  {
331  /* .name = */ "v_accuracy",
332  /* .docs = */ "[meters/second]",
333  /* .type = */ {Type::FLOAT, nullptr},
334  /* .accessor = */ nullptr, //utils::access<type, float, &type::v_accuracy>,
335  /* .attributes = */ {true, false, false, false, false},
336  /* .count = */ 1,
337  /* .condition = */ {},
338  },
339  {
340  /* .name = */ "valid_flags",
341  /* .docs = */ "",
343  /* .accessor = */ nullptr, //utils::access<type, data_gnss::VelEcef::ValidFlags, &type::valid_flags>,
344  /* .attributes = */ {true, false, false, false, false},
345  /* .count = */ 1,
346  /* .condition = */ {},
347  },
348  };
349 
350  static constexpr inline FieldInfo value = {
351  {
352  /* .name = */ "data_gnss::VelEcef",
353  /* .title = */ "GNSS ECEF Velocity",
354  /* .docs = */ "GNSS reported velocity in the Earth-centered, Earth-Fixed (ECEF) frame",
355  /* .parameters = */ parameters,
356  },
357  /* .descriptor = */ type::DESCRIPTOR,
358  /* .functions = */ NO_FUNCTIONS,
359  /* .response = */ nullptr,
360  };
361 };
362 
363 template<>
364 struct MetadataFor<data_gnss::Dop::ValidFlags>
365 {
367 
368  static constexpr inline BitfieldInfo::Entry entries[] = {
369  { uint32_t(1), "gdop", "" },
370  { uint32_t(2), "pdop", "" },
371  { uint32_t(4), "hdop", "" },
372  { uint32_t(8), "vdop", "" },
373  { uint32_t(16), "tdop", "" },
374  { uint32_t(32), "ndop", "" },
375  { uint32_t(64), "edop", "" },
376  { uint32_t(127), "flags", "" },
377  };
378 
379  static constexpr inline BitfieldInfo value = {
380  /* .name = */ "ValidFlags",
381  /* .docs = */ "",
382  /* .type = */ Type::U16,
383  /* .entries = */ entries,
384  };
385 
386 };
387 
388 template<>
389 struct MetadataFor<data_gnss::Dop>
390 {
392 
393  static constexpr inline ParameterInfo parameters[] = {
394  {
395  /* .name = */ "gdop",
396  /* .docs = */ "Geometric DOP",
397  /* .type = */ {Type::FLOAT, nullptr},
398  /* .accessor = */ nullptr, //utils::access<type, float, &type::gdop>,
399  /* .attributes = */ {true, false, false, false, false},
400  /* .count = */ 1,
401  /* .condition = */ {},
402  },
403  {
404  /* .name = */ "pdop",
405  /* .docs = */ "Position DOP",
406  /* .type = */ {Type::FLOAT, nullptr},
407  /* .accessor = */ nullptr, //utils::access<type, float, &type::pdop>,
408  /* .attributes = */ {true, false, false, false, false},
409  /* .count = */ 1,
410  /* .condition = */ {},
411  },
412  {
413  /* .name = */ "hdop",
414  /* .docs = */ "Horizontal DOP",
415  /* .type = */ {Type::FLOAT, nullptr},
416  /* .accessor = */ nullptr, //utils::access<type, float, &type::hdop>,
417  /* .attributes = */ {true, false, false, false, false},
418  /* .count = */ 1,
419  /* .condition = */ {},
420  },
421  {
422  /* .name = */ "vdop",
423  /* .docs = */ "Vertical DOP",
424  /* .type = */ {Type::FLOAT, nullptr},
425  /* .accessor = */ nullptr, //utils::access<type, float, &type::vdop>,
426  /* .attributes = */ {true, false, false, false, false},
427  /* .count = */ 1,
428  /* .condition = */ {},
429  },
430  {
431  /* .name = */ "tdop",
432  /* .docs = */ "Time DOP",
433  /* .type = */ {Type::FLOAT, nullptr},
434  /* .accessor = */ nullptr, //utils::access<type, float, &type::tdop>,
435  /* .attributes = */ {true, false, false, false, false},
436  /* .count = */ 1,
437  /* .condition = */ {},
438  },
439  {
440  /* .name = */ "ndop",
441  /* .docs = */ "Northing DOP",
442  /* .type = */ {Type::FLOAT, nullptr},
443  /* .accessor = */ nullptr, //utils::access<type, float, &type::ndop>,
444  /* .attributes = */ {true, false, false, false, false},
445  /* .count = */ 1,
446  /* .condition = */ {},
447  },
448  {
449  /* .name = */ "edop",
450  /* .docs = */ "Easting DOP",
451  /* .type = */ {Type::FLOAT, nullptr},
452  /* .accessor = */ nullptr, //utils::access<type, float, &type::edop>,
453  /* .attributes = */ {true, false, false, false, false},
454  /* .count = */ 1,
455  /* .condition = */ {},
456  },
457  {
458  /* .name = */ "valid_flags",
459  /* .docs = */ "",
461  /* .accessor = */ nullptr, //utils::access<type, data_gnss::Dop::ValidFlags, &type::valid_flags>,
462  /* .attributes = */ {true, false, false, false, false},
463  /* .count = */ 1,
464  /* .condition = */ {},
465  },
466  };
467 
468  static constexpr inline FieldInfo value = {
469  {
470  /* .name = */ "data_gnss::Dop",
471  /* .title = */ "dop",
472  /* .docs = */ "GNSS reported dilution of precision information.",
473  /* .parameters = */ parameters,
474  },
475  /* .descriptor = */ type::DESCRIPTOR,
476  /* .functions = */ NO_FUNCTIONS,
477  /* .response = */ nullptr,
478  };
479 };
480 
481 template<>
482 struct MetadataFor<data_gnss::UtcTime::ValidFlags>
483 {
485 
486  static constexpr inline BitfieldInfo::Entry entries[] = {
487  { uint32_t(1), "gnss_date_time", "" },
488  { uint32_t(2), "leap_seconds_known", "" },
489  { uint32_t(3), "flags", "" },
490  };
491 
492  static constexpr inline BitfieldInfo value = {
493  /* .name = */ "ValidFlags",
494  /* .docs = */ "",
495  /* .type = */ Type::U16,
496  /* .entries = */ entries,
497  };
498 
499 };
500 
501 template<>
502 struct MetadataFor<data_gnss::UtcTime>
503 {
505 
506  static constexpr inline ParameterInfo parameters[] = {
507  {
508  /* .name = */ "year",
509  /* .docs = */ "",
510  /* .type = */ {Type::U16, nullptr},
511  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::year>,
512  /* .attributes = */ {true, false, false, false, false},
513  /* .count = */ 1,
514  /* .condition = */ {},
515  },
516  {
517  /* .name = */ "month",
518  /* .docs = */ "Month (1-12)",
519  /* .type = */ {Type::U8, nullptr},
520  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::month>,
521  /* .attributes = */ {true, false, false, false, false},
522  /* .count = */ 1,
523  /* .condition = */ {},
524  },
525  {
526  /* .name = */ "day",
527  /* .docs = */ "Day (1-31)",
528  /* .type = */ {Type::U8, nullptr},
529  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::day>,
530  /* .attributes = */ {true, false, false, false, false},
531  /* .count = */ 1,
532  /* .condition = */ {},
533  },
534  {
535  /* .name = */ "hour",
536  /* .docs = */ "Hour (0-23)",
537  /* .type = */ {Type::U8, nullptr},
538  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::hour>,
539  /* .attributes = */ {true, false, false, false, false},
540  /* .count = */ 1,
541  /* .condition = */ {},
542  },
543  {
544  /* .name = */ "min",
545  /* .docs = */ "Minute (0-59)",
546  /* .type = */ {Type::U8, nullptr},
547  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::min>,
548  /* .attributes = */ {true, false, false, false, false},
549  /* .count = */ 1,
550  /* .condition = */ {},
551  },
552  {
553  /* .name = */ "sec",
554  /* .docs = */ "Second (0-59)",
555  /* .type = */ {Type::U8, nullptr},
556  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sec>,
557  /* .attributes = */ {true, false, false, false, false},
558  /* .count = */ 1,
559  /* .condition = */ {},
560  },
561  {
562  /* .name = */ "msec",
563  /* .docs = */ "Millisecond(0-999)",
564  /* .type = */ {Type::U32, nullptr},
565  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::msec>,
566  /* .attributes = */ {true, false, false, false, false},
567  /* .count = */ 1,
568  /* .condition = */ {},
569  },
570  {
571  /* .name = */ "valid_flags",
572  /* .docs = */ "",
574  /* .accessor = */ nullptr, //utils::access<type, data_gnss::UtcTime::ValidFlags, &type::valid_flags>,
575  /* .attributes = */ {true, false, false, false, false},
576  /* .count = */ 1,
577  /* .condition = */ {},
578  },
579  };
580 
581  static constexpr inline FieldInfo value = {
582  {
583  /* .name = */ "data_gnss::UtcTime",
584  /* .title = */ "utc_time",
585  /* .docs = */ "GNSS reported Coordinated Universal Time",
586  /* .parameters = */ parameters,
587  },
588  /* .descriptor = */ type::DESCRIPTOR,
589  /* .functions = */ NO_FUNCTIONS,
590  /* .response = */ nullptr,
591  };
592 };
593 
594 template<>
595 struct MetadataFor<data_gnss::GpsTime::ValidFlags>
596 {
598 
599  static constexpr inline BitfieldInfo::Entry entries[] = {
600  { uint32_t(1), "tow", "" },
601  { uint32_t(2), "week_number", "" },
602  { uint32_t(3), "flags", "" },
603  };
604 
605  static constexpr inline BitfieldInfo value = {
606  /* .name = */ "ValidFlags",
607  /* .docs = */ "",
608  /* .type = */ Type::U16,
609  /* .entries = */ entries,
610  };
611 
612 };
613 
614 template<>
615 struct MetadataFor<data_gnss::GpsTime>
616 {
618 
619  static constexpr inline ParameterInfo parameters[] = {
620  {
621  /* .name = */ "tow",
622  /* .docs = */ "GPS Time of week [seconds]",
623  /* .type = */ {Type::DOUBLE, nullptr},
624  /* .accessor = */ nullptr, //utils::access<type, double, &type::tow>,
625  /* .attributes = */ {true, false, false, false, false},
626  /* .count = */ 1,
627  /* .condition = */ {},
628  },
629  {
630  /* .name = */ "week_number",
631  /* .docs = */ "GPS Week since 1980 [weeks]",
632  /* .type = */ {Type::U16, nullptr},
633  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
634  /* .attributes = */ {true, false, false, false, false},
635  /* .count = */ 1,
636  /* .condition = */ {},
637  },
638  {
639  /* .name = */ "valid_flags",
640  /* .docs = */ "",
642  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GpsTime::ValidFlags, &type::valid_flags>,
643  /* .attributes = */ {true, false, false, false, false},
644  /* .count = */ 1,
645  /* .condition = */ {},
646  },
647  };
648 
649  static constexpr inline FieldInfo value = {
650  {
651  /* .name = */ "data_gnss::GpsTime",
652  /* .title = */ "gps_time",
653  /* .docs = */ "GNSS reported GPS Time",
654  /* .parameters = */ parameters,
655  },
656  /* .descriptor = */ type::DESCRIPTOR,
657  /* .functions = */ NO_FUNCTIONS,
658  /* .response = */ nullptr,
659  };
660 };
661 
662 template<>
663 struct MetadataFor<data_gnss::ClockInfo::ValidFlags>
664 {
666 
667  static constexpr inline BitfieldInfo::Entry entries[] = {
668  { uint32_t(1), "bias", "" },
669  { uint32_t(2), "drift", "" },
670  { uint32_t(4), "accuracy_estimate", "" },
671  { uint32_t(7), "flags", "" },
672  };
673 
674  static constexpr inline BitfieldInfo value = {
675  /* .name = */ "ValidFlags",
676  /* .docs = */ "",
677  /* .type = */ Type::U16,
678  /* .entries = */ entries,
679  };
680 
681 };
682 
683 template<>
684 struct MetadataFor<data_gnss::ClockInfo>
685 {
687 
688  static constexpr inline ParameterInfo parameters[] = {
689  {
690  /* .name = */ "bias",
691  /* .docs = */ "[seconds]",
692  /* .type = */ {Type::DOUBLE, nullptr},
693  /* .accessor = */ nullptr, //utils::access<type, double, &type::bias>,
694  /* .attributes = */ {true, false, false, false, false},
695  /* .count = */ 1,
696  /* .condition = */ {},
697  },
698  {
699  /* .name = */ "drift",
700  /* .docs = */ "[seconds/second]",
701  /* .type = */ {Type::DOUBLE, nullptr},
702  /* .accessor = */ nullptr, //utils::access<type, double, &type::drift>,
703  /* .attributes = */ {true, false, false, false, false},
704  /* .count = */ 1,
705  /* .condition = */ {},
706  },
707  {
708  /* .name = */ "accuracy_estimate",
709  /* .docs = */ "[seconds]",
710  /* .type = */ {Type::DOUBLE, nullptr},
711  /* .accessor = */ nullptr, //utils::access<type, double, &type::accuracy_estimate>,
712  /* .attributes = */ {true, false, false, false, false},
713  /* .count = */ 1,
714  /* .condition = */ {},
715  },
716  {
717  /* .name = */ "valid_flags",
718  /* .docs = */ "",
720  /* .accessor = */ nullptr, //utils::access<type, data_gnss::ClockInfo::ValidFlags, &type::valid_flags>,
721  /* .attributes = */ {true, false, false, false, false},
722  /* .count = */ 1,
723  /* .condition = */ {},
724  },
725  };
726 
727  static constexpr inline FieldInfo value = {
728  {
729  /* .name = */ "data_gnss::ClockInfo",
730  /* .title = */ "clock_info",
731  /* .docs = */ "GNSS reported receiver clock parameters",
732  /* .parameters = */ parameters,
733  },
734  /* .descriptor = */ type::DESCRIPTOR,
735  /* .functions = */ NO_FUNCTIONS,
736  /* .response = */ nullptr,
737  };
738 };
739 
740 template<>
741 struct MetadataFor<data_gnss::FixInfo::FixType>
742 {
744 
745  static constexpr inline EnumInfo::Entry entries[] = {
746  { uint32_t(0), "FIX_3D", "" },
747  { uint32_t(1), "FIX_2D", "" },
748  { uint32_t(2), "FIX_TIME_ONLY", "" },
749  { uint32_t(3), "FIX_NONE", "" },
750  { uint32_t(4), "FIX_INVALID", "" },
751  { uint32_t(5), "FIX_RTK_FLOAT", "" },
752  { uint32_t(6), "FIX_RTK_FIXED", "" },
753  { uint32_t(7), "FIX_DIFFERENTIAL", "" },
754  };
755 
756  static constexpr inline EnumInfo value = {
757  /* .name = */ "FixType",
758  /* .docs = */ "",
759  /* .type = */ Type::U8,
760  /* .entries = */ entries,
761  };
762 
763 };
764 
765 template<>
766 struct MetadataFor<data_gnss::FixInfo::FixFlags>
767 {
769 
770  static constexpr inline BitfieldInfo::Entry entries[] = {
771  { uint32_t(1), "sbas_used", "" },
772  { uint32_t(2), "dgnss_used", "" },
773  };
774 
775  static constexpr inline BitfieldInfo value = {
776  /* .name = */ "FixFlags",
777  /* .docs = */ "",
778  /* .type = */ Type::U16,
779  /* .entries = */ entries,
780  };
781 
782 };
783 
784 template<>
785 struct MetadataFor<data_gnss::FixInfo::ValidFlags>
786 {
788 
789  static constexpr inline BitfieldInfo::Entry entries[] = {
790  { uint32_t(1), "fix_type", "" },
791  { uint32_t(2), "num_sv", "" },
792  { uint32_t(4), "fix_flags", "" },
793  { uint32_t(7), "flags", "" },
794  };
795 
796  static constexpr inline BitfieldInfo value = {
797  /* .name = */ "ValidFlags",
798  /* .docs = */ "",
799  /* .type = */ Type::U16,
800  /* .entries = */ entries,
801  };
802 
803 };
804 
805 template<>
806 struct MetadataFor<data_gnss::FixInfo>
807 {
809 
810  static constexpr inline ParameterInfo parameters[] = {
811  {
812  /* .name = */ "fix_type",
813  /* .docs = */ "",
815  /* .accessor = */ nullptr, //utils::access<type, data_gnss::FixInfo::FixType, &type::fix_type>,
816  /* .attributes = */ {true, false, false, false, false},
817  /* .count = */ 1,
818  /* .condition = */ {},
819  },
820  {
821  /* .name = */ "num_sv",
822  /* .docs = */ "",
823  /* .type = */ {Type::U8, nullptr},
824  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_sv>,
825  /* .attributes = */ {true, false, false, false, false},
826  /* .count = */ 1,
827  /* .condition = */ {},
828  },
829  {
830  /* .name = */ "fix_flags",
831  /* .docs = */ "",
833  /* .accessor = */ nullptr, //utils::access<type, data_gnss::FixInfo::FixFlags, &type::fix_flags>,
834  /* .attributes = */ {true, false, false, false, false},
835  /* .count = */ 1,
836  /* .condition = */ {},
837  },
838  {
839  /* .name = */ "valid_flags",
840  /* .docs = */ "",
842  /* .accessor = */ nullptr, //utils::access<type, data_gnss::FixInfo::ValidFlags, &type::valid_flags>,
843  /* .attributes = */ {true, false, false, false, false},
844  /* .count = */ 1,
845  /* .condition = */ {},
846  },
847  };
848 
849  static constexpr inline FieldInfo value = {
850  {
851  /* .name = */ "data_gnss::FixInfo",
852  /* .title = */ "fix_info",
853  /* .docs = */ "GNSS reported position fix type",
854  /* .parameters = */ parameters,
855  },
856  /* .descriptor = */ type::DESCRIPTOR,
857  /* .functions = */ NO_FUNCTIONS,
858  /* .response = */ nullptr,
859  };
860 };
861 
862 template<>
863 struct MetadataFor<data_gnss::SvInfo::SVFlags>
864 {
866 
867  static constexpr inline BitfieldInfo::Entry entries[] = {
868  { uint32_t(1), "used_for_navigation", "" },
869  { uint32_t(2), "healthy", "" },
870  };
871 
872  static constexpr inline BitfieldInfo value = {
873  /* .name = */ "SVFlags",
874  /* .docs = */ "",
875  /* .type = */ Type::U16,
876  /* .entries = */ entries,
877  };
878 
879 };
880 
881 template<>
882 struct MetadataFor<data_gnss::SvInfo::ValidFlags>
883 {
885 
886  static constexpr inline BitfieldInfo::Entry entries[] = {
887  { uint32_t(1), "channel", "" },
888  { uint32_t(2), "sv_id", "" },
889  { uint32_t(4), "carrier_noise_ratio", "" },
890  { uint32_t(8), "azimuth", "" },
891  { uint32_t(16), "elevation", "" },
892  { uint32_t(32), "sv_flags", "" },
893  { uint32_t(63), "flags", "" },
894  };
895 
896  static constexpr inline BitfieldInfo value = {
897  /* .name = */ "ValidFlags",
898  /* .docs = */ "",
899  /* .type = */ Type::U16,
900  /* .entries = */ entries,
901  };
902 
903 };
904 
905 template<>
906 struct MetadataFor<data_gnss::SvInfo>
907 {
909 
910  static constexpr inline ParameterInfo parameters[] = {
911  {
912  /* .name = */ "channel",
913  /* .docs = */ "Receiver channel number",
914  /* .type = */ {Type::U8, nullptr},
915  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::channel>,
916  /* .attributes = */ {true, false, false, false, false},
917  /* .count = */ 1,
918  /* .condition = */ {},
919  },
920  {
921  /* .name = */ "sv_id",
922  /* .docs = */ "GNSS Satellite ID",
923  /* .type = */ {Type::U8, nullptr},
924  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sv_id>,
925  /* .attributes = */ {true, false, false, false, false},
926  /* .count = */ 1,
927  /* .condition = */ {},
928  },
929  {
930  /* .name = */ "carrier_noise_ratio",
931  /* .docs = */ "[dBHz]",
932  /* .type = */ {Type::U16, nullptr},
933  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::carrier_noise_ratio>,
934  /* .attributes = */ {true, false, false, false, false},
935  /* .count = */ 1,
936  /* .condition = */ {},
937  },
938  {
939  /* .name = */ "azimuth",
940  /* .docs = */ "[deg]",
941  /* .type = */ {Type::S16, nullptr},
942  /* .accessor = */ nullptr, //utils::access<type, int16_t, &type::azimuth>,
943  /* .attributes = */ {true, false, false, false, false},
944  /* .count = */ 1,
945  /* .condition = */ {},
946  },
947  {
948  /* .name = */ "elevation",
949  /* .docs = */ "[deg]",
950  /* .type = */ {Type::S16, nullptr},
951  /* .accessor = */ nullptr, //utils::access<type, int16_t, &type::elevation>,
952  /* .attributes = */ {true, false, false, false, false},
953  /* .count = */ 1,
954  /* .condition = */ {},
955  },
956  {
957  /* .name = */ "sv_flags",
958  /* .docs = */ "",
960  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SvInfo::SVFlags, &type::sv_flags>,
961  /* .attributes = */ {true, false, false, false, false},
962  /* .count = */ 1,
963  /* .condition = */ {},
964  },
965  {
966  /* .name = */ "valid_flags",
967  /* .docs = */ "",
969  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SvInfo::ValidFlags, &type::valid_flags>,
970  /* .attributes = */ {true, false, false, false, false},
971  /* .count = */ 1,
972  /* .condition = */ {},
973  },
974  };
975 
976  static constexpr inline FieldInfo value = {
977  {
978  /* .name = */ "data_gnss::SvInfo",
979  /* .title = */ "sv_info",
980  /* .docs = */ "GNSS reported space vehicle information\n\nWhen enabled, these fields will arrive in separate MIP packets",
981  /* .parameters = */ parameters,
982  },
983  /* .descriptor = */ type::DESCRIPTOR,
984  /* .functions = */ NO_FUNCTIONS,
985  /* .response = */ nullptr,
986  };
987 };
988 
989 template<>
990 struct MetadataFor<data_gnss::HwStatus::ReceiverState>
991 {
993 
994  static constexpr inline EnumInfo::Entry entries[] = {
995  { uint32_t(0), "OFF", "" },
996  { uint32_t(1), "ON", "" },
997  { uint32_t(2), "UNKNOWN", "" },
998  };
999 
1000  static constexpr inline EnumInfo value = {
1001  /* .name = */ "ReceiverState",
1002  /* .docs = */ "",
1003  /* .type = */ Type::U8,
1004  /* .entries = */ entries,
1005  };
1006 
1007 };
1008 
1009 template<>
1010 struct MetadataFor<data_gnss::HwStatus::AntennaState>
1011 {
1013 
1014  static constexpr inline EnumInfo::Entry entries[] = {
1015  { uint32_t(1), "INIT", "" },
1016  { uint32_t(2), "SHORT", "" },
1017  { uint32_t(3), "OPEN", "" },
1018  { uint32_t(4), "GOOD", "" },
1019  { uint32_t(5), "UNKNOWN", "" },
1020  };
1021 
1022  static constexpr inline EnumInfo value = {
1023  /* .name = */ "AntennaState",
1024  /* .docs = */ "",
1025  /* .type = */ Type::U8,
1026  /* .entries = */ entries,
1027  };
1028 
1029 };
1030 
1031 template<>
1032 struct MetadataFor<data_gnss::HwStatus::AntennaPower>
1033 {
1035 
1036  static constexpr inline EnumInfo::Entry entries[] = {
1037  { uint32_t(0), "OFF", "" },
1038  { uint32_t(1), "ON", "" },
1039  { uint32_t(2), "UNKNOWN", "" },
1040  };
1041 
1042  static constexpr inline EnumInfo value = {
1043  /* .name = */ "AntennaPower",
1044  /* .docs = */ "",
1045  /* .type = */ Type::U8,
1046  /* .entries = */ entries,
1047  };
1048 
1049 };
1050 
1051 template<>
1052 struct MetadataFor<data_gnss::HwStatus::ValidFlags>
1053 {
1055 
1056  static constexpr inline BitfieldInfo::Entry entries[] = {
1057  { uint32_t(1), "sensor_state", "" },
1058  { uint32_t(2), "antenna_state", "" },
1059  { uint32_t(4), "antenna_power", "" },
1060  { uint32_t(7), "flags", "" },
1061  };
1062 
1063  static constexpr inline BitfieldInfo value = {
1064  /* .name = */ "ValidFlags",
1065  /* .docs = */ "",
1066  /* .type = */ Type::U16,
1067  /* .entries = */ entries,
1068  };
1069 
1070 };
1071 
1072 template<>
1073 struct MetadataFor<data_gnss::HwStatus>
1074 {
1076 
1077  static constexpr inline ParameterInfo parameters[] = {
1078  {
1079  /* .name = */ "receiver_state",
1080  /* .docs = */ "",
1082  /* .accessor = */ nullptr, //utils::access<type, data_gnss::HwStatus::ReceiverState, &type::receiver_state>,
1083  /* .attributes = */ {true, false, false, false, false},
1084  /* .count = */ 1,
1085  /* .condition = */ {},
1086  },
1087  {
1088  /* .name = */ "antenna_state",
1089  /* .docs = */ "",
1091  /* .accessor = */ nullptr, //utils::access<type, data_gnss::HwStatus::AntennaState, &type::antenna_state>,
1092  /* .attributes = */ {true, false, false, false, false},
1093  /* .count = */ 1,
1094  /* .condition = */ {},
1095  },
1096  {
1097  /* .name = */ "antenna_power",
1098  /* .docs = */ "",
1100  /* .accessor = */ nullptr, //utils::access<type, data_gnss::HwStatus::AntennaPower, &type::antenna_power>,
1101  /* .attributes = */ {true, false, false, false, false},
1102  /* .count = */ 1,
1103  /* .condition = */ {},
1104  },
1105  {
1106  /* .name = */ "valid_flags",
1107  /* .docs = */ "",
1109  /* .accessor = */ nullptr, //utils::access<type, data_gnss::HwStatus::ValidFlags, &type::valid_flags>,
1110  /* .attributes = */ {true, false, false, false, false},
1111  /* .count = */ 1,
1112  /* .condition = */ {},
1113  },
1114  };
1115 
1116  static constexpr inline FieldInfo value = {
1117  {
1118  /* .name = */ "data_gnss::HwStatus",
1119  /* .title = */ "GNSS Hardware Status",
1120  /* .docs = */ "GNSS reported hardware status",
1121  /* .parameters = */ parameters,
1122  },
1123  /* .descriptor = */ type::DESCRIPTOR,
1124  /* .functions = */ NO_FUNCTIONS,
1125  /* .response = */ nullptr,
1126  };
1127 };
1128 
1129 template<>
1130 struct MetadataFor<data_gnss::DgpsInfo::ValidFlags>
1131 {
1133 
1134  static constexpr inline BitfieldInfo::Entry entries[] = {
1135  { uint32_t(1), "age", "" },
1136  { uint32_t(2), "base_station_id", "" },
1137  { uint32_t(4), "base_station_status", "" },
1138  { uint32_t(8), "num_channels", "" },
1139  { uint32_t(15), "flags", "" },
1140  };
1141 
1142  static constexpr inline BitfieldInfo value = {
1143  /* .name = */ "ValidFlags",
1144  /* .docs = */ "",
1145  /* .type = */ Type::U16,
1146  /* .entries = */ entries,
1147  };
1148 
1149 };
1150 
1151 template<>
1152 struct MetadataFor<data_gnss::DgpsInfo>
1153 {
1155 
1156  static constexpr inline ParameterInfo parameters[] = {
1157  {
1158  /* .name = */ "sv_id",
1159  /* .docs = */ "",
1160  /* .type = */ {Type::U8, nullptr},
1161  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sv_id>,
1162  /* .attributes = */ {true, false, false, false, false},
1163  /* .count = */ 1,
1164  /* .condition = */ {},
1165  },
1166  {
1167  /* .name = */ "age",
1168  /* .docs = */ "",
1169  /* .type = */ {Type::FLOAT, nullptr},
1170  /* .accessor = */ nullptr, //utils::access<type, float, &type::age>,
1171  /* .attributes = */ {true, false, false, false, false},
1172  /* .count = */ 1,
1173  /* .condition = */ {},
1174  },
1175  {
1176  /* .name = */ "range_correction",
1177  /* .docs = */ "",
1178  /* .type = */ {Type::FLOAT, nullptr},
1179  /* .accessor = */ nullptr, //utils::access<type, float, &type::range_correction>,
1180  /* .attributes = */ {true, false, false, false, false},
1181  /* .count = */ 1,
1182  /* .condition = */ {},
1183  },
1184  {
1185  /* .name = */ "range_rate_correction",
1186  /* .docs = */ "",
1187  /* .type = */ {Type::FLOAT, nullptr},
1188  /* .accessor = */ nullptr, //utils::access<type, float, &type::range_rate_correction>,
1189  /* .attributes = */ {true, false, false, false, false},
1190  /* .count = */ 1,
1191  /* .condition = */ {},
1192  },
1193  {
1194  /* .name = */ "valid_flags",
1195  /* .docs = */ "",
1197  /* .accessor = */ nullptr, //utils::access<type, data_gnss::DgpsInfo::ValidFlags, &type::valid_flags>,
1198  /* .attributes = */ {true, false, false, false, false},
1199  /* .count = */ 1,
1200  /* .condition = */ {},
1201  },
1202  };
1203 
1204  static constexpr inline FieldInfo value = {
1205  {
1206  /* .name = */ "data_gnss::DgpsInfo",
1207  /* .title = */ "dgps_info",
1208  /* .docs = */ "GNSS reported DGNSS status\n\n<pre>Possible Base Station Status Values:</pre>\n<pre> 0 - UDRE Scale Factor = 1.0</pre>\n<pre> 1 - UDRE Scale Factor = 0.75</pre>\n<pre> 2 - UDRE Scale Factor = 0.5</pre>\n<pre> 3 - UDRE Scale Factor = 0.3</pre>\n<pre> 4 - UDRE Scale Factor = 0.2</pre>\n<pre> 5 - UDRE Scale Factor = 0.1</pre>\n<pre> 6 - Reference Station Transmission Not Monitored</pre>\n<pre> 7 - Reference Station Not Working</pre>\n\n(UDRE = User Differential Range Error)",
1209  /* .parameters = */ parameters,
1210  },
1211  /* .descriptor = */ type::DESCRIPTOR,
1212  /* .functions = */ NO_FUNCTIONS,
1213  /* .response = */ nullptr,
1214  };
1215 };
1216 
1217 template<>
1218 struct MetadataFor<data_gnss::DgpsChannel::ValidFlags>
1219 {
1221 
1222  static constexpr inline BitfieldInfo::Entry entries[] = {
1223  { uint32_t(1), "id", "" },
1224  { uint32_t(2), "age", "" },
1225  { uint32_t(4), "range_correction", "" },
1226  { uint32_t(8), "range_rate_correction", "" },
1227  { uint32_t(15), "flags", "" },
1228  };
1229 
1230  static constexpr inline BitfieldInfo value = {
1231  /* .name = */ "ValidFlags",
1232  /* .docs = */ "",
1233  /* .type = */ Type::U16,
1234  /* .entries = */ entries,
1235  };
1236 
1237 };
1238 
1239 template<>
1240 struct MetadataFor<data_gnss::DgpsChannel>
1241 {
1243 
1244  static constexpr inline ParameterInfo parameters[] = {
1245  {
1246  /* .name = */ "sv_id",
1247  /* .docs = */ "",
1248  /* .type = */ {Type::U8, nullptr},
1249  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sv_id>,
1250  /* .attributes = */ {true, false, false, false, false},
1251  /* .count = */ 1,
1252  /* .condition = */ {},
1253  },
1254  {
1255  /* .name = */ "age",
1256  /* .docs = */ "[s]",
1257  /* .type = */ {Type::FLOAT, nullptr},
1258  /* .accessor = */ nullptr, //utils::access<type, float, &type::age>,
1259  /* .attributes = */ {true, false, false, false, false},
1260  /* .count = */ 1,
1261  /* .condition = */ {},
1262  },
1263  {
1264  /* .name = */ "range_correction",
1265  /* .docs = */ "[m]",
1266  /* .type = */ {Type::FLOAT, nullptr},
1267  /* .accessor = */ nullptr, //utils::access<type, float, &type::range_correction>,
1268  /* .attributes = */ {true, false, false, false, false},
1269  /* .count = */ 1,
1270  /* .condition = */ {},
1271  },
1272  {
1273  /* .name = */ "range_rate_correction",
1274  /* .docs = */ "[m/s]",
1275  /* .type = */ {Type::FLOAT, nullptr},
1276  /* .accessor = */ nullptr, //utils::access<type, float, &type::range_rate_correction>,
1277  /* .attributes = */ {true, false, false, false, false},
1278  /* .count = */ 1,
1279  /* .condition = */ {},
1280  },
1281  {
1282  /* .name = */ "valid_flags",
1283  /* .docs = */ "",
1285  /* .accessor = */ nullptr, //utils::access<type, data_gnss::DgpsChannel::ValidFlags, &type::valid_flags>,
1286  /* .attributes = */ {true, false, false, false, false},
1287  /* .count = */ 1,
1288  /* .condition = */ {},
1289  },
1290  };
1291 
1292  static constexpr inline FieldInfo value = {
1293  {
1294  /* .name = */ "data_gnss::DgpsChannel",
1295  /* .title = */ "dgps_channel",
1296  /* .docs = */ "GNSS reported DGPS Channel Status status\n\nWhen enabled, a separate field for each active space vehicle will be sent in the packet.",
1297  /* .parameters = */ parameters,
1298  },
1299  /* .descriptor = */ type::DESCRIPTOR,
1300  /* .functions = */ NO_FUNCTIONS,
1301  /* .response = */ nullptr,
1302  };
1303 };
1304 
1305 template<>
1306 struct MetadataFor<data_gnss::ClockInfo2::ValidFlags>
1307 {
1309 
1310  static constexpr inline BitfieldInfo::Entry entries[] = {
1311  { uint32_t(1), "bias", "" },
1312  { uint32_t(2), "drift", "" },
1313  { uint32_t(4), "bias_accuracy", "" },
1314  { uint32_t(8), "drift_accuracy", "" },
1315  { uint32_t(15), "flags", "" },
1316  };
1317 
1318  static constexpr inline BitfieldInfo value = {
1319  /* .name = */ "ValidFlags",
1320  /* .docs = */ "",
1321  /* .type = */ Type::U16,
1322  /* .entries = */ entries,
1323  };
1324 
1325 };
1326 
1327 template<>
1328 struct MetadataFor<data_gnss::ClockInfo2>
1329 {
1331 
1332  static constexpr inline ParameterInfo parameters[] = {
1333  {
1334  /* .name = */ "bias",
1335  /* .docs = */ "",
1336  /* .type = */ {Type::DOUBLE, nullptr},
1337  /* .accessor = */ nullptr, //utils::access<type, double, &type::bias>,
1338  /* .attributes = */ {true, false, false, false, false},
1339  /* .count = */ 1,
1340  /* .condition = */ {},
1341  },
1342  {
1343  /* .name = */ "drift",
1344  /* .docs = */ "",
1345  /* .type = */ {Type::DOUBLE, nullptr},
1346  /* .accessor = */ nullptr, //utils::access<type, double, &type::drift>,
1347  /* .attributes = */ {true, false, false, false, false},
1348  /* .count = */ 1,
1349  /* .condition = */ {},
1350  },
1351  {
1352  /* .name = */ "bias_accuracy_estimate",
1353  /* .docs = */ "",
1354  /* .type = */ {Type::DOUBLE, nullptr},
1355  /* .accessor = */ nullptr, //utils::access<type, double, &type::bias_accuracy_estimate>,
1356  /* .attributes = */ {true, false, false, false, false},
1357  /* .count = */ 1,
1358  /* .condition = */ {},
1359  },
1360  {
1361  /* .name = */ "drift_accuracy_estimate",
1362  /* .docs = */ "",
1363  /* .type = */ {Type::DOUBLE, nullptr},
1364  /* .accessor = */ nullptr, //utils::access<type, double, &type::drift_accuracy_estimate>,
1365  /* .attributes = */ {true, false, false, false, false},
1366  /* .count = */ 1,
1367  /* .condition = */ {},
1368  },
1369  {
1370  /* .name = */ "valid_flags",
1371  /* .docs = */ "",
1373  /* .accessor = */ nullptr, //utils::access<type, data_gnss::ClockInfo2::ValidFlags, &type::valid_flags>,
1374  /* .attributes = */ {true, false, false, false, false},
1375  /* .count = */ 1,
1376  /* .condition = */ {},
1377  },
1378  };
1379 
1380  static constexpr inline FieldInfo value = {
1381  {
1382  /* .name = */ "data_gnss::ClockInfo2",
1383  /* .title = */ "clock_info_2",
1384  /* .docs = */ "GNSS reported receiver clock parameters\n\nThis supersedes MIP_DATA_DESC_GNSS_CLOCK_INFO with additional information.",
1385  /* .parameters = */ parameters,
1386  },
1387  /* .descriptor = */ type::DESCRIPTOR,
1388  /* .functions = */ NO_FUNCTIONS,
1389  /* .response = */ nullptr,
1390  };
1391 };
1392 
1393 template<>
1394 struct MetadataFor<data_gnss::GpsLeapSeconds::ValidFlags>
1395 {
1397 
1398  static constexpr inline BitfieldInfo::Entry entries[] = {
1399  { uint32_t(2), "leap_seconds", "" },
1400  };
1401 
1402  static constexpr inline BitfieldInfo value = {
1403  /* .name = */ "ValidFlags",
1404  /* .docs = */ "",
1405  /* .type = */ Type::U16,
1406  /* .entries = */ entries,
1407  };
1408 
1409 };
1410 
1411 template<>
1412 struct MetadataFor<data_gnss::GpsLeapSeconds>
1413 {
1415 
1416  static constexpr inline ParameterInfo parameters[] = {
1417  {
1418  /* .name = */ "leap_seconds",
1419  /* .docs = */ "[s]",
1420  /* .type = */ {Type::U8, nullptr},
1421  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::leap_seconds>,
1422  /* .attributes = */ {true, false, false, false, false},
1423  /* .count = */ 1,
1424  /* .condition = */ {},
1425  },
1426  {
1427  /* .name = */ "valid_flags",
1428  /* .docs = */ "",
1430  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GpsLeapSeconds::ValidFlags, &type::valid_flags>,
1431  /* .attributes = */ {true, false, false, false, false},
1432  /* .count = */ 1,
1433  /* .condition = */ {},
1434  },
1435  };
1436 
1437  static constexpr inline FieldInfo value = {
1438  {
1439  /* .name = */ "data_gnss::GpsLeapSeconds",
1440  /* .title = */ "gps_leap_seconds",
1441  /* .docs = */ "GNSS reported leap seconds (difference between GPS and UTC Time)",
1442  /* .parameters = */ parameters,
1443  },
1444  /* .descriptor = */ type::DESCRIPTOR,
1445  /* .functions = */ NO_FUNCTIONS,
1446  /* .response = */ nullptr,
1447  };
1448 };
1449 
1450 template<>
1451 struct MetadataFor<data_gnss::SbasSystem>
1452 {
1454 
1455  static constexpr inline EnumInfo::Entry entries[] = {
1456  { uint32_t(0), "UNKNOWN", "" },
1457  { uint32_t(1), "WAAS", "" },
1458  { uint32_t(2), "EGNOS", "" },
1459  { uint32_t(3), "MSAS", "" },
1460  { uint32_t(4), "GAGAN", "" },
1461  };
1462 
1463  static constexpr inline EnumInfo value = {
1464  /* .name = */ "SbasSystem",
1465  /* .docs = */ "",
1466  /* .type = */ Type::U8,
1467  /* .entries = */ entries,
1468  };
1469 
1470 };
1471 
1472 template<>
1473 struct MetadataFor<data_gnss::SbasInfo::SbasStatus>
1474 {
1476 
1477  static constexpr inline BitfieldInfo::Entry entries[] = {
1478  { uint32_t(1), "range_available", "" },
1479  { uint32_t(2), "corrections_available", "" },
1480  { uint32_t(4), "integrity_available", "" },
1481  { uint32_t(8), "test_mode", "" },
1482  };
1483 
1484  static constexpr inline BitfieldInfo value = {
1485  /* .name = */ "SbasStatus",
1486  /* .docs = */ "",
1487  /* .type = */ Type::U8,
1488  /* .entries = */ entries,
1489  };
1490 
1491 };
1492 
1493 template<>
1494 struct MetadataFor<data_gnss::SbasInfo::ValidFlags>
1495 {
1497 
1498  static constexpr inline BitfieldInfo::Entry entries[] = {
1499  { uint32_t(1), "tow", "" },
1500  { uint32_t(2), "week_number", "" },
1501  { uint32_t(4), "sbas_system", "" },
1502  { uint32_t(8), "sbas_id", "" },
1503  { uint32_t(16), "count", "" },
1504  { uint32_t(32), "sbas_status", "" },
1505  { uint32_t(63), "flags", "" },
1506  };
1507 
1508  static constexpr inline BitfieldInfo value = {
1509  /* .name = */ "ValidFlags",
1510  /* .docs = */ "",
1511  /* .type = */ Type::U16,
1512  /* .entries = */ entries,
1513  };
1514 
1515 };
1516 
1517 template<>
1518 struct MetadataFor<data_gnss::SbasInfo>
1519 {
1521 
1522  static constexpr inline ParameterInfo parameters[] = {
1523  {
1524  /* .name = */ "time_of_week",
1525  /* .docs = */ "GPS Time of week [seconds]",
1526  /* .type = */ {Type::DOUBLE, nullptr},
1527  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
1528  /* .attributes = */ {true, false, false, false, false},
1529  /* .count = */ 1,
1530  /* .condition = */ {},
1531  },
1532  {
1533  /* .name = */ "week_number",
1534  /* .docs = */ "GPS Week since 1980 [weeks]",
1535  /* .type = */ {Type::U16, nullptr},
1536  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1537  /* .attributes = */ {true, false, false, false, false},
1538  /* .count = */ 1,
1539  /* .condition = */ {},
1540  },
1541  {
1542  /* .name = */ "sbas_system",
1543  /* .docs = */ "SBAS system id",
1545  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SbasSystem, &type::sbas_system>,
1546  /* .attributes = */ {true, false, false, false, false},
1547  /* .count = */ 1,
1548  /* .condition = */ {},
1549  },
1550  {
1551  /* .name = */ "sbas_id",
1552  /* .docs = */ "SBAS satellite id.",
1553  /* .type = */ {Type::U8, nullptr},
1554  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sbas_id>,
1555  /* .attributes = */ {true, false, false, false, false},
1556  /* .count = */ 1,
1557  /* .condition = */ {},
1558  },
1559  {
1560  /* .name = */ "count",
1561  /* .docs = */ "Number of SBAS corrections",
1562  /* .type = */ {Type::U8, nullptr},
1563  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
1564  /* .attributes = */ {true, false, false, false, false},
1565  /* .count = */ 1,
1566  /* .condition = */ {},
1567  },
1568  {
1569  /* .name = */ "sbas_status",
1570  /* .docs = */ "Status of the SBAS service",
1572  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SbasInfo::SbasStatus, &type::sbas_status>,
1573  /* .attributes = */ {true, false, false, false, false},
1574  /* .count = */ 1,
1575  /* .condition = */ {},
1576  },
1577  {
1578  /* .name = */ "valid_flags",
1579  /* .docs = */ "",
1581  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SbasInfo::ValidFlags, &type::valid_flags>,
1582  /* .attributes = */ {true, false, false, false, false},
1583  /* .count = */ 1,
1584  /* .condition = */ {},
1585  },
1586  };
1587 
1588  static constexpr inline FieldInfo value = {
1589  {
1590  /* .name = */ "data_gnss::SbasInfo",
1591  /* .title = */ "sbas_info",
1592  /* .docs = */ "GNSS SBAS status",
1593  /* .parameters = */ parameters,
1594  },
1595  /* .descriptor = */ type::DESCRIPTOR,
1596  /* .functions = */ NO_FUNCTIONS,
1597  /* .response = */ nullptr,
1598  };
1599 };
1600 
1601 template<>
1603 {
1605 
1606  static constexpr inline EnumInfo::Entry entries[] = {
1607  { uint32_t(0), "UNKNOWN", "" },
1608  { uint32_t(1), "GPS", "" },
1609  { uint32_t(2), "GLONASS", "" },
1610  { uint32_t(3), "GALILEO", "" },
1611  { uint32_t(4), "BEIDOU", "" },
1612  { uint32_t(5), "SBAS", "" },
1613  };
1614 
1615  static constexpr inline EnumInfo value = {
1616  /* .name = */ "GnssConstellationId",
1617  /* .docs = */ "",
1618  /* .type = */ Type::U8,
1619  /* .entries = */ entries,
1620  };
1621 
1622 };
1623 
1624 template<>
1625 struct MetadataFor<data_gnss::SbasCorrection::ValidFlags>
1626 {
1628 
1629  static constexpr inline BitfieldInfo::Entry entries[] = {
1630  { uint32_t(1), "udrei", "" },
1631  { uint32_t(2), "pseudorange_correction", "" },
1632  { uint32_t(4), "iono_correction", "" },
1633  { uint32_t(7), "flags", "" },
1634  };
1635 
1636  static constexpr inline BitfieldInfo value = {
1637  /* .name = */ "ValidFlags",
1638  /* .docs = */ "",
1639  /* .type = */ Type::U16,
1640  /* .entries = */ entries,
1641  };
1642 
1643 };
1644 
1645 template<>
1646 struct MetadataFor<data_gnss::SbasCorrection>
1647 {
1649 
1650  static constexpr inline ParameterInfo parameters[] = {
1651  {
1652  /* .name = */ "index",
1653  /* .docs = */ "Index of this field in this epoch.",
1654  /* .type = */ {Type::U8, nullptr},
1655  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
1656  /* .attributes = */ {true, false, false, false, false},
1657  /* .count = */ 1,
1658  /* .condition = */ {},
1659  },
1660  {
1661  /* .name = */ "count",
1662  /* .docs = */ "Total number of fields in this epoch.",
1663  /* .type = */ {Type::U8, nullptr},
1664  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
1665  /* .attributes = */ {true, false, false, false, false},
1666  /* .count = */ 1,
1667  /* .condition = */ {},
1668  },
1669  {
1670  /* .name = */ "time_of_week",
1671  /* .docs = */ "GPS Time of week the message was received [seconds]",
1672  /* .type = */ {Type::DOUBLE, nullptr},
1673  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
1674  /* .attributes = */ {true, false, false, false, false},
1675  /* .count = */ 1,
1676  /* .condition = */ {},
1677  },
1678  {
1679  /* .name = */ "week_number",
1680  /* .docs = */ "GPS Week since 1980 [weeks]",
1681  /* .type = */ {Type::U16, nullptr},
1682  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1683  /* .attributes = */ {true, false, false, false, false},
1684  /* .count = */ 1,
1685  /* .condition = */ {},
1686  },
1687  {
1688  /* .name = */ "gnss_id",
1689  /* .docs = */ "GNSS constellation id",
1691  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GnssConstellationId, &type::gnss_id>,
1692  /* .attributes = */ {true, false, false, false, false},
1693  /* .count = */ 1,
1694  /* .condition = */ {},
1695  },
1696  {
1697  /* .name = */ "sv_id",
1698  /* .docs = */ "GNSS satellite id within the constellation.",
1699  /* .type = */ {Type::U8, nullptr},
1700  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sv_id>,
1701  /* .attributes = */ {true, false, false, false, false},
1702  /* .count = */ 1,
1703  /* .condition = */ {},
1704  },
1705  {
1706  /* .name = */ "udrei",
1707  /* .docs = */ "[See above 0-13 usable, 14 not monitored, 15 - do not use]",
1708  /* .type = */ {Type::U8, nullptr},
1709  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::udrei>,
1710  /* .attributes = */ {true, false, false, false, false},
1711  /* .count = */ 1,
1712  /* .condition = */ {},
1713  },
1714  {
1715  /* .name = */ "pseudorange_correction",
1716  /* .docs = */ "Pseudo-range correction [meters].",
1717  /* .type = */ {Type::FLOAT, nullptr},
1718  /* .accessor = */ nullptr, //utils::access<type, float, &type::pseudorange_correction>,
1719  /* .attributes = */ {true, false, false, false, false},
1720  /* .count = */ 1,
1721  /* .condition = */ {},
1722  },
1723  {
1724  /* .name = */ "iono_correction",
1725  /* .docs = */ "Ionospheric correction [meters].",
1726  /* .type = */ {Type::FLOAT, nullptr},
1727  /* .accessor = */ nullptr, //utils::access<type, float, &type::iono_correction>,
1728  /* .attributes = */ {true, false, false, false, false},
1729  /* .count = */ 1,
1730  /* .condition = */ {},
1731  },
1732  {
1733  /* .name = */ "valid_flags",
1734  /* .docs = */ "",
1736  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SbasCorrection::ValidFlags, &type::valid_flags>,
1737  /* .attributes = */ {true, false, false, false, false},
1738  /* .count = */ 1,
1739  /* .condition = */ {},
1740  },
1741  };
1742 
1743  static constexpr inline FieldInfo value = {
1744  {
1745  /* .name = */ "data_gnss::SbasCorrection",
1746  /* .title = */ "sbas_correction",
1747  /* .docs = */ "GNSS calculated SBAS Correction\n\nUDREI - the variance of a normal distribution associated with the user differential range errors for a\nsatellite after application of fast and long-term corrections, excluding atmospheric effects\n\n<pre>UDREI Variance</pre>\n<pre>-----------------------</pre>\n<pre>0 0.0520 m^2</pre>\n<pre>1 0.0924 m^2</pre>\n<pre>2 0.1444 m^2</pre>\n<pre>3 0.2830 m^2</pre>\n<pre>4 0.4678 m^2</pre>\n<pre>5 0.8315 m^2</pre>\n<pre>6 1.2992 m^2</pre>\n<pre>7 1.8709 m^2</pre>\n<pre>8 2.5465 m^2</pre>\n<pre>9 3.3260 m^2</pre>\n<pre>10 5.1968 m^2</pre>\n<pre>11 20.7870 m^2</pre>\n<pre>12 230.9661 m^2</pre>\n<pre>13 2078.695 m^2</pre>\n<pre>14 'Not Monitored'</pre>\n<pre>15 'Do Not Use'</pre>",
1748  /* .parameters = */ parameters,
1749  },
1750  /* .descriptor = */ type::DESCRIPTOR,
1751  /* .functions = */ NO_FUNCTIONS,
1752  /* .response = */ nullptr,
1753  };
1754 };
1755 
1756 template<>
1757 struct MetadataFor<data_gnss::RfErrorDetection::RFBand>
1758 {
1760 
1761  static constexpr inline EnumInfo::Entry entries[] = {
1762  { uint32_t(0), "UNKNOWN", "" },
1763  { uint32_t(1), "L1", "" },
1764  { uint32_t(2), "L2", "" },
1765  { uint32_t(5), "L5", "" },
1766  };
1767 
1768  static constexpr inline EnumInfo value = {
1769  /* .name = */ "RFBand",
1770  /* .docs = */ "",
1771  /* .type = */ Type::U8,
1772  /* .entries = */ entries,
1773  };
1774 
1775 };
1776 
1777 template<>
1778 struct MetadataFor<data_gnss::RfErrorDetection::JammingState>
1779 {
1781 
1782  static constexpr inline EnumInfo::Entry entries[] = {
1783  { uint32_t(0), "UNKNOWN", "" },
1784  { uint32_t(1), "NONE", "" },
1785  { uint32_t(2), "PARTIAL", "" },
1786  { uint32_t(3), "SIGNIFICANT", "" },
1787  };
1788 
1789  static constexpr inline EnumInfo value = {
1790  /* .name = */ "JammingState",
1791  /* .docs = */ "",
1792  /* .type = */ Type::U8,
1793  /* .entries = */ entries,
1794  };
1795 
1796 };
1797 
1798 template<>
1799 struct MetadataFor<data_gnss::RfErrorDetection::SpoofingState>
1800 {
1802 
1803  static constexpr inline EnumInfo::Entry entries[] = {
1804  { uint32_t(0), "UNKNOWN", "" },
1805  { uint32_t(1), "NONE", "" },
1806  { uint32_t(2), "PARTIAL", "" },
1807  { uint32_t(3), "SIGNIFICANT", "" },
1808  };
1809 
1810  static constexpr inline EnumInfo value = {
1811  /* .name = */ "SpoofingState",
1812  /* .docs = */ "",
1813  /* .type = */ Type::U8,
1814  /* .entries = */ entries,
1815  };
1816 
1817 };
1818 
1819 template<>
1820 struct MetadataFor<data_gnss::RfErrorDetection::ValidFlags>
1821 {
1823 
1824  static constexpr inline BitfieldInfo::Entry entries[] = {
1825  { uint32_t(1), "rf_band", "" },
1826  { uint32_t(2), "jamming_state", "" },
1827  { uint32_t(4), "spoofing_state", "" },
1828  { uint32_t(7), "flags", "" },
1829  };
1830 
1831  static constexpr inline BitfieldInfo value = {
1832  /* .name = */ "ValidFlags",
1833  /* .docs = */ "",
1834  /* .type = */ Type::U16,
1835  /* .entries = */ entries,
1836  };
1837 
1838 };
1839 
1840 template<>
1841 struct MetadataFor<data_gnss::RfErrorDetection>
1842 {
1844 
1845  static constexpr inline ParameterInfo parameters[] = {
1846  {
1847  /* .name = */ "rf_band",
1848  /* .docs = */ "RF Band of the reported information",
1850  /* .accessor = */ nullptr, //utils::access<type, data_gnss::RfErrorDetection::RFBand, &type::rf_band>,
1851  /* .attributes = */ {true, false, false, false, false},
1852  /* .count = */ 1,
1853  /* .condition = */ {},
1854  },
1855  {
1856  /* .name = */ "jamming_state",
1857  /* .docs = */ "GNSS Jamming State (as reported by the GNSS module)",
1859  /* .accessor = */ nullptr, //utils::access<type, data_gnss::RfErrorDetection::JammingState, &type::jamming_state>,
1860  /* .attributes = */ {true, false, false, false, false},
1861  /* .count = */ 1,
1862  /* .condition = */ {},
1863  },
1864  {
1865  /* .name = */ "spoofing_state",
1866  /* .docs = */ "GNSS Spoofing State (as reported by the GNSS module)",
1868  /* .accessor = */ nullptr, //utils::access<type, data_gnss::RfErrorDetection::SpoofingState, &type::spoofing_state>,
1869  /* .attributes = */ {true, false, false, false, false},
1870  /* .count = */ 1,
1871  /* .condition = */ {},
1872  },
1873  {
1874  /* .name = */ "reserved",
1875  /* .docs = */ "Reserved for future use",
1876  /* .type = */ {Type::U8, nullptr},
1877  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
1878  /* .attributes = */ {true, false, false, false, false},
1879  /* .count = */ 4,
1880  /* .condition = */ {},
1881  },
1882  {
1883  /* .name = */ "valid_flags",
1884  /* .docs = */ "",
1886  /* .accessor = */ nullptr, //utils::access<type, data_gnss::RfErrorDetection::ValidFlags, &type::valid_flags>,
1887  /* .attributes = */ {true, false, false, false, false},
1888  /* .count = */ 1,
1889  /* .condition = */ {},
1890  },
1891  };
1892 
1893  static constexpr inline FieldInfo value = {
1894  {
1895  /* .name = */ "data_gnss::RfErrorDetection",
1896  /* .title = */ "rf_error_detection",
1897  /* .docs = */ "GNSS Error Detection subsystem status",
1898  /* .parameters = */ parameters,
1899  },
1900  /* .descriptor = */ type::DESCRIPTOR,
1901  /* .functions = */ NO_FUNCTIONS,
1902  /* .response = */ nullptr,
1903  };
1904 };
1905 
1906 template<>
1907 struct MetadataFor<data_gnss::BaseStationInfo::IndicatorFlags>
1908 {
1910 
1911  static constexpr inline BitfieldInfo::Entry entries[] = {
1912  { uint32_t(1), "gps", "" },
1913  { uint32_t(2), "glonass", "" },
1914  { uint32_t(4), "galileo", "" },
1915  { uint32_t(8), "beidou", "" },
1916  { uint32_t(16), "ref_station", "" },
1917  { uint32_t(32), "single_receiver", "" },
1918  { uint32_t(64), "quarter_cycle_bit1", "" },
1919  { uint32_t(128), "quarter_cycle_bit2", "" },
1920  { uint32_t(192), "quarter_cycle_bits", "" },
1921  };
1922 
1923  static constexpr inline BitfieldInfo value = {
1924  /* .name = */ "IndicatorFlags",
1925  /* .docs = */ "",
1926  /* .type = */ Type::U16,
1927  /* .entries = */ entries,
1928  };
1929 
1930 };
1931 
1932 template<>
1933 struct MetadataFor<data_gnss::BaseStationInfo::ValidFlags>
1934 {
1936 
1937  static constexpr inline BitfieldInfo::Entry entries[] = {
1938  { uint32_t(1), "tow", "" },
1939  { uint32_t(2), "week_number", "" },
1940  { uint32_t(4), "ecef_position", "" },
1941  { uint32_t(8), "height", "" },
1942  { uint32_t(16), "station_id", "" },
1943  { uint32_t(32), "indicators", "" },
1944  { uint32_t(63), "flags", "" },
1945  };
1946 
1947  static constexpr inline BitfieldInfo value = {
1948  /* .name = */ "ValidFlags",
1949  /* .docs = */ "",
1950  /* .type = */ Type::U16,
1951  /* .entries = */ entries,
1952  };
1953 
1954 };
1955 
1956 template<>
1957 struct MetadataFor<data_gnss::BaseStationInfo>
1958 {
1960 
1961  static constexpr inline ParameterInfo parameters[] = {
1962  {
1963  /* .name = */ "time_of_week",
1964  /* .docs = */ "GPS Time of week the message was received [seconds]",
1965  /* .type = */ {Type::DOUBLE, nullptr},
1966  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
1967  /* .attributes = */ {true, false, false, false, false},
1968  /* .count = */ 1,
1969  /* .condition = */ {},
1970  },
1971  {
1972  /* .name = */ "week_number",
1973  /* .docs = */ "GPS Week since 1980 [weeks]",
1974  /* .type = */ {Type::U16, nullptr},
1975  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1976  /* .attributes = */ {true, false, false, false, false},
1977  /* .count = */ 1,
1978  /* .condition = */ {},
1979  },
1980  {
1981  /* .name = */ "ecef_pos",
1982  /* .docs = */ "Earth-centered, Earth-fixed [m]",
1983  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3d>::value},
1984  /* .accessor = */ nullptr, //utils::access<type, Vector3d, &type::ecef_pos>,
1985  /* .attributes = */ {true, false, false, false, false},
1986  /* .count = */ 1,
1987  /* .condition = */ {},
1988  },
1989  {
1990  /* .name = */ "height",
1991  /* .docs = */ "Antenna Height above the marker used in the survey [m]",
1992  /* .type = */ {Type::FLOAT, nullptr},
1993  /* .accessor = */ nullptr, //utils::access<type, float, &type::height>,
1994  /* .attributes = */ {true, false, false, false, false},
1995  /* .count = */ 1,
1996  /* .condition = */ {},
1997  },
1998  {
1999  /* .name = */ "station_id",
2000  /* .docs = */ "Range: 0-4095",
2001  /* .type = */ {Type::U16, nullptr},
2002  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::station_id>,
2003  /* .attributes = */ {true, false, false, false, false},
2004  /* .count = */ 1,
2005  /* .condition = */ {},
2006  },
2007  {
2008  /* .name = */ "indicators",
2009  /* .docs = */ "Bitfield",
2011  /* .accessor = */ nullptr, //utils::access<type, data_gnss::BaseStationInfo::IndicatorFlags, &type::indicators>,
2012  /* .attributes = */ {true, false, false, false, false},
2013  /* .count = */ 1,
2014  /* .condition = */ {},
2015  },
2016  {
2017  /* .name = */ "valid_flags",
2018  /* .docs = */ "",
2020  /* .accessor = */ nullptr, //utils::access<type, data_gnss::BaseStationInfo::ValidFlags, &type::valid_flags>,
2021  /* .attributes = */ {true, false, false, false, false},
2022  /* .count = */ 1,
2023  /* .condition = */ {},
2024  },
2025  };
2026 
2027  static constexpr inline FieldInfo value = {
2028  {
2029  /* .name = */ "data_gnss::BaseStationInfo",
2030  /* .title = */ "base_station_info",
2031  /* .docs = */ "RTCM reported base station information (sourced from RTCM Message 1005 or 1006)\n\nValid Flag Mapping:",
2032  /* .parameters = */ parameters,
2033  },
2034  /* .descriptor = */ type::DESCRIPTOR,
2035  /* .functions = */ NO_FUNCTIONS,
2036  /* .response = */ nullptr,
2037  };
2038 };
2039 
2040 template<>
2041 struct MetadataFor<data_gnss::RtkCorrectionsStatus::ValidFlags>
2042 {
2044 
2045  static constexpr inline BitfieldInfo::Entry entries[] = {
2046  { uint32_t(1), "tow", "" },
2047  { uint32_t(2), "week_number", "" },
2048  { uint32_t(4), "epoch_status", "" },
2049  { uint32_t(8), "dongle_status", "" },
2050  { uint32_t(16), "gps_latency", "" },
2051  { uint32_t(32), "glonass_latency", "" },
2052  { uint32_t(64), "galileo_latency", "" },
2053  { uint32_t(128), "beidou_latency", "" },
2054  { uint32_t(255), "flags", "" },
2055  };
2056 
2057  static constexpr inline BitfieldInfo value = {
2058  /* .name = */ "ValidFlags",
2059  /* .docs = */ "",
2060  /* .type = */ Type::U16,
2061  /* .entries = */ entries,
2062  };
2063 
2064 };
2065 
2066 template<>
2067 struct MetadataFor<data_gnss::RtkCorrectionsStatus::EpochStatus>
2068 {
2070 
2071  static constexpr inline BitfieldInfo::Entry entries[] = {
2072  { uint32_t(1), "antenna_location_received", "" },
2073  { uint32_t(2), "antenna_description_received", "" },
2074  { uint32_t(4), "gps_received", "" },
2075  { uint32_t(8), "glonass_received", "" },
2076  { uint32_t(16), "galileo_received", "" },
2077  { uint32_t(32), "beidou_received", "" },
2078  { uint32_t(64), "using_gps_msm_messages", "Using MSM messages for GPS corrections instead of RTCM messages 1001-1004" },
2079  { uint32_t(128), "using_glonass_msm_messages", "Using MSM messages for GLONASS corrections instead of RTCM messages 1009-1012" },
2080  { uint32_t(256), "dongle_status_read_failed", "A read of the dongle status was attempted, but failed" },
2081  };
2082 
2083  static constexpr inline BitfieldInfo value = {
2084  /* .name = */ "EpochStatus",
2085  /* .docs = */ "",
2086  /* .type = */ Type::U16,
2087  /* .entries = */ entries,
2088  };
2089 
2090 };
2091 
2092 template<>
2093 struct MetadataFor<data_gnss::RtkCorrectionsStatus>
2094 {
2096 
2097  static constexpr inline ParameterInfo parameters[] = {
2098  {
2099  /* .name = */ "time_of_week",
2100  /* .docs = */ "GPS Time of week [seconds]",
2101  /* .type = */ {Type::DOUBLE, nullptr},
2102  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
2103  /* .attributes = */ {true, false, false, false, false},
2104  /* .count = */ 1,
2105  /* .condition = */ {},
2106  },
2107  {
2108  /* .name = */ "week_number",
2109  /* .docs = */ "GPS Week since 1980 [weeks]",
2110  /* .type = */ {Type::U16, nullptr},
2111  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
2112  /* .attributes = */ {true, false, false, false, false},
2113  /* .count = */ 1,
2114  /* .condition = */ {},
2115  },
2116  {
2117  /* .name = */ "epoch_status",
2118  /* .docs = */ "Status of the corrections received during this epoch",
2120  /* .accessor = */ nullptr, //utils::access<type, data_gnss::RtkCorrectionsStatus::EpochStatus, &type::epoch_status>,
2121  /* .attributes = */ {true, false, false, false, false},
2122  /* .count = */ 1,
2123  /* .condition = */ {},
2124  },
2125  {
2126  /* .name = */ "dongle_status",
2127  /* .docs = */ "RTK Dongle Status Flags (valid only when using RTK dongle, see Get RTK Device Status Flags (0x0F,0x01) for details)",
2128  /* .type = */ {Type::U32, nullptr},
2129  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::dongle_status>,
2130  /* .attributes = */ {true, false, false, false, false},
2131  /* .count = */ 1,
2132  /* .condition = */ {},
2133  },
2134  {
2135  /* .name = */ "gps_correction_latency",
2136  /* .docs = */ "Latency of last GPS correction [seconds]",
2137  /* .type = */ {Type::FLOAT, nullptr},
2138  /* .accessor = */ nullptr, //utils::access<type, float, &type::gps_correction_latency>,
2139  /* .attributes = */ {true, false, false, false, false},
2140  /* .count = */ 1,
2141  /* .condition = */ {},
2142  },
2143  {
2144  /* .name = */ "glonass_correction_latency",
2145  /* .docs = */ "Latency of last GLONASS correction [seconds]",
2146  /* .type = */ {Type::FLOAT, nullptr},
2147  /* .accessor = */ nullptr, //utils::access<type, float, &type::glonass_correction_latency>,
2148  /* .attributes = */ {true, false, false, false, false},
2149  /* .count = */ 1,
2150  /* .condition = */ {},
2151  },
2152  {
2153  /* .name = */ "galileo_correction_latency",
2154  /* .docs = */ "Latency of last Galileo correction [seconds]",
2155  /* .type = */ {Type::FLOAT, nullptr},
2156  /* .accessor = */ nullptr, //utils::access<type, float, &type::galileo_correction_latency>,
2157  /* .attributes = */ {true, false, false, false, false},
2158  /* .count = */ 1,
2159  /* .condition = */ {},
2160  },
2161  {
2162  /* .name = */ "beidou_correction_latency",
2163  /* .docs = */ "Latency of last Beidou correction [seconds]",
2164  /* .type = */ {Type::FLOAT, nullptr},
2165  /* .accessor = */ nullptr, //utils::access<type, float, &type::beidou_correction_latency>,
2166  /* .attributes = */ {true, false, false, false, false},
2167  /* .count = */ 1,
2168  /* .condition = */ {},
2169  },
2170  {
2171  /* .name = */ "reserved",
2172  /* .docs = */ "Reserved for future use",
2173  /* .type = */ {Type::U32, nullptr},
2174  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::reserved>,
2175  /* .attributes = */ {true, false, false, false, false},
2176  /* .count = */ 4,
2177  /* .condition = */ {},
2178  },
2179  {
2180  /* .name = */ "valid_flags",
2181  /* .docs = */ "",
2183  /* .accessor = */ nullptr, //utils::access<type, data_gnss::RtkCorrectionsStatus::ValidFlags, &type::valid_flags>,
2184  /* .attributes = */ {true, false, false, false, false},
2185  /* .count = */ 1,
2186  /* .condition = */ {},
2187  },
2188  };
2189 
2190  static constexpr inline FieldInfo value = {
2191  {
2192  /* .name = */ "data_gnss::RtkCorrectionsStatus",
2193  /* .title = */ "rtk_corrections_status",
2194  /* .docs = */ "",
2195  /* .parameters = */ parameters,
2196  },
2197  /* .descriptor = */ type::DESCRIPTOR,
2198  /* .functions = */ NO_FUNCTIONS,
2199  /* .response = */ nullptr,
2200  };
2201 };
2202 
2203 template<>
2204 struct MetadataFor<data_gnss::SatelliteStatus::ValidFlags>
2205 {
2207 
2208  static constexpr inline BitfieldInfo::Entry entries[] = {
2209  { uint32_t(1), "tow", "" },
2210  { uint32_t(2), "week_number", "" },
2211  { uint32_t(4), "gnss_id", "" },
2212  { uint32_t(8), "satellite_id", "" },
2213  { uint32_t(16), "elevation", "" },
2214  { uint32_t(32), "azimuth", "" },
2215  { uint32_t(64), "health", "" },
2216  { uint32_t(127), "flags", "" },
2217  };
2218 
2219  static constexpr inline BitfieldInfo value = {
2220  /* .name = */ "ValidFlags",
2221  /* .docs = */ "",
2222  /* .type = */ Type::U16,
2223  /* .entries = */ entries,
2224  };
2225 
2226 };
2227 
2228 template<>
2229 struct MetadataFor<data_gnss::SatelliteStatus>
2230 {
2232 
2233  static constexpr inline ParameterInfo parameters[] = {
2234  {
2235  /* .name = */ "index",
2236  /* .docs = */ "Index of this field in this epoch.",
2237  /* .type = */ {Type::U8, nullptr},
2238  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
2239  /* .attributes = */ {true, false, false, false, false},
2240  /* .count = */ 1,
2241  /* .condition = */ {},
2242  },
2243  {
2244  /* .name = */ "count",
2245  /* .docs = */ "Total number of fields in this epoch.",
2246  /* .type = */ {Type::U8, nullptr},
2247  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
2248  /* .attributes = */ {true, false, false, false, false},
2249  /* .count = */ 1,
2250  /* .condition = */ {},
2251  },
2252  {
2253  /* .name = */ "time_of_week",
2254  /* .docs = */ "GPS Time of week [seconds]",
2255  /* .type = */ {Type::DOUBLE, nullptr},
2256  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
2257  /* .attributes = */ {true, false, false, false, false},
2258  /* .count = */ 1,
2259  /* .condition = */ {},
2260  },
2261  {
2262  /* .name = */ "week_number",
2263  /* .docs = */ "GPS Week since 1980 [weeks]",
2264  /* .type = */ {Type::U16, nullptr},
2265  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
2266  /* .attributes = */ {true, false, false, false, false},
2267  /* .count = */ 1,
2268  /* .condition = */ {},
2269  },
2270  {
2271  /* .name = */ "gnss_id",
2272  /* .docs = */ "",
2274  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GnssConstellationId, &type::gnss_id>,
2275  /* .attributes = */ {true, false, false, false, false},
2276  /* .count = */ 1,
2277  /* .condition = */ {},
2278  },
2279  {
2280  /* .name = */ "satellite_id",
2281  /* .docs = */ "GNSS satellite id within the constellation",
2282  /* .type = */ {Type::U8, nullptr},
2283  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::satellite_id>,
2284  /* .attributes = */ {true, false, false, false, false},
2285  /* .count = */ 1,
2286  /* .condition = */ {},
2287  },
2288  {
2289  /* .name = */ "elevation",
2290  /* .docs = */ "Elevation of the satellite relative to the rover [degrees]",
2291  /* .type = */ {Type::FLOAT, nullptr},
2292  /* .accessor = */ nullptr, //utils::access<type, float, &type::elevation>,
2293  /* .attributes = */ {true, false, false, false, false},
2294  /* .count = */ 1,
2295  /* .condition = */ {},
2296  },
2297  {
2298  /* .name = */ "azimuth",
2299  /* .docs = */ "Azimuth of the satellite relative to the rover [degrees]",
2300  /* .type = */ {Type::FLOAT, nullptr},
2301  /* .accessor = */ nullptr, //utils::access<type, float, &type::azimuth>,
2302  /* .attributes = */ {true, false, false, false, false},
2303  /* .count = */ 1,
2304  /* .condition = */ {},
2305  },
2306  {
2307  /* .name = */ "health",
2308  /* .docs = */ "True if the satellite is healthy.",
2309  /* .type = */ {Type::BOOL, nullptr},
2310  /* .accessor = */ nullptr, //utils::access<type, bool, &type::health>,
2311  /* .attributes = */ {true, false, false, false, false},
2312  /* .count = */ 1,
2313  /* .condition = */ {},
2314  },
2315  {
2316  /* .name = */ "valid_flags",
2317  /* .docs = */ "",
2319  /* .accessor = */ nullptr, //utils::access<type, data_gnss::SatelliteStatus::ValidFlags, &type::valid_flags>,
2320  /* .attributes = */ {true, false, false, false, false},
2321  /* .count = */ 1,
2322  /* .condition = */ {},
2323  },
2324  };
2325 
2326  static constexpr inline FieldInfo value = {
2327  {
2328  /* .name = */ "data_gnss::SatelliteStatus",
2329  /* .title = */ "satellite_status",
2330  /* .docs = */ "Status information for a GNSS satellite.",
2331  /* .parameters = */ parameters,
2332  },
2333  /* .descriptor = */ type::DESCRIPTOR,
2334  /* .functions = */ NO_FUNCTIONS,
2335  /* .response = */ nullptr,
2336  };
2337 };
2338 
2339 template<>
2340 struct MetadataFor<data_gnss::GnssSignalId>
2341 {
2343 
2344  static constexpr inline EnumInfo::Entry entries[] = {
2345  { uint32_t(0), "UNKNOWN", "" },
2346  { uint32_t(1), "GPS_L1CA", "" },
2347  { uint32_t(2), "GPS_L1P", "" },
2348  { uint32_t(3), "GPS_L1Z", "" },
2349  { uint32_t(4), "GPS_L2CA", "" },
2350  { uint32_t(5), "GPS_L2P", "" },
2351  { uint32_t(6), "GPS_L2Z", "" },
2352  { uint32_t(7), "GPS_L2CL", "" },
2353  { uint32_t(8), "GPS_L2CM", "" },
2354  { uint32_t(9), "GPS_L2CML", "" },
2355  { uint32_t(10), "GPS_L5I", "" },
2356  { uint32_t(11), "GPS_L5Q", "" },
2357  { uint32_t(12), "GPS_L5IQ", "" },
2358  { uint32_t(13), "GPS_L1CD", "" },
2359  { uint32_t(14), "GPS_L1CP", "" },
2360  { uint32_t(15), "GPS_L1CDP", "" },
2361  { uint32_t(32), "GLONASS_G1CA", "" },
2362  { uint32_t(33), "GLONASS_G1P", "" },
2363  { uint32_t(34), "GLONASS_G2C", "" },
2364  { uint32_t(35), "GLONASS_G2P", "" },
2365  { uint32_t(64), "GALILEO_E1C", "" },
2366  { uint32_t(65), "GALILEO_E1A", "" },
2367  { uint32_t(66), "GALILEO_E1B", "" },
2368  { uint32_t(67), "GALILEO_E1BC", "" },
2369  { uint32_t(68), "GALILEO_E1ABC", "" },
2370  { uint32_t(69), "GALILEO_E6C", "" },
2371  { uint32_t(70), "GALILEO_E6A", "" },
2372  { uint32_t(71), "GALILEO_E6B", "" },
2373  { uint32_t(72), "GALILEO_E6BC", "" },
2374  { uint32_t(73), "GALILEO_E6ABC", "" },
2375  { uint32_t(74), "GALILEO_E5BI", "" },
2376  { uint32_t(75), "GALILEO_E5BQ", "" },
2377  { uint32_t(76), "GALILEO_E5BIQ", "" },
2378  { uint32_t(77), "GALILEO_E5ABI", "" },
2379  { uint32_t(78), "GALILEO_E5ABQ", "" },
2380  { uint32_t(79), "GALILEO_E5ABIQ", "" },
2381  { uint32_t(80), "GALILEO_E5AI", "" },
2382  { uint32_t(81), "GALILEO_E5AQ", "" },
2383  { uint32_t(82), "GALILEO_E5AIQ", "" },
2384  { uint32_t(96), "SBAS_L1CA", "" },
2385  { uint32_t(97), "SBAS_L5I", "" },
2386  { uint32_t(98), "SBAS_L5Q", "" },
2387  { uint32_t(99), "SBAS_L5IQ", "" },
2388  { uint32_t(128), "QZSS_L1CA", "" },
2389  { uint32_t(129), "QZSS_LEXS", "" },
2390  { uint32_t(130), "QZSS_LEXL", "" },
2391  { uint32_t(131), "QZSS_LEXSL", "" },
2392  { uint32_t(132), "QZSS_L2CM", "" },
2393  { uint32_t(133), "QZSS_L2CL", "" },
2394  { uint32_t(134), "QZSS_L2CML", "" },
2395  { uint32_t(135), "QZSS_L5I", "" },
2396  { uint32_t(136), "QZSS_L5Q", "" },
2397  { uint32_t(137), "QZSS_L5IQ", "" },
2398  { uint32_t(138), "QZSS_L1CD", "" },
2399  { uint32_t(139), "QZSS_L1CP", "" },
2400  { uint32_t(140), "QZSS_L1CDP", "" },
2401  { uint32_t(160), "BEIDOU_B1I", "" },
2402  { uint32_t(161), "BEIDOU_B1Q", "" },
2403  { uint32_t(162), "BEIDOU_B1IQ", "" },
2404  { uint32_t(163), "BEIDOU_B3I", "" },
2405  { uint32_t(164), "BEIDOU_B3Q", "" },
2406  { uint32_t(165), "BEIDOU_B3IQ", "" },
2407  { uint32_t(166), "BEIDOU_B2I", "" },
2408  { uint32_t(167), "BEIDOU_B2Q", "" },
2409  { uint32_t(168), "BEIDOU_B2IQ", "" },
2410  { uint32_t(169), "BEIDOU_B2A", "" },
2411  };
2412 
2413  static constexpr inline EnumInfo value = {
2414  /* .name = */ "GnssSignalId",
2415  /* .docs = */ "",
2416  /* .type = */ Type::U8,
2417  /* .entries = */ entries,
2418  };
2419 
2420 };
2421 
2422 template<>
2423 struct MetadataFor<data_gnss::Raw::GnssSignalQuality>
2424 {
2426 
2427  static constexpr inline EnumInfo::Entry entries[] = {
2428  { uint32_t(0), "NONE", "" },
2429  { uint32_t(1), "SEARCHING", "" },
2430  { uint32_t(2), "ACQUIRED", "" },
2431  { uint32_t(3), "UNUSABLE", "" },
2432  { uint32_t(4), "TIME_LOCKED", "" },
2433  { uint32_t(5), "FULLY_LOCKED", "" },
2434  };
2435 
2436  static constexpr inline EnumInfo value = {
2437  /* .name = */ "GnssSignalQuality",
2438  /* .docs = */ "",
2439  /* .type = */ Type::U8,
2440  /* .entries = */ entries,
2441  };
2442 
2443 };
2444 
2445 template<>
2446 struct MetadataFor<data_gnss::Raw::ValidFlags>
2447 {
2449 
2450  static constexpr inline BitfieldInfo::Entry entries[] = {
2451  { uint32_t(1), "tow", "" },
2452  { uint32_t(2), "week_number", "" },
2453  { uint32_t(4), "receiver_id", "" },
2454  { uint32_t(8), "tracking_channel", "" },
2455  { uint32_t(16), "gnss_id", "" },
2456  { uint32_t(32), "satellite_id", "" },
2457  { uint32_t(64), "signal_id", "" },
2458  { uint32_t(128), "signal_strength", "" },
2459  { uint32_t(256), "quality", "" },
2460  { uint32_t(512), "pseudorange", "" },
2461  { uint32_t(1024), "carrier_phase", "" },
2462  { uint32_t(2048), "doppler", "" },
2463  { uint32_t(4096), "range_uncertainty", "" },
2464  { uint32_t(8192), "carrier_phase_uncertainty", "" },
2465  { uint32_t(16384), "doppler_uncertainty", "" },
2466  { uint32_t(32768), "lock_time", "" },
2467  { uint32_t(65535), "flags", "" },
2468  };
2469 
2470  static constexpr inline BitfieldInfo value = {
2471  /* .name = */ "ValidFlags",
2472  /* .docs = */ "",
2473  /* .type = */ Type::U16,
2474  /* .entries = */ entries,
2475  };
2476 
2477 };
2478 
2479 template<>
2480 struct MetadataFor<data_gnss::Raw>
2481 {
2483 
2484  static constexpr inline ParameterInfo parameters[] = {
2485  {
2486  /* .name = */ "index",
2487  /* .docs = */ "Index of this field in this epoch.",
2488  /* .type = */ {Type::U8, nullptr},
2489  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
2490  /* .attributes = */ {true, false, false, false, false},
2491  /* .count = */ 1,
2492  /* .condition = */ {},
2493  },
2494  {
2495  /* .name = */ "count",
2496  /* .docs = */ "Total number of fields in this epoch.",
2497  /* .type = */ {Type::U8, nullptr},
2498  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
2499  /* .attributes = */ {true, false, false, false, false},
2500  /* .count = */ 1,
2501  /* .condition = */ {},
2502  },
2503  {
2504  /* .name = */ "time_of_week",
2505  /* .docs = */ "GPS Time of week [seconds]",
2506  /* .type = */ {Type::DOUBLE, nullptr},
2507  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
2508  /* .attributes = */ {true, false, false, false, false},
2509  /* .count = */ 1,
2510  /* .condition = */ {},
2511  },
2512  {
2513  /* .name = */ "week_number",
2514  /* .docs = */ "GPS Week since 1980 [weeks]",
2515  /* .type = */ {Type::U16, nullptr},
2516  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
2517  /* .attributes = */ {true, false, false, false, false},
2518  /* .count = */ 1,
2519  /* .condition = */ {},
2520  },
2521  {
2522  /* .name = */ "receiver_id",
2523  /* .docs = */ "When the measurement comes from RTCM, this will be the reference station ID; otherwise, it's the receiver number (1,2,...)",
2524  /* .type = */ {Type::U16, nullptr},
2525  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::receiver_id>,
2526  /* .attributes = */ {true, false, false, false, false},
2527  /* .count = */ 1,
2528  /* .condition = */ {},
2529  },
2530  {
2531  /* .name = */ "tracking_channel",
2532  /* .docs = */ "Channel the receiver is using to track this satellite.",
2533  /* .type = */ {Type::U8, nullptr},
2534  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::tracking_channel>,
2535  /* .attributes = */ {true, false, false, false, false},
2536  /* .count = */ 1,
2537  /* .condition = */ {},
2538  },
2539  {
2540  /* .name = */ "gnss_id",
2541  /* .docs = */ "",
2543  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GnssConstellationId, &type::gnss_id>,
2544  /* .attributes = */ {true, false, false, false, false},
2545  /* .count = */ 1,
2546  /* .condition = */ {},
2547  },
2548  {
2549  /* .name = */ "satellite_id",
2550  /* .docs = */ "GNSS satellite id within the constellation.",
2551  /* .type = */ {Type::U8, nullptr},
2552  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::satellite_id>,
2553  /* .attributes = */ {true, false, false, false, false},
2554  /* .count = */ 1,
2555  /* .condition = */ {},
2556  },
2557  {
2558  /* .name = */ "signal_id",
2559  /* .docs = */ "Signal identifier for the satellite.",
2561  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GnssSignalId, &type::signal_id>,
2562  /* .attributes = */ {true, false, false, false, false},
2563  /* .count = */ 1,
2564  /* .condition = */ {},
2565  },
2566  {
2567  /* .name = */ "signal_strength",
2568  /* .docs = */ "Carrier to noise ratio [dBHz].",
2569  /* .type = */ {Type::FLOAT, nullptr},
2570  /* .accessor = */ nullptr, //utils::access<type, float, &type::signal_strength>,
2571  /* .attributes = */ {true, false, false, false, false},
2572  /* .count = */ 1,
2573  /* .condition = */ {},
2574  },
2575  {
2576  /* .name = */ "quality",
2577  /* .docs = */ "Indicator of signal quality.",
2579  /* .accessor = */ nullptr, //utils::access<type, data_gnss::Raw::GnssSignalQuality, &type::quality>,
2580  /* .attributes = */ {true, false, false, false, false},
2581  /* .count = */ 1,
2582  /* .condition = */ {},
2583  },
2584  {
2585  /* .name = */ "pseudorange",
2586  /* .docs = */ "Pseudo-range measurement [meters].",
2587  /* .type = */ {Type::DOUBLE, nullptr},
2588  /* .accessor = */ nullptr, //utils::access<type, double, &type::pseudorange>,
2589  /* .attributes = */ {true, false, false, false, false},
2590  /* .count = */ 1,
2591  /* .condition = */ {},
2592  },
2593  {
2594  /* .name = */ "carrier_phase",
2595  /* .docs = */ "Carrier phase measurement [Carrier periods].",
2596  /* .type = */ {Type::DOUBLE, nullptr},
2597  /* .accessor = */ nullptr, //utils::access<type, double, &type::carrier_phase>,
2598  /* .attributes = */ {true, false, false, false, false},
2599  /* .count = */ 1,
2600  /* .condition = */ {},
2601  },
2602  {
2603  /* .name = */ "doppler",
2604  /* .docs = */ "Measured doppler shift [Hz].",
2605  /* .type = */ {Type::FLOAT, nullptr},
2606  /* .accessor = */ nullptr, //utils::access<type, float, &type::doppler>,
2607  /* .attributes = */ {true, false, false, false, false},
2608  /* .count = */ 1,
2609  /* .condition = */ {},
2610  },
2611  {
2612  /* .name = */ "range_uncert",
2613  /* .docs = */ "Uncertainty of the pseudo-range measurement [m].",
2614  /* .type = */ {Type::FLOAT, nullptr},
2615  /* .accessor = */ nullptr, //utils::access<type, float, &type::range_uncert>,
2616  /* .attributes = */ {true, false, false, false, false},
2617  /* .count = */ 1,
2618  /* .condition = */ {},
2619  },
2620  {
2621  /* .name = */ "phase_uncert",
2622  /* .docs = */ "Uncertainty of the phase measurement [Carrier periods].",
2623  /* .type = */ {Type::FLOAT, nullptr},
2624  /* .accessor = */ nullptr, //utils::access<type, float, &type::phase_uncert>,
2625  /* .attributes = */ {true, false, false, false, false},
2626  /* .count = */ 1,
2627  /* .condition = */ {},
2628  },
2629  {
2630  /* .name = */ "doppler_uncert",
2631  /* .docs = */ "Uncertainty of the measured doppler shift [Hz].",
2632  /* .type = */ {Type::FLOAT, nullptr},
2633  /* .accessor = */ nullptr, //utils::access<type, float, &type::doppler_uncert>,
2634  /* .attributes = */ {true, false, false, false, false},
2635  /* .count = */ 1,
2636  /* .condition = */ {},
2637  },
2638  {
2639  /* .name = */ "lock_time",
2640  /* .docs = */ "DOC\nMinimum carrier phase lock time [s]. Note: the maximum value is dependent on the receiver.",
2641  /* .type = */ {Type::FLOAT, nullptr},
2642  /* .accessor = */ nullptr, //utils::access<type, float, &type::lock_time>,
2643  /* .attributes = */ {true, false, false, false, false},
2644  /* .count = */ 1,
2645  /* .condition = */ {},
2646  },
2647  {
2648  /* .name = */ "valid_flags",
2649  /* .docs = */ "",
2651  /* .accessor = */ nullptr, //utils::access<type, data_gnss::Raw::ValidFlags, &type::valid_flags>,
2652  /* .attributes = */ {true, false, false, false, false},
2653  /* .count = */ 1,
2654  /* .condition = */ {},
2655  },
2656  };
2657 
2658  static constexpr inline FieldInfo value = {
2659  {
2660  /* .name = */ "data_gnss::Raw",
2661  /* .title = */ "raw",
2662  /* .docs = */ "GNSS Raw observation.",
2663  /* .parameters = */ parameters,
2664  },
2665  /* .descriptor = */ type::DESCRIPTOR,
2666  /* .functions = */ NO_FUNCTIONS,
2667  /* .response = */ nullptr,
2668  };
2669 };
2670 
2671 template<>
2672 struct MetadataFor<data_gnss::GpsEphemeris::ValidFlags>
2673 {
2675 
2676  static constexpr inline BitfieldInfo::Entry entries[] = {
2677  { uint32_t(1), "ephemeris", "" },
2678  { uint32_t(2), "modern_data", "" },
2679  { uint32_t(4), "isc_l5", "" },
2680  { uint32_t(7), "flags", "" },
2681  };
2682 
2683  static constexpr inline BitfieldInfo value = {
2684  /* .name = */ "ValidFlags",
2685  /* .docs = */ "",
2686  /* .type = */ Type::U16,
2687  /* .entries = */ entries,
2688  };
2689 
2690 };
2691 
2692 template<>
2693 struct MetadataFor<data_gnss::GpsEphemeris>
2694 {
2696 
2697  static constexpr inline ParameterInfo parameters[] = {
2698  {
2699  /* .name = */ "index",
2700  /* .docs = */ "Index of this field in this epoch.",
2701  /* .type = */ {Type::U8, nullptr},
2702  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
2703  /* .attributes = */ {true, false, false, false, false},
2704  /* .count = */ 1,
2705  /* .condition = */ {},
2706  },
2707  {
2708  /* .name = */ "count",
2709  /* .docs = */ "Total number of fields in this epoch.",
2710  /* .type = */ {Type::U8, nullptr},
2711  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
2712  /* .attributes = */ {true, false, false, false, false},
2713  /* .count = */ 1,
2714  /* .condition = */ {},
2715  },
2716  {
2717  /* .name = */ "time_of_week",
2718  /* .docs = */ "GPS Time of week [seconds]",
2719  /* .type = */ {Type::DOUBLE, nullptr},
2720  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
2721  /* .attributes = */ {true, false, false, false, false},
2722  /* .count = */ 1,
2723  /* .condition = */ {},
2724  },
2725  {
2726  /* .name = */ "week_number",
2727  /* .docs = */ "GPS Week since 1980 [weeks]",
2728  /* .type = */ {Type::U16, nullptr},
2729  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
2730  /* .attributes = */ {true, false, false, false, false},
2731  /* .count = */ 1,
2732  /* .condition = */ {},
2733  },
2734  {
2735  /* .name = */ "satellite_id",
2736  /* .docs = */ "GNSS satellite id within the constellation.",
2737  /* .type = */ {Type::U8, nullptr},
2738  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::satellite_id>,
2739  /* .attributes = */ {true, false, false, false, false},
2740  /* .count = */ 1,
2741  /* .condition = */ {},
2742  },
2743  {
2744  /* .name = */ "health",
2745  /* .docs = */ "Satellite and signal health",
2746  /* .type = */ {Type::U8, nullptr},
2747  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::health>,
2748  /* .attributes = */ {true, false, false, false, false},
2749  /* .count = */ 1,
2750  /* .condition = */ {},
2751  },
2752  {
2753  /* .name = */ "iodc",
2754  /* .docs = */ "Issue of Data Clock. This increments each time the data changes and\nrolls over at 4. It is used to make sure various raw data elements from\ndifferent sources line up correctly.",
2755  /* .type = */ {Type::U8, nullptr},
2756  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::iodc>,
2757  /* .attributes = */ {true, false, false, false, false},
2758  /* .count = */ 1,
2759  /* .condition = */ {},
2760  },
2761  {
2762  /* .name = */ "iode",
2763  /* .docs = */ "Issue of Data Ephemeris.",
2764  /* .type = */ {Type::U8, nullptr},
2765  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::iode>,
2766  /* .attributes = */ {true, false, false, false, false},
2767  /* .count = */ 1,
2768  /* .condition = */ {},
2769  },
2770  {
2771  /* .name = */ "t_oc",
2772  /* .docs = */ "Reference time for clock data.",
2773  /* .type = */ {Type::DOUBLE, nullptr},
2774  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_oc>,
2775  /* .attributes = */ {true, false, false, false, false},
2776  /* .count = */ 1,
2777  /* .condition = */ {},
2778  },
2779  {
2780  /* .name = */ "af0",
2781  /* .docs = */ "Clock bias in [s].",
2782  /* .type = */ {Type::DOUBLE, nullptr},
2783  /* .accessor = */ nullptr, //utils::access<type, double, &type::af0>,
2784  /* .attributes = */ {true, false, false, false, false},
2785  /* .count = */ 1,
2786  /* .condition = */ {},
2787  },
2788  {
2789  /* .name = */ "af1",
2790  /* .docs = */ "Clock drift in [s/s].",
2791  /* .type = */ {Type::DOUBLE, nullptr},
2792  /* .accessor = */ nullptr, //utils::access<type, double, &type::af1>,
2793  /* .attributes = */ {true, false, false, false, false},
2794  /* .count = */ 1,
2795  /* .condition = */ {},
2796  },
2797  {
2798  /* .name = */ "af2",
2799  /* .docs = */ "Clock drift rate in [s/s^2].",
2800  /* .type = */ {Type::DOUBLE, nullptr},
2801  /* .accessor = */ nullptr, //utils::access<type, double, &type::af2>,
2802  /* .attributes = */ {true, false, false, false, false},
2803  /* .count = */ 1,
2804  /* .condition = */ {},
2805  },
2806  {
2807  /* .name = */ "t_gd",
2808  /* .docs = */ "T Group Delay [s].",
2809  /* .type = */ {Type::DOUBLE, nullptr},
2810  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_gd>,
2811  /* .attributes = */ {true, false, false, false, false},
2812  /* .count = */ 1,
2813  /* .condition = */ {},
2814  },
2815  {
2816  /* .name = */ "ISC_L1CA",
2817  /* .docs = */ "Inter-signal correction (L1).",
2818  /* .type = */ {Type::DOUBLE, nullptr},
2819  /* .accessor = */ nullptr, //utils::access<type, double, &type::ISC_L1CA>,
2820  /* .attributes = */ {true, false, false, false, false},
2821  /* .count = */ 1,
2822  /* .condition = */ {},
2823  },
2824  {
2825  /* .name = */ "ISC_L2C",
2826  /* .docs = */ "Inter-signal correction (L2, or L5 if isc_l5 flag is set).",
2827  /* .type = */ {Type::DOUBLE, nullptr},
2828  /* .accessor = */ nullptr, //utils::access<type, double, &type::ISC_L2C>,
2829  /* .attributes = */ {true, false, false, false, false},
2830  /* .count = */ 1,
2831  /* .condition = */ {},
2832  },
2833  {
2834  /* .name = */ "t_oe",
2835  /* .docs = */ "Reference time for ephemeris in [s].",
2836  /* .type = */ {Type::DOUBLE, nullptr},
2837  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_oe>,
2838  /* .attributes = */ {true, false, false, false, false},
2839  /* .count = */ 1,
2840  /* .condition = */ {},
2841  },
2842  {
2843  /* .name = */ "a",
2844  /* .docs = */ "Semi-major axis [m].",
2845  /* .type = */ {Type::DOUBLE, nullptr},
2846  /* .accessor = */ nullptr, //utils::access<type, double, &type::a>,
2847  /* .attributes = */ {true, false, false, false, false},
2848  /* .count = */ 1,
2849  /* .condition = */ {},
2850  },
2851  {
2852  /* .name = */ "a_dot",
2853  /* .docs = */ "Semi-major axis rate [m/s].",
2854  /* .type = */ {Type::DOUBLE, nullptr},
2855  /* .accessor = */ nullptr, //utils::access<type, double, &type::a_dot>,
2856  /* .attributes = */ {true, false, false, false, false},
2857  /* .count = */ 1,
2858  /* .condition = */ {},
2859  },
2860  {
2861  /* .name = */ "mean_anomaly",
2862  /* .docs = */ "[rad].",
2863  /* .type = */ {Type::DOUBLE, nullptr},
2864  /* .accessor = */ nullptr, //utils::access<type, double, &type::mean_anomaly>,
2865  /* .attributes = */ {true, false, false, false, false},
2866  /* .count = */ 1,
2867  /* .condition = */ {},
2868  },
2869  {
2870  /* .name = */ "delta_mean_motion",
2871  /* .docs = */ "[rad].",
2872  /* .type = */ {Type::DOUBLE, nullptr},
2873  /* .accessor = */ nullptr, //utils::access<type, double, &type::delta_mean_motion>,
2874  /* .attributes = */ {true, false, false, false, false},
2875  /* .count = */ 1,
2876  /* .condition = */ {},
2877  },
2878  {
2879  /* .name = */ "delta_mean_motion_dot",
2880  /* .docs = */ "[rad/s].",
2881  /* .type = */ {Type::DOUBLE, nullptr},
2882  /* .accessor = */ nullptr, //utils::access<type, double, &type::delta_mean_motion_dot>,
2883  /* .attributes = */ {true, false, false, false, false},
2884  /* .count = */ 1,
2885  /* .condition = */ {},
2886  },
2887  {
2888  /* .name = */ "eccentricity",
2889  /* .docs = */ "",
2890  /* .type = */ {Type::DOUBLE, nullptr},
2891  /* .accessor = */ nullptr, //utils::access<type, double, &type::eccentricity>,
2892  /* .attributes = */ {true, false, false, false, false},
2893  /* .count = */ 1,
2894  /* .condition = */ {},
2895  },
2896  {
2897  /* .name = */ "argument_of_perigee",
2898  /* .docs = */ "[rad].",
2899  /* .type = */ {Type::DOUBLE, nullptr},
2900  /* .accessor = */ nullptr, //utils::access<type, double, &type::argument_of_perigee>,
2901  /* .attributes = */ {true, false, false, false, false},
2902  /* .count = */ 1,
2903  /* .condition = */ {},
2904  },
2905  {
2906  /* .name = */ "omega",
2907  /* .docs = */ "Longitude of Ascending Node [rad].",
2908  /* .type = */ {Type::DOUBLE, nullptr},
2909  /* .accessor = */ nullptr, //utils::access<type, double, &type::omega>,
2910  /* .attributes = */ {true, false, false, false, false},
2911  /* .count = */ 1,
2912  /* .condition = */ {},
2913  },
2914  {
2915  /* .name = */ "omega_dot",
2916  /* .docs = */ "Rate of Right Ascension [rad/s].",
2917  /* .type = */ {Type::DOUBLE, nullptr},
2918  /* .accessor = */ nullptr, //utils::access<type, double, &type::omega_dot>,
2919  /* .attributes = */ {true, false, false, false, false},
2920  /* .count = */ 1,
2921  /* .condition = */ {},
2922  },
2923  {
2924  /* .name = */ "inclination",
2925  /* .docs = */ "Inclination angle [rad].",
2926  /* .type = */ {Type::DOUBLE, nullptr},
2927  /* .accessor = */ nullptr, //utils::access<type, double, &type::inclination>,
2928  /* .attributes = */ {true, false, false, false, false},
2929  /* .count = */ 1,
2930  /* .condition = */ {},
2931  },
2932  {
2933  /* .name = */ "inclination_dot",
2934  /* .docs = */ "Inclination angle rate of change [rad/s].",
2935  /* .type = */ {Type::DOUBLE, nullptr},
2936  /* .accessor = */ nullptr, //utils::access<type, double, &type::inclination_dot>,
2937  /* .attributes = */ {true, false, false, false, false},
2938  /* .count = */ 1,
2939  /* .condition = */ {},
2940  },
2941  {
2942  /* .name = */ "c_ic",
2943  /* .docs = */ "Harmonic Correction Term.",
2944  /* .type = */ {Type::DOUBLE, nullptr},
2945  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_ic>,
2946  /* .attributes = */ {true, false, false, false, false},
2947  /* .count = */ 1,
2948  /* .condition = */ {},
2949  },
2950  {
2951  /* .name = */ "c_is",
2952  /* .docs = */ "Harmonic Correction Term.",
2953  /* .type = */ {Type::DOUBLE, nullptr},
2954  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_is>,
2955  /* .attributes = */ {true, false, false, false, false},
2956  /* .count = */ 1,
2957  /* .condition = */ {},
2958  },
2959  {
2960  /* .name = */ "c_uc",
2961  /* .docs = */ "Harmonic Correction Term.",
2962  /* .type = */ {Type::DOUBLE, nullptr},
2963  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_uc>,
2964  /* .attributes = */ {true, false, false, false, false},
2965  /* .count = */ 1,
2966  /* .condition = */ {},
2967  },
2968  {
2969  /* .name = */ "c_us",
2970  /* .docs = */ "Harmonic Correction Term.",
2971  /* .type = */ {Type::DOUBLE, nullptr},
2972  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_us>,
2973  /* .attributes = */ {true, false, false, false, false},
2974  /* .count = */ 1,
2975  /* .condition = */ {},
2976  },
2977  {
2978  /* .name = */ "c_rc",
2979  /* .docs = */ "Harmonic Correction Term.",
2980  /* .type = */ {Type::DOUBLE, nullptr},
2981  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_rc>,
2982  /* .attributes = */ {true, false, false, false, false},
2983  /* .count = */ 1,
2984  /* .condition = */ {},
2985  },
2986  {
2987  /* .name = */ "c_rs",
2988  /* .docs = */ "Harmonic Correction Term.",
2989  /* .type = */ {Type::DOUBLE, nullptr},
2990  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_rs>,
2991  /* .attributes = */ {true, false, false, false, false},
2992  /* .count = */ 1,
2993  /* .condition = */ {},
2994  },
2995  {
2996  /* .name = */ "valid_flags",
2997  /* .docs = */ "",
2999  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GpsEphemeris::ValidFlags, &type::valid_flags>,
3000  /* .attributes = */ {true, false, false, false, false},
3001  /* .count = */ 1,
3002  /* .condition = */ {},
3003  },
3004  };
3005 
3006  static constexpr inline FieldInfo value = {
3007  {
3008  /* .name = */ "data_gnss::GpsEphemeris",
3009  /* .title = */ "GPS Ephemeris",
3010  /* .docs = */ "GPS Ephemeris Data",
3011  /* .parameters = */ parameters,
3012  },
3013  /* .descriptor = */ type::DESCRIPTOR,
3014  /* .functions = */ NO_FUNCTIONS,
3015  /* .response = */ nullptr,
3016  };
3017 };
3018 
3019 template<>
3020 struct MetadataFor<data_gnss::GalileoEphemeris::ValidFlags>
3021 {
3023 
3024  static constexpr inline BitfieldInfo::Entry entries[] = {
3025  { uint32_t(1), "ephemeris", "" },
3026  { uint32_t(2), "modern_data", "" },
3027  { uint32_t(4), "isc_l5", "" },
3028  { uint32_t(7), "flags", "" },
3029  };
3030 
3031  static constexpr inline BitfieldInfo value = {
3032  /* .name = */ "ValidFlags",
3033  /* .docs = */ "",
3034  /* .type = */ Type::U16,
3035  /* .entries = */ entries,
3036  };
3037 
3038 };
3039 
3040 template<>
3041 struct MetadataFor<data_gnss::GalileoEphemeris>
3042 {
3044 
3045  static constexpr inline ParameterInfo parameters[] = {
3046  {
3047  /* .name = */ "index",
3048  /* .docs = */ "Index of this field in this epoch.",
3049  /* .type = */ {Type::U8, nullptr},
3050  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
3051  /* .attributes = */ {true, false, false, false, false},
3052  /* .count = */ 1,
3053  /* .condition = */ {},
3054  },
3055  {
3056  /* .name = */ "count",
3057  /* .docs = */ "Total number of fields in this epoch.",
3058  /* .type = */ {Type::U8, nullptr},
3059  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
3060  /* .attributes = */ {true, false, false, false, false},
3061  /* .count = */ 1,
3062  /* .condition = */ {},
3063  },
3064  {
3065  /* .name = */ "time_of_week",
3066  /* .docs = */ "GPS Time of week [seconds]",
3067  /* .type = */ {Type::DOUBLE, nullptr},
3068  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
3069  /* .attributes = */ {true, false, false, false, false},
3070  /* .count = */ 1,
3071  /* .condition = */ {},
3072  },
3073  {
3074  /* .name = */ "week_number",
3075  /* .docs = */ "GPS Week since 1980 [weeks]",
3076  /* .type = */ {Type::U16, nullptr},
3077  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
3078  /* .attributes = */ {true, false, false, false, false},
3079  /* .count = */ 1,
3080  /* .condition = */ {},
3081  },
3082  {
3083  /* .name = */ "satellite_id",
3084  /* .docs = */ "GNSS satellite id within the constellation.",
3085  /* .type = */ {Type::U8, nullptr},
3086  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::satellite_id>,
3087  /* .attributes = */ {true, false, false, false, false},
3088  /* .count = */ 1,
3089  /* .condition = */ {},
3090  },
3091  {
3092  /* .name = */ "health",
3093  /* .docs = */ "Satellite and signal health",
3094  /* .type = */ {Type::U8, nullptr},
3095  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::health>,
3096  /* .attributes = */ {true, false, false, false, false},
3097  /* .count = */ 1,
3098  /* .condition = */ {},
3099  },
3100  {
3101  /* .name = */ "iodc",
3102  /* .docs = */ "Issue of Data Clock. This increments each time the data changes and\nrolls over at 4. It is used to make sure various raw data elements from\ndifferent sources line up correctly.",
3103  /* .type = */ {Type::U8, nullptr},
3104  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::iodc>,
3105  /* .attributes = */ {true, false, false, false, false},
3106  /* .count = */ 1,
3107  /* .condition = */ {},
3108  },
3109  {
3110  /* .name = */ "iode",
3111  /* .docs = */ "Issue of Data Ephemeris.",
3112  /* .type = */ {Type::U8, nullptr},
3113  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::iode>,
3114  /* .attributes = */ {true, false, false, false, false},
3115  /* .count = */ 1,
3116  /* .condition = */ {},
3117  },
3118  {
3119  /* .name = */ "t_oc",
3120  /* .docs = */ "Reference time for clock data.",
3121  /* .type = */ {Type::DOUBLE, nullptr},
3122  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_oc>,
3123  /* .attributes = */ {true, false, false, false, false},
3124  /* .count = */ 1,
3125  /* .condition = */ {},
3126  },
3127  {
3128  /* .name = */ "af0",
3129  /* .docs = */ "Clock bias in [s].",
3130  /* .type = */ {Type::DOUBLE, nullptr},
3131  /* .accessor = */ nullptr, //utils::access<type, double, &type::af0>,
3132  /* .attributes = */ {true, false, false, false, false},
3133  /* .count = */ 1,
3134  /* .condition = */ {},
3135  },
3136  {
3137  /* .name = */ "af1",
3138  /* .docs = */ "Clock drift in [s/s].",
3139  /* .type = */ {Type::DOUBLE, nullptr},
3140  /* .accessor = */ nullptr, //utils::access<type, double, &type::af1>,
3141  /* .attributes = */ {true, false, false, false, false},
3142  /* .count = */ 1,
3143  /* .condition = */ {},
3144  },
3145  {
3146  /* .name = */ "af2",
3147  /* .docs = */ "Clock drift rate in [s/s^2].",
3148  /* .type = */ {Type::DOUBLE, nullptr},
3149  /* .accessor = */ nullptr, //utils::access<type, double, &type::af2>,
3150  /* .attributes = */ {true, false, false, false, false},
3151  /* .count = */ 1,
3152  /* .condition = */ {},
3153  },
3154  {
3155  /* .name = */ "t_gd",
3156  /* .docs = */ "T Group Delay [s].",
3157  /* .type = */ {Type::DOUBLE, nullptr},
3158  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_gd>,
3159  /* .attributes = */ {true, false, false, false, false},
3160  /* .count = */ 1,
3161  /* .condition = */ {},
3162  },
3163  {
3164  /* .name = */ "ISC_L1CA",
3165  /* .docs = */ "Inter-signal correction (L1).",
3166  /* .type = */ {Type::DOUBLE, nullptr},
3167  /* .accessor = */ nullptr, //utils::access<type, double, &type::ISC_L1CA>,
3168  /* .attributes = */ {true, false, false, false, false},
3169  /* .count = */ 1,
3170  /* .condition = */ {},
3171  },
3172  {
3173  /* .name = */ "ISC_L2C",
3174  /* .docs = */ "Inter-signal correction (L2, or L5 if isc_l5 flag is set).",
3175  /* .type = */ {Type::DOUBLE, nullptr},
3176  /* .accessor = */ nullptr, //utils::access<type, double, &type::ISC_L2C>,
3177  /* .attributes = */ {true, false, false, false, false},
3178  /* .count = */ 1,
3179  /* .condition = */ {},
3180  },
3181  {
3182  /* .name = */ "t_oe",
3183  /* .docs = */ "Reference time for ephemeris in [s].",
3184  /* .type = */ {Type::DOUBLE, nullptr},
3185  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_oe>,
3186  /* .attributes = */ {true, false, false, false, false},
3187  /* .count = */ 1,
3188  /* .condition = */ {},
3189  },
3190  {
3191  /* .name = */ "a",
3192  /* .docs = */ "Semi-major axis [m].",
3193  /* .type = */ {Type::DOUBLE, nullptr},
3194  /* .accessor = */ nullptr, //utils::access<type, double, &type::a>,
3195  /* .attributes = */ {true, false, false, false, false},
3196  /* .count = */ 1,
3197  /* .condition = */ {},
3198  },
3199  {
3200  /* .name = */ "a_dot",
3201  /* .docs = */ "Semi-major axis rate [m/s].",
3202  /* .type = */ {Type::DOUBLE, nullptr},
3203  /* .accessor = */ nullptr, //utils::access<type, double, &type::a_dot>,
3204  /* .attributes = */ {true, false, false, false, false},
3205  /* .count = */ 1,
3206  /* .condition = */ {},
3207  },
3208  {
3209  /* .name = */ "mean_anomaly",
3210  /* .docs = */ "[rad].",
3211  /* .type = */ {Type::DOUBLE, nullptr},
3212  /* .accessor = */ nullptr, //utils::access<type, double, &type::mean_anomaly>,
3213  /* .attributes = */ {true, false, false, false, false},
3214  /* .count = */ 1,
3215  /* .condition = */ {},
3216  },
3217  {
3218  /* .name = */ "delta_mean_motion",
3219  /* .docs = */ "[rad].",
3220  /* .type = */ {Type::DOUBLE, nullptr},
3221  /* .accessor = */ nullptr, //utils::access<type, double, &type::delta_mean_motion>,
3222  /* .attributes = */ {true, false, false, false, false},
3223  /* .count = */ 1,
3224  /* .condition = */ {},
3225  },
3226  {
3227  /* .name = */ "delta_mean_motion_dot",
3228  /* .docs = */ "[rad/s].",
3229  /* .type = */ {Type::DOUBLE, nullptr},
3230  /* .accessor = */ nullptr, //utils::access<type, double, &type::delta_mean_motion_dot>,
3231  /* .attributes = */ {true, false, false, false, false},
3232  /* .count = */ 1,
3233  /* .condition = */ {},
3234  },
3235  {
3236  /* .name = */ "eccentricity",
3237  /* .docs = */ "",
3238  /* .type = */ {Type::DOUBLE, nullptr},
3239  /* .accessor = */ nullptr, //utils::access<type, double, &type::eccentricity>,
3240  /* .attributes = */ {true, false, false, false, false},
3241  /* .count = */ 1,
3242  /* .condition = */ {},
3243  },
3244  {
3245  /* .name = */ "argument_of_perigee",
3246  /* .docs = */ "[rad].",
3247  /* .type = */ {Type::DOUBLE, nullptr},
3248  /* .accessor = */ nullptr, //utils::access<type, double, &type::argument_of_perigee>,
3249  /* .attributes = */ {true, false, false, false, false},
3250  /* .count = */ 1,
3251  /* .condition = */ {},
3252  },
3253  {
3254  /* .name = */ "omega",
3255  /* .docs = */ "Longitude of Ascending Node [rad].",
3256  /* .type = */ {Type::DOUBLE, nullptr},
3257  /* .accessor = */ nullptr, //utils::access<type, double, &type::omega>,
3258  /* .attributes = */ {true, false, false, false, false},
3259  /* .count = */ 1,
3260  /* .condition = */ {},
3261  },
3262  {
3263  /* .name = */ "omega_dot",
3264  /* .docs = */ "Rate of Right Ascension [rad/s].",
3265  /* .type = */ {Type::DOUBLE, nullptr},
3266  /* .accessor = */ nullptr, //utils::access<type, double, &type::omega_dot>,
3267  /* .attributes = */ {true, false, false, false, false},
3268  /* .count = */ 1,
3269  /* .condition = */ {},
3270  },
3271  {
3272  /* .name = */ "inclination",
3273  /* .docs = */ "Inclination angle [rad].",
3274  /* .type = */ {Type::DOUBLE, nullptr},
3275  /* .accessor = */ nullptr, //utils::access<type, double, &type::inclination>,
3276  /* .attributes = */ {true, false, false, false, false},
3277  /* .count = */ 1,
3278  /* .condition = */ {},
3279  },
3280  {
3281  /* .name = */ "inclination_dot",
3282  /* .docs = */ "Inclination angle rate of change [rad/s].",
3283  /* .type = */ {Type::DOUBLE, nullptr},
3284  /* .accessor = */ nullptr, //utils::access<type, double, &type::inclination_dot>,
3285  /* .attributes = */ {true, false, false, false, false},
3286  /* .count = */ 1,
3287  /* .condition = */ {},
3288  },
3289  {
3290  /* .name = */ "c_ic",
3291  /* .docs = */ "Harmonic Correction Term.",
3292  /* .type = */ {Type::DOUBLE, nullptr},
3293  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_ic>,
3294  /* .attributes = */ {true, false, false, false, false},
3295  /* .count = */ 1,
3296  /* .condition = */ {},
3297  },
3298  {
3299  /* .name = */ "c_is",
3300  /* .docs = */ "Harmonic Correction Term.",
3301  /* .type = */ {Type::DOUBLE, nullptr},
3302  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_is>,
3303  /* .attributes = */ {true, false, false, false, false},
3304  /* .count = */ 1,
3305  /* .condition = */ {},
3306  },
3307  {
3308  /* .name = */ "c_uc",
3309  /* .docs = */ "Harmonic Correction Term.",
3310  /* .type = */ {Type::DOUBLE, nullptr},
3311  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_uc>,
3312  /* .attributes = */ {true, false, false, false, false},
3313  /* .count = */ 1,
3314  /* .condition = */ {},
3315  },
3316  {
3317  /* .name = */ "c_us",
3318  /* .docs = */ "Harmonic Correction Term.",
3319  /* .type = */ {Type::DOUBLE, nullptr},
3320  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_us>,
3321  /* .attributes = */ {true, false, false, false, false},
3322  /* .count = */ 1,
3323  /* .condition = */ {},
3324  },
3325  {
3326  /* .name = */ "c_rc",
3327  /* .docs = */ "Harmonic Correction Term.",
3328  /* .type = */ {Type::DOUBLE, nullptr},
3329  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_rc>,
3330  /* .attributes = */ {true, false, false, false, false},
3331  /* .count = */ 1,
3332  /* .condition = */ {},
3333  },
3334  {
3335  /* .name = */ "c_rs",
3336  /* .docs = */ "Harmonic Correction Term.",
3337  /* .type = */ {Type::DOUBLE, nullptr},
3338  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_rs>,
3339  /* .attributes = */ {true, false, false, false, false},
3340  /* .count = */ 1,
3341  /* .condition = */ {},
3342  },
3343  {
3344  /* .name = */ "valid_flags",
3345  /* .docs = */ "",
3347  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GalileoEphemeris::ValidFlags, &type::valid_flags>,
3348  /* .attributes = */ {true, false, false, false, false},
3349  /* .count = */ 1,
3350  /* .condition = */ {},
3351  },
3352  };
3353 
3354  static constexpr inline FieldInfo value = {
3355  {
3356  /* .name = */ "data_gnss::GalileoEphemeris",
3357  /* .title = */ "Galileo Ephemeris",
3358  /* .docs = */ "Galileo Ephemeris Data",
3359  /* .parameters = */ parameters,
3360  },
3361  /* .descriptor = */ type::DESCRIPTOR,
3362  /* .functions = */ NO_FUNCTIONS,
3363  /* .response = */ nullptr,
3364  };
3365 };
3366 
3367 template<>
3368 struct MetadataFor<data_gnss::GloEphemeris::ValidFlags>
3369 {
3371 
3372  static constexpr inline BitfieldInfo::Entry entries[] = {
3373  { uint32_t(1), "ephemeris", "" },
3374  { uint32_t(1), "flags", "" },
3375  };
3376 
3377  static constexpr inline BitfieldInfo value = {
3378  /* .name = */ "ValidFlags",
3379  /* .docs = */ "",
3380  /* .type = */ Type::U16,
3381  /* .entries = */ entries,
3382  };
3383 
3384 };
3385 
3386 template<>
3387 struct MetadataFor<data_gnss::GloEphemeris>
3388 {
3390 
3391  static constexpr inline ParameterInfo parameters[] = {
3392  {
3393  /* .name = */ "index",
3394  /* .docs = */ "Index of this field in this epoch.",
3395  /* .type = */ {Type::U8, nullptr},
3396  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
3397  /* .attributes = */ {true, false, false, false, false},
3398  /* .count = */ 1,
3399  /* .condition = */ {},
3400  },
3401  {
3402  /* .name = */ "count",
3403  /* .docs = */ "Total number of fields in this epoch.",
3404  /* .type = */ {Type::U8, nullptr},
3405  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
3406  /* .attributes = */ {true, false, false, false, false},
3407  /* .count = */ 1,
3408  /* .condition = */ {},
3409  },
3410  {
3411  /* .name = */ "time_of_week",
3412  /* .docs = */ "GPS Time of week [seconds]",
3413  /* .type = */ {Type::DOUBLE, nullptr},
3414  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
3415  /* .attributes = */ {true, false, false, false, false},
3416  /* .count = */ 1,
3417  /* .condition = */ {},
3418  },
3419  {
3420  /* .name = */ "week_number",
3421  /* .docs = */ "GPS Week since 1980 [weeks]",
3422  /* .type = */ {Type::U16, nullptr},
3423  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
3424  /* .attributes = */ {true, false, false, false, false},
3425  /* .count = */ 1,
3426  /* .condition = */ {},
3427  },
3428  {
3429  /* .name = */ "satellite_id",
3430  /* .docs = */ "GNSS satellite id within the constellation.",
3431  /* .type = */ {Type::U8, nullptr},
3432  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::satellite_id>,
3433  /* .attributes = */ {true, false, false, false, false},
3434  /* .count = */ 1,
3435  /* .condition = */ {},
3436  },
3437  {
3438  /* .name = */ "freq_number",
3439  /* .docs = */ "GLONASS frequency number (-7 to 24)",
3440  /* .type = */ {Type::S8, nullptr},
3441  /* .accessor = */ nullptr, //utils::access<type, int8_t, &type::freq_number>,
3442  /* .attributes = */ {true, false, false, false, false},
3443  /* .count = */ 1,
3444  /* .condition = */ {},
3445  },
3446  {
3447  /* .name = */ "tk",
3448  /* .docs = */ "Frame start time within current day [seconds]",
3449  /* .type = */ {Type::U32, nullptr},
3450  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::tk>,
3451  /* .attributes = */ {true, false, false, false, false},
3452  /* .count = */ 1,
3453  /* .condition = */ {},
3454  },
3455  {
3456  /* .name = */ "tb",
3457  /* .docs = */ "Ephemeris reference time [seconds]",
3458  /* .type = */ {Type::U32, nullptr},
3459  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::tb>,
3460  /* .attributes = */ {true, false, false, false, false},
3461  /* .count = */ 1,
3462  /* .condition = */ {},
3463  },
3464  {
3465  /* .name = */ "sat_type",
3466  /* .docs = */ "Type of satellite (M) GLONASS = 0, GLONASS-M = 1",
3467  /* .type = */ {Type::U8, nullptr},
3468  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::sat_type>,
3469  /* .attributes = */ {true, false, false, false, false},
3470  /* .count = */ 1,
3471  /* .condition = */ {},
3472  },
3473  {
3474  /* .name = */ "gamma",
3475  /* .docs = */ "Relative deviation of carrier frequency from nominal [dimensionless]",
3476  /* .type = */ {Type::DOUBLE, nullptr},
3477  /* .accessor = */ nullptr, //utils::access<type, double, &type::gamma>,
3478  /* .attributes = */ {true, false, false, false, false},
3479  /* .count = */ 1,
3480  /* .condition = */ {},
3481  },
3482  {
3483  /* .name = */ "tau_n",
3484  /* .docs = */ "Time correction relative to GLONASS Time [seconds]",
3485  /* .type = */ {Type::DOUBLE, nullptr},
3486  /* .accessor = */ nullptr, //utils::access<type, double, &type::tau_n>,
3487  /* .attributes = */ {true, false, false, false, false},
3488  /* .count = */ 1,
3489  /* .condition = */ {},
3490  },
3491  {
3492  /* .name = */ "x",
3493  /* .docs = */ "Satellite PE-90 position [m]",
3494  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3d>::value},
3495  /* .accessor = */ nullptr, //utils::access<type, Vector3d, &type::x>,
3496  /* .attributes = */ {true, false, false, false, false},
3497  /* .count = */ 1,
3498  /* .condition = */ {},
3499  },
3500  {
3501  /* .name = */ "v",
3502  /* .docs = */ "Satellite PE-90 velocity [m/s]",
3503  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3504  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::v>,
3505  /* .attributes = */ {true, false, false, false, false},
3506  /* .count = */ 1,
3507  /* .condition = */ {},
3508  },
3509  {
3510  /* .name = */ "a",
3511  /* .docs = */ "Satellite PE-90 acceleration due to perturbations [m/s^2]",
3512  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3513  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::a>,
3514  /* .attributes = */ {true, false, false, false, false},
3515  /* .count = */ 1,
3516  /* .condition = */ {},
3517  },
3518  {
3519  /* .name = */ "health",
3520  /* .docs = */ "Satellite Health (Bn), Non-zero indicates satellite malfunction",
3521  /* .type = */ {Type::U8, nullptr},
3522  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::health>,
3523  /* .attributes = */ {true, false, false, false, false},
3524  /* .count = */ 1,
3525  /* .condition = */ {},
3526  },
3527  {
3528  /* .name = */ "P",
3529  /* .docs = */ "Satellite operation mode (See GLONASS ICD)",
3530  /* .type = */ {Type::U8, nullptr},
3531  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::P>,
3532  /* .attributes = */ {true, false, false, false, false},
3533  /* .count = */ 1,
3534  /* .condition = */ {},
3535  },
3536  {
3537  /* .name = */ "NT",
3538  /* .docs = */ "Day number within a 4 year period.",
3539  /* .type = */ {Type::U8, nullptr},
3540  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::NT>,
3541  /* .attributes = */ {true, false, false, false, false},
3542  /* .count = */ 1,
3543  /* .condition = */ {},
3544  },
3545  {
3546  /* .name = */ "delta_tau_n",
3547  /* .docs = */ "Time difference between L1 and L2[m/s]",
3548  /* .type = */ {Type::FLOAT, nullptr},
3549  /* .accessor = */ nullptr, //utils::access<type, float, &type::delta_tau_n>,
3550  /* .attributes = */ {true, false, false, false, false},
3551  /* .count = */ 1,
3552  /* .condition = */ {},
3553  },
3554  {
3555  /* .name = */ "Ft",
3556  /* .docs = */ "User Range Accuracy (See GLONASS ICD)",
3557  /* .type = */ {Type::U8, nullptr},
3558  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::Ft>,
3559  /* .attributes = */ {true, false, false, false, false},
3560  /* .count = */ 1,
3561  /* .condition = */ {},
3562  },
3563  {
3564  /* .name = */ "En",
3565  /* .docs = */ "Age of current information [days]",
3566  /* .type = */ {Type::U8, nullptr},
3567  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::En>,
3568  /* .attributes = */ {true, false, false, false, false},
3569  /* .count = */ 1,
3570  /* .condition = */ {},
3571  },
3572  {
3573  /* .name = */ "P1",
3574  /* .docs = */ "Time interval between adjacent values of tb [minutes]",
3575  /* .type = */ {Type::U8, nullptr},
3576  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::P1>,
3577  /* .attributes = */ {true, false, false, false, false},
3578  /* .count = */ 1,
3579  /* .condition = */ {},
3580  },
3581  {
3582  /* .name = */ "P2",
3583  /* .docs = */ "Oddness '1' or evenness '0' of the value of tb.",
3584  /* .type = */ {Type::U8, nullptr},
3585  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::P2>,
3586  /* .attributes = */ {true, false, false, false, false},
3587  /* .count = */ 1,
3588  /* .condition = */ {},
3589  },
3590  {
3591  /* .name = */ "P3",
3592  /* .docs = */ "Number of satellites in almanac for this frame",
3593  /* .type = */ {Type::U8, nullptr},
3594  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::P3>,
3595  /* .attributes = */ {true, false, false, false, false},
3596  /* .count = */ 1,
3597  /* .condition = */ {},
3598  },
3599  {
3600  /* .name = */ "P4",
3601  /* .docs = */ "Flag indicating ephemeris parameters are present",
3602  /* .type = */ {Type::U8, nullptr},
3603  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::P4>,
3604  /* .attributes = */ {true, false, false, false, false},
3605  /* .count = */ 1,
3606  /* .condition = */ {},
3607  },
3608  {
3609  /* .name = */ "valid_flags",
3610  /* .docs = */ "",
3612  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GloEphemeris::ValidFlags, &type::valid_flags>,
3613  /* .attributes = */ {true, false, false, false, false},
3614  /* .count = */ 1,
3615  /* .condition = */ {},
3616  },
3617  };
3618 
3619  static constexpr inline FieldInfo value = {
3620  {
3621  /* .name = */ "data_gnss::GloEphemeris",
3622  /* .title = */ "Glonass Ephemeris",
3623  /* .docs = */ "Glonass Ephemeris Data",
3624  /* .parameters = */ parameters,
3625  },
3626  /* .descriptor = */ type::DESCRIPTOR,
3627  /* .functions = */ NO_FUNCTIONS,
3628  /* .response = */ nullptr,
3629  };
3630 };
3631 
3632 template<>
3633 struct MetadataFor<data_gnss::BeidouEphemeris::ValidFlags>
3634 {
3636 
3637  static constexpr inline BitfieldInfo::Entry entries[] = {
3638  { uint32_t(1), "ephemeris", "" },
3639  { uint32_t(2), "modern_data", "" },
3640  { uint32_t(4), "isc_l5", "" },
3641  { uint32_t(7), "flags", "" },
3642  };
3643 
3644  static constexpr inline BitfieldInfo value = {
3645  /* .name = */ "ValidFlags",
3646  /* .docs = */ "",
3647  /* .type = */ Type::U16,
3648  /* .entries = */ entries,
3649  };
3650 
3651 };
3652 
3653 template<>
3654 struct MetadataFor<data_gnss::BeidouEphemeris>
3655 {
3657 
3658  static constexpr inline ParameterInfo parameters[] = {
3659  {
3660  /* .name = */ "index",
3661  /* .docs = */ "Index of this field in this epoch.",
3662  /* .type = */ {Type::U8, nullptr},
3663  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::index>,
3664  /* .attributes = */ {true, false, false, false, false},
3665  /* .count = */ 1,
3666  /* .condition = */ {},
3667  },
3668  {
3669  /* .name = */ "count",
3670  /* .docs = */ "Total number of fields in this epoch.",
3671  /* .type = */ {Type::U8, nullptr},
3672  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
3673  /* .attributes = */ {true, false, false, false, false},
3674  /* .count = */ 1,
3675  /* .condition = */ {},
3676  },
3677  {
3678  /* .name = */ "time_of_week",
3679  /* .docs = */ "GPS Time of week [seconds]",
3680  /* .type = */ {Type::DOUBLE, nullptr},
3681  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
3682  /* .attributes = */ {true, false, false, false, false},
3683  /* .count = */ 1,
3684  /* .condition = */ {},
3685  },
3686  {
3687  /* .name = */ "week_number",
3688  /* .docs = */ "GPS Week since 1980 [weeks]",
3689  /* .type = */ {Type::U16, nullptr},
3690  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
3691  /* .attributes = */ {true, false, false, false, false},
3692  /* .count = */ 1,
3693  /* .condition = */ {},
3694  },
3695  {
3696  /* .name = */ "satellite_id",
3697  /* .docs = */ "GNSS satellite id within the constellation.",
3698  /* .type = */ {Type::U8, nullptr},
3699  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::satellite_id>,
3700  /* .attributes = */ {true, false, false, false, false},
3701  /* .count = */ 1,
3702  /* .condition = */ {},
3703  },
3704  {
3705  /* .name = */ "health",
3706  /* .docs = */ "Satellite and signal health",
3707  /* .type = */ {Type::U8, nullptr},
3708  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::health>,
3709  /* .attributes = */ {true, false, false, false, false},
3710  /* .count = */ 1,
3711  /* .condition = */ {},
3712  },
3713  {
3714  /* .name = */ "iodc",
3715  /* .docs = */ "Issue of Data Clock. This increments each time the data changes and\nrolls over at 4. It is used to make sure various raw data elements from\ndifferent sources line up correctly.",
3716  /* .type = */ {Type::U8, nullptr},
3717  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::iodc>,
3718  /* .attributes = */ {true, false, false, false, false},
3719  /* .count = */ 1,
3720  /* .condition = */ {},
3721  },
3722  {
3723  /* .name = */ "iode",
3724  /* .docs = */ "Issue of Data Ephemeris.",
3725  /* .type = */ {Type::U8, nullptr},
3726  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::iode>,
3727  /* .attributes = */ {true, false, false, false, false},
3728  /* .count = */ 1,
3729  /* .condition = */ {},
3730  },
3731  {
3732  /* .name = */ "t_oc",
3733  /* .docs = */ "Reference time for clock data.",
3734  /* .type = */ {Type::DOUBLE, nullptr},
3735  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_oc>,
3736  /* .attributes = */ {true, false, false, false, false},
3737  /* .count = */ 1,
3738  /* .condition = */ {},
3739  },
3740  {
3741  /* .name = */ "af0",
3742  /* .docs = */ "Clock bias in [s].",
3743  /* .type = */ {Type::DOUBLE, nullptr},
3744  /* .accessor = */ nullptr, //utils::access<type, double, &type::af0>,
3745  /* .attributes = */ {true, false, false, false, false},
3746  /* .count = */ 1,
3747  /* .condition = */ {},
3748  },
3749  {
3750  /* .name = */ "af1",
3751  /* .docs = */ "Clock drift in [s/s].",
3752  /* .type = */ {Type::DOUBLE, nullptr},
3753  /* .accessor = */ nullptr, //utils::access<type, double, &type::af1>,
3754  /* .attributes = */ {true, false, false, false, false},
3755  /* .count = */ 1,
3756  /* .condition = */ {},
3757  },
3758  {
3759  /* .name = */ "af2",
3760  /* .docs = */ "Clock drift rate in [s/s^2].",
3761  /* .type = */ {Type::DOUBLE, nullptr},
3762  /* .accessor = */ nullptr, //utils::access<type, double, &type::af2>,
3763  /* .attributes = */ {true, false, false, false, false},
3764  /* .count = */ 1,
3765  /* .condition = */ {},
3766  },
3767  {
3768  /* .name = */ "t_gd",
3769  /* .docs = */ "T Group Delay [s].",
3770  /* .type = */ {Type::DOUBLE, nullptr},
3771  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_gd>,
3772  /* .attributes = */ {true, false, false, false, false},
3773  /* .count = */ 1,
3774  /* .condition = */ {},
3775  },
3776  {
3777  /* .name = */ "ISC_L1CA",
3778  /* .docs = */ "Inter-signal correction (L1).",
3779  /* .type = */ {Type::DOUBLE, nullptr},
3780  /* .accessor = */ nullptr, //utils::access<type, double, &type::ISC_L1CA>,
3781  /* .attributes = */ {true, false, false, false, false},
3782  /* .count = */ 1,
3783  /* .condition = */ {},
3784  },
3785  {
3786  /* .name = */ "ISC_L2C",
3787  /* .docs = */ "Inter-signal correction (L2, or L5 if isc_l5 flag is set).",
3788  /* .type = */ {Type::DOUBLE, nullptr},
3789  /* .accessor = */ nullptr, //utils::access<type, double, &type::ISC_L2C>,
3790  /* .attributes = */ {true, false, false, false, false},
3791  /* .count = */ 1,
3792  /* .condition = */ {},
3793  },
3794  {
3795  /* .name = */ "t_oe",
3796  /* .docs = */ "Reference time for ephemeris in [s].",
3797  /* .type = */ {Type::DOUBLE, nullptr},
3798  /* .accessor = */ nullptr, //utils::access<type, double, &type::t_oe>,
3799  /* .attributes = */ {true, false, false, false, false},
3800  /* .count = */ 1,
3801  /* .condition = */ {},
3802  },
3803  {
3804  /* .name = */ "a",
3805  /* .docs = */ "Semi-major axis [m].",
3806  /* .type = */ {Type::DOUBLE, nullptr},
3807  /* .accessor = */ nullptr, //utils::access<type, double, &type::a>,
3808  /* .attributes = */ {true, false, false, false, false},
3809  /* .count = */ 1,
3810  /* .condition = */ {},
3811  },
3812  {
3813  /* .name = */ "a_dot",
3814  /* .docs = */ "Semi-major axis rate [m/s].",
3815  /* .type = */ {Type::DOUBLE, nullptr},
3816  /* .accessor = */ nullptr, //utils::access<type, double, &type::a_dot>,
3817  /* .attributes = */ {true, false, false, false, false},
3818  /* .count = */ 1,
3819  /* .condition = */ {},
3820  },
3821  {
3822  /* .name = */ "mean_anomaly",
3823  /* .docs = */ "[rad].",
3824  /* .type = */ {Type::DOUBLE, nullptr},
3825  /* .accessor = */ nullptr, //utils::access<type, double, &type::mean_anomaly>,
3826  /* .attributes = */ {true, false, false, false, false},
3827  /* .count = */ 1,
3828  /* .condition = */ {},
3829  },
3830  {
3831  /* .name = */ "delta_mean_motion",
3832  /* .docs = */ "[rad].",
3833  /* .type = */ {Type::DOUBLE, nullptr},
3834  /* .accessor = */ nullptr, //utils::access<type, double, &type::delta_mean_motion>,
3835  /* .attributes = */ {true, false, false, false, false},
3836  /* .count = */ 1,
3837  /* .condition = */ {},
3838  },
3839  {
3840  /* .name = */ "delta_mean_motion_dot",
3841  /* .docs = */ "[rad/s].",
3842  /* .type = */ {Type::DOUBLE, nullptr},
3843  /* .accessor = */ nullptr, //utils::access<type, double, &type::delta_mean_motion_dot>,
3844  /* .attributes = */ {true, false, false, false, false},
3845  /* .count = */ 1,
3846  /* .condition = */ {},
3847  },
3848  {
3849  /* .name = */ "eccentricity",
3850  /* .docs = */ "",
3851  /* .type = */ {Type::DOUBLE, nullptr},
3852  /* .accessor = */ nullptr, //utils::access<type, double, &type::eccentricity>,
3853  /* .attributes = */ {true, false, false, false, false},
3854  /* .count = */ 1,
3855  /* .condition = */ {},
3856  },
3857  {
3858  /* .name = */ "argument_of_perigee",
3859  /* .docs = */ "[rad].",
3860  /* .type = */ {Type::DOUBLE, nullptr},
3861  /* .accessor = */ nullptr, //utils::access<type, double, &type::argument_of_perigee>,
3862  /* .attributes = */ {true, false, false, false, false},
3863  /* .count = */ 1,
3864  /* .condition = */ {},
3865  },
3866  {
3867  /* .name = */ "omega",
3868  /* .docs = */ "Longitude of Ascending Node [rad].",
3869  /* .type = */ {Type::DOUBLE, nullptr},
3870  /* .accessor = */ nullptr, //utils::access<type, double, &type::omega>,
3871  /* .attributes = */ {true, false, false, false, false},
3872  /* .count = */ 1,
3873  /* .condition = */ {},
3874  },
3875  {
3876  /* .name = */ "omega_dot",
3877  /* .docs = */ "Rate of Right Ascension [rad/s].",
3878  /* .type = */ {Type::DOUBLE, nullptr},
3879  /* .accessor = */ nullptr, //utils::access<type, double, &type::omega_dot>,
3880  /* .attributes = */ {true, false, false, false, false},
3881  /* .count = */ 1,
3882  /* .condition = */ {},
3883  },
3884  {
3885  /* .name = */ "inclination",
3886  /* .docs = */ "Inclination angle [rad].",
3887  /* .type = */ {Type::DOUBLE, nullptr},
3888  /* .accessor = */ nullptr, //utils::access<type, double, &type::inclination>,
3889  /* .attributes = */ {true, false, false, false, false},
3890  /* .count = */ 1,
3891  /* .condition = */ {},
3892  },
3893  {
3894  /* .name = */ "inclination_dot",
3895  /* .docs = */ "Inclination angle rate of change [rad/s].",
3896  /* .type = */ {Type::DOUBLE, nullptr},
3897  /* .accessor = */ nullptr, //utils::access<type, double, &type::inclination_dot>,
3898  /* .attributes = */ {true, false, false, false, false},
3899  /* .count = */ 1,
3900  /* .condition = */ {},
3901  },
3902  {
3903  /* .name = */ "c_ic",
3904  /* .docs = */ "Harmonic Correction Term.",
3905  /* .type = */ {Type::DOUBLE, nullptr},
3906  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_ic>,
3907  /* .attributes = */ {true, false, false, false, false},
3908  /* .count = */ 1,
3909  /* .condition = */ {},
3910  },
3911  {
3912  /* .name = */ "c_is",
3913  /* .docs = */ "Harmonic Correction Term.",
3914  /* .type = */ {Type::DOUBLE, nullptr},
3915  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_is>,
3916  /* .attributes = */ {true, false, false, false, false},
3917  /* .count = */ 1,
3918  /* .condition = */ {},
3919  },
3920  {
3921  /* .name = */ "c_uc",
3922  /* .docs = */ "Harmonic Correction Term.",
3923  /* .type = */ {Type::DOUBLE, nullptr},
3924  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_uc>,
3925  /* .attributes = */ {true, false, false, false, false},
3926  /* .count = */ 1,
3927  /* .condition = */ {},
3928  },
3929  {
3930  /* .name = */ "c_us",
3931  /* .docs = */ "Harmonic Correction Term.",
3932  /* .type = */ {Type::DOUBLE, nullptr},
3933  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_us>,
3934  /* .attributes = */ {true, false, false, false, false},
3935  /* .count = */ 1,
3936  /* .condition = */ {},
3937  },
3938  {
3939  /* .name = */ "c_rc",
3940  /* .docs = */ "Harmonic Correction Term.",
3941  /* .type = */ {Type::DOUBLE, nullptr},
3942  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_rc>,
3943  /* .attributes = */ {true, false, false, false, false},
3944  /* .count = */ 1,
3945  /* .condition = */ {},
3946  },
3947  {
3948  /* .name = */ "c_rs",
3949  /* .docs = */ "Harmonic Correction Term.",
3950  /* .type = */ {Type::DOUBLE, nullptr},
3951  /* .accessor = */ nullptr, //utils::access<type, double, &type::c_rs>,
3952  /* .attributes = */ {true, false, false, false, false},
3953  /* .count = */ 1,
3954  /* .condition = */ {},
3955  },
3956  {
3957  /* .name = */ "valid_flags",
3958  /* .docs = */ "",
3960  /* .accessor = */ nullptr, //utils::access<type, data_gnss::BeidouEphemeris::ValidFlags, &type::valid_flags>,
3961  /* .attributes = */ {true, false, false, false, false},
3962  /* .count = */ 1,
3963  /* .condition = */ {},
3964  },
3965  };
3966 
3967  static constexpr inline FieldInfo value = {
3968  {
3969  /* .name = */ "data_gnss::BeidouEphemeris",
3970  /* .title = */ "BeiDou Ephemeris",
3971  /* .docs = */ "BeiDou Ephemeris Data",
3972  /* .parameters = */ parameters,
3973  },
3974  /* .descriptor = */ type::DESCRIPTOR,
3975  /* .functions = */ NO_FUNCTIONS,
3976  /* .response = */ nullptr,
3977  };
3978 };
3979 
3980 template<>
3981 struct MetadataFor<data_gnss::GpsIonoCorr::ValidFlags>
3982 {
3984 
3985  static constexpr inline BitfieldInfo::Entry entries[] = {
3986  { uint32_t(1), "tow", "" },
3987  { uint32_t(2), "week_number", "" },
3988  { uint32_t(4), "alpha", "" },
3989  { uint32_t(8), "beta", "" },
3990  { uint32_t(15), "flags", "" },
3991  };
3992 
3993  static constexpr inline BitfieldInfo value = {
3994  /* .name = */ "ValidFlags",
3995  /* .docs = */ "",
3996  /* .type = */ Type::U16,
3997  /* .entries = */ entries,
3998  };
3999 
4000 };
4001 
4002 template<>
4003 struct MetadataFor<data_gnss::GpsIonoCorr>
4004 {
4006 
4007  static constexpr inline ParameterInfo parameters[] = {
4008  {
4009  /* .name = */ "time_of_week",
4010  /* .docs = */ "GPS Time of week [seconds]",
4011  /* .type = */ {Type::DOUBLE, nullptr},
4012  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
4013  /* .attributes = */ {true, false, false, false, false},
4014  /* .count = */ 1,
4015  /* .condition = */ {},
4016  },
4017  {
4018  /* .name = */ "week_number",
4019  /* .docs = */ "GPS Week since 1980 [weeks]",
4020  /* .type = */ {Type::U16, nullptr},
4021  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
4022  /* .attributes = */ {true, false, false, false, false},
4023  /* .count = */ 1,
4024  /* .condition = */ {},
4025  },
4026  {
4027  /* .name = */ "alpha",
4028  /* .docs = */ "Ionospheric Correction Terms.",
4029  /* .type = */ {Type::DOUBLE, nullptr},
4030  /* .accessor = */ nullptr, //utils::access<type, double, &type::alpha>,
4031  /* .attributes = */ {true, false, false, false, false},
4032  /* .count = */ 4,
4033  /* .condition = */ {},
4034  },
4035  {
4036  /* .name = */ "beta",
4037  /* .docs = */ "Ionospheric Correction Terms.",
4038  /* .type = */ {Type::DOUBLE, nullptr},
4039  /* .accessor = */ nullptr, //utils::access<type, double, &type::beta>,
4040  /* .attributes = */ {true, false, false, false, false},
4041  /* .count = */ 4,
4042  /* .condition = */ {},
4043  },
4044  {
4045  /* .name = */ "valid_flags",
4046  /* .docs = */ "",
4048  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GpsIonoCorr::ValidFlags, &type::valid_flags>,
4049  /* .attributes = */ {true, false, false, false, false},
4050  /* .count = */ 1,
4051  /* .condition = */ {},
4052  },
4053  };
4054 
4055  static constexpr inline FieldInfo value = {
4056  {
4057  /* .name = */ "data_gnss::GpsIonoCorr",
4058  /* .title = */ "GPS Ionospheric Correction",
4059  /* .docs = */ "Ionospheric Correction Terms for GNSS",
4060  /* .parameters = */ parameters,
4061  },
4062  /* .descriptor = */ type::DESCRIPTOR,
4063  /* .functions = */ NO_FUNCTIONS,
4064  /* .response = */ nullptr,
4065  };
4066 };
4067 
4068 template<>
4069 struct MetadataFor<data_gnss::GalileoIonoCorr::ValidFlags>
4070 {
4072 
4073  static constexpr inline BitfieldInfo::Entry entries[] = {
4074  { uint32_t(1), "tow", "" },
4075  { uint32_t(2), "week_number", "" },
4076  { uint32_t(4), "alpha", "" },
4077  { uint32_t(8), "disturbance_flags", "" },
4078  { uint32_t(15), "flags", "" },
4079  };
4080 
4081  static constexpr inline BitfieldInfo value = {
4082  /* .name = */ "ValidFlags",
4083  /* .docs = */ "",
4084  /* .type = */ Type::U16,
4085  /* .entries = */ entries,
4086  };
4087 
4088 };
4089 
4090 template<>
4091 struct MetadataFor<data_gnss::GalileoIonoCorr>
4092 {
4094 
4095  static constexpr inline ParameterInfo parameters[] = {
4096  {
4097  /* .name = */ "time_of_week",
4098  /* .docs = */ "GPS Time of week [seconds]",
4099  /* .type = */ {Type::DOUBLE, nullptr},
4100  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
4101  /* .attributes = */ {true, false, false, false, false},
4102  /* .count = */ 1,
4103  /* .condition = */ {},
4104  },
4105  {
4106  /* .name = */ "week_number",
4107  /* .docs = */ "GPS Week since 1980 [weeks]",
4108  /* .type = */ {Type::U16, nullptr},
4109  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
4110  /* .attributes = */ {true, false, false, false, false},
4111  /* .count = */ 1,
4112  /* .condition = */ {},
4113  },
4114  {
4115  /* .name = */ "alpha",
4116  /* .docs = */ "Coefficients for the model.",
4117  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3d>::value},
4118  /* .accessor = */ nullptr, //utils::access<type, Vector3d, &type::alpha>,
4119  /* .attributes = */ {true, false, false, false, false},
4120  /* .count = */ 1,
4121  /* .condition = */ {},
4122  },
4123  {
4124  /* .name = */ "disturbance_flags",
4125  /* .docs = */ "Region disturbance flags (bits 1-5).",
4126  /* .type = */ {Type::U8, nullptr},
4127  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::disturbance_flags>,
4128  /* .attributes = */ {true, false, false, false, false},
4129  /* .count = */ 1,
4130  /* .condition = */ {},
4131  },
4132  {
4133  /* .name = */ "valid_flags",
4134  /* .docs = */ "",
4136  /* .accessor = */ nullptr, //utils::access<type, data_gnss::GalileoIonoCorr::ValidFlags, &type::valid_flags>,
4137  /* .attributes = */ {true, false, false, false, false},
4138  /* .count = */ 1,
4139  /* .condition = */ {},
4140  },
4141  };
4142 
4143  static constexpr inline FieldInfo value = {
4144  {
4145  /* .name = */ "data_gnss::GalileoIonoCorr",
4146  /* .title = */ "Galileo Ionospheric Correction",
4147  /* .docs = */ "Ionospheric Correction Terms for Galileo",
4148  /* .parameters = */ parameters,
4149  },
4150  /* .descriptor = */ type::DESCRIPTOR,
4151  /* .functions = */ NO_FUNCTIONS,
4152  /* .response = */ nullptr,
4153  };
4154 };
4155 
4156 template<>
4157 struct MetadataFor<data_gnss::BeidouIonoCorr::ValidFlags>
4158 {
4160 
4161  static constexpr inline BitfieldInfo::Entry entries[] = {
4162  { uint32_t(1), "tow", "" },
4163  { uint32_t(2), "week_number", "" },
4164  { uint32_t(4), "alpha", "" },
4165  { uint32_t(8), "beta", "" },
4166  { uint32_t(16), "alpha_corr", "" },
4167  { uint32_t(31), "flags", "" },
4168  };
4169 
4170  static constexpr inline BitfieldInfo value = {
4171  /* .name = */ "ValidFlags",
4172  /* .docs = */ "",
4173  /* .type = */ Type::U16,
4174  /* .entries = */ entries,
4175  };
4176 
4177 };
4178 
4179 template<>
4180 struct MetadataFor<data_gnss::BeidouIonoCorr>
4181 {
4183 
4184  static constexpr inline ParameterInfo parameters[] = {
4185  {
4186  /* .name = */ "time_of_week",
4187  /* .docs = */ "GPS Time of week [seconds]",
4188  /* .type = */ {Type::DOUBLE, nullptr},
4189  /* .accessor = */ nullptr, //utils::access<type, double, &type::time_of_week>,
4190  /* .attributes = */ {true, false, false, false, false},
4191  /* .count = */ 1,
4192  /* .condition = */ {},
4193  },
4194  {
4195  /* .name = */ "week_number",
4196  /* .docs = */ "GPS Week since 1980 [weeks]",
4197  /* .type = */ {Type::U16, nullptr},
4198  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
4199  /* .attributes = */ {true, false, false, false, false},
4200  /* .count = */ 1,
4201  /* .condition = */ {},
4202  },
4203  {
4204  /* .name = */ "alpha",
4205  /* .docs = */ "Ionospheric Delay Terms.",
4206  /* .type = */ {Type::DOUBLE, nullptr},
4207  /* .accessor = */ nullptr, //utils::access<type, double, &type::alpha>,
4208  /* .attributes = */ {true, false, false, false, false},
4209  /* .count = */ 4,
4210  /* .condition = */ {},
4211  },
4212  {
4213  /* .name = */ "beta",
4214  /* .docs = */ "Ionospheric Delay Terms.",
4215  /* .type = */ {Type::DOUBLE, nullptr},
4216  /* .accessor = */ nullptr, //utils::access<type, double, &type::beta>,
4217  /* .attributes = */ {true, false, false, false, false},
4218  /* .count = */ 4,
4219  /* .condition = */ {},
4220  },
4221  {
4222  /* .name = */ "alpha_corr",
4223  /* .docs = */ "Ionospheric Delay Correction Terms.",
4224  /* .type = */ {Type::DOUBLE, nullptr},
4225  /* .accessor = */ nullptr, //utils::access<type, double, &type::alpha_corr>,
4226  /* .attributes = */ {true, false, false, false, false},
4227  /* .count = */ 9,
4228  /* .condition = */ {},
4229  },
4230  {
4231  /* .name = */ "valid_flags",
4232  /* .docs = */ "",
4234  /* .accessor = */ nullptr, //utils::access<type, data_gnss::BeidouIonoCorr::ValidFlags, &type::valid_flags>,
4235  /* .attributes = */ {true, false, false, false, false},
4236  /* .count = */ 1,
4237  /* .condition = */ {},
4238  },
4239  };
4240 
4241  static constexpr inline FieldInfo value = {
4242  {
4243  /* .name = */ "data_gnss::BeidouIonoCorr",
4244  /* .title = */ "BeiDou Ionospheric Correction",
4245  /* .docs = */ "Ionospheric Correction Terms for BeiDou",
4246  /* .parameters = */ parameters,
4247  },
4248  /* .descriptor = */ type::DESCRIPTOR,
4249  /* .functions = */ NO_FUNCTIONS,
4250  /* .response = */ nullptr,
4251  };
4252 };
4253 
4254 
4255 static constexpr inline const FieldInfo* DATA_GNSS_FIELDS[] = {
4285 };
4286 
4287 static constexpr DescriptorSetInfo DATA_GNSS = {
4288  /* .descriptor = */ mip::data_gnss::DESCRIPTOR_SET,
4289  /* .name = */ "Gnss Data",
4290  /* .fields = */ DATA_GNSS_FIELDS,
4291 };
4292 
4293 } // namespace mip::metadata
4294 
mip::data_gnss::HwStatus::ValidFlags
Definition: data_gnss.hpp:1038
mip::metadata::MetadataFor< data_gnss::GalileoEphemeris >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:3354
mip::data_gnss::ClockInfo2
Definition: data_gnss.hpp:1279
mip::data_gnss::Raw::ValidFlags
Definition: data_gnss.hpp:2114
mip::data_gnss::Dop
Definition: data_gnss.hpp:482
common.hpp
mip::data_gnss::BeidouEphemeris::ValidFlags
Definition: data_gnss.hpp:2535
mip::metadata::MetadataFor< data_gnss::Dop >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:468
mip::metadata::Type::ENUM
@ ENUM
mip::data_gnss::Raw
Definition: data_gnss.hpp:2102
mip::data_gnss::FixInfo
Definition: data_gnss.hpp:787
mip::data_gnss::HwStatus
Definition: data_gnss.hpp:1013
mip::metadata::BitfieldInfo
Definition: mip_structures.hpp:89
mip::metadata
Definition: common.hpp:8
mip::data_gnss::RtkCorrectionsStatus
Definition: data_gnss.hpp:1869
mip::data_gnss::VelEcef
Definition: data_gnss.hpp:413
mip::data_gnss::Dop::ValidFlags
Definition: data_gnss.hpp:484
mip::metadata::MetadataFor< data_gnss::GpsTime >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:649
mip::data_gnss::GpsIonoCorr::ValidFlags
Definition: data_gnss.hpp:2638
mip::data_gnss::SbasSystem
SbasSystem
Definition: data_gnss.hpp:155
mip::data_gnss::RfErrorDetection
Definition: data_gnss.hpp:1637
mip::data_gnss::SbasInfo::SbasStatus
Definition: data_gnss.hpp:1420
mip::data_gnss::GnssConstellationId
GnssConstellationId
Definition: data_gnss.hpp:75
mip::metadata::MetadataFor< data_gnss::GloEphemeris >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:3619
mip::data_gnss::RtkCorrectionsStatus::ValidFlags
Definition: data_gnss.hpp:1871
mip::metadata::MetadataFor< data_gnss::PosLlh >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:106
mip::data_gnss::SatelliteStatus::ValidFlags
Definition: data_gnss.hpp:2013
mip::metadata::MetadataFor< data_gnss::DgpsInfo >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1204
mip::metadata::MetadataFor< data_gnss::GpsIonoCorr >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:4055
mip::metadata::Type::U16
@ U16
mip::data_gnss::GalileoEphemeris::ValidFlags
Definition: data_gnss.hpp:2344
mip::metadata::MetadataFor< data_gnss::UtcTime >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:581
mip::metadata::MetadataFor
Definition: mip_metadata.hpp:13
mip::data_gnss::UtcTime
Definition: data_gnss.hpp:571
mip::data_gnss::VelNed::ValidFlags
Definition: data_gnss.hpp:330
mip::data_gnss::BeidouIonoCorr::ValidFlags
Definition: data_gnss.hpp:2792
mip::data_gnss::GpsLeapSeconds
Definition: data_gnss.hpp:1356
mip::metadata::Type::STRUCT
@ STRUCT
mip::data_gnss::SatelliteStatus
Definition: data_gnss.hpp:2011
mip::metadata::MetadataFor< data_gnss::BaseStationInfo >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:2027
mip::metadata::MetadataFor< data_gnss::PosEcef >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:174
mip::metadata::MetadataFor< data_gnss::HwStatus >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1116
mip::metadata::Type::DOUBLE
@ DOUBLE
mip::data_gnss::DgpsChannel
Definition: data_gnss.hpp:1200
mip::data_gnss::FixInfo::ValidFlags
Definition: data_gnss.hpp:828
mip::metadata::ParameterInfo
Definition: mip_structures.hpp:158
data_gnss.hpp
mip::metadata::MetadataFor< data_gnss::GalileoIonoCorr >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:4143
mip::metadata::EnumInfo::Entry
Definition: mip_structures.hpp:65
mip::metadata::MetadataFor< data_gnss::GpsLeapSeconds >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1437
mip::data_gnss::RfErrorDetection::RFBand
RFBand
Definition: data_gnss.hpp:1639
mip::metadata::MetadataFor< data_gnss::SbasInfo >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1588
mip::metadata::MetadataFor< data_gnss::FixInfo >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:849
mip::data_gnss::DgpsInfo
Definition: data_gnss.hpp:1121
mip::metadata::Type::S8
@ S8
mip_metadata.hpp
mip::data_gnss::DgpsInfo::ValidFlags
Definition: data_gnss.hpp:1123
mip::metadata::MetadataFor< data_gnss::Raw >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:2658
mip::data_gnss::PosEcef
Definition: data_gnss.hpp:259
mip::data_gnss::GloEphemeris::ValidFlags
Definition: data_gnss.hpp:2447
mip::data_gnss::HwStatus::AntennaPower
AntennaPower
Definition: data_gnss.hpp:1031
mip::metadata::Type::FLOAT
@ FLOAT
mip::metadata::Type::S16
@ S16
mip::data_gnss::SvInfo::ValidFlags
Definition: data_gnss.hpp:930
mip::data_gnss::ClockInfo2::ValidFlags
Definition: data_gnss.hpp:1281
mip::data_gnss::GpsEphemeris
Definition: data_gnss.hpp:2239
mip::data_gnss::BaseStationInfo
Definition: data_gnss.hpp:1737
mip::data_gnss::HwStatus::ReceiverState
ReceiverState
Definition: data_gnss.hpp:1015
mip::data_gnss::SbasInfo::ValidFlags
Definition: data_gnss.hpp:1453
mip::metadata::MetadataFor< data_gnss::GpsEphemeris >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:3006
mip::data_gnss::ClockInfo::ValidFlags
Definition: data_gnss.hpp:716
mip::metadata::MetadataFor< data_gnss::BeidouEphemeris >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:3967
mip::data_gnss::RfErrorDetection::ValidFlags
Definition: data_gnss.hpp:1663
mip::data_gnss::ClockInfo
Definition: data_gnss.hpp:714
mip::data_gnss::SbasCorrection
Definition: data_gnss.hpp:1558
mip::metadata::MetadataFor< data_gnss::BeidouIonoCorr >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:4241
mip::metadata::MetadataFor< data_gnss::ClockInfo2 >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1380
mip::data_gnss::DESCRIPTOR_SET
@ DESCRIPTOR_SET
Definition: data_gnss.hpp:31
mip::data_gnss::PosLlh::ValidFlags
Definition: data_gnss.hpp:179
mip::data_gnss::PosLlh
Definition: data_gnss.hpp:177
mip::metadata::MetadataFor< data_gnss::SvInfo >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:976
mip::data_gnss::BeidouIonoCorr
Definition: data_gnss.hpp:2790
mip::metadata::MetadataFor< data_gnss::ClockInfo >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:727
mip::data_gnss::SbasInfo
Definition: data_gnss.hpp:1418
mip::data_gnss::GpsTime
Definition: data_gnss.hpp:645
mip::data_gnss::UtcTime::ValidFlags
Definition: data_gnss.hpp:573
mip::metadata::Type::BOOL
@ BOOL
mip::data_gnss::GalileoEphemeris
Definition: data_gnss.hpp:2342
mip::metadata::FieldInfo
Definition: mip_structures.hpp:212
mip::metadata::Type::U8
@ U8
mip::data_gnss::GpsTime::ValidFlags
Definition: data_gnss.hpp:647
mip::data_gnss::GpsLeapSeconds::ValidFlags
Definition: data_gnss.hpp:1358
mip::data_gnss::RtkCorrectionsStatus::EpochStatus
Definition: data_gnss.hpp:1919
mip::data_gnss::VelEcef::ValidFlags
Definition: data_gnss.hpp:415
mip::data_gnss::SvInfo::SVFlags
Definition: data_gnss.hpp:903
mip::data_gnss::HwStatus::AntennaState
AntennaState
Definition: data_gnss.hpp:1022
mip::metadata::MetadataFor< data_gnss::VelEcef >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:350
mip::metadata::MetadataFor< data_gnss::VelNed >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:282
mip::data_gnss::GloEphemeris
Definition: data_gnss.hpp:2445
mip::metadata::MetadataFor< data_gnss::RfErrorDetection >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1893
mip::data_gnss::SbasCorrection::ValidFlags
Definition: data_gnss.hpp:1560
mip::metadata::MetadataFor< data_gnss::SbasCorrection >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1743
mip::data_gnss::Raw::GnssSignalQuality
GnssSignalQuality
Definition: data_gnss.hpp:2104
mip::data_gnss::FixInfo::FixFlags
Definition: data_gnss.hpp:801
mip::metadata::EnumInfo
Definition: mip_structures.hpp:63
mip::metadata::MetadataFor< data_gnss::SatelliteStatus >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:2326
mip::data_gnss::GnssSignalId
GnssSignalId
Definition: data_gnss.hpp:85
mip::data_gnss::BeidouEphemeris
Definition: data_gnss.hpp:2533
mip::data_gnss::GalileoIonoCorr
Definition: data_gnss.hpp:2713
mip::data_gnss::GalileoIonoCorr::ValidFlags
Definition: data_gnss.hpp:2715
mip::data_gnss::GpsEphemeris::ValidFlags
Definition: data_gnss.hpp:2241
mip::data_gnss::SvInfo
Definition: data_gnss.hpp:901
mip::metadata::MetadataFor< data_gnss::DgpsChannel >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:1292
mip::data_gnss::FixInfo::FixType
FixType
Definition: data_gnss.hpp:789
mip::data_gnss::RfErrorDetection::SpoofingState
SpoofingState
Definition: data_gnss.hpp:1655
mip::data_gnss::PosEcef::ValidFlags
Definition: data_gnss.hpp:261
mip::data_gnss::BaseStationInfo::IndicatorFlags
Definition: data_gnss.hpp:1739
mip::data_gnss::BaseStationInfo::ValidFlags
Definition: data_gnss.hpp:1787
mip::data_gnss::DgpsChannel::ValidFlags
Definition: data_gnss.hpp:1202
mip::metadata::Type::BITS
@ BITS
mip::metadata::Type::U32
@ U32
mip::metadata::MetadataFor< data_gnss::RtkCorrectionsStatus >::value
static constexpr FieldInfo value
Definition: data_gnss.hpp:2190
mip::data_gnss::RfErrorDetection::JammingState
JammingState
Definition: data_gnss.hpp:1647
mip::data_gnss::GpsIonoCorr
Definition: data_gnss.hpp:2636
mip::data_gnss::VelNed
Definition: data_gnss.hpp:328