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