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