MIP_SDK  v3.0.0-192-g8bd7933
MicroStrain Communications Library for embedded systems
commands_3dm.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 
6 
7 
9 
10 namespace mip::metadata
11 {
12 
13 
14 template<>
15 struct MetadataFor<commands_3dm::PollImuMessage>
16 {
18 
19  static constexpr inline ParameterInfo parameters[] = {
20  {
21  /* .name = */ "suppress_ack",
22  /* .docs = */ "Suppress the usual ACK/NACK reply.",
23  /* .type = */ {Type::BOOL, nullptr},
24  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
25  /* .attributes = */ {true, false, false, false, false},
26  /* .count = */ 1,
27  /* .condition = */ {},
28  },
29  {
30  /* .name = */ "num_descriptors",
31  /* .docs = */ "Number of descriptors in the descriptor list.",
32  /* .type = */ {Type::U8, nullptr},
33  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
34  /* .attributes = */ {true, false, false, false, false},
35  /* .count = */ 1,
36  /* .condition = */ {},
37  },
38  {
39  /* .name = */ "descriptors",
40  /* .docs = */ "Descriptor list.",
42  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
43  /* .attributes = */ {true, false, false, false, false},
44  /* .count = */ {83, microstrain::Index(1) /* num_descriptors */},
45  /* .condition = */ {},
46  },
47  };
48 
49  static constexpr inline FieldInfo value = {
50  /* .name = */ "commands_3dm::PollImuMessage",
51  /* .title = */ "Poll IMU Message",
52  /* .docs = */ "Poll the device for an IMU message with the specified format\n\nThis function polls for an IMU message using the provided format. The resulting message\nwill maintain the order of descriptors sent in the command and any unrecognized\ndescriptors are ignored. If the format is not provided, the device will attempt to use the\nstored format (set with the Set IMU Message Format command.) If no format is provided\nand there is no stored format, the device will respond with a NACK. The reply packet contains\nan ACK/NACK field. The polled data packet is sent separately as an IMU Data packet.",
53  /* .parameters = */ parameters,
54  /* .descriptor = */ type::DESCRIPTOR,
55  /* .functions = */ NO_FUNCTIONS,
56  /* .response = */ nullptr,
57  };
58 };
59 
60 template<>
61 struct MetadataFor<commands_3dm::PollGnssMessage>
62 {
64 
65  static constexpr inline ParameterInfo parameters[] = {
66  {
67  /* .name = */ "suppress_ack",
68  /* .docs = */ "Suppress the usual ACK/NACK reply.",
69  /* .type = */ {Type::BOOL, nullptr},
70  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
71  /* .attributes = */ {true, false, false, false, false},
72  /* .count = */ 1,
73  /* .condition = */ {},
74  },
75  {
76  /* .name = */ "num_descriptors",
77  /* .docs = */ "Number of descriptors in the descriptor list.",
78  /* .type = */ {Type::U8, nullptr},
79  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
80  /* .attributes = */ {true, false, false, false, false},
81  /* .count = */ 1,
82  /* .condition = */ {},
83  },
84  {
85  /* .name = */ "descriptors",
86  /* .docs = */ "Descriptor list.",
88  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
89  /* .attributes = */ {true, false, false, false, false},
90  /* .count = */ {83, microstrain::Index(1) /* num_descriptors */},
91  /* .condition = */ {},
92  },
93  };
94 
95  static constexpr inline FieldInfo value = {
96  /* .name = */ "commands_3dm::PollGnssMessage",
97  /* .title = */ "Poll GNSS Message",
98  /* .docs = */ "Poll the device for an GNSS message with the specified format\n\nThis function polls for a GNSS message using the provided format. The resulting message\nwill maintain the order of descriptors sent in the command and any unrecognized\ndescriptors are ignored. If the format is not provided, the device will attempt to use the\nstored format (set with the Set GNSS Message Format command.) If no format is provided\nand there is no stored format, the device will respond with a NACK. The reply packet contains\nan ACK/NACK field. The polled data packet is sent separately as a GNSS Data packet.",
99  /* .parameters = */ parameters,
100  /* .descriptor = */ type::DESCRIPTOR,
101  /* .functions = */ NO_FUNCTIONS,
102  /* .response = */ nullptr,
103  };
104 };
105 
106 template<>
107 struct MetadataFor<commands_3dm::PollFilterMessage>
108 {
110 
111  static constexpr inline ParameterInfo parameters[] = {
112  {
113  /* .name = */ "suppress_ack",
114  /* .docs = */ "Suppress the usual ACK/NACK reply.",
115  /* .type = */ {Type::BOOL, nullptr},
116  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
117  /* .attributes = */ {true, false, false, false, false},
118  /* .count = */ 1,
119  /* .condition = */ {},
120  },
121  {
122  /* .name = */ "num_descriptors",
123  /* .docs = */ "Number of descriptors in the format list.",
124  /* .type = */ {Type::U8, nullptr},
125  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
126  /* .attributes = */ {true, false, false, false, false},
127  /* .count = */ 1,
128  /* .condition = */ {},
129  },
130  {
131  /* .name = */ "descriptors",
132  /* .docs = */ "Descriptor format list.",
134  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
135  /* .attributes = */ {true, false, false, false, false},
136  /* .count = */ {83, microstrain::Index(1) /* num_descriptors */},
137  /* .condition = */ {},
138  },
139  };
140 
141  static constexpr inline FieldInfo value = {
142  /* .name = */ "commands_3dm::PollFilterMessage",
143  /* .title = */ "Poll Estimation Filter Message",
144  /* .docs = */ "Poll the device for an Estimation Filter message with the specified format\n\nThis function polls for an Estimation Filter message using the provided format. The resulting message\nwill maintain the order of descriptors sent in the command and any unrecognized\ndescriptors are ignored. If the format is not provided, the device will attempt to use the\nstored format (set with the Set Estimation Filter Message Format command.) If no format is provided\nand there is no stored format, the device will respond with a NACK. The reply packet contains\nan ACK/NACK field. The polled data packet is sent separately as an Estimation Filter Data packet.",
145  /* .parameters = */ parameters,
146  /* .descriptor = */ type::DESCRIPTOR,
147  /* .functions = */ NO_FUNCTIONS,
148  /* .response = */ nullptr,
149  };
150 };
151 
152 template<>
153 struct MetadataFor<commands_3dm::NmeaMessage::MessageID>
154 {
156 
157  static constexpr inline EnumInfo::Entry entries[] = {
158  { uint32_t(1), "GGA", "GPS System Fix Data. Source can be the Filter or GNSS1/2 datasets." },
159  { uint32_t(2), "GLL", "Geographic Position Lat/Lon. Source can be the Filter or GNSS1/2 datasets." },
160  { uint32_t(3), "GSV", "GNSS Satellites in View. Source must be either GNSS1 or GNSS2 datasets. The talker ID must be set to IGNORED." },
161  { uint32_t(4), "RMC", "Recommended Minimum Specific GNSS Data. Source can be the Filter or GNSS1/2 datasets." },
162  { uint32_t(5), "VTG", "Course over Ground. Source can be the Filter or GNSS1/2 datasets." },
163  { uint32_t(6), "HDT", "Heading, True. Source can be the Filter or GNSS1/2 datasets." },
164  { uint32_t(7), "ZDA", "Time & Date. Source must be the GNSS1 or GNSS2 datasets." },
165  { uint32_t(8), "GST", "Position Error Statistics. Source can be the Filter or GNSS1/2 datasets." },
166  { uint32_t(129), "MSRA", "MicroStrain proprietary Euler angles. Source must be the Filter dataset. The talker ID must be set to IGNORED." },
167  { uint32_t(130), "MSRR", "MicroStrain proprietary Angular Rate/Acceleration. Source must be the Sensor dataset. The talker ID must be set to IGNORED." },
168  };
169 
170  static constexpr inline EnumInfo value = {
171  /* .name = */ "MessageID",
172  /* .docs = */ "",
173  /* .type = */ Type::U8,
174  /* .entries = */ entries,
175  };
176 
177 };
178 
179 template<>
180 struct MetadataFor<commands_3dm::NmeaMessage::TalkerID>
181 {
183 
184  static constexpr inline EnumInfo::Entry entries[] = {
185  { uint32_t(0), "IGNORED", "Talker ID cannot be changed." },
186  { uint32_t(1), "GNSS", "NMEA message will be produced with talker id 'GN'." },
187  { uint32_t(2), "GPS", "NMEA message will be produced with talker id 'GP'." },
188  { uint32_t(3), "GALILEO", "NMEA message will be produced with talker id 'GA'." },
189  { uint32_t(4), "GLONASS", "NMEA message will be produced with talker id 'GL'." },
190  };
191 
192  static constexpr inline EnumInfo value = {
193  /* .name = */ "TalkerID",
194  /* .docs = */ "",
195  /* .type = */ Type::U8,
196  /* .entries = */ entries,
197  };
198 
199 };
200 
201 template<>
202 struct MetadataFor<commands_3dm::NmeaMessage>
203 {
205 
206  static constexpr inline ParameterInfo parameters[] = {
207  {
208  /* .name = */ "message_id",
209  /* .docs = */ "NMEA sentence type.",
211  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage::MessageID, &type::message_id>,
212  /* .attributes = */ NO_FUNCTIONS,
213  /* .count = */ 1,
214  /* .condition = */ {},
215  },
216  {
217  /* .name = */ "talker_id",
218  /* .docs = */ "NMEA talker ID. Ignored for proprietary sentences.",
220  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage::TalkerID, &type::talker_id>,
221  /* .attributes = */ NO_FUNCTIONS,
222  /* .count = */ 1,
223  /* .condition = */ {},
224  },
225  {
226  /* .name = */ "source_desc_set",
227  /* .docs = */ "Data descriptor set where the data will be sourced. Available options depend on the sentence.",
228  /* .type = */ {Type::U8, nullptr},
229  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::source_desc_set>,
230  /* .attributes = */ NO_FUNCTIONS,
231  /* .count = */ 1,
232  /* .condition = */ {},
233  },
234  {
235  /* .name = */ "decimation",
236  /* .docs = */ "Decimation from the base rate for source_desc_set. Frequency is limited to 10 Hz or the base rate, whichever is lower. Must be 0 when polling.",
237  /* .type = */ {Type::U16, nullptr},
238  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::decimation>,
239  /* .attributes = */ NO_FUNCTIONS,
240  /* .count = */ 1,
241  /* .condition = */ {},
242  },
243  };
244 
245  static constexpr inline StructInfo value = {
246  /* .name = */ "NmeaMessage",
247  /* .title = */ "NMEA Message",
248  /* .docs = */ "",
249  /* .parameters = */ parameters,
250  };
251 };
252 
253 template<>
254 struct MetadataFor<commands_3dm::NmeaPollData>
255 {
257 
258  static constexpr inline ParameterInfo parameters[] = {
259  {
260  /* .name = */ "suppress_ack",
261  /* .docs = */ "Suppress the usual ACK/NACK reply.",
262  /* .type = */ {Type::BOOL, nullptr},
263  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
264  /* .attributes = */ {true, false, false, false, false},
265  /* .count = */ 1,
266  /* .condition = */ {},
267  },
268  {
269  /* .name = */ "count",
270  /* .docs = */ "Number of format entries (limited by payload size)",
271  /* .type = */ {Type::U8, nullptr},
272  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
273  /* .attributes = */ {true, false, false, false, false},
274  /* .count = */ 1,
275  /* .condition = */ {},
276  },
277  {
278  /* .name = */ "format_entries",
279  /* .docs = */ "List of format entries.",
281  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage, &type::format_entries>,
282  /* .attributes = */ {true, false, false, false, false},
283  /* .count = */ {40, microstrain::Index(1) /* count */},
284  /* .condition = */ {},
285  },
286  };
287 
288  static constexpr inline FieldInfo value = {
289  /* .name = */ "commands_3dm::NmeaPollData",
290  /* .title = */ "Poll NMEA Data",
291  /* .docs = */ "Poll the device for a NMEA message with the specified format.\n\nThis function polls for a NMEA message using the provided format.\nIf the format is not provided, the device will attempt to use the\nstored format (set with the Set NMEA Message Format command.) If no format is provided\nand there is no stored format, the device will respond with a NACK. The reply packet contains\nan ACK/NACK field. The polled data packet is sent separately as normal NMEA messages.",
292  /* .parameters = */ parameters,
293  /* .descriptor = */ type::DESCRIPTOR,
294  /* .functions = */ NO_FUNCTIONS,
295  /* .response = */ nullptr,
296  };
297 };
298 
299 template<>
300 struct MetadataFor<commands_3dm::ImuGetBaseRate::Response>
301 {
303 
304  static constexpr inline ParameterInfo parameters[] = {
305  {
306  /* .name = */ "rate",
307  /* .docs = */ "[hz]",
308  /* .type = */ {Type::U16, nullptr},
309  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
310  /* .attributes = */ {true, false, false, false, false},
311  /* .count = */ 1,
312  /* .condition = */ {},
313  },
314  };
315 
316  static constexpr inline FieldInfo value = {
317  /* .name = */ "commands_3dm::ImuGetBaseRate::Response",
318  /* .title = */ "response",
319  /* .docs = */ "",
320  /* .parameters = */ parameters,
321  /* .descriptor = */ type::DESCRIPTOR,
322  /* .functions = */ NO_FUNCTIONS,
323  /* .response = */ nullptr,
324  };
325 };
326 
327 template<>
328 struct MetadataFor<commands_3dm::ImuGetBaseRate>
329 {
331 
332  static constexpr inline FieldInfo value = {
333  /* .name = */ "commands_3dm::ImuGetBaseRate",
334  /* .title = */ "Get IMU Data Base Rate",
335  /* .docs = */ "Get the base rate for the IMU data in Hz\n\nThis is the fastest rate for this type of data available on the device.\nThis is used in conjunction with the IMU Message Format Command to set streaming data at a specified rate.",
336  /* .parameters = */ {},
337  /* .descriptor = */ type::DESCRIPTOR,
338  /* .functions = */ NO_FUNCTIONS,
339  /* .response = */ &MetadataFor<type::Response>::value,
340  };
341 };
342 
343 template<>
344 struct MetadataFor<commands_3dm::GnssGetBaseRate::Response>
345 {
347 
348  static constexpr inline ParameterInfo parameters[] = {
349  {
350  /* .name = */ "rate",
351  /* .docs = */ "[hz]",
352  /* .type = */ {Type::U16, nullptr},
353  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
354  /* .attributes = */ {true, false, false, false, false},
355  /* .count = */ 1,
356  /* .condition = */ {},
357  },
358  };
359 
360  static constexpr inline FieldInfo value = {
361  /* .name = */ "commands_3dm::GnssGetBaseRate::Response",
362  /* .title = */ "response",
363  /* .docs = */ "",
364  /* .parameters = */ parameters,
365  /* .descriptor = */ type::DESCRIPTOR,
366  /* .functions = */ NO_FUNCTIONS,
367  /* .response = */ nullptr,
368  };
369 };
370 
371 template<>
372 struct MetadataFor<commands_3dm::GnssGetBaseRate>
373 {
375 
376  static constexpr inline FieldInfo value = {
377  /* .name = */ "commands_3dm::GnssGetBaseRate",
378  /* .title = */ "Get GNSS Data Base Rate",
379  /* .docs = */ "Get the base rate for the GNSS data in Hz\n\nThis is the fastest rate for this type of data available on the device.\nThis is used in conjunction with the GNSS Message Format Command to set streaming data at a specified rate.",
380  /* .parameters = */ {},
381  /* .descriptor = */ type::DESCRIPTOR,
382  /* .functions = */ NO_FUNCTIONS,
383  /* .response = */ &MetadataFor<type::Response>::value,
384  };
385 };
386 
387 template<>
388 struct MetadataFor<commands_3dm::ImuMessageFormat::Response>
389 {
391 
392  static constexpr inline ParameterInfo parameters[] = {
393  {
394  /* .name = */ "num_descriptors",
395  /* .docs = */ "Number of descriptors",
396  /* .type = */ {Type::U8, nullptr},
397  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
398  /* .attributes = */ {true, false, false, false, false},
399  /* .count = */ 1,
400  /* .condition = */ {},
401  },
402  {
403  /* .name = */ "descriptors",
404  /* .docs = */ "Descriptor format list.",
406  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
407  /* .attributes = */ {true, false, false, false, false},
408  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
409  /* .condition = */ {},
410  },
411  };
412 
413  static constexpr inline FieldInfo value = {
414  /* .name = */ "commands_3dm::ImuMessageFormat::Response",
415  /* .title = */ "response",
416  /* .docs = */ "",
417  /* .parameters = */ parameters,
418  /* .descriptor = */ type::DESCRIPTOR,
419  /* .functions = */ NO_FUNCTIONS,
420  /* .response = */ nullptr,
421  };
422 };
423 
424 template<>
425 struct MetadataFor<commands_3dm::ImuMessageFormat>
426 {
428 
429  static constexpr inline ParameterInfo parameters[] = {
430  FUNCTION_SELECTOR_PARAM,
431  {
432  /* .name = */ "num_descriptors",
433  /* .docs = */ "Number of descriptors",
434  /* .type = */ {Type::U8, nullptr},
435  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
436  /* .attributes = */ {true, false, false, false, false},
437  /* .count = */ 1,
438  /* .condition = */ {},
439  },
440  {
441  /* .name = */ "descriptors",
442  /* .docs = */ "Descriptor format list.",
444  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
445  /* .attributes = */ {true, false, false, false, false},
446  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
447  /* .condition = */ {},
448  },
449  };
450 
451  static constexpr inline FieldInfo value = {
452  /* .name = */ "commands_3dm::ImuMessageFormat",
453  /* .title = */ "IMU Message Format",
454  /* .docs = */ "Set, read, or save the format of the IMU data packet.\n\nThe resulting data messages will maintain the order of descriptors sent in the command.",
455  /* .parameters = */ parameters,
456  /* .descriptor = */ type::DESCRIPTOR,
457  /* .functions = */ {true, true, true, true, true},
458  /* .response = */ &MetadataFor<type::Response>::value,
459  };
460 };
461 
462 template<>
463 struct MetadataFor<commands_3dm::GnssMessageFormat::Response>
464 {
466 
467  static constexpr inline ParameterInfo parameters[] = {
468  {
469  /* .name = */ "num_descriptors",
470  /* .docs = */ "Number of descriptors",
471  /* .type = */ {Type::U8, nullptr},
472  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
473  /* .attributes = */ {true, false, false, false, false},
474  /* .count = */ 1,
475  /* .condition = */ {},
476  },
477  {
478  /* .name = */ "descriptors",
479  /* .docs = */ "Descriptor format list.",
481  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
482  /* .attributes = */ {true, false, false, false, false},
483  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
484  /* .condition = */ {},
485  },
486  };
487 
488  static constexpr inline FieldInfo value = {
489  /* .name = */ "commands_3dm::GnssMessageFormat::Response",
490  /* .title = */ "response",
491  /* .docs = */ "",
492  /* .parameters = */ parameters,
493  /* .descriptor = */ type::DESCRIPTOR,
494  /* .functions = */ NO_FUNCTIONS,
495  /* .response = */ nullptr,
496  };
497 };
498 
499 template<>
500 struct MetadataFor<commands_3dm::GnssMessageFormat>
501 {
503 
504  static constexpr inline ParameterInfo parameters[] = {
505  FUNCTION_SELECTOR_PARAM,
506  {
507  /* .name = */ "num_descriptors",
508  /* .docs = */ "Number of descriptors",
509  /* .type = */ {Type::U8, nullptr},
510  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
511  /* .attributes = */ {true, false, false, false, false},
512  /* .count = */ 1,
513  /* .condition = */ {},
514  },
515  {
516  /* .name = */ "descriptors",
517  /* .docs = */ "Descriptor format list.",
519  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
520  /* .attributes = */ {true, false, false, false, false},
521  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
522  /* .condition = */ {},
523  },
524  };
525 
526  static constexpr inline FieldInfo value = {
527  /* .name = */ "commands_3dm::GnssMessageFormat",
528  /* .title = */ "GNSS Message Format",
529  /* .docs = */ "Set, read, or save the format of the GNSS data packet.\n\nThe resulting data messages will maintain the order of descriptors sent in the command.",
530  /* .parameters = */ parameters,
531  /* .descriptor = */ type::DESCRIPTOR,
532  /* .functions = */ {true, true, true, true, true},
533  /* .response = */ &MetadataFor<type::Response>::value,
534  };
535 };
536 
537 template<>
538 struct MetadataFor<commands_3dm::FilterMessageFormat::Response>
539 {
541 
542  static constexpr inline ParameterInfo parameters[] = {
543  {
544  /* .name = */ "num_descriptors",
545  /* .docs = */ "Number of descriptors (limited by payload size)",
546  /* .type = */ {Type::U8, nullptr},
547  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
548  /* .attributes = */ {true, false, false, false, false},
549  /* .count = */ 1,
550  /* .condition = */ {},
551  },
552  {
553  /* .name = */ "descriptors",
554  /* .docs = */ "",
556  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
557  /* .attributes = */ {true, false, false, false, false},
558  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
559  /* .condition = */ {},
560  },
561  };
562 
563  static constexpr inline FieldInfo value = {
564  /* .name = */ "commands_3dm::FilterMessageFormat::Response",
565  /* .title = */ "response",
566  /* .docs = */ "",
567  /* .parameters = */ parameters,
568  /* .descriptor = */ type::DESCRIPTOR,
569  /* .functions = */ NO_FUNCTIONS,
570  /* .response = */ nullptr,
571  };
572 };
573 
574 template<>
575 struct MetadataFor<commands_3dm::FilterMessageFormat>
576 {
578 
579  static constexpr inline ParameterInfo parameters[] = {
580  FUNCTION_SELECTOR_PARAM,
581  {
582  /* .name = */ "num_descriptors",
583  /* .docs = */ "Number of descriptors (limited by payload size)",
584  /* .type = */ {Type::U8, nullptr},
585  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
586  /* .attributes = */ {true, false, false, false, false},
587  /* .count = */ 1,
588  /* .condition = */ {},
589  },
590  {
591  /* .name = */ "descriptors",
592  /* .docs = */ "",
594  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
595  /* .attributes = */ {true, false, false, false, false},
596  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
597  /* .condition = */ {},
598  },
599  };
600 
601  static constexpr inline FieldInfo value = {
602  /* .name = */ "commands_3dm::FilterMessageFormat",
603  /* .title = */ "Estimation Filter Message Format",
604  /* .docs = */ "Set, read, or save the format of the Estimation Filter data packet.\n\nThe resulting data messages will maintain the order of descriptors sent in the command.",
605  /* .parameters = */ parameters,
606  /* .descriptor = */ type::DESCRIPTOR,
607  /* .functions = */ {true, true, true, true, true},
608  /* .response = */ &MetadataFor<type::Response>::value,
609  };
610 };
611 
612 template<>
613 struct MetadataFor<commands_3dm::FilterGetBaseRate::Response>
614 {
616 
617  static constexpr inline ParameterInfo parameters[] = {
618  {
619  /* .name = */ "rate",
620  /* .docs = */ "[hz]",
621  /* .type = */ {Type::U16, nullptr},
622  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
623  /* .attributes = */ {true, false, false, false, false},
624  /* .count = */ 1,
625  /* .condition = */ {},
626  },
627  };
628 
629  static constexpr inline FieldInfo value = {
630  /* .name = */ "commands_3dm::FilterGetBaseRate::Response",
631  /* .title = */ "response",
632  /* .docs = */ "",
633  /* .parameters = */ parameters,
634  /* .descriptor = */ type::DESCRIPTOR,
635  /* .functions = */ NO_FUNCTIONS,
636  /* .response = */ nullptr,
637  };
638 };
639 
640 template<>
641 struct MetadataFor<commands_3dm::FilterGetBaseRate>
642 {
644 
645  static constexpr inline FieldInfo value = {
646  /* .name = */ "commands_3dm::FilterGetBaseRate",
647  /* .title = */ "Get Estimation Filter Data Base Rate",
648  /* .docs = */ "Get the base rate for the Estimation Filter data in Hz\n\nThis is the fastest rate for this type of data available on the device.\nThis is used in conjunction with the Estimation Filter Message Format Command to set streaming data at a specified rate.",
649  /* .parameters = */ {},
650  /* .descriptor = */ type::DESCRIPTOR,
651  /* .functions = */ NO_FUNCTIONS,
652  /* .response = */ &MetadataFor<type::Response>::value,
653  };
654 };
655 
656 template<>
657 struct MetadataFor<commands_3dm::NmeaMessageFormat::Response>
658 {
660 
661  static constexpr inline ParameterInfo parameters[] = {
662  {
663  /* .name = */ "count",
664  /* .docs = */ "Number of format entries (limited by payload size)",
665  /* .type = */ {Type::U8, nullptr},
666  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
667  /* .attributes = */ {true, false, false, false, false},
668  /* .count = */ 1,
669  /* .condition = */ {},
670  },
671  {
672  /* .name = */ "format_entries",
673  /* .docs = */ "List of format entries.",
675  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage, &type::format_entries>,
676  /* .attributes = */ {true, false, false, false, false},
677  /* .count = */ {40, microstrain::Index(0) /* count */},
678  /* .condition = */ {},
679  },
680  };
681 
682  static constexpr inline FieldInfo value = {
683  /* .name = */ "commands_3dm::NmeaMessageFormat::Response",
684  /* .title = */ "response",
685  /* .docs = */ "",
686  /* .parameters = */ parameters,
687  /* .descriptor = */ type::DESCRIPTOR,
688  /* .functions = */ NO_FUNCTIONS,
689  /* .response = */ nullptr,
690  };
691 };
692 
693 template<>
694 struct MetadataFor<commands_3dm::NmeaMessageFormat>
695 {
697 
698  static constexpr inline ParameterInfo parameters[] = {
699  FUNCTION_SELECTOR_PARAM,
700  {
701  /* .name = */ "count",
702  /* .docs = */ "Number of format entries (limited by payload size)",
703  /* .type = */ {Type::U8, nullptr},
704  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
705  /* .attributes = */ {true, false, false, false, false},
706  /* .count = */ 1,
707  /* .condition = */ {},
708  },
709  {
710  /* .name = */ "format_entries",
711  /* .docs = */ "List of format entries.",
713  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage, &type::format_entries>,
714  /* .attributes = */ {true, false, false, false, false},
715  /* .count = */ {40, microstrain::Index(0) /* count */},
716  /* .condition = */ {},
717  },
718  };
719 
720  static constexpr inline FieldInfo value = {
721  /* .name = */ "commands_3dm::NmeaMessageFormat",
722  /* .title = */ "NMEA Message Format",
723  /* .docs = */ "Set, read, or save the NMEA message format.",
724  /* .parameters = */ parameters,
725  /* .descriptor = */ type::DESCRIPTOR,
726  /* .functions = */ {true, true, true, true, true},
727  /* .response = */ &MetadataFor<type::Response>::value,
728  };
729 };
730 
731 template<>
732 struct MetadataFor<commands_3dm::PollData>
733 {
735 
736  static constexpr inline ParameterInfo parameters[] = {
737  {
738  /* .name = */ "desc_set",
739  /* .docs = */ "Data descriptor set. Must be supported.",
740  /* .type = */ {Type::U8, nullptr},
741  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
742  /* .attributes = */ {true, false, false, false, false},
743  /* .count = */ 1,
744  /* .condition = */ {},
745  },
746  {
747  /* .name = */ "suppress_ack",
748  /* .docs = */ "Suppress the usual ACK/NACK reply.",
749  /* .type = */ {Type::BOOL, nullptr},
750  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
751  /* .attributes = */ {true, false, false, false, false},
752  /* .count = */ 1,
753  /* .condition = */ {},
754  },
755  {
756  /* .name = */ "num_descriptors",
757  /* .docs = */ "Number of descriptors in the format list.",
758  /* .type = */ {Type::U8, nullptr},
759  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
760  /* .attributes = */ {true, false, false, false, false},
761  /* .count = */ 1,
762  /* .condition = */ {},
763  },
764  {
765  /* .name = */ "descriptors",
766  /* .docs = */ "Descriptor format list.",
767  /* .type = */ {Type::U8, nullptr},
768  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::descriptors>,
769  /* .attributes = */ {true, false, false, false, false},
770  /* .count = */ {82, microstrain::Index(2) /* num_descriptors */},
771  /* .condition = */ {},
772  },
773  };
774 
775  static constexpr inline FieldInfo value = {
776  /* .name = */ "commands_3dm::PollData",
777  /* .title = */ "Poll Data",
778  /* .docs = */ "Poll the device for a message with the specified descriptor set and format.\n\nThis function polls for a message using the provided format. The resulting message\nwill maintain the order of descriptors sent in the command and any unrecognized\ndescriptors are ignored. If the format is not provided, the device will attempt to use the\nstored format (set with the Set Message Format command.) If no format is provided\nand there is no stored format, the device will respond with a NACK. The reply packet contains\nan ACK/NACK field. The polled data packet is sent separately as a normal Data packet.",
779  /* .parameters = */ parameters,
780  /* .descriptor = */ type::DESCRIPTOR,
781  /* .functions = */ NO_FUNCTIONS,
782  /* .response = */ nullptr,
783  };
784 };
785 
786 template<>
787 struct MetadataFor<commands_3dm::GetBaseRate::Response>
788 {
790 
791  static constexpr inline ParameterInfo parameters[] = {
792  {
793  /* .name = */ "desc_set",
794  /* .docs = */ "Echoes the parameter in the command.",
795  /* .type = */ {Type::U8, nullptr},
796  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
797  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
798  /* .count = */ 1,
799  /* .condition = */ {},
800  },
801  {
802  /* .name = */ "rate",
803  /* .docs = */ "Base rate in Hz (0 = variable, unknown, or user-defined rate. Data will be sent when received).",
804  /* .type = */ {Type::U16, nullptr},
805  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
806  /* .attributes = */ {true, false, false, false, false},
807  /* .count = */ 1,
808  /* .condition = */ {},
809  },
810  };
811 
812  static constexpr inline FieldInfo value = {
813  /* .name = */ "commands_3dm::GetBaseRate::Response",
814  /* .title = */ "response",
815  /* .docs = */ "",
816  /* .parameters = */ parameters,
817  /* .descriptor = */ type::DESCRIPTOR,
818  /* .functions = */ NO_FUNCTIONS,
819  /* .response = */ nullptr,
820  };
821 };
822 
823 template<>
824 struct MetadataFor<commands_3dm::GetBaseRate>
825 {
827 
828  static constexpr inline ParameterInfo parameters[] = {
829  {
830  /* .name = */ "desc_set",
831  /* .docs = */ "This is the data descriptor set. It must be a supported descriptor.",
832  /* .type = */ {Type::U8, nullptr},
833  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
834  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
835  /* .count = */ 1,
836  /* .condition = */ {},
837  },
838  };
839 
840  static constexpr inline FieldInfo value = {
841  /* .name = */ "commands_3dm::GetBaseRate",
842  /* .title = */ "Get Data Base Rate",
843  /* .docs = */ "Get the base rate for the specified descriptor set in Hz.",
844  /* .parameters = */ parameters,
845  /* .descriptor = */ type::DESCRIPTOR,
846  /* .functions = */ NO_FUNCTIONS,
847  /* .response = */ &MetadataFor<type::Response>::value,
848  };
849 };
850 
851 template<>
852 struct MetadataFor<commands_3dm::MessageFormat::Response>
853 {
855 
856  static constexpr inline ParameterInfo parameters[] = {
857  {
858  /* .name = */ "desc_set",
859  /* .docs = */ "Echoes the descriptor set from the command.",
860  /* .type = */ {Type::U8, nullptr},
861  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
862  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
863  /* .count = */ 1,
864  /* .condition = */ {},
865  },
866  {
867  /* .name = */ "num_descriptors",
868  /* .docs = */ "Number of descriptors in the list.",
869  /* .type = */ {Type::U8, nullptr},
870  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
871  /* .attributes = */ {true, false, false, false, false},
872  /* .count = */ 1,
873  /* .condition = */ {},
874  },
875  {
876  /* .name = */ "descriptors",
877  /* .docs = */ "List of descriptors and decimations.",
879  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
880  /* .attributes = */ {true, false, false, false, false},
881  /* .count = */ {82, microstrain::Index(1) /* num_descriptors */},
882  /* .condition = */ {},
883  },
884  };
885 
886  static constexpr inline FieldInfo value = {
887  /* .name = */ "commands_3dm::MessageFormat::Response",
888  /* .title = */ "response",
889  /* .docs = */ "",
890  /* .parameters = */ parameters,
891  /* .descriptor = */ type::DESCRIPTOR,
892  /* .functions = */ NO_FUNCTIONS,
893  /* .response = */ nullptr,
894  };
895 };
896 
897 template<>
898 struct MetadataFor<commands_3dm::MessageFormat>
899 {
901 
902  static constexpr inline ParameterInfo parameters[] = {
903  FUNCTION_SELECTOR_PARAM,
904  {
905  /* .name = */ "desc_set",
906  /* .docs = */ "Data descriptor set. Must be supported. When function is SAVE, LOAD, or DEFAULT, can be 0 to apply to all descriptor sets.",
907  /* .type = */ {Type::U8, nullptr},
908  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
909  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
910  /* .count = */ 1,
911  /* .condition = */ {},
912  },
913  {
914  /* .name = */ "num_descriptors",
915  /* .docs = */ "Number of descriptors (limited by payload size)",
916  /* .type = */ {Type::U8, nullptr},
917  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
918  /* .attributes = */ {true, false, false, false, false},
919  /* .count = */ 1,
920  /* .condition = */ {},
921  },
922  {
923  /* .name = */ "descriptors",
924  /* .docs = */ "List of descriptors and decimations.",
926  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
927  /* .attributes = */ {true, false, false, false, false},
928  /* .count = */ {82, microstrain::Index(1) /* num_descriptors */},
929  /* .condition = */ {},
930  },
931  };
932 
933  static constexpr inline FieldInfo value = {
934  /* .name = */ "commands_3dm::MessageFormat",
935  /* .title = */ "Message Format",
936  /* .docs = */ "Set, read, or save the format for a given data packet.\n\nThe resulting data messages will maintain the order of descriptors sent in the command.",
937  /* .parameters = */ parameters,
938  /* .descriptor = */ type::DESCRIPTOR,
939  /* .functions = */ {true, true, true, true, true},
940  /* .response = */ &MetadataFor<type::Response>::value,
941  };
942 };
943 
944 template<>
945 struct MetadataFor<commands_3dm::FactoryStreaming::Action>
946 {
948 
949  static constexpr inline EnumInfo::Entry entries[] = {
950  { uint32_t(0), "OVERWRITE", "Replaces the message format(s), removing any existing descriptors." },
951  { uint32_t(1), "MERGE", "Merges support descriptors into existing format(s). May reorder descriptors." },
952  { uint32_t(2), "ADD", "Adds descriptors to the current message format(s) without changing existing descriptors. May result in duplicates." },
953  };
954 
955  static constexpr inline EnumInfo value = {
956  /* .name = */ "Action",
957  /* .docs = */ "",
958  /* .type = */ Type::U8,
959  /* .entries = */ entries,
960  };
961 
962 };
963 
964 template<>
965 struct MetadataFor<commands_3dm::FactoryStreaming>
966 {
968 
969  static constexpr inline ParameterInfo parameters[] = {
970  {
971  /* .name = */ "action",
972  /* .docs = */ "",
974  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::FactoryStreaming::Action, &type::action>,
975  /* .attributes = */ {true, false, false, false, false},
976  /* .count = */ 1,
977  /* .condition = */ {},
978  },
979  {
980  /* .name = */ "reserved",
981  /* .docs = */ "Reserved. Set to 0x00.",
982  /* .type = */ {Type::U8, nullptr},
983  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
984  /* .attributes = */ {true, false, false, false, false},
985  /* .count = */ 1,
986  /* .condition = */ {},
987  },
988  };
989 
990  static constexpr inline FieldInfo value = {
991  /* .name = */ "commands_3dm::FactoryStreaming",
992  /* .title = */ "Factory Streaming",
993  /* .docs = */ "Configures the device for recording data for technical support.\n\nThis command will configure all available data streams to predefined\nformats designed to be used with technical support.",
994  /* .parameters = */ parameters,
995  /* .descriptor = */ type::DESCRIPTOR,
996  /* .functions = */ NO_FUNCTIONS,
997  /* .response = */ nullptr,
998  };
999 };
1000 
1001 template<>
1002 struct MetadataFor<commands_3dm::DatastreamControl::Response>
1003 {
1005 
1006  static constexpr inline ParameterInfo parameters[] = {
1007  {
1008  /* .name = */ "desc_set",
1009  /* .docs = */ "",
1010  /* .type = */ {Type::U8, nullptr},
1011  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
1012  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
1013  /* .count = */ 1,
1014  /* .condition = */ {},
1015  },
1016  {
1017  /* .name = */ "enabled",
1018  /* .docs = */ "",
1019  /* .type = */ {Type::BOOL, nullptr},
1020  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enabled>,
1021  /* .attributes = */ {true, false, false, false, false},
1022  /* .count = */ 1,
1023  /* .condition = */ {},
1024  },
1025  };
1026 
1027  static constexpr inline FieldInfo value = {
1028  /* .name = */ "commands_3dm::DatastreamControl::Response",
1029  /* .title = */ "response",
1030  /* .docs = */ "",
1031  /* .parameters = */ parameters,
1032  /* .descriptor = */ type::DESCRIPTOR,
1033  /* .functions = */ NO_FUNCTIONS,
1034  /* .response = */ nullptr,
1035  };
1036 };
1037 
1038 template<>
1039 struct MetadataFor<commands_3dm::DatastreamControl>
1040 {
1042 
1043  static constexpr inline ParameterInfo parameters[] = {
1044  FUNCTION_SELECTOR_PARAM,
1045  {
1046  /* .name = */ "desc_set",
1047  /* .docs = */ "The descriptor set of the stream to control. When function is SAVE, LOAD, or DEFAULT, can be ALL_STREAMS(0) to apply to all descriptor sets.\nOn Generation 5 products, this must be one of the above legacy constants.",
1048  /* .type = */ {Type::U8, nullptr},
1049  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
1050  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
1051  /* .count = */ 1,
1052  /* .condition = */ {},
1053  },
1054  {
1055  /* .name = */ "enable",
1056  /* .docs = */ "True or false to enable or disable the stream.",
1057  /* .type = */ {Type::BOOL, nullptr},
1058  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
1059  /* .attributes = */ {true, false, false, false, false},
1060  /* .count = */ 1,
1061  /* .condition = */ {},
1062  },
1063  };
1064 
1065  static constexpr inline FieldInfo value = {
1066  /* .name = */ "commands_3dm::DatastreamControl",
1067  /* .title = */ "Data Stream Control",
1068  /* .docs = */ "Enable/disable the selected data stream.\n\nEach data stream (descriptor set) can be enabled or disabled.\nThe default for the device is all streams enabled.\nFor all functions except 0x01 (use new setting),\nthe new enable flag value is ignored and can be omitted.",
1069  /* .parameters = */ parameters,
1070  /* .descriptor = */ type::DESCRIPTOR,
1071  /* .functions = */ {true, true, true, true, true},
1072  /* .response = */ &MetadataFor<type::Response>::value,
1073  };
1074 };
1075 
1076 template<>
1077 struct MetadataFor<commands_3dm::ConstellationSettings::ConstellationId>
1078 {
1080 
1081  static constexpr inline EnumInfo::Entry entries[] = {
1082  { uint32_t(0), "GPS", "GPS (G1-G32)" },
1083  { uint32_t(1), "SBAS", "SBAS (S120-S158)" },
1084  { uint32_t(2), "GALILEO", "GALILEO (E1-E36)" },
1085  { uint32_t(3), "BeiDou", "BeiDou (B1-B37)" },
1086  { uint32_t(5), "QZSS", "QZSS (Q1-Q5)" },
1087  { uint32_t(6), "GLONASS", "GLONASS (R1-R32)" },
1088  };
1089 
1090  static constexpr inline EnumInfo value = {
1091  /* .name = */ "ConstellationId",
1092  /* .docs = */ "",
1093  /* .type = */ Type::U8,
1094  /* .entries = */ entries,
1095  };
1096 
1097 };
1098 
1099 template<>
1100 struct MetadataFor<commands_3dm::ConstellationSettings::OptionFlags>
1101 {
1103 
1104  static constexpr inline BitfieldInfo::Entry entries[] = {
1105  { uint32_t(1), "L1SAIF", "Available only for QZSS" },
1106  };
1107 
1108  static constexpr inline BitfieldInfo value = {
1109  /* .name = */ "OptionFlags",
1110  /* .docs = */ "",
1111  /* .type = */ Type::U16,
1112  /* .entries = */ entries,
1113  };
1114 
1115 };
1116 
1117 template<>
1118 struct MetadataFor<commands_3dm::ConstellationSettings::Settings>
1119 {
1121 
1122  static constexpr inline ParameterInfo parameters[] = {
1123  {
1124  /* .name = */ "constellation_id",
1125  /* .docs = */ "Constellation ID",
1127  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::ConstellationId, &type::constellation_id>,
1128  /* .attributes = */ NO_FUNCTIONS,
1129  /* .count = */ 1,
1130  /* .condition = */ {},
1131  },
1132  {
1133  /* .name = */ "enable",
1134  /* .docs = */ "Enable/Disable constellation",
1135  /* .type = */ {Type::U8, nullptr},
1136  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::enable>,
1137  /* .attributes = */ NO_FUNCTIONS,
1138  /* .count = */ 1,
1139  /* .condition = */ {},
1140  },
1141  {
1142  /* .name = */ "reserved_channels",
1143  /* .docs = */ "Minimum number of channels reserved for this constellation",
1144  /* .type = */ {Type::U8, nullptr},
1145  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved_channels>,
1146  /* .attributes = */ NO_FUNCTIONS,
1147  /* .count = */ 1,
1148  /* .condition = */ {},
1149  },
1150  {
1151  /* .name = */ "max_channels",
1152  /* .docs = */ "Maximum number of channels to use for this constallation",
1153  /* .type = */ {Type::U8, nullptr},
1154  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::max_channels>,
1155  /* .attributes = */ NO_FUNCTIONS,
1156  /* .count = */ 1,
1157  /* .condition = */ {},
1158  },
1159  {
1160  /* .name = */ "option_flags",
1161  /* .docs = */ "Constellation option Flags",
1163  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::OptionFlags, &type::option_flags>,
1164  /* .attributes = */ NO_FUNCTIONS,
1165  /* .count = */ 1,
1166  /* .condition = */ {},
1167  },
1168  };
1169 
1170  static constexpr inline StructInfo value = {
1171  /* .name = */ "Settings",
1172  /* .title = */ "Settings",
1173  /* .docs = */ "",
1174  /* .parameters = */ parameters,
1175  };
1176 };
1177 
1178 template<>
1179 struct MetadataFor<commands_3dm::ConstellationSettings::Response>
1180 {
1182 
1183  static constexpr inline ParameterInfo parameters[] = {
1184  {
1185  /* .name = */ "max_channels_available",
1186  /* .docs = */ "Maximum channels available",
1187  /* .type = */ {Type::U16, nullptr},
1188  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::max_channels_available>,
1189  /* .attributes = */ {true, false, false, false, false},
1190  /* .count = */ 1,
1191  /* .condition = */ {},
1192  },
1193  {
1194  /* .name = */ "max_channels_use",
1195  /* .docs = */ "Maximum channels to use",
1196  /* .type = */ {Type::U16, nullptr},
1197  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::max_channels_use>,
1198  /* .attributes = */ {true, false, false, false, false},
1199  /* .count = */ 1,
1200  /* .condition = */ {},
1201  },
1202  {
1203  /* .name = */ "config_count",
1204  /* .docs = */ "Number of constellation configurations",
1205  /* .type = */ {Type::U8, nullptr},
1206  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::config_count>,
1207  /* .attributes = */ {true, false, false, false, false},
1208  /* .count = */ 1,
1209  /* .condition = */ {},
1210  },
1211  {
1212  /* .name = */ "settings",
1213  /* .docs = */ "Constellation Settings",
1215  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::Settings, &type::settings>,
1216  /* .attributes = */ {true, false, false, false, false},
1217  /* .count = */ {0, microstrain::Index(2) /* config_count */},
1218  /* .condition = */ {},
1219  },
1220  };
1221 
1222  static constexpr inline FieldInfo value = {
1223  /* .name = */ "commands_3dm::ConstellationSettings::Response",
1224  /* .title = */ "response",
1225  /* .docs = */ "",
1226  /* .parameters = */ parameters,
1227  /* .descriptor = */ type::DESCRIPTOR,
1228  /* .functions = */ NO_FUNCTIONS,
1229  /* .response = */ nullptr,
1230  };
1231 };
1232 
1233 template<>
1234 struct MetadataFor<commands_3dm::ConstellationSettings>
1235 {
1237 
1238  static constexpr inline ParameterInfo parameters[] = {
1239  FUNCTION_SELECTOR_PARAM,
1240  {
1241  /* .name = */ "max_channels",
1242  /* .docs = */ "",
1243  /* .type = */ {Type::U16, nullptr},
1244  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::max_channels>,
1245  /* .attributes = */ {true, false, false, false, false},
1246  /* .count = */ 1,
1247  /* .condition = */ {},
1248  },
1249  {
1250  /* .name = */ "config_count",
1251  /* .docs = */ "",
1252  /* .type = */ {Type::U8, nullptr},
1253  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::config_count>,
1254  /* .attributes = */ {true, false, false, false, false},
1255  /* .count = */ 1,
1256  /* .condition = */ {},
1257  },
1258  {
1259  /* .name = */ "settings",
1260  /* .docs = */ "",
1262  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::Settings, &type::settings>,
1263  /* .attributes = */ {true, false, false, false, false},
1264  /* .count = */ {0, microstrain::Index(1) /* config_count */},
1265  /* .condition = */ {},
1266  },
1267  };
1268 
1269  static constexpr inline FieldInfo value = {
1270  /* .name = */ "commands_3dm::ConstellationSettings",
1271  /* .title = */ "Constellation Settings",
1272  /* .docs = */ "This command configures which satellite constellations are enabled and how many channels are dedicated to tracking each constellation.\n\nMaximum number of tracking channels to use (total for all constellations):\n0 to max_channels_available (from reply message)\n\nFor each constellation you wish to use, include a ConstellationSettings struct. Note the following:\n\nTotal number of tracking channels (sum of 'reserved_channels' for all constellations) must be <= 32:\n0 -> 32 Number of reserved channels\n0 -> 32 Max number of channels (>= reserved channels)\n\nThe factory default setting is: GPS and GLONASS enabled. Min/Max for GPS = 8/16, GLONASS = 8/14, SBAS = 1/3, QZSS = 0/3.\n\nWarning: SBAS functionality shall not be used in 'safety of life' applications!\nWarning: Any setting that causes the total reserved channels to exceed 32 will result in a NACK.\nWarning: You cannot enable GLONASS and BeiDou at the same time.\nNote: Enabling SBAS and QZSS augments GPS accuracy.\nNote: It is recommended to disable GLONASS and BeiDou if a GPS-only antenna or GPS-only SAW filter is used.",
1273  /* .parameters = */ parameters,
1274  /* .descriptor = */ type::DESCRIPTOR,
1275  /* .functions = */ {true, true, true, true, true},
1276  /* .response = */ &MetadataFor<type::Response>::value,
1277  };
1278 };
1279 
1280 template<>
1281 struct MetadataFor<commands_3dm::GnssSbasSettings::SBASOptions>
1282 {
1284 
1285  static constexpr inline BitfieldInfo::Entry entries[] = {
1286  { uint32_t(1), "enable_ranging", "Use SBAS pseudoranges in position solution" },
1287  { uint32_t(2), "enable_corrections", "Use SBAS differential corrections" },
1288  { uint32_t(4), "apply_integrity", "Use SBAS integrity information. If enabled, only GPS satellites for which integrity information is available will be used." },
1289  };
1290 
1291  static constexpr inline BitfieldInfo value = {
1292  /* .name = */ "SBASOptions",
1293  /* .docs = */ "",
1294  /* .type = */ Type::U16,
1295  /* .entries = */ entries,
1296  };
1297 
1298 };
1299 
1300 template<>
1301 struct MetadataFor<commands_3dm::GnssSbasSettings::Response>
1302 {
1304 
1305  static constexpr inline ParameterInfo parameters[] = {
1306  {
1307  /* .name = */ "enable_sbas",
1308  /* .docs = */ "0 - SBAS Disabled, 1 - SBAS enabled",
1309  /* .type = */ {Type::U8, nullptr},
1310  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::enable_sbas>,
1311  /* .attributes = */ {true, false, false, false, false},
1312  /* .count = */ 1,
1313  /* .condition = */ {},
1314  },
1315  {
1316  /* .name = */ "sbas_options",
1317  /* .docs = */ "SBAS options, see definition",
1319  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssSbasSettings::SBASOptions, &type::sbas_options>,
1320  /* .attributes = */ {true, false, false, false, false},
1321  /* .count = */ 1,
1322  /* .condition = */ {},
1323  },
1324  {
1325  /* .name = */ "num_included_prns",
1326  /* .docs = */ "Number of SBAS PRNs to include in search (0 = include all)",
1327  /* .type = */ {Type::U8, nullptr},
1328  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_included_prns>,
1329  /* .attributes = */ {true, false, false, false, false},
1330  /* .count = */ 1,
1331  /* .condition = */ {},
1332  },
1333  {
1334  /* .name = */ "included_prns",
1335  /* .docs = */ "List of specific SBAS PRNs to search for",
1336  /* .type = */ {Type::U16, nullptr},
1337  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::included_prns>,
1338  /* .attributes = */ {true, false, false, false, false},
1339  /* .count = */ {39, microstrain::Index(2) /* num_included_prns */},
1340  /* .condition = */ {},
1341  },
1342  };
1343 
1344  static constexpr inline FieldInfo value = {
1345  /* .name = */ "commands_3dm::GnssSbasSettings::Response",
1346  /* .title = */ "response",
1347  /* .docs = */ "",
1348  /* .parameters = */ parameters,
1349  /* .descriptor = */ type::DESCRIPTOR,
1350  /* .functions = */ NO_FUNCTIONS,
1351  /* .response = */ nullptr,
1352  };
1353 };
1354 
1355 template<>
1356 struct MetadataFor<commands_3dm::GnssSbasSettings>
1357 {
1359 
1360  static constexpr inline ParameterInfo parameters[] = {
1361  FUNCTION_SELECTOR_PARAM,
1362  {
1363  /* .name = */ "enable_sbas",
1364  /* .docs = */ "0 - SBAS Disabled, 1 - SBAS enabled",
1365  /* .type = */ {Type::U8, nullptr},
1366  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::enable_sbas>,
1367  /* .attributes = */ {true, false, false, false, false},
1368  /* .count = */ 1,
1369  /* .condition = */ {},
1370  },
1371  {
1372  /* .name = */ "sbas_options",
1373  /* .docs = */ "SBAS options, see definition",
1375  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssSbasSettings::SBASOptions, &type::sbas_options>,
1376  /* .attributes = */ {true, false, false, false, false},
1377  /* .count = */ 1,
1378  /* .condition = */ {},
1379  },
1380  {
1381  /* .name = */ "num_included_prns",
1382  /* .docs = */ "Number of SBAS PRNs to include in search (0 = include all)",
1383  /* .type = */ {Type::U8, nullptr},
1384  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_included_prns>,
1385  /* .attributes = */ {true, false, false, false, false},
1386  /* .count = */ 1,
1387  /* .condition = */ {},
1388  },
1389  {
1390  /* .name = */ "included_prns",
1391  /* .docs = */ "List of specific SBAS PRNs to search for",
1392  /* .type = */ {Type::U16, nullptr},
1393  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::included_prns>,
1394  /* .attributes = */ {true, false, false, false, false},
1395  /* .count = */ {39, microstrain::Index(2) /* num_included_prns */},
1396  /* .condition = */ {},
1397  },
1398  };
1399 
1400  static constexpr inline FieldInfo value = {
1401  /* .name = */ "commands_3dm::GnssSbasSettings",
1402  /* .title = */ "GNSS SBAS Settings",
1403  /* .docs = */ "Configure the GNSS SBAS subsystem",
1404  /* .parameters = */ parameters,
1405  /* .descriptor = */ type::DESCRIPTOR,
1406  /* .functions = */ {true, true, true, true, true},
1407  /* .response = */ &MetadataFor<type::Response>::value,
1408  };
1409 };
1410 
1411 template<>
1412 struct MetadataFor<commands_3dm::GnssAssistedFix::AssistedFixOption>
1413 {
1415 
1416  static constexpr inline EnumInfo::Entry entries[] = {
1417  { uint32_t(0), "NONE", "No assisted fix (default)" },
1418  { uint32_t(1), "ENABLED", "Enable assisted fix" },
1419  };
1420 
1421  static constexpr inline EnumInfo value = {
1422  /* .name = */ "AssistedFixOption",
1423  /* .docs = */ "",
1424  /* .type = */ Type::U8,
1425  /* .entries = */ entries,
1426  };
1427 
1428 };
1429 
1430 template<>
1431 struct MetadataFor<commands_3dm::GnssAssistedFix::Response>
1432 {
1434 
1435  static constexpr inline ParameterInfo parameters[] = {
1436  {
1437  /* .name = */ "option",
1438  /* .docs = */ "Assisted fix options",
1440  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssAssistedFix::AssistedFixOption, &type::option>,
1441  /* .attributes = */ {true, false, false, false, false},
1442  /* .count = */ 1,
1443  /* .condition = */ {},
1444  },
1445  {
1446  /* .name = */ "flags",
1447  /* .docs = */ "Assisted fix flags (set to 0xFF)",
1448  /* .type = */ {Type::U8, nullptr},
1449  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::flags>,
1450  /* .attributes = */ {true, false, false, false, false},
1451  /* .count = */ 1,
1452  /* .condition = */ {},
1453  },
1454  };
1455 
1456  static constexpr inline FieldInfo value = {
1457  /* .name = */ "commands_3dm::GnssAssistedFix::Response",
1458  /* .title = */ "response",
1459  /* .docs = */ "",
1460  /* .parameters = */ parameters,
1461  /* .descriptor = */ type::DESCRIPTOR,
1462  /* .functions = */ NO_FUNCTIONS,
1463  /* .response = */ nullptr,
1464  };
1465 };
1466 
1467 template<>
1468 struct MetadataFor<commands_3dm::GnssAssistedFix>
1469 {
1471 
1472  static constexpr inline ParameterInfo parameters[] = {
1473  FUNCTION_SELECTOR_PARAM,
1474  {
1475  /* .name = */ "option",
1476  /* .docs = */ "Assisted fix options",
1478  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssAssistedFix::AssistedFixOption, &type::option>,
1479  /* .attributes = */ {true, false, false, false, false},
1480  /* .count = */ 1,
1481  /* .condition = */ {},
1482  },
1483  {
1484  /* .name = */ "flags",
1485  /* .docs = */ "Assisted fix flags (set to 0xFF)",
1486  /* .type = */ {Type::U8, nullptr},
1487  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::flags>,
1488  /* .attributes = */ {true, false, false, false, false},
1489  /* .count = */ 1,
1490  /* .condition = */ {},
1491  },
1492  };
1493 
1494  static constexpr inline FieldInfo value = {
1495  /* .name = */ "commands_3dm::GnssAssistedFix",
1496  /* .title = */ "GNSS Assisted Fix Settings",
1497  /* .docs = */ "Set the options for assisted GNSS fix.\n\nDevices that implement this command have a dedicated GNSS flash memory and a non-volatile FRAM.\nThese storage mechanisms are used to retain information about the last good GNSS fix. This can greatly reduces the TTFF (Time To First Fix) depending on the age of the stored information.\nThe TTFF can be as low as one second, or up to the equivalent of a cold start. There is a small increase in power used when enabling assisted fix.\n\nThe fastest fix will be obtained by supplying the device with a GNSS Assist Time Update message containing the current GPS time immediately after subsequent power up.\nThis allows the device to determine if the last GNSS information saved is still fresh enough to improve the TTFF.\n\nNOTE: Non-volatile GNSS memory is cleared when going from an enabled state to a disabled state.\nWARNING: The clearing operation results in an erase operation on the GNSS Flash. The flash has a limited durability of 100,000 write/erase cycles",
1498  /* .parameters = */ parameters,
1499  /* .descriptor = */ type::DESCRIPTOR,
1500  /* .functions = */ {true, true, true, true, true},
1501  /* .response = */ &MetadataFor<type::Response>::value,
1502  };
1503 };
1504 
1505 template<>
1506 struct MetadataFor<commands_3dm::GnssTimeAssistance::Response>
1507 {
1509 
1510  static constexpr inline ParameterInfo parameters[] = {
1511  {
1512  /* .name = */ "tow",
1513  /* .docs = */ "GPS Time of week [seconds]",
1514  /* .type = */ {Type::DOUBLE, nullptr},
1515  /* .accessor = */ nullptr, //utils::access<type, double, &type::tow>,
1516  /* .attributes = */ {true, false, false, false, false},
1517  /* .count = */ 1,
1518  /* .condition = */ {},
1519  },
1520  {
1521  /* .name = */ "week_number",
1522  /* .docs = */ "GPS Weeks since 1980 [weeks]",
1523  /* .type = */ {Type::U16, nullptr},
1524  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1525  /* .attributes = */ {true, false, false, false, false},
1526  /* .count = */ 1,
1527  /* .condition = */ {},
1528  },
1529  {
1530  /* .name = */ "accuracy",
1531  /* .docs = */ "Accuracy of time information [seconds]",
1532  /* .type = */ {Type::FLOAT, nullptr},
1533  /* .accessor = */ nullptr, //utils::access<type, float, &type::accuracy>,
1534  /* .attributes = */ {true, false, false, false, false},
1535  /* .count = */ 1,
1536  /* .condition = */ {},
1537  },
1538  };
1539 
1540  static constexpr inline FieldInfo value = {
1541  /* .name = */ "commands_3dm::GnssTimeAssistance::Response",
1542  /* .title = */ "response",
1543  /* .docs = */ "",
1544  /* .parameters = */ parameters,
1545  /* .descriptor = */ type::DESCRIPTOR,
1546  /* .functions = */ NO_FUNCTIONS,
1547  /* .response = */ nullptr,
1548  };
1549 };
1550 
1551 template<>
1552 struct MetadataFor<commands_3dm::GnssTimeAssistance>
1553 {
1555 
1556  static constexpr inline ParameterInfo parameters[] = {
1557  FUNCTION_SELECTOR_PARAM,
1558  {
1559  /* .name = */ "tow",
1560  /* .docs = */ "GPS Time of week [seconds]",
1561  /* .type = */ {Type::DOUBLE, nullptr},
1562  /* .accessor = */ nullptr, //utils::access<type, double, &type::tow>,
1563  /* .attributes = */ {true, false, false, false, false},
1564  /* .count = */ 1,
1565  /* .condition = */ {},
1566  },
1567  {
1568  /* .name = */ "week_number",
1569  /* .docs = */ "GPS Weeks since 1980 [weeks]",
1570  /* .type = */ {Type::U16, nullptr},
1571  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1572  /* .attributes = */ {true, false, false, false, false},
1573  /* .count = */ 1,
1574  /* .condition = */ {},
1575  },
1576  {
1577  /* .name = */ "accuracy",
1578  /* .docs = */ "Accuracy of time information [seconds]",
1579  /* .type = */ {Type::FLOAT, nullptr},
1580  /* .accessor = */ nullptr, //utils::access<type, float, &type::accuracy>,
1581  /* .attributes = */ {true, false, false, false, false},
1582  /* .count = */ 1,
1583  /* .condition = */ {},
1584  },
1585  };
1586 
1587  static constexpr inline FieldInfo value = {
1588  /* .name = */ "commands_3dm::GnssTimeAssistance",
1589  /* .title = */ "GNSS Time Assistance",
1590  /* .docs = */ "Provide the GNSS subsystem with initial time information.\n\nThis message is required immediately after power up if GNSS Assist was enabled when the device was powered off.\nThis will initialize the subsystem clock to help reduce the time to first fix (TTFF).",
1591  /* .parameters = */ parameters,
1592  /* .descriptor = */ type::DESCRIPTOR,
1593  /* .functions = */ {true, true, false, false, false},
1594  /* .response = */ &MetadataFor<type::Response>::value,
1595  };
1596 };
1597 
1598 template<>
1599 struct MetadataFor<commands_3dm::PpsSource::Source>
1600 {
1602 
1603  static constexpr inline EnumInfo::Entry entries[] = {
1604  { uint32_t(0), "DISABLED", "PPS output is disabled. Not valid for PPS source command." },
1605  { uint32_t(1), "RECEIVER_1", "PPS is provided by GNSS receiver 1." },
1606  { uint32_t(2), "RECEIVER_2", "PPS is provided by GNSS receiver 2." },
1607  { uint32_t(3), "GPIO", "PPS is provided to an external GPIO pin. Use the GPIO Setup command to choose and configure the pin." },
1608  { uint32_t(4), "GENERATED", "PPS is generated from the system oscillator." },
1609  };
1610 
1611  static constexpr inline EnumInfo value = {
1612  /* .name = */ "Source",
1613  /* .docs = */ "",
1614  /* .type = */ Type::U8,
1615  /* .entries = */ entries,
1616  };
1617 
1618 };
1619 
1620 template<>
1621 struct MetadataFor<commands_3dm::PpsSource::Response>
1622 {
1624 
1625  static constexpr inline ParameterInfo parameters[] = {
1626  {
1627  /* .name = */ "source",
1628  /* .docs = */ "",
1630  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::PpsSource::Source, &type::source>,
1631  /* .attributes = */ {true, false, false, false, false},
1632  /* .count = */ 1,
1633  /* .condition = */ {},
1634  },
1635  };
1636 
1637  static constexpr inline FieldInfo value = {
1638  /* .name = */ "commands_3dm::PpsSource::Response",
1639  /* .title = */ "response",
1640  /* .docs = */ "",
1641  /* .parameters = */ parameters,
1642  /* .descriptor = */ type::DESCRIPTOR,
1643  /* .functions = */ NO_FUNCTIONS,
1644  /* .response = */ nullptr,
1645  };
1646 };
1647 
1648 template<>
1649 struct MetadataFor<commands_3dm::PpsSource>
1650 {
1652 
1653  static constexpr inline ParameterInfo parameters[] = {
1654  FUNCTION_SELECTOR_PARAM,
1655  {
1656  /* .name = */ "source",
1657  /* .docs = */ "",
1659  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::PpsSource::Source, &type::source>,
1660  /* .attributes = */ {true, false, false, false, false},
1661  /* .count = */ 1,
1662  /* .condition = */ {},
1663  },
1664  };
1665 
1666  static constexpr inline FieldInfo value = {
1667  /* .name = */ "commands_3dm::PpsSource",
1668  /* .title = */ "PPS Source Control",
1669  /* .docs = */ "Controls the Pulse Per Second (PPS) source.",
1670  /* .parameters = */ parameters,
1671  /* .descriptor = */ type::DESCRIPTOR,
1672  /* .functions = */ {true, true, true, true, true},
1673  /* .response = */ &MetadataFor<type::Response>::value,
1674  };
1675 };
1676 
1677 template<>
1678 struct MetadataFor<commands_3dm::GetEventSupport::Query>
1679 {
1681 
1682  static constexpr inline EnumInfo::Entry entries[] = {
1683  { uint32_t(1), "TRIGGER_TYPES", "Query the supported trigger types and max count for each." },
1684  { uint32_t(2), "ACTION_TYPES", "Query the supported action types and max count for each." },
1685  };
1686 
1687  static constexpr inline EnumInfo value = {
1688  /* .name = */ "Query",
1689  /* .docs = */ "",
1690  /* .type = */ Type::U8,
1691  /* .entries = */ entries,
1692  };
1693 
1694 };
1695 
1696 template<>
1697 struct MetadataFor<commands_3dm::GetEventSupport::Info>
1698 {
1700 
1701  static constexpr inline ParameterInfo parameters[] = {
1702  {
1703  /* .name = */ "type",
1704  /* .docs = */ "Trigger or action type, as defined in the respective setup command.",
1705  /* .type = */ {Type::U8, nullptr},
1706  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::type>,
1707  /* .attributes = */ NO_FUNCTIONS,
1708  /* .count = */ 1,
1709  /* .condition = */ {},
1710  },
1711  {
1712  /* .name = */ "count",
1713  /* .docs = */ "This is the maximum number of instances supported for this type.",
1714  /* .type = */ {Type::U8, nullptr},
1715  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
1716  /* .attributes = */ NO_FUNCTIONS,
1717  /* .count = */ 1,
1718  /* .condition = */ {},
1719  },
1720  };
1721 
1722  static constexpr inline StructInfo value = {
1723  /* .name = */ "Info",
1724  /* .title = */ "Event Info",
1725  /* .docs = */ "",
1726  /* .parameters = */ parameters,
1727  };
1728 };
1729 
1730 template<>
1731 struct MetadataFor<commands_3dm::GetEventSupport::Response>
1732 {
1734 
1735  static constexpr inline ParameterInfo parameters[] = {
1736  {
1737  /* .name = */ "query",
1738  /* .docs = */ "Query type specified in the command.",
1740  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventSupport::Query, &type::query>,
1741  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
1742  /* .count = */ 1,
1743  /* .condition = */ {},
1744  },
1745  {
1746  /* .name = */ "max_instances",
1747  /* .docs = */ "Number of slots available. The 'instance' number for\nthe configuration or control commands must be between 1 and this value.",
1748  /* .type = */ {Type::U8, nullptr},
1749  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::max_instances>,
1750  /* .attributes = */ {true, false, false, false, false},
1751  /* .count = */ 1,
1752  /* .condition = */ {},
1753  },
1754  {
1755  /* .name = */ "num_entries",
1756  /* .docs = */ "Number of supported types.",
1757  /* .type = */ {Type::U8, nullptr},
1758  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_entries>,
1759  /* .attributes = */ {true, false, false, false, false},
1760  /* .count = */ 1,
1761  /* .condition = */ {},
1762  },
1763  {
1764  /* .name = */ "entries",
1765  /* .docs = */ "List of supported types.",
1767  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventSupport::Info, &type::entries>,
1768  /* .attributes = */ {true, false, false, false, false},
1769  /* .count = */ {0, microstrain::Index(2) /* num_entries */},
1770  /* .condition = */ {},
1771  },
1772  };
1773 
1774  static constexpr inline FieldInfo value = {
1775  /* .name = */ "commands_3dm::GetEventSupport::Response",
1776  /* .title = */ "response",
1777  /* .docs = */ "",
1778  /* .parameters = */ parameters,
1779  /* .descriptor = */ type::DESCRIPTOR,
1780  /* .functions = */ NO_FUNCTIONS,
1781  /* .response = */ nullptr,
1782  };
1783 };
1784 
1785 template<>
1786 struct MetadataFor<commands_3dm::GetEventSupport>
1787 {
1789 
1790  static constexpr inline ParameterInfo parameters[] = {
1791  {
1792  /* .name = */ "query",
1793  /* .docs = */ "What type of information to retrieve.",
1795  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventSupport::Query, &type::query>,
1796  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
1797  /* .count = */ 1,
1798  /* .condition = */ {},
1799  },
1800  };
1801 
1802  static constexpr inline FieldInfo value = {
1803  /* .name = */ "commands_3dm::GetEventSupport",
1804  /* .title = */ "Get Supported Events",
1805  /* .docs = */ "Lists the available trigger or action types.\n\nThere are a limited number of trigger and action slots available\nin the device. Up to M triggers and N actions can be configured at once\nin slots 1..M and 1..N respectively. M and N are identified by the\nmax_instances field in the response with the appropriate query selector.\n\nEach slot can be configured as one of a variety of different types of\ntriggers or actions. The supported types are enumerated in the response\nto this command. Additionally, there is a limit on the number of a given\ntype. In other words, while the device may support M triggers in total,\nonly a few of them maybe usable as a given type. This limit helps optimize\ndevice resources. The limit is identified in the count field.\n\nAll of the information in this command is available in the user manual.\nThis command provides a programmatic method for obtaining the information.\n",
1806  /* .parameters = */ parameters,
1807  /* .descriptor = */ type::DESCRIPTOR,
1808  /* .functions = */ NO_FUNCTIONS,
1809  /* .response = */ &MetadataFor<type::Response>::value,
1810  };
1811 };
1812 
1813 template<>
1814 struct MetadataFor<commands_3dm::EventControl::Mode>
1815 {
1817 
1818  static constexpr inline EnumInfo::Entry entries[] = {
1819  { uint32_t(0), "DISABLED", "Trigger is disabled." },
1820  { uint32_t(1), "ENABLED", "Trigger is enabled and will work normally." },
1821  { uint32_t(2), "TEST", "Forces the trigger to the active state for testing purposes." },
1822  { uint32_t(3), "TEST_PULSE", "Trigger is forced to the active state for one event cycle only. After the test cycle, the mode reverts to the previous state (either enabled or disabled)." },
1823  };
1824 
1825  static constexpr inline EnumInfo value = {
1826  /* .name = */ "Mode",
1827  /* .docs = */ "",
1828  /* .type = */ Type::U8,
1829  /* .entries = */ entries,
1830  };
1831 
1832 };
1833 
1834 template<>
1835 struct MetadataFor<commands_3dm::EventControl::Response>
1836 {
1838 
1839  static constexpr inline ParameterInfo parameters[] = {
1840  {
1841  /* .name = */ "instance",
1842  /* .docs = */ "Trigger instance to affect. 0 can be used to apply the mode to all\nconfigured triggers, except when the function selector is READ.",
1843  /* .type = */ {Type::U8, nullptr},
1844  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
1845  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
1846  /* .count = */ 1,
1847  /* .condition = */ {},
1848  },
1849  {
1850  /* .name = */ "mode",
1851  /* .docs = */ "How to change the trigger state. Except when instance is 0, the\ncorresponding trigger must be configured, i.e. not have type 0.",
1853  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventControl::Mode, &type::mode>,
1854  /* .attributes = */ {true, false, false, false, false},
1855  /* .count = */ 1,
1856  /* .condition = */ {},
1857  },
1858  };
1859 
1860  static constexpr inline FieldInfo value = {
1861  /* .name = */ "commands_3dm::EventControl::Response",
1862  /* .title = */ "response",
1863  /* .docs = */ "",
1864  /* .parameters = */ parameters,
1865  /* .descriptor = */ type::DESCRIPTOR,
1866  /* .functions = */ NO_FUNCTIONS,
1867  /* .response = */ nullptr,
1868  };
1869 };
1870 
1871 template<>
1872 struct MetadataFor<commands_3dm::EventControl>
1873 {
1875 
1876  static constexpr inline ParameterInfo parameters[] = {
1877  FUNCTION_SELECTOR_PARAM,
1878  {
1879  /* .name = */ "instance",
1880  /* .docs = */ "Trigger instance to affect. 0 can be used to apply the mode to all\nconfigured triggers, except when the function selector is READ.",
1881  /* .type = */ {Type::U8, nullptr},
1882  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
1883  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
1884  /* .count = */ 1,
1885  /* .condition = */ {},
1886  },
1887  {
1888  /* .name = */ "mode",
1889  /* .docs = */ "How to change the trigger state. Except when instance is 0, the\ncorresponding trigger must be configured, i.e. not have type 0.",
1891  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventControl::Mode, &type::mode>,
1892  /* .attributes = */ {true, false, false, false, false},
1893  /* .count = */ 1,
1894  /* .condition = */ {},
1895  },
1896  };
1897 
1898  static constexpr inline FieldInfo value = {
1899  /* .name = */ "commands_3dm::EventControl",
1900  /* .title = */ "Event Control",
1901  /* .docs = */ "Enables or disables event triggers.\n\nTriggers can be disabled, enabled, and tested. While disabled, a trigger will\nnot evaluate its logic and effective behave like no trigger is configured.\nA disabled trigger will not activate any actions. Triggers are disabled by default.\n\nUse this command to enable (or disable) a trigger, or to place it into a test mode.\nWhen in test mode, the trigger logic is disabled but the output is forced to\nthe active state, meaning that it will behave as if the trigger logic is satisfied\nand any associated actions will execute.",
1902  /* .parameters = */ parameters,
1903  /* .descriptor = */ type::DESCRIPTOR,
1904  /* .functions = */ {true, true, true, true, true},
1905  /* .response = */ &MetadataFor<type::Response>::value,
1906  };
1907 };
1908 
1909 template<>
1910 struct MetadataFor<commands_3dm::GetEventTriggerStatus::Status>
1911 {
1913 
1914  static constexpr inline BitfieldInfo::Entry entries[] = {
1915  { uint32_t(1), "active", "True if the trigger is currently active (either due to its logic or being in test mode)." },
1916  { uint32_t(2), "enabled", "True if the trigger is enabled." },
1917  { uint32_t(4), "test", "True if the trigger is in test mode." },
1918  };
1919 
1920  static constexpr inline BitfieldInfo value = {
1921  /* .name = */ "Status",
1922  /* .docs = */ "",
1923  /* .type = */ Type::U8,
1924  /* .entries = */ entries,
1925  };
1926 
1927 };
1928 
1929 template<>
1930 struct MetadataFor<commands_3dm::GetEventTriggerStatus::Entry>
1931 {
1933 
1934  static constexpr inline ParameterInfo parameters[] = {
1935  {
1936  /* .name = */ "type",
1937  /* .docs = */ "Configured trigger type.",
1938  /* .type = */ {Type::U8, nullptr},
1939  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::type>,
1940  /* .attributes = */ NO_FUNCTIONS,
1941  /* .count = */ 1,
1942  /* .condition = */ {},
1943  },
1944  {
1945  /* .name = */ "status",
1946  /* .docs = */ "Trigger status.",
1948  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventTriggerStatus::Status, &type::status>,
1949  /* .attributes = */ NO_FUNCTIONS,
1950  /* .count = */ 1,
1951  /* .condition = */ {},
1952  },
1953  };
1954 
1955  static constexpr inline StructInfo value = {
1956  /* .name = */ "Entry",
1957  /* .title = */ "Trigger Entry",
1958  /* .docs = */ "",
1959  /* .parameters = */ parameters,
1960  };
1961 };
1962 
1963 template<>
1964 struct MetadataFor<commands_3dm::GetEventTriggerStatus::Response>
1965 {
1967 
1968  static constexpr inline ParameterInfo parameters[] = {
1969  {
1970  /* .name = */ "count",
1971  /* .docs = */ "Number of entries requested. If requested_count was 0, this is the number of supported trigger slots.",
1972  /* .type = */ {Type::U8, nullptr},
1973  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
1974  /* .attributes = */ {true, false, false, false, false},
1975  /* .count = */ 1,
1976  /* .condition = */ {},
1977  },
1978  {
1979  /* .name = */ "triggers",
1980  /* .docs = */ "A list of the configured triggers. Entries are in the order requested, or in increasing order if count was 0.",
1982  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventTriggerStatus::Entry, &type::triggers>,
1983  /* .attributes = */ {true, false, false, false, false},
1984  /* .count = */ {20, microstrain::Index(0) /* count */},
1985  /* .condition = */ {},
1986  },
1987  };
1988 
1989  static constexpr inline FieldInfo value = {
1990  /* .name = */ "commands_3dm::GetEventTriggerStatus::Response",
1991  /* .title = */ "response",
1992  /* .docs = */ "",
1993  /* .parameters = */ parameters,
1994  /* .descriptor = */ type::DESCRIPTOR,
1995  /* .functions = */ NO_FUNCTIONS,
1996  /* .response = */ nullptr,
1997  };
1998 };
1999 
2000 template<>
2001 struct MetadataFor<commands_3dm::GetEventTriggerStatus>
2002 {
2004 
2005  static constexpr inline ParameterInfo parameters[] = {
2006  {
2007  /* .name = */ "requested_count",
2008  /* .docs = */ "Number of entries requested. If 0, requests all trigger slots.",
2009  /* .type = */ {Type::U8, nullptr},
2010  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_count>,
2011  /* .attributes = */ {true, false, false, false, false},
2012  /* .count = */ 1,
2013  /* .condition = */ {},
2014  },
2015  {
2016  /* .name = */ "requested_instances",
2017  /* .docs = */ "List of trigger instances to query.",
2018  /* .type = */ {Type::U8, nullptr},
2019  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_instances>,
2020  /* .attributes = */ {true, false, false, false, false},
2021  /* .count = */ {20, microstrain::Index(0) /* requested_count */},
2022  /* .condition = */ {},
2023  },
2024  };
2025 
2026  static constexpr inline FieldInfo value = {
2027  /* .name = */ "commands_3dm::GetEventTriggerStatus",
2028  /* .title = */ "Get Event Trigger Status",
2029  /* .docs = */ "",
2030  /* .parameters = */ parameters,
2031  /* .descriptor = */ type::DESCRIPTOR,
2032  /* .functions = */ NO_FUNCTIONS,
2033  /* .response = */ &MetadataFor<type::Response>::value,
2034  };
2035 };
2036 
2037 template<>
2038 struct MetadataFor<commands_3dm::GetEventActionStatus::Entry>
2039 {
2041 
2042  static constexpr inline ParameterInfo parameters[] = {
2043  {
2044  /* .name = */ "action_type",
2045  /* .docs = */ "Configured action type.",
2046  /* .type = */ {Type::U8, nullptr},
2047  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::action_type>,
2048  /* .attributes = */ NO_FUNCTIONS,
2049  /* .count = */ 1,
2050  /* .condition = */ {},
2051  },
2052  {
2053  /* .name = */ "trigger_id",
2054  /* .docs = */ "Associated trigger instance.",
2055  /* .type = */ {Type::U8, nullptr},
2056  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::trigger_id>,
2057  /* .attributes = */ NO_FUNCTIONS,
2058  /* .count = */ 1,
2059  /* .condition = */ {},
2060  },
2061  };
2062 
2063  static constexpr inline StructInfo value = {
2064  /* .name = */ "Entry",
2065  /* .title = */ "Action Entry",
2066  /* .docs = */ "",
2067  /* .parameters = */ parameters,
2068  };
2069 };
2070 
2071 template<>
2072 struct MetadataFor<commands_3dm::GetEventActionStatus::Response>
2073 {
2075 
2076  static constexpr inline ParameterInfo parameters[] = {
2077  {
2078  /* .name = */ "count",
2079  /* .docs = */ "Number of entries requested. If requested_count was 0, this is the number of supported action slots.",
2080  /* .type = */ {Type::U8, nullptr},
2081  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
2082  /* .attributes = */ {true, false, false, false, false},
2083  /* .count = */ 1,
2084  /* .condition = */ {},
2085  },
2086  {
2087  /* .name = */ "actions",
2088  /* .docs = */ "A list of the configured actions. Entries are in the order requested, or in increasing order if count was 0.",
2090  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventActionStatus::Entry, &type::actions>,
2091  /* .attributes = */ {true, false, false, false, false},
2092  /* .count = */ {20, microstrain::Index(0) /* count */},
2093  /* .condition = */ {},
2094  },
2095  };
2096 
2097  static constexpr inline FieldInfo value = {
2098  /* .name = */ "commands_3dm::GetEventActionStatus::Response",
2099  /* .title = */ "response",
2100  /* .docs = */ "",
2101  /* .parameters = */ parameters,
2102  /* .descriptor = */ type::DESCRIPTOR,
2103  /* .functions = */ NO_FUNCTIONS,
2104  /* .response = */ nullptr,
2105  };
2106 };
2107 
2108 template<>
2109 struct MetadataFor<commands_3dm::GetEventActionStatus>
2110 {
2112 
2113  static constexpr inline ParameterInfo parameters[] = {
2114  {
2115  /* .name = */ "requested_count",
2116  /* .docs = */ "Number of entries requested. If 0, requests all action slots.",
2117  /* .type = */ {Type::U8, nullptr},
2118  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_count>,
2119  /* .attributes = */ {true, false, false, false, false},
2120  /* .count = */ 1,
2121  /* .condition = */ {},
2122  },
2123  {
2124  /* .name = */ "requested_instances",
2125  /* .docs = */ "List of action instances to query.",
2126  /* .type = */ {Type::U8, nullptr},
2127  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_instances>,
2128  /* .attributes = */ {true, false, false, false, false},
2129  /* .count = */ {20, microstrain::Index(0) /* requested_count */},
2130  /* .condition = */ {},
2131  },
2132  };
2133 
2134  static constexpr inline FieldInfo value = {
2135  /* .name = */ "commands_3dm::GetEventActionStatus",
2136  /* .title = */ "Get Event Action Status",
2137  /* .docs = */ "",
2138  /* .parameters = */ parameters,
2139  /* .descriptor = */ type::DESCRIPTOR,
2140  /* .functions = */ NO_FUNCTIONS,
2141  /* .response = */ &MetadataFor<type::Response>::value,
2142  };
2143 };
2144 
2145 template<>
2146 struct MetadataFor<commands_3dm::EventTrigger::GpioParams::Mode>
2147 {
2149 
2150  static constexpr inline EnumInfo::Entry entries[] = {
2151  { uint32_t(0), "DISABLED", "The pin will have no effect and the trigger will never activate." },
2152  { uint32_t(1), "WHILE_HIGH", "The trigger will be active while the pin is high." },
2153  { uint32_t(2), "WHILE_LOW", "The trigger will be active while the pin is low." },
2154  { uint32_t(4), "EDGE", "Use if the pin is configured for timestamping via the 3DM Gpio Configuration command (0x0C41)." },
2155  };
2156 
2157  static constexpr inline EnumInfo value = {
2158  /* .name = */ "Mode",
2159  /* .docs = */ "",
2160  /* .type = */ Type::U8,
2161  /* .entries = */ entries,
2162  };
2163 
2164 };
2165 
2166 template<>
2167 struct MetadataFor<commands_3dm::EventTrigger::GpioParams>
2168 {
2170 
2171  static constexpr inline ParameterInfo parameters[] = {
2172  {
2173  /* .name = */ "pin",
2174  /* .docs = */ "GPIO pin number.",
2175  /* .type = */ {Type::U8, nullptr},
2176  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
2177  /* .attributes = */ NO_FUNCTIONS,
2178  /* .count = */ 1,
2179  /* .condition = */ {},
2180  },
2181  {
2182  /* .name = */ "mode",
2183  /* .docs = */ "How the pin state affects the trigger.",
2185  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::GpioParams::Mode, &type::mode>,
2186  /* .attributes = */ NO_FUNCTIONS,
2187  /* .count = */ 1,
2188  /* .condition = */ {},
2189  },
2190  };
2191 
2192  static constexpr inline StructInfo value = {
2193  /* .name = */ "GpioParams",
2194  /* .title = */ "Trigger GPIO Parameters",
2195  /* .docs = */ "",
2196  /* .parameters = */ parameters,
2197  };
2198 };
2199 
2200 template<>
2202 {
2204 
2205  static constexpr inline EnumInfo::Entry entries[] = {
2206  { uint32_t(1), "WINDOW", "Window comparison. Trigger is active if low_thres &lt;= value &lt;= high_thres. If the thresholds are reversed, the trigger is active when value &lt; high_thres or value &gt; low_thres." },
2207  { uint32_t(2), "INTERVAL", "Trigger at evenly spaced intervals. Normally used with time fields to trigger periodically. Trigger is active when (value % interval) &lt;= int_thres. If the thresholds are reversed (high_thres &lt; low_thres) then the trigger is active when (value % low_thres) &gt; high_thres." },
2208  };
2209 
2210  static constexpr inline EnumInfo value = {
2211  /* .name = */ "Type",
2212  /* .docs = */ "",
2213  /* .type = */ Type::U8,
2214  /* .entries = */ entries,
2215  };
2216 
2217 };
2218 
2219 template<>
2220 struct MetadataFor<commands_3dm::EventTrigger::ThresholdParams>
2221 {
2223 
2224  static constexpr inline ParameterInfo parameters[] = {
2225  {
2226  /* .name = */ "desc_set",
2227  /* .docs = */ "Descriptor set of target data quantity.",
2228  /* .type = */ {Type::U8, nullptr},
2229  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
2230  /* .attributes = */ NO_FUNCTIONS,
2231  /* .count = */ 1,
2232  /* .condition = */ {},
2233  },
2234  {
2235  /* .name = */ "field_desc",
2236  /* .docs = */ "Field descriptor of target data quantity.",
2237  /* .type = */ {Type::U8, nullptr},
2238  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::field_desc>,
2239  /* .attributes = */ NO_FUNCTIONS,
2240  /* .count = */ 1,
2241  /* .condition = */ {},
2242  },
2243  {
2244  /* .name = */ "param_id",
2245  /* .docs = */ "1-based index of the target parameter within the MIP field. E.g. for Scaled Accel (0x80,0x04) a value of 2 would represent the Y axis.",
2246  /* .type = */ {Type::U8, nullptr},
2247  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::param_id>,
2248  /* .attributes = */ NO_FUNCTIONS,
2249  /* .count = */ 1,
2250  /* .condition = */ {},
2251  },
2252  {
2253  /* .name = */ "type",
2254  /* .docs = */ "Determines the type of comparison.",
2256  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::ThresholdParams::Type, &type::type>,
2257  /* .attributes = */ NO_FUNCTIONS,
2258  /* .count = */ 1,
2259  /* .condition = */ {},
2260  },
2261  {
2262  /* .name = */ "low_thres",
2263  /* .docs = */ "",
2264  /* .type = */ {Type::DOUBLE, nullptr},
2265  /* .accessor = */ nullptr, //utils::access<type, double, &type::low_thres>,
2266  /* .attributes = */ NO_FUNCTIONS,
2267  /* .count = */ 1,
2268  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::WINDOW)} /* type == WINDOW */,
2269  },
2270  {
2271  /* .name = */ "int_thres",
2272  /* .docs = */ "",
2273  /* .type = */ {Type::DOUBLE, nullptr},
2274  /* .accessor = */ nullptr, //utils::access<type, double, &type::int_thres>,
2275  /* .attributes = */ NO_FUNCTIONS,
2276  /* .count = */ 1,
2277  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::INTERVAL)} /* type == INTERVAL */,
2278  },
2279  {
2280  /* .name = */ "high_thres",
2281  /* .docs = */ "",
2282  /* .type = */ {Type::DOUBLE, nullptr},
2283  /* .accessor = */ nullptr, //utils::access<type, double, &type::high_thres>,
2284  /* .attributes = */ NO_FUNCTIONS,
2285  /* .count = */ 1,
2286  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::WINDOW)} /* type == WINDOW */,
2287  },
2288  {
2289  /* .name = */ "interval",
2290  /* .docs = */ "",
2291  /* .type = */ {Type::DOUBLE, nullptr},
2292  /* .accessor = */ nullptr, //utils::access<type, double, &type::interval>,
2293  /* .attributes = */ NO_FUNCTIONS,
2294  /* .count = */ 1,
2295  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::INTERVAL)} /* type == INTERVAL */,
2296  },
2297  };
2298 
2299  static constexpr inline StructInfo value = {
2300  /* .name = */ "ThresholdParams",
2301  /* .title = */ "Trigger Threshold Parameters",
2302  /* .docs = */ "Comparison of a supported MIP field parameter against a set of thresholds.\n\nTriggers when a data quantity meets the comparison criteria. The comparison can be either\na window comparison with high and low thresholds or a periodic interval.\n\nThe data quantity is identified by the MIP descriptor set, field descriptor, and parameter number.\nE.g. Scaled acceleration in the Z direction is specified with desc_set=0x80 (sensor data),\nfield_desc=0x04 (scaled accel), and param_id=3 (the third parameter and Z axis).\n\nThe window comparison can be used for a variety of purposes, such as disabling\na robot's drive motors if it tips over. In this case, a window comparison could\nbe set up to monitor the roll angle, (0x80,0x0C,3). The lower threshold would be set\nto -pi/2 radians and the upper threshold to pi/2 radians.\n\nThe interval trigger can be used to perform an action periodically if used with\na time field. E.g. to execute the action every 16 ms, set an interval comparison on\nthe GPS time of week parameter (0x80,0xD3,1) with high_thres set to 0.016. The lower\nthreshold determines how long the trigger is active within the 16-ms period.\n\nEither comparison type can be inverted by reversing the threshold values; setting\nlow_thres > high_thres will result in the reverse condition.",
2303  /* .parameters = */ parameters,
2304  };
2305 };
2306 
2307 template<>
2308 struct MetadataFor<commands_3dm::EventTrigger::CombinationParams>
2309 {
2311 
2312  static constexpr inline ParameterInfo parameters[] = {
2313  {
2314  /* .name = */ "logic_table",
2315  /* .docs = */ "The last column of a truth table describing the output given the state of each input.",
2316  /* .type = */ {Type::U16, nullptr},
2317  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::logic_table>,
2318  /* .attributes = */ NO_FUNCTIONS,
2319  /* .count = */ 1,
2320  /* .condition = */ {},
2321  },
2322  {
2323  /* .name = */ "input_triggers",
2324  /* .docs = */ "List of trigger IDs for inputs. Use 0 for unused inputs.",
2325  /* .type = */ {Type::U8, nullptr},
2326  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::input_triggers>,
2327  /* .attributes = */ NO_FUNCTIONS,
2328  /* .count = */ 4,
2329  /* .condition = */ {},
2330  },
2331  };
2332 
2333  static constexpr inline StructInfo value = {
2334  /* .name = */ "CombinationParams",
2335  /* .title = */ "Trigger Combination Parameters",
2336  /* .docs = */ "",
2337  /* .parameters = */ parameters,
2338  };
2339 };
2340 
2341 template<>
2342 struct MetadataFor<commands_3dm::EventTrigger::Type>
2343 {
2345 
2346  static constexpr inline EnumInfo::Entry entries[] = {
2347  { uint32_t(0), "NONE", "No trigger selected. The state will always be inactive." },
2348  { uint32_t(1), "GPIO", "Trigger based on the state of a GPIO pin. See GpioParams." },
2349  { uint32_t(2), "THRESHOLD", "Compare a data quantity against a high and low threshold. See ThresholdParams." },
2350  { uint32_t(3), "COMBINATION", "Logical combination of two or more triggers. See CombinationParams." },
2351  };
2352 
2353  static constexpr inline EnumInfo value = {
2354  /* .name = */ "Type",
2355  /* .docs = */ "",
2356  /* .type = */ Type::U8,
2357  /* .entries = */ entries,
2358  };
2359 
2360 };
2361 
2362 template<>
2363 struct MetadataFor<commands_3dm::EventTrigger::Parameters>
2364 {
2366 
2367  static constexpr inline ParameterInfo parameters[] = {
2368  {
2369  /* .name = */ "gpio",
2370  /* .docs = */ "",
2372  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::GpioParams, &type::gpio>,
2373  /* .attributes = */ NO_FUNCTIONS,
2374  /* .count = */ 1,
2375  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(1) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::Type::GPIO)} /* type == GPIO */,
2376  },
2377  {
2378  /* .name = */ "threshold",
2379  /* .docs = */ "",
2381  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::ThresholdParams, &type::threshold>,
2382  /* .attributes = */ NO_FUNCTIONS,
2383  /* .count = */ 1,
2384  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(1) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::Type::THRESHOLD)} /* type == THRESHOLD */,
2385  },
2386  {
2387  /* .name = */ "combination",
2388  /* .docs = */ "",
2390  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::CombinationParams, &type::combination>,
2391  /* .attributes = */ NO_FUNCTIONS,
2392  /* .count = */ 1,
2393  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(1) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::Type::COMBINATION)} /* type == COMBINATION */,
2394  },
2395  };
2396 
2397  static constexpr inline StructInfo value = {
2398  /* .name = */ "Parameters",
2399  /* .title = */ "Parameters",
2400  /* .docs = */ "",
2401  /* .parameters = */ parameters,
2402  };
2403 };
2404 
2405 template<>
2406 struct MetadataFor<commands_3dm::EventTrigger::Response>
2407 {
2409 
2410  static constexpr inline ParameterInfo parameters[] = {
2411  {
2412  /* .name = */ "instance",
2413  /* .docs = */ "Trigger number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2414  /* .type = */ {Type::U8, nullptr},
2415  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2416  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2417  /* .count = */ 1,
2418  /* .condition = */ {},
2419  },
2420  {
2421  /* .name = */ "type",
2422  /* .docs = */ "Type of trigger to configure.",
2424  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Type, &type::type>,
2425  /* .attributes = */ {true, false, false, false, false},
2426  /* .count = */ 1,
2427  /* .condition = */ {},
2428  },
2429  {
2430  /* .name = */ "parameters",
2431  /* .docs = */ "",
2433  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Parameters, &type::parameters>,
2434  /* .attributes = */ {true, false, false, false, false},
2435  /* .count = */ 1,
2436  /* .condition = */ {},
2437  },
2438  };
2439 
2440  static constexpr inline FieldInfo value = {
2441  /* .name = */ "commands_3dm::EventTrigger::Response",
2442  /* .title = */ "response",
2443  /* .docs = */ "",
2444  /* .parameters = */ parameters,
2445  /* .descriptor = */ type::DESCRIPTOR,
2446  /* .functions = */ NO_FUNCTIONS,
2447  /* .response = */ nullptr,
2448  };
2449 };
2450 
2451 template<>
2452 struct MetadataFor<commands_3dm::EventTrigger>
2453 {
2455 
2456  static constexpr inline ParameterInfo parameters[] = {
2457  FUNCTION_SELECTOR_PARAM,
2458  {
2459  /* .name = */ "instance",
2460  /* .docs = */ "Trigger number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2461  /* .type = */ {Type::U8, nullptr},
2462  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2463  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2464  /* .count = */ 1,
2465  /* .condition = */ {},
2466  },
2467  {
2468  /* .name = */ "type",
2469  /* .docs = */ "Type of trigger to configure.",
2471  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Type, &type::type>,
2472  /* .attributes = */ {true, false, false, false, false},
2473  /* .count = */ 1,
2474  /* .condition = */ {},
2475  },
2476  {
2477  /* .name = */ "parameters",
2478  /* .docs = */ "",
2480  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Parameters, &type::parameters>,
2481  /* .attributes = */ {true, false, false, false, false},
2482  /* .count = */ 1,
2483  /* .condition = */ {},
2484  },
2485  };
2486 
2487  static constexpr inline FieldInfo value = {
2488  /* .name = */ "commands_3dm::EventTrigger",
2489  /* .title = */ "Event Trigger Configuration",
2490  /* .docs = */ "Configures various types of event triggers.",
2491  /* .parameters = */ parameters,
2492  /* .descriptor = */ type::DESCRIPTOR,
2493  /* .functions = */ {true, true, true, true, true},
2494  /* .response = */ &MetadataFor<type::Response>::value,
2495  };
2496 };
2497 
2498 template<>
2499 struct MetadataFor<commands_3dm::EventAction::GpioParams::Mode>
2500 {
2502 
2503  static constexpr inline EnumInfo::Entry entries[] = {
2504  { uint32_t(0), "DISABLED", "Pin state will not be changed." },
2505  { uint32_t(1), "ACTIVE_HIGH", "Pin will be set high when the trigger is active and low otherwise." },
2506  { uint32_t(2), "ACTIVE_LOW", "Pin will be set low when the trigger is active and high otherwise." },
2507  { uint32_t(5), "ONESHOT_HIGH", "Pin will be set high each time the trigger activates. It will not be set low." },
2508  { uint32_t(6), "ONESHOT_LOW", "Pin will be set low each time the trigger activates. It will not be set high." },
2509  { uint32_t(7), "TOGGLE", "Pin will change to the opposite state each time the trigger activates." },
2510  };
2511 
2512  static constexpr inline EnumInfo value = {
2513  /* .name = */ "Mode",
2514  /* .docs = */ "",
2515  /* .type = */ Type::U8,
2516  /* .entries = */ entries,
2517  };
2518 
2519 };
2520 
2521 template<>
2522 struct MetadataFor<commands_3dm::EventAction::GpioParams>
2523 {
2525 
2526  static constexpr inline ParameterInfo parameters[] = {
2527  {
2528  /* .name = */ "pin",
2529  /* .docs = */ "GPIO pin number.",
2530  /* .type = */ {Type::U8, nullptr},
2531  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
2532  /* .attributes = */ NO_FUNCTIONS,
2533  /* .count = */ 1,
2534  /* .condition = */ {},
2535  },
2536  {
2537  /* .name = */ "mode",
2538  /* .docs = */ "Behavior of the pin.",
2540  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::GpioParams::Mode, &type::mode>,
2541  /* .attributes = */ NO_FUNCTIONS,
2542  /* .count = */ 1,
2543  /* .condition = */ {},
2544  },
2545  };
2546 
2547  static constexpr inline StructInfo value = {
2548  /* .name = */ "GpioParams",
2549  /* .title = */ "Action GPIO Parameters",
2550  /* .docs = */ "",
2551  /* .parameters = */ parameters,
2552  };
2553 };
2554 
2555 template<>
2556 struct MetadataFor<commands_3dm::EventAction::MessageParams>
2557 {
2559 
2560  static constexpr inline ParameterInfo parameters[] = {
2561  {
2562  /* .name = */ "desc_set",
2563  /* .docs = */ "MIP data descriptor set.",
2564  /* .type = */ {Type::U8, nullptr},
2565  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
2566  /* .attributes = */ NO_FUNCTIONS,
2567  /* .count = */ 1,
2568  /* .condition = */ {},
2569  },
2570  {
2571  /* .name = */ "decimation",
2572  /* .docs = */ "Decimation from the base rate.\nIf 0, a packet is emitted each time the trigger activates.\nOtherwise, packets will be streamed while the trigger is active.\nThe internal decimation counter is reset if the trigger deactivates.",
2573  /* .type = */ {Type::U16, nullptr},
2574  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::decimation>,
2575  /* .attributes = */ NO_FUNCTIONS,
2576  /* .count = */ 1,
2577  /* .condition = */ {},
2578  },
2579  {
2580  /* .name = */ "num_fields",
2581  /* .docs = */ "Number of mip fields in the packet. Limited to 12.",
2582  /* .type = */ {Type::U8, nullptr},
2583  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_fields>,
2584  /* .attributes = */ NO_FUNCTIONS,
2585  /* .count = */ 1,
2586  /* .condition = */ {},
2587  },
2588  {
2589  /* .name = */ "descriptors",
2590  /* .docs = */ "List of field descriptors.",
2591  /* .type = */ {Type::U8, nullptr},
2592  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::descriptors>,
2593  /* .attributes = */ NO_FUNCTIONS,
2594  /* .count = */ {20, microstrain::Index(2) /* num_fields */},
2595  /* .condition = */ {},
2596  },
2597  };
2598 
2599  static constexpr inline StructInfo value = {
2600  /* .name = */ "MessageParams",
2601  /* .title = */ "Action Message Parameters",
2602  /* .docs = */ "",
2603  /* .parameters = */ parameters,
2604  };
2605 };
2606 
2607 template<>
2608 struct MetadataFor<commands_3dm::EventAction::Type>
2609 {
2611 
2612  static constexpr inline EnumInfo::Entry entries[] = {
2613  { uint32_t(0), "NONE", "No action. Parameters should be empty." },
2614  { uint32_t(1), "GPIO", "Control the state of a GPIO pin. See GpioParameters." },
2615  { uint32_t(2), "MESSAGE", "Output a data packet. See MessageParameters." },
2616  };
2617 
2618  static constexpr inline EnumInfo value = {
2619  /* .name = */ "Type",
2620  /* .docs = */ "",
2621  /* .type = */ Type::U8,
2622  /* .entries = */ entries,
2623  };
2624 
2625 };
2626 
2627 template<>
2628 struct MetadataFor<commands_3dm::EventAction::Parameters>
2629 {
2631 
2632  static constexpr inline ParameterInfo parameters[] = {
2633  {
2634  /* .name = */ "gpio",
2635  /* .docs = */ "Gpio parameters, if type == GPIO. Ignore otherwise.",
2637  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::GpioParams, &type::gpio>,
2638  /* .attributes = */ NO_FUNCTIONS,
2639  /* .count = */ 1,
2640  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(2) /* type */, static_cast<uint16_t>(commands_3dm::EventAction::Type::GPIO)} /* type == GPIO */,
2641  },
2642  {
2643  /* .name = */ "message",
2644  /* .docs = */ "Message parameters, if type == MESSAGE. Ignore otherwise.",
2646  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::MessageParams, &type::message>,
2647  /* .attributes = */ NO_FUNCTIONS,
2648  /* .count = */ 1,
2649  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(2) /* type */, static_cast<uint16_t>(commands_3dm::EventAction::Type::MESSAGE)} /* type == MESSAGE */,
2650  },
2651  };
2652 
2653  static constexpr inline StructInfo value = {
2654  /* .name = */ "Parameters",
2655  /* .title = */ "Parameters",
2656  /* .docs = */ "",
2657  /* .parameters = */ parameters,
2658  };
2659 };
2660 
2661 template<>
2662 struct MetadataFor<commands_3dm::EventAction::Response>
2663 {
2665 
2666  static constexpr inline ParameterInfo parameters[] = {
2667  {
2668  /* .name = */ "instance",
2669  /* .docs = */ "Action number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2670  /* .type = */ {Type::U8, nullptr},
2671  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2672  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2673  /* .count = */ 1,
2674  /* .condition = */ {},
2675  },
2676  {
2677  /* .name = */ "trigger",
2678  /* .docs = */ "Trigger ID number.",
2679  /* .type = */ {Type::U8, nullptr},
2680  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::trigger>,
2681  /* .attributes = */ {true, false, false, false, false},
2682  /* .count = */ 1,
2683  /* .condition = */ {},
2684  },
2685  {
2686  /* .name = */ "type",
2687  /* .docs = */ "Type of action to configure.",
2689  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Type, &type::type>,
2690  /* .attributes = */ {true, false, false, false, false},
2691  /* .count = */ 1,
2692  /* .condition = */ {},
2693  },
2694  {
2695  /* .name = */ "parameters",
2696  /* .docs = */ "",
2698  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Parameters, &type::parameters>,
2699  /* .attributes = */ {true, false, false, false, false},
2700  /* .count = */ 1,
2701  /* .condition = */ {},
2702  },
2703  };
2704 
2705  static constexpr inline FieldInfo value = {
2706  /* .name = */ "commands_3dm::EventAction::Response",
2707  /* .title = */ "response",
2708  /* .docs = */ "",
2709  /* .parameters = */ parameters,
2710  /* .descriptor = */ type::DESCRIPTOR,
2711  /* .functions = */ NO_FUNCTIONS,
2712  /* .response = */ nullptr,
2713  };
2714 };
2715 
2716 template<>
2717 struct MetadataFor<commands_3dm::EventAction>
2718 {
2720 
2721  static constexpr inline ParameterInfo parameters[] = {
2722  FUNCTION_SELECTOR_PARAM,
2723  {
2724  /* .name = */ "instance",
2725  /* .docs = */ "Action number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2726  /* .type = */ {Type::U8, nullptr},
2727  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2728  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2729  /* .count = */ 1,
2730  /* .condition = */ {},
2731  },
2732  {
2733  /* .name = */ "trigger",
2734  /* .docs = */ "Trigger ID number.",
2735  /* .type = */ {Type::U8, nullptr},
2736  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::trigger>,
2737  /* .attributes = */ {true, false, false, false, false},
2738  /* .count = */ 1,
2739  /* .condition = */ {},
2740  },
2741  {
2742  /* .name = */ "type",
2743  /* .docs = */ "Type of action to configure.",
2745  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Type, &type::type>,
2746  /* .attributes = */ {true, false, false, false, false},
2747  /* .count = */ 1,
2748  /* .condition = */ {},
2749  },
2750  {
2751  /* .name = */ "parameters",
2752  /* .docs = */ "",
2754  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Parameters, &type::parameters>,
2755  /* .attributes = */ {true, false, false, false, false},
2756  /* .count = */ 1,
2757  /* .condition = */ {},
2758  },
2759  };
2760 
2761  static constexpr inline FieldInfo value = {
2762  /* .name = */ "commands_3dm::EventAction",
2763  /* .title = */ "Event Action Configuration",
2764  /* .docs = */ "Configures various types of event actions.",
2765  /* .parameters = */ parameters,
2766  /* .descriptor = */ type::DESCRIPTOR,
2767  /* .functions = */ {true, true, true, true, true},
2768  /* .response = */ &MetadataFor<type::Response>::value,
2769  };
2770 };
2771 
2772 template<>
2773 struct MetadataFor<commands_3dm::DeviceSettings>
2774 {
2776 
2777  static constexpr inline ParameterInfo parameters[] = {
2778  FUNCTION_SELECTOR_PARAM,
2779 
2780  };
2781 
2782  static constexpr inline FieldInfo value = {
2783  /* .name = */ "commands_3dm::DeviceSettings",
2784  /* .title = */ "Device Start Up Settings",
2785  /* .docs = */ "Save, Load, or Reset to Default the values for all device settings.\n\nWhen a save current settings command is issued, a brief data disturbance may occur while all settings are written to non-volatile memory.\n\nThis command should have a long timeout as it may take up to 1 second to complete.",
2786  /* .parameters = */ parameters,
2787  /* .descriptor = */ type::DESCRIPTOR,
2788  /* .functions = */ {false, false, true, true, true},
2789  /* .response = */ nullptr,
2790  };
2791 };
2792 
2793 template<>
2794 struct MetadataFor<commands_3dm::Sensor2VehicleTransformEuler::Response>
2795 {
2797 
2798  static constexpr inline ParameterInfo parameters[] = {
2799  {
2800  /* .name = */ "roll",
2801  /* .docs = */ "[radians]",
2802  /* .type = */ {Type::FLOAT, nullptr},
2803  /* .accessor = */ nullptr, //utils::access<type, float, &type::roll>,
2804  /* .attributes = */ {true, false, false, false, false},
2805  /* .count = */ 1,
2806  /* .condition = */ {},
2807  },
2808  {
2809  /* .name = */ "pitch",
2810  /* .docs = */ "[radians]",
2811  /* .type = */ {Type::FLOAT, nullptr},
2812  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch>,
2813  /* .attributes = */ {true, false, false, false, false},
2814  /* .count = */ 1,
2815  /* .condition = */ {},
2816  },
2817  {
2818  /* .name = */ "yaw",
2819  /* .docs = */ "[radians]",
2820  /* .type = */ {Type::FLOAT, nullptr},
2821  /* .accessor = */ nullptr, //utils::access<type, float, &type::yaw>,
2822  /* .attributes = */ {true, false, false, false, false},
2823  /* .count = */ 1,
2824  /* .condition = */ {},
2825  },
2826  };
2827 
2828  static constexpr inline FieldInfo value = {
2829  /* .name = */ "commands_3dm::Sensor2VehicleTransformEuler::Response",
2830  /* .title = */ "response",
2831  /* .docs = */ "",
2832  /* .parameters = */ parameters,
2833  /* .descriptor = */ type::DESCRIPTOR,
2834  /* .functions = */ NO_FUNCTIONS,
2835  /* .response = */ nullptr,
2836  };
2837 };
2838 
2839 template<>
2840 struct MetadataFor<commands_3dm::Sensor2VehicleTransformEuler>
2841 {
2843 
2844  static constexpr inline ParameterInfo parameters[] = {
2845  FUNCTION_SELECTOR_PARAM,
2846  {
2847  /* .name = */ "roll",
2848  /* .docs = */ "[radians]",
2849  /* .type = */ {Type::FLOAT, nullptr},
2850  /* .accessor = */ nullptr, //utils::access<type, float, &type::roll>,
2851  /* .attributes = */ {true, false, false, false, false},
2852  /* .count = */ 1,
2853  /* .condition = */ {},
2854  },
2855  {
2856  /* .name = */ "pitch",
2857  /* .docs = */ "[radians]",
2858  /* .type = */ {Type::FLOAT, nullptr},
2859  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch>,
2860  /* .attributes = */ {true, false, false, false, false},
2861  /* .count = */ 1,
2862  /* .condition = */ {},
2863  },
2864  {
2865  /* .name = */ "yaw",
2866  /* .docs = */ "[radians]",
2867  /* .type = */ {Type::FLOAT, nullptr},
2868  /* .accessor = */ nullptr, //utils::access<type, float, &type::yaw>,
2869  /* .attributes = */ {true, false, false, false, false},
2870  /* .count = */ 1,
2871  /* .condition = */ {},
2872  },
2873  };
2874 
2875  static constexpr inline FieldInfo value = {
2876  /* .name = */ "commands_3dm::Sensor2VehicleTransformEuler",
2877  /* .title = */ "Sensor-to-Vehicle Frame Transformation Euler",
2878  /* .docs = */ "Sets the sensor-to-vehicle frame transformation using Yaw, Pitch, and Roll Euler angles.\n\nThese are the Yaw, Pitch, and Roll mounting angles of the sensor with respect to vehicle frame of reference,\nand describe the transformation of vectors from the sensor body frame to the vehicle frame.<br/>\n\nNote: This is the transformation, the inverse of the rotation defined in our legacy products.<br/>\n\nThe transformation may be stored in the device as a matrix or quaternion. When Euler angles are read back from the device, they may not\nbe exactly equal to the Euler angles used to set the transformation, but they are functionally equivalent, such that they result in the same transformation.<br/>\n<br/><br/>\nThis transformation to the vehicle frame will be applied to the following output quantities:<br/><br/>\nIMU:<br/>\nScaled Acceleration<br/>\nScaled Gyro<br/>\nScaled Magnetometer<br/>\nDelta Theta<br/>\nDelta Velocity<br/>\nComplementary Filter Orientation<br/>\n<br/><br/>\nEstimation Filter:<br/>\nEstimated Orientation, Quaternion<br/>\nEstimated Orientation, Matrix<br/>\nEstimated Orientation, Euler Angles<br/>\nEstimated Linear Acceleration<br/>\nEstimated Angular Rate<br/>\nEstimated Gravity Vector<br/>\n<br/>\nChanging this setting will force all low-pass filters, the complementary filter, and the estimation filter to reset.",
2879  /* .parameters = */ parameters,
2880  /* .descriptor = */ type::DESCRIPTOR,
2881  /* .functions = */ {true, true, true, true, true},
2882  /* .response = */ &MetadataFor<type::Response>::value,
2883  };
2884 };
2885 
2886 template<>
2887 struct MetadataFor<commands_3dm::Sensor2VehicleTransformQuaternion::Response>
2888 {
2890 
2891  static constexpr inline ParameterInfo parameters[] = {
2892  {
2893  /* .name = */ "q",
2894  /* .docs = */ "Unit length quaternion representing transform [w, i, j, k]",
2895  /* .type = */ {Type::STRUCT, &MetadataFor<Quatf>::value},
2896  /* .accessor = */ nullptr, //utils::access<type, Quatf, &type::q>,
2897  /* .attributes = */ {true, false, false, false, false},
2898  /* .count = */ 1,
2899  /* .condition = */ {},
2900  },
2901  };
2902 
2903  static constexpr inline FieldInfo value = {
2904  /* .name = */ "commands_3dm::Sensor2VehicleTransformQuaternion::Response",
2905  /* .title = */ "response",
2906  /* .docs = */ "",
2907  /* .parameters = */ parameters,
2908  /* .descriptor = */ type::DESCRIPTOR,
2909  /* .functions = */ NO_FUNCTIONS,
2910  /* .response = */ nullptr,
2911  };
2912 };
2913 
2914 template<>
2915 struct MetadataFor<commands_3dm::Sensor2VehicleTransformQuaternion>
2916 {
2918 
2919  static constexpr inline ParameterInfo parameters[] = {
2920  FUNCTION_SELECTOR_PARAM,
2921  {
2922  /* .name = */ "q",
2923  /* .docs = */ "Unit length quaternion representing transform [w, i, j, k]",
2924  /* .type = */ {Type::STRUCT, &MetadataFor<Quatf>::value},
2925  /* .accessor = */ nullptr, //utils::access<type, Quatf, &type::q>,
2926  /* .attributes = */ {true, false, false, false, false},
2927  /* .count = */ 1,
2928  /* .condition = */ {},
2929  },
2930  };
2931 
2932  static constexpr inline FieldInfo value = {
2933  /* .name = */ "commands_3dm::Sensor2VehicleTransformQuaternion",
2934  /* .title = */ "Sensor-to-Vehicle Frame Transformation Quaternion",
2935  /* .docs = */ "Set the sensor-to-vehicle frame transformation using unit length quaternion.\n\nNote: This is the transformation, the inverse of the rotation.\n\nThis quaternion describes the transformation of vectors from the sensor body frame to the vehicle frame of reference, and satisfies the following relationship:<br/>\n\nEQSTART p^{veh} = q^{-1} p^{sen} q EQEND<br/>\n\nWhere:<br/>\nEQSTART q = (q_w, q_x, q_y, q_z) EQEND is the quaternion describing the transformation. <br/>\nEQSTART p^{sen} = (0, v^{sen}_x, v^{sen}_y, v^{sen}_z) EQEND and EQSTART v^{sen} EQEND is a 3-element vector expressed in the sensor body frame.<br/>\nEQSTART p^{veh} = (0, v^{veh}_x, v^{veh}_y, v^{veh}_z) EQEND and EQSTART v^{veh} EQEND is a 3-element vector expressed in the vehicle frame.<br/>\n\nThe transformation may be stored in the device as a matrix or a quaternion. When the quaternion is read back from the device, it may not\nbe exactly equal to the quaternion used to set the transformation, but it is functionally equivalent.<br/>\n<br/><br/>\nThis transformation affects the following output quantities:<br/><br/>\nIMU:<br/>\nScaled Acceleration<br/>\nScaled Gyro<br/>\nScaled Magnetometer<br/>\nDelta Theta<br/>\nDelta Velocity<br/>\n<br/><br/>\nEstimation Filter:<br/>\nEstimated Orientation, Quaternion<br/>\nEstimated Orientation, Matrix<br/>\nEstimated Orientation, Euler Angles<br/>\nEstimated Linear Acceleration<br/>\nEstimated Angular Rate<br/>\nEstimated Gravity Vector<br/>\n<br/>\nChanging this setting will force all low-pass filters, the complementary filter, and the estimation filter to reset.",
2936  /* .parameters = */ parameters,
2937  /* .descriptor = */ type::DESCRIPTOR,
2938  /* .functions = */ {true, true, true, true, true},
2939  /* .response = */ &MetadataFor<type::Response>::value,
2940  };
2941 };
2942 
2943 template<>
2944 struct MetadataFor<commands_3dm::Sensor2VehicleTransformDcm::Response>
2945 {
2947 
2948  static constexpr inline ParameterInfo parameters[] = {
2949  {
2950  /* .name = */ "dcm",
2951  /* .docs = */ "3 x 3 direction cosine matrix, stored in row-major order",
2952  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
2953  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::dcm>,
2954  /* .attributes = */ {true, false, false, false, false},
2955  /* .count = */ 1,
2956  /* .condition = */ {},
2957  },
2958  };
2959 
2960  static constexpr inline FieldInfo value = {
2961  /* .name = */ "commands_3dm::Sensor2VehicleTransformDcm::Response",
2962  /* .title = */ "response",
2963  /* .docs = */ "",
2964  /* .parameters = */ parameters,
2965  /* .descriptor = */ type::DESCRIPTOR,
2966  /* .functions = */ NO_FUNCTIONS,
2967  /* .response = */ nullptr,
2968  };
2969 };
2970 
2971 template<>
2972 struct MetadataFor<commands_3dm::Sensor2VehicleTransformDcm>
2973 {
2975 
2976  static constexpr inline ParameterInfo parameters[] = {
2977  FUNCTION_SELECTOR_PARAM,
2978  {
2979  /* .name = */ "dcm",
2980  /* .docs = */ "3 x 3 direction cosine matrix, stored in row-major order",
2981  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
2982  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::dcm>,
2983  /* .attributes = */ {true, false, false, false, false},
2984  /* .count = */ 1,
2985  /* .condition = */ {},
2986  },
2987  };
2988 
2989  static constexpr inline FieldInfo value = {
2990  /* .name = */ "commands_3dm::Sensor2VehicleTransformDcm",
2991  /* .title = */ "Sensor-to-Vehicle Frame Transformation Direction Cosine Matrix",
2992  /* .docs = */ "Set the sensor to vehicle frame transformation using a using a 3 x 3 direction cosine matrix EQSTART M_{ned}^{veh} EQEND, stored in row-major order in a 9-element array.\n\nThese angles define the transformation of vectors from the sensor body frame to the fixed vehicle frame, according to:<br/>\nEQSTART v^{veh} = M_{sen}^{veh} v^{sen} EQEND<br/>\n\nWhere:<br/>\n\nEQSTART v^{sen} EQEND is a 3-element vector expressed in the sensor body frame. <br/>\nEQSTART v^{veh} EQEND is the same 3-element vector expressed in the vehicle frame. <br/>\n<br/>\nThe matrix elements are stored is row-major order: EQSTART M_{sen}^{veh} = \\begin{bmatrix} M_{11}, M_{12}, M_{13}, M_{21}, M_{22}, M_{23}, M_{31}, M_{32}, M_{33} \\end{bmatrix} EQEND\n\nThe transformation may be stored in the device as a matrix or a quaternion. When EQSTART M_{sen}^{veh} EQEND is read back from the device, it may not\nbe exactly equal to array used to set the transformation, but it is functionally equivalent.<br/>\n<br/><br/>\nThis transformation affects the following output quantities:<br/><br/>\nIMU:<br/>\nScaled Acceleration<br/>\nScaled Gyro<br/>\nScaled Magnetometer<br/>\nDelta Theta<br/>\nDelta Velocity<br/>\n<br/><br/>\nEstimation Filter:<br/>\nEstimated Orientation, Quaternion<br/>\nEstimated Orientation, Matrix<br/>\nEstimated Orientation, Euler Angles<br/>\nEstimated Linear Acceleration<br/>\nEstimated Angular Rate<br/>\nEstimated Gravity Vector<br/>\n<br/>\nChanging this setting will force all low-pass filters, the complementary filter, and the estimation filter to reset.",
2993  /* .parameters = */ parameters,
2994  /* .descriptor = */ type::DESCRIPTOR,
2995  /* .functions = */ {true, true, true, true, true},
2996  /* .response = */ &MetadataFor<type::Response>::value,
2997  };
2998 };
2999 
3000 template<>
3001 struct MetadataFor<commands_3dm::AccelBias::Response>
3002 {
3004 
3005  static constexpr inline ParameterInfo parameters[] = {
3006  {
3007  /* .name = */ "bias",
3008  /* .docs = */ "accelerometer bias in the sensor frame (x,y,z) [g]",
3009  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3010  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3011  /* .attributes = */ {true, false, false, false, false},
3012  /* .count = */ 1,
3013  /* .condition = */ {},
3014  },
3015  };
3016 
3017  static constexpr inline FieldInfo value = {
3018  /* .name = */ "commands_3dm::AccelBias::Response",
3019  /* .title = */ "response",
3020  /* .docs = */ "",
3021  /* .parameters = */ parameters,
3022  /* .descriptor = */ type::DESCRIPTOR,
3023  /* .functions = */ NO_FUNCTIONS,
3024  /* .response = */ nullptr,
3025  };
3026 };
3027 
3028 template<>
3029 struct MetadataFor<commands_3dm::AccelBias>
3030 {
3032 
3033  static constexpr inline ParameterInfo parameters[] = {
3034  FUNCTION_SELECTOR_PARAM,
3035  {
3036  /* .name = */ "bias",
3037  /* .docs = */ "accelerometer bias in the sensor frame (x,y,z) [g]",
3038  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3039  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3040  /* .attributes = */ {true, false, false, false, false},
3041  /* .count = */ 1,
3042  /* .condition = */ {},
3043  },
3044  };
3045 
3046  static constexpr inline FieldInfo value = {
3047  /* .name = */ "commands_3dm::AccelBias",
3048  /* .title = */ "Accelerometer Bias Configuration",
3049  /* .docs = */ "Configures the user specified accelerometer bias\n\nThe user specified bias is subtracted from the calibrated accelerometer output. Value is input in the sensor frame.",
3050  /* .parameters = */ parameters,
3051  /* .descriptor = */ type::DESCRIPTOR,
3052  /* .functions = */ {true, true, true, true, true},
3053  /* .response = */ &MetadataFor<type::Response>::value,
3054  };
3055 };
3056 
3057 template<>
3058 struct MetadataFor<commands_3dm::GyroBias::Response>
3059 {
3061 
3062  static constexpr inline ParameterInfo parameters[] = {
3063  {
3064  /* .name = */ "bias",
3065  /* .docs = */ "gyro bias in the sensor frame (x,y,z) [radians/second]",
3066  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3067  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3068  /* .attributes = */ {true, false, false, false, false},
3069  /* .count = */ 1,
3070  /* .condition = */ {},
3071  },
3072  };
3073 
3074  static constexpr inline FieldInfo value = {
3075  /* .name = */ "commands_3dm::GyroBias::Response",
3076  /* .title = */ "response",
3077  /* .docs = */ "",
3078  /* .parameters = */ parameters,
3079  /* .descriptor = */ type::DESCRIPTOR,
3080  /* .functions = */ NO_FUNCTIONS,
3081  /* .response = */ nullptr,
3082  };
3083 };
3084 
3085 template<>
3086 struct MetadataFor<commands_3dm::GyroBias>
3087 {
3089 
3090  static constexpr inline ParameterInfo parameters[] = {
3091  FUNCTION_SELECTOR_PARAM,
3092  {
3093  /* .name = */ "bias",
3094  /* .docs = */ "gyro bias in the sensor frame (x,y,z) [radians/second]",
3095  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3096  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3097  /* .attributes = */ {true, false, false, false, false},
3098  /* .count = */ 1,
3099  /* .condition = */ {},
3100  },
3101  };
3102 
3103  static constexpr inline FieldInfo value = {
3104  /* .name = */ "commands_3dm::GyroBias",
3105  /* .title = */ "Gyroscope Bias Configuration",
3106  /* .docs = */ "Configures the user specified gyroscope bias\n\nThe user specified bias is subtracted from the calibrated angular rate output. Value is input in the sensor frame.",
3107  /* .parameters = */ parameters,
3108  /* .descriptor = */ type::DESCRIPTOR,
3109  /* .functions = */ {true, true, true, true, true},
3110  /* .response = */ &MetadataFor<type::Response>::value,
3111  };
3112 };
3113 
3114 template<>
3115 struct MetadataFor<commands_3dm::CaptureGyroBias::Response>
3116 {
3118 
3119  static constexpr inline ParameterInfo parameters[] = {
3120  {
3121  /* .name = */ "bias",
3122  /* .docs = */ "gyro bias in the sensor frame (x,y,z) [radians/second]",
3123  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3124  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3125  /* .attributes = */ {true, false, false, false, false},
3126  /* .count = */ 1,
3127  /* .condition = */ {},
3128  },
3129  };
3130 
3131  static constexpr inline FieldInfo value = {
3132  /* .name = */ "commands_3dm::CaptureGyroBias::Response",
3133  /* .title = */ "response",
3134  /* .docs = */ "",
3135  /* .parameters = */ parameters,
3136  /* .descriptor = */ type::DESCRIPTOR,
3137  /* .functions = */ NO_FUNCTIONS,
3138  /* .response = */ nullptr,
3139  };
3140 };
3141 
3142 template<>
3143 struct MetadataFor<commands_3dm::CaptureGyroBias>
3144 {
3146 
3147  static constexpr inline ParameterInfo parameters[] = {
3148  {
3149  /* .name = */ "averaging_time_ms",
3150  /* .docs = */ "Averaging time [milliseconds]",
3151  /* .type = */ {Type::U16, nullptr},
3152  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::averaging_time_ms>,
3153  /* .attributes = */ {true, false, false, false, false},
3154  /* .count = */ 1,
3155  /* .condition = */ {},
3156  },
3157  };
3158 
3159  static constexpr inline FieldInfo value = {
3160  /* .name = */ "commands_3dm::CaptureGyroBias",
3161  /* .title = */ "Capture Gyroscope Bias",
3162  /* .docs = */ "Samples gyro for a specified time range and writes the averaged result to the Gyro Bias vector in RAM\n\nThe device will average the gyro output for the duration of 'averaging_time_ms.' To store the resulting vector\nin non-volatile memory, use the Set Gyro Bias command.\nIMPORTANT: The device must be stationary and experiencing minimum vibration for the duration of 'averaging_time_ms'\nAveraging Time range: 1000 to 30,000",
3163  /* .parameters = */ parameters,
3164  /* .descriptor = */ type::DESCRIPTOR,
3165  /* .functions = */ NO_FUNCTIONS,
3166  /* .response = */ &MetadataFor<type::Response>::value,
3167  };
3168 };
3169 
3170 template<>
3171 struct MetadataFor<commands_3dm::MagHardIronOffset::Response>
3172 {
3174 
3175  static constexpr inline ParameterInfo parameters[] = {
3176  {
3177  /* .name = */ "offset",
3178  /* .docs = */ "hard iron offset in the sensor frame (x,y,z) [Gauss]",
3179  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3180  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::offset>,
3181  /* .attributes = */ {true, false, false, false, false},
3182  /* .count = */ 1,
3183  /* .condition = */ {},
3184  },
3185  };
3186 
3187  static constexpr inline FieldInfo value = {
3188  /* .name = */ "commands_3dm::MagHardIronOffset::Response",
3189  /* .title = */ "response",
3190  /* .docs = */ "",
3191  /* .parameters = */ parameters,
3192  /* .descriptor = */ type::DESCRIPTOR,
3193  /* .functions = */ NO_FUNCTIONS,
3194  /* .response = */ nullptr,
3195  };
3196 };
3197 
3198 template<>
3199 struct MetadataFor<commands_3dm::MagHardIronOffset>
3200 {
3202 
3203  static constexpr inline ParameterInfo parameters[] = {
3204  FUNCTION_SELECTOR_PARAM,
3205  {
3206  /* .name = */ "offset",
3207  /* .docs = */ "hard iron offset in the sensor frame (x,y,z) [Gauss]",
3208  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3209  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::offset>,
3210  /* .attributes = */ {true, false, false, false, false},
3211  /* .count = */ 1,
3212  /* .condition = */ {},
3213  },
3214  };
3215 
3216  static constexpr inline FieldInfo value = {
3217  /* .name = */ "commands_3dm::MagHardIronOffset",
3218  /* .title = */ "Magnetometer Hard Iron Offset",
3219  /* .docs = */ "Configure the user specified magnetometer hard iron offset vector\n\nThe values for this offset are determined empirically by external software algorithms\nbased on calibration data taken after the device is installed in its application. These values\ncan be obtained and set by using Microstrain software tools.\nAlternatively, on some systems, the auto-mag calibration feature may be used to capture these values in-run.\nThe offset is applied to the scaled magnetometer vector prior to output.",
3220  /* .parameters = */ parameters,
3221  /* .descriptor = */ type::DESCRIPTOR,
3222  /* .functions = */ {true, true, true, true, true},
3223  /* .response = */ &MetadataFor<type::Response>::value,
3224  };
3225 };
3226 
3227 template<>
3228 struct MetadataFor<commands_3dm::MagSoftIronMatrix::Response>
3229 {
3231 
3232  static constexpr inline ParameterInfo parameters[] = {
3233  {
3234  /* .name = */ "offset",
3235  /* .docs = */ "soft iron matrix [dimensionless]",
3236  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
3237  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::offset>,
3238  /* .attributes = */ {true, false, false, false, false},
3239  /* .count = */ 1,
3240  /* .condition = */ {},
3241  },
3242  };
3243 
3244  static constexpr inline FieldInfo value = {
3245  /* .name = */ "commands_3dm::MagSoftIronMatrix::Response",
3246  /* .title = */ "response",
3247  /* .docs = */ "",
3248  /* .parameters = */ parameters,
3249  /* .descriptor = */ type::DESCRIPTOR,
3250  /* .functions = */ NO_FUNCTIONS,
3251  /* .response = */ nullptr,
3252  };
3253 };
3254 
3255 template<>
3256 struct MetadataFor<commands_3dm::MagSoftIronMatrix>
3257 {
3259 
3260  static constexpr inline ParameterInfo parameters[] = {
3261  FUNCTION_SELECTOR_PARAM,
3262  {
3263  /* .name = */ "offset",
3264  /* .docs = */ "soft iron matrix [dimensionless]",
3265  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
3266  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::offset>,
3267  /* .attributes = */ {true, false, false, false, false},
3268  /* .count = */ 1,
3269  /* .condition = */ {},
3270  },
3271  };
3272 
3273  static constexpr inline FieldInfo value = {
3274  /* .name = */ "commands_3dm::MagSoftIronMatrix",
3275  /* .title = */ "Magnetometer Soft Iron Matrix",
3276  /* .docs = */ "Configure the user specified magnetometer soft iron offset matrix\n\nThe values for this matrix are determined empirically by external software algorithms\nbased on calibration data taken after the device is installed in its application. These values\ncan be obtained and set by using Microstrain software tools.\nAlternatively, on some systems, the auto-mag calibration feature may be used to capture these values in-run.\nThe matrix is applied to the scaled magnetometer vector prior to output.\n\nThe matrix is in row major order:\nEQSTART M = \\begin{bmatrix} 0 &amp; 1 &amp; 2 \\\\ 3 &amp; 4 &amp; 5 \\\\ 6 &amp; 7 &amp; 8 \\end{bmatrix} EQEND",
3277  /* .parameters = */ parameters,
3278  /* .descriptor = */ type::DESCRIPTOR,
3279  /* .functions = */ {true, true, true, true, true},
3280  /* .response = */ &MetadataFor<type::Response>::value,
3281  };
3282 };
3283 
3284 template<>
3285 struct MetadataFor<commands_3dm::ConingScullingEnable::Response>
3286 {
3288 
3289  static constexpr inline ParameterInfo parameters[] = {
3290  {
3291  /* .name = */ "enable",
3292  /* .docs = */ "If true, coning and sculling compensation is enabled.",
3293  /* .type = */ {Type::BOOL, nullptr},
3294  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3295  /* .attributes = */ {true, false, false, false, false},
3296  /* .count = */ 1,
3297  /* .condition = */ {},
3298  },
3299  };
3300 
3301  static constexpr inline FieldInfo value = {
3302  /* .name = */ "commands_3dm::ConingScullingEnable::Response",
3303  /* .title = */ "response",
3304  /* .docs = */ "",
3305  /* .parameters = */ parameters,
3306  /* .descriptor = */ type::DESCRIPTOR,
3307  /* .functions = */ NO_FUNCTIONS,
3308  /* .response = */ nullptr,
3309  };
3310 };
3311 
3312 template<>
3313 struct MetadataFor<commands_3dm::ConingScullingEnable>
3314 {
3316 
3317  static constexpr inline ParameterInfo parameters[] = {
3318  FUNCTION_SELECTOR_PARAM,
3319  {
3320  /* .name = */ "enable",
3321  /* .docs = */ "If true, coning and sculling compensation is enabled.",
3322  /* .type = */ {Type::BOOL, nullptr},
3323  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3324  /* .attributes = */ {true, false, false, false, false},
3325  /* .count = */ 1,
3326  /* .condition = */ {},
3327  },
3328  };
3329 
3330  static constexpr inline FieldInfo value = {
3331  /* .name = */ "commands_3dm::ConingScullingEnable",
3332  /* .title = */ "Coning and Sculling Enable",
3333  /* .docs = */ "Controls the Coning and Sculling Compenstation setting.",
3334  /* .parameters = */ parameters,
3335  /* .descriptor = */ type::DESCRIPTOR,
3336  /* .functions = */ {true, true, true, true, true},
3337  /* .response = */ &MetadataFor<type::Response>::value,
3338  };
3339 };
3340 
3341 template<>
3342 struct MetadataFor<commands_3dm::UartBaudrate::Response>
3343 {
3345 
3346  static constexpr inline ParameterInfo parameters[] = {
3347  {
3348  /* .name = */ "baud",
3349  /* .docs = */ "",
3350  /* .type = */ {Type::U32, nullptr},
3351  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::baud>,
3352  /* .attributes = */ {true, false, false, false, false},
3353  /* .count = */ 1,
3354  /* .condition = */ {},
3355  },
3356  };
3357 
3358  static constexpr inline FieldInfo value = {
3359  /* .name = */ "commands_3dm::UartBaudrate::Response",
3360  /* .title = */ "response",
3361  /* .docs = */ "",
3362  /* .parameters = */ parameters,
3363  /* .descriptor = */ type::DESCRIPTOR,
3364  /* .functions = */ NO_FUNCTIONS,
3365  /* .response = */ nullptr,
3366  };
3367 };
3368 
3369 template<>
3370 struct MetadataFor<commands_3dm::UartBaudrate>
3371 {
3373 
3374  static constexpr inline ParameterInfo parameters[] = {
3375  FUNCTION_SELECTOR_PARAM,
3376  {
3377  /* .name = */ "baud",
3378  /* .docs = */ "",
3379  /* .type = */ {Type::U32, nullptr},
3380  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::baud>,
3381  /* .attributes = */ {true, false, false, false, false},
3382  /* .count = */ 1,
3383  /* .condition = */ {},
3384  },
3385  };
3386 
3387  static constexpr inline FieldInfo value = {
3388  /* .name = */ "commands_3dm::UartBaudrate",
3389  /* .title = */ "UART Baudrate",
3390  /* .docs = */ "Read, Save, Load, or Reset to Default the baud rate of the main communication channel.\n\nFor all functions except 0x01 (use new settings), the new baud rate value is ignored.\nPlease see the device user manual for supported baud rates.\n\nThe device will wait until all incoming and outgoing data has been sent, up\nto a maximum of 250 ms, before applying any change.\n\nNo guarantee is provided as to what happens to commands issued during this\ndelay period; They may or may not be processed and any responses aren't\nguaranteed to be at one rate or the other. The same applies to data packets.\n\nIt is highly recommended that the device be idle before issuing this command\nand that it be issued in its own packet. Users should wait 250 ms after\nsending this command before further interaction.",
3391  /* .parameters = */ parameters,
3392  /* .descriptor = */ type::DESCRIPTOR,
3393  /* .functions = */ {true, true, true, true, true},
3394  /* .response = */ &MetadataFor<type::Response>::value,
3395  };
3396 };
3397 
3398 template<>
3399 struct MetadataFor<commands_3dm::GpioConfig::Feature>
3400 {
3402 
3403  static constexpr inline EnumInfo::Entry entries[] = {
3404  { uint32_t(0), "UNUSED", "The pin is not used. It may be technically possible to read the pin state in this mode, but this is not guaranteed to be true of all devices or pins." },
3405  { uint32_t(1), "GPIO", "General purpose input or output. Use this for direct control of pin output state or to stream the state of the pin." },
3406  { uint32_t(2), "PPS", "Pulse per second input or output." },
3407  { uint32_t(3), "ENCODER", "Motor encoder/odometer input." },
3408  { uint32_t(4), "TIMESTAMP", "Precision Timestamping. Use with Event Trigger Configuration (0x0C,0x2E)." },
3409  { uint32_t(5), "UART", "UART data or control lines." },
3410  };
3411 
3412  static constexpr inline EnumInfo value = {
3413  /* .name = */ "Feature",
3414  /* .docs = */ "",
3415  /* .type = */ Type::U8,
3416  /* .entries = */ entries,
3417  };
3418 
3419 };
3420 
3421 template<>
3422 struct MetadataFor<commands_3dm::GpioConfig::Behavior>
3423 {
3425 
3426  static constexpr inline EnumInfo::Entry entries[] = {
3427  { uint32_t(0), "UNUSED", "Use 0 unless otherwise specified." },
3428  { uint32_t(1), "GPIO_INPUT", "Pin will be an input. This can be used to stream or poll the value and is the default setting." },
3429  { uint32_t(2), "GPIO_OUTPUT_LOW", "Pin is an output initially in the LOW state. This state will be restored during system startup if the configuration is saved." },
3430  { uint32_t(3), "GPIO_OUTPUT_HIGH", "Pin is an output initially in the HIGH state. This state will be restored during system startup if the configuration is saved." },
3431  { uint32_t(1), "PPS_INPUT", "Pin will receive the pulse-per-second signal. Only one pin can have this behavior. This will only work if the PPS Source command is configured to GPIO." },
3432  { uint32_t(2), "PPS_OUTPUT", "Pin will transmit the pulse-per-second signal from the device." },
3433  { uint32_t(1), "ENCODER_A", "Encoder 'A' quadrature input. Only one pin can have this behavior. The last command to set this behavior will take precedence." },
3434  { uint32_t(2), "ENCODER_B", "Encoder 'B' quadrature input. Only one pin can have this behavior. The last command to set this behavior will take precedence." },
3435  { uint32_t(1), "TIMESTAMP_RISING", "Rising edges will be timestamped." },
3436  { uint32_t(2), "TIMESTAMP_FALLING", "Falling edges will be timestamped." },
3437  { uint32_t(3), "TIMESTAMP_EITHER", "Both rising and falling edges will be timestamped." },
3438  { uint32_t(33), "UART_PORT2_TX", "(0x21) UART port 2 transmit." },
3439  { uint32_t(34), "UART_PORT2_RX", "(0x22) UART port 2 receive." },
3440  { uint32_t(49), "UART_PORT3_TX", "(0x31) UART port 3 transmit." },
3441  { uint32_t(50), "UART_PORT3_RX", "(0x32) UART port 3 receive." },
3442  };
3443 
3444  static constexpr inline EnumInfo value = {
3445  /* .name = */ "Behavior",
3446  /* .docs = */ "",
3447  /* .type = */ Type::U8,
3448  /* .entries = */ entries,
3449  };
3450 
3451 };
3452 
3453 template<>
3454 struct MetadataFor<commands_3dm::GpioConfig::PinMode>
3455 {
3457 
3458  static constexpr inline BitfieldInfo::Entry entries[] = {
3459  { uint32_t(1), "open_drain", "The pin will be an open-drain output. The state will be either LOW or FLOATING instead of LOW or HIGH, respectively. This is used to connect multiple open-drain outputs from several devices. An internal or external pull-up resistor is typically used in combination. The maximum voltage of an open drain output is subject to the device maximum input voltage range found in the specifications." },
3460  { uint32_t(2), "pulldown", "The pin will have an internal pull-down resistor enabled. This is useful for connecting inputs to signals which can only be pulled high such as mechanical switches. Cannot be used in combination with pull-up. See the device specifications for the resistance value." },
3461  { uint32_t(4), "pullup", "The pin will have an internal pull-up resistor enabled. Useful for connecting inputs to signals which can only be pulled low such as mechanical switches, or in combination with an open drain output. Cannot be used in combination with pull-down. See the device specifications for the resistance value. Use of this mode may restrict the maximum allowed input voltage. See the device datasheet for details." },
3462  };
3463 
3464  static constexpr inline BitfieldInfo value = {
3465  /* .name = */ "PinMode",
3466  /* .docs = */ "",
3467  /* .type = */ Type::U8,
3468  /* .entries = */ entries,
3469  };
3470 
3471 };
3472 
3473 template<>
3474 struct MetadataFor<commands_3dm::GpioConfig::Response>
3475 {
3477 
3478  static constexpr inline ParameterInfo parameters[] = {
3479  {
3480  /* .name = */ "pin",
3481  /* .docs = */ "GPIO pin number counting from 1. For save, load, and default function selectors, this can be 0 to select all pins.",
3482  /* .type = */ {Type::U8, nullptr},
3483  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3484  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
3485  /* .count = */ 1,
3486  /* .condition = */ {},
3487  },
3488  {
3489  /* .name = */ "feature",
3490  /* .docs = */ "Determines how the pin will be used.",
3492  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Feature, &type::feature>,
3493  /* .attributes = */ {true, false, false, false, false},
3494  /* .count = */ 1,
3495  /* .condition = */ {},
3496  },
3497  {
3498  /* .name = */ "behavior",
3499  /* .docs = */ "Select an appropriate value from the enumeration based on the selected feature (e.g. for PPS, select one of the values prefixed with PPS_.)",
3501  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Behavior, &type::behavior>,
3502  /* .attributes = */ {true, false, false, false, false},
3503  /* .count = */ 1,
3504  /* .condition = */ {},
3505  },
3506  {
3507  /* .name = */ "pin_mode",
3508  /* .docs = */ "GPIO configuration. May be restricted depending on device, pin, feature, and behavior. See device user manual.",
3510  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::PinMode, &type::pin_mode>,
3511  /* .attributes = */ {true, false, false, false, false},
3512  /* .count = */ 1,
3513  /* .condition = */ {},
3514  },
3515  };
3516 
3517  static constexpr inline FieldInfo value = {
3518  /* .name = */ "commands_3dm::GpioConfig::Response",
3519  /* .title = */ "response",
3520  /* .docs = */ "",
3521  /* .parameters = */ parameters,
3522  /* .descriptor = */ type::DESCRIPTOR,
3523  /* .functions = */ NO_FUNCTIONS,
3524  /* .response = */ nullptr,
3525  };
3526 };
3527 
3528 template<>
3529 struct MetadataFor<commands_3dm::GpioConfig>
3530 {
3532 
3533  static constexpr inline ParameterInfo parameters[] = {
3534  FUNCTION_SELECTOR_PARAM,
3535  {
3536  /* .name = */ "pin",
3537  /* .docs = */ "GPIO pin number counting from 1. For save, load, and default function selectors, this can be 0 to select all pins.",
3538  /* .type = */ {Type::U8, nullptr},
3539  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3540  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
3541  /* .count = */ 1,
3542  /* .condition = */ {},
3543  },
3544  {
3545  /* .name = */ "feature",
3546  /* .docs = */ "Determines how the pin will be used.",
3548  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Feature, &type::feature>,
3549  /* .attributes = */ {true, false, false, false, false},
3550  /* .count = */ 1,
3551  /* .condition = */ {},
3552  },
3553  {
3554  /* .name = */ "behavior",
3555  /* .docs = */ "Select an appropriate value from the enumeration based on the selected feature (e.g. for PPS, select one of the values prefixed with PPS_.)",
3557  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Behavior, &type::behavior>,
3558  /* .attributes = */ {true, false, false, false, false},
3559  /* .count = */ 1,
3560  /* .condition = */ {},
3561  },
3562  {
3563  /* .name = */ "pin_mode",
3564  /* .docs = */ "GPIO configuration. May be restricted depending on device, pin, feature, and behavior. See device user manual.",
3566  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::PinMode, &type::pin_mode>,
3567  /* .attributes = */ {true, false, false, false, false},
3568  /* .count = */ 1,
3569  /* .condition = */ {},
3570  },
3571  };
3572 
3573  static constexpr inline FieldInfo value = {
3574  /* .name = */ "commands_3dm::GpioConfig",
3575  /* .title = */ "GPIO Configuration",
3576  /* .docs = */ "Configures the user GPIO pins on the connector for use with several built-in functions or for general input or output.\n\nGPIO pins are device-dependent. Some features are only available on\ncertain pins. Some behaviors require specific configurations.\nConsult the device user manual for restrictions and default settings.\n\nTo avoid glitches on GPIOs configured as an output in a mode other than\nGPIO, always configure the relevant function before setting up the pin\nwith this command. Otherwise, the pin state will be undefined between\nthis command and the one to set up the feature. For input pins, use\nthis command first so the state is well-defined when the feature is\ninitialized.\n\nSome configurations can only be active on one pin at a time. If such\nconfiguration is applied to a second pin, the second one will take\nprecedence and the original pin's configuration will be reset.\n",
3577  /* .parameters = */ parameters,
3578  /* .descriptor = */ type::DESCRIPTOR,
3579  /* .functions = */ {true, true, true, true, true},
3580  /* .response = */ &MetadataFor<type::Response>::value,
3581  };
3582 };
3583 
3584 template<>
3585 struct MetadataFor<commands_3dm::GpioState::Response>
3586 {
3588 
3589  static constexpr inline ParameterInfo parameters[] = {
3590  {
3591  /* .name = */ "pin",
3592  /* .docs = */ "GPIO pin number counting from 1. Cannot be 0.",
3593  /* .type = */ {Type::U8, nullptr},
3594  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3595  /* .attributes = */ {true, true, false, false, false, /*echo*/true},
3596  /* .count = */ 1,
3597  /* .condition = */ {},
3598  },
3599  {
3600  /* .name = */ "state",
3601  /* .docs = */ "The pin state.",
3602  /* .type = */ {Type::BOOL, nullptr},
3603  /* .accessor = */ nullptr, //utils::access<type, bool, &type::state>,
3604  /* .attributes = */ {true, false, false, false, false},
3605  /* .count = */ 1,
3606  /* .condition = */ {},
3607  },
3608  };
3609 
3610  static constexpr inline FieldInfo value = {
3611  /* .name = */ "commands_3dm::GpioState::Response",
3612  /* .title = */ "response",
3613  /* .docs = */ "",
3614  /* .parameters = */ parameters,
3615  /* .descriptor = */ type::DESCRIPTOR,
3616  /* .functions = */ NO_FUNCTIONS,
3617  /* .response = */ nullptr,
3618  };
3619 };
3620 
3621 template<>
3622 struct MetadataFor<commands_3dm::GpioState>
3623 {
3625 
3626  static constexpr inline ParameterInfo parameters[] = {
3627  FUNCTION_SELECTOR_PARAM,
3628  {
3629  /* .name = */ "pin",
3630  /* .docs = */ "GPIO pin number counting from 1. Cannot be 0.",
3631  /* .type = */ {Type::U8, nullptr},
3632  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3633  /* .attributes = */ {true, true, false, false, false, /*echo*/true},
3634  /* .count = */ 1,
3635  /* .condition = */ {},
3636  },
3637  {
3638  /* .name = */ "state",
3639  /* .docs = */ "The pin state.",
3640  /* .type = */ {Type::BOOL, nullptr},
3641  /* .accessor = */ nullptr, //utils::access<type, bool, &type::state>,
3642  /* .attributes = */ {true, false, false, false, false},
3643  /* .count = */ 1,
3644  /* .condition = */ {},
3645  },
3646  };
3647 
3648  static constexpr inline FieldInfo value = {
3649  /* .name = */ "commands_3dm::GpioState",
3650  /* .title = */ "GPIO State",
3651  /* .docs = */ "Allows the state of the pin to be read or controlled.\n\nThis command serves two purposes: 1) To allow reading the state of a pin via command,\nrather than polling a data quantity, and 2) to provide a way to set the output state\nwithout also having to specify the operating mode.\n\nThe state read back from the pin is the physical state of the pin, rather than a\nconfiguration value. The state can be read regardless of its configuration as long as\nthe device supports GPIO input on that pin. If the pin is set to an output, the read\nvalue would match the output value.\n\nWhile the state of a pin can always be set, it will only have an observable effect if\nthe pin is set to output mode.\n\nThis command does not support saving, loading, or resetting the state. Instead, use the\nGPIO Configuration command, which allows the initial state to be configured.",
3652  /* .parameters = */ parameters,
3653  /* .descriptor = */ type::DESCRIPTOR,
3654  /* .functions = */ {true, true, false, false, false},
3655  /* .response = */ &MetadataFor<type::Response>::value,
3656  };
3657 };
3658 
3659 template<>
3660 struct MetadataFor<commands_3dm::Odometer::Mode>
3661 {
3663 
3664  static constexpr inline EnumInfo::Entry entries[] = {
3665  { uint32_t(0), "DISABLED", "Encoder is disabled." },
3666  { uint32_t(2), "QUADRATURE", "Quadrature encoder mode." },
3667  };
3668 
3669  static constexpr inline EnumInfo value = {
3670  /* .name = */ "Mode",
3671  /* .docs = */ "",
3672  /* .type = */ Type::U8,
3673  /* .entries = */ entries,
3674  };
3675 
3676 };
3677 
3678 template<>
3679 struct MetadataFor<commands_3dm::Odometer::Response>
3680 {
3682 
3683  static constexpr inline ParameterInfo parameters[] = {
3684  {
3685  /* .name = */ "mode",
3686  /* .docs = */ "Mode setting.",
3688  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::Odometer::Mode, &type::mode>,
3689  /* .attributes = */ {true, false, false, false, false},
3690  /* .count = */ 1,
3691  /* .condition = */ {},
3692  },
3693  {
3694  /* .name = */ "scaling",
3695  /* .docs = */ "Encoder pulses per meter of distance traveled [pulses/m].\nDistance traveled is computed using the formula d = p / N * 2R * pi, where d is distance,\np is the number of pulses received, N is the encoder resolution, and R is the wheel radius.\nBy simplifying all of the parameters into one, the formula d = p / S is obtained, where s\nis the odometer scaling factor passed to this command. S is equivalent to N / (2R * pi) and\nhas units of pulses / meter. N is in units of 'A' pulses per revolution and R is in meters.\nMake this value negative if the odometer is mounted so that it rotates backwards.",
3696  /* .type = */ {Type::FLOAT, nullptr},
3697  /* .accessor = */ nullptr, //utils::access<type, float, &type::scaling>,
3698  /* .attributes = */ {true, false, false, false, false},
3699  /* .count = */ 1,
3700  /* .condition = */ {},
3701  },
3702  {
3703  /* .name = */ "uncertainty",
3704  /* .docs = */ "Uncertainty in encoder counts to distance translation (1-sigma value) [m/m].",
3705  /* .type = */ {Type::FLOAT, nullptr},
3706  /* .accessor = */ nullptr, //utils::access<type, float, &type::uncertainty>,
3707  /* .attributes = */ {true, false, false, false, false},
3708  /* .count = */ 1,
3709  /* .condition = */ {},
3710  },
3711  };
3712 
3713  static constexpr inline FieldInfo value = {
3714  /* .name = */ "commands_3dm::Odometer::Response",
3715  /* .title = */ "response",
3716  /* .docs = */ "",
3717  /* .parameters = */ parameters,
3718  /* .descriptor = */ type::DESCRIPTOR,
3719  /* .functions = */ NO_FUNCTIONS,
3720  /* .response = */ nullptr,
3721  };
3722 };
3723 
3724 template<>
3725 struct MetadataFor<commands_3dm::Odometer>
3726 {
3728 
3729  static constexpr inline ParameterInfo parameters[] = {
3730  FUNCTION_SELECTOR_PARAM,
3731  {
3732  /* .name = */ "mode",
3733  /* .docs = */ "Mode setting.",
3735  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::Odometer::Mode, &type::mode>,
3736  /* .attributes = */ {true, false, false, false, false},
3737  /* .count = */ 1,
3738  /* .condition = */ {},
3739  },
3740  {
3741  /* .name = */ "scaling",
3742  /* .docs = */ "Encoder pulses per meter of distance traveled [pulses/m].\nDistance traveled is computed using the formula d = p / N * 2R * pi, where d is distance,\np is the number of pulses received, N is the encoder resolution, and R is the wheel radius.\nBy simplifying all of the parameters into one, the formula d = p / S is obtained, where s\nis the odometer scaling factor passed to this command. S is equivalent to N / (2R * pi) and\nhas units of pulses / meter. N is in units of 'A' pulses per revolution and R is in meters.\nMake this value negative if the odometer is mounted so that it rotates backwards.",
3743  /* .type = */ {Type::FLOAT, nullptr},
3744  /* .accessor = */ nullptr, //utils::access<type, float, &type::scaling>,
3745  /* .attributes = */ {true, false, false, false, false},
3746  /* .count = */ 1,
3747  /* .condition = */ {},
3748  },
3749  {
3750  /* .name = */ "uncertainty",
3751  /* .docs = */ "Uncertainty in encoder counts to distance translation (1-sigma value) [m/m].",
3752  /* .type = */ {Type::FLOAT, nullptr},
3753  /* .accessor = */ nullptr, //utils::access<type, float, &type::uncertainty>,
3754  /* .attributes = */ {true, false, false, false, false},
3755  /* .count = */ 1,
3756  /* .condition = */ {},
3757  },
3758  };
3759 
3760  static constexpr inline FieldInfo value = {
3761  /* .name = */ "commands_3dm::Odometer",
3762  /* .title = */ "Odometer Configuration",
3763  /* .docs = */ "Configures the hardware odometer interface.",
3764  /* .parameters = */ parameters,
3765  /* .descriptor = */ type::DESCRIPTOR,
3766  /* .functions = */ {true, true, true, true, true},
3767  /* .response = */ &MetadataFor<type::Response>::value,
3768  };
3769 };
3770 
3771 template<>
3772 struct MetadataFor<commands_3dm::ImuLowpassFilter::Response>
3773 {
3775 
3776  static constexpr inline ParameterInfo parameters[] = {
3777  {
3778  /* .name = */ "target_descriptor",
3779  /* .docs = */ "",
3780  /* .type = */ {Type::U8, nullptr},
3781  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::target_descriptor>,
3782  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
3783  /* .count = */ 1,
3784  /* .condition = */ {},
3785  },
3786  {
3787  /* .name = */ "enable",
3788  /* .docs = */ "True if the filter is currently enabled.",
3789  /* .type = */ {Type::BOOL, nullptr},
3790  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3791  /* .attributes = */ {true, false, false, false, false},
3792  /* .count = */ 1,
3793  /* .condition = */ {},
3794  },
3795  {
3796  /* .name = */ "manual",
3797  /* .docs = */ "True if the filter cutoff was manually configured.",
3798  /* .type = */ {Type::BOOL, nullptr},
3799  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
3800  /* .attributes = */ {true, false, false, false, false},
3801  /* .count = */ 1,
3802  /* .condition = */ {},
3803  },
3804  {
3805  /* .name = */ "frequency",
3806  /* .docs = */ "The cutoff frequency of the filter. If the filter is in\nauto mode, this value is unspecified.",
3807  /* .type = */ {Type::U16, nullptr},
3808  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::frequency>,
3809  /* .attributes = */ {true, false, false, false, false},
3810  /* .count = */ 1,
3811  /* .condition = */ {},
3812  },
3813  {
3814  /* .name = */ "reserved",
3815  /* .docs = */ "Reserved and must be ignored.",
3816  /* .type = */ {Type::U8, nullptr},
3817  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
3818  /* .attributes = */ {true, false, false, false, false},
3819  /* .count = */ 1,
3820  /* .condition = */ {},
3821  },
3822  };
3823 
3824  static constexpr inline FieldInfo value = {
3825  /* .name = */ "commands_3dm::ImuLowpassFilter::Response",
3826  /* .title = */ "response",
3827  /* .docs = */ "",
3828  /* .parameters = */ parameters,
3829  /* .descriptor = */ type::DESCRIPTOR,
3830  /* .functions = */ NO_FUNCTIONS,
3831  /* .response = */ nullptr,
3832  };
3833 };
3834 
3835 template<>
3836 struct MetadataFor<commands_3dm::ImuLowpassFilter>
3837 {
3839 
3840  static constexpr inline ParameterInfo parameters[] = {
3841  FUNCTION_SELECTOR_PARAM,
3842  {
3843  /* .name = */ "target_descriptor",
3844  /* .docs = */ "Field descriptor of filtered quantity within the Sensor data set.\nSupported values are accel (0x04), gyro (0x05), mag (0x06), and\npressure (0x17), provided the data is supported by the device.\nExcept with the READ function selector, this can be 0 to apply to all of the above quantities.",
3845  /* .type = */ {Type::U8, nullptr},
3846  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::target_descriptor>,
3847  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
3848  /* .count = */ 1,
3849  /* .condition = */ {},
3850  },
3851  {
3852  /* .name = */ "enable",
3853  /* .docs = */ "The target data will be filtered if this is true.",
3854  /* .type = */ {Type::BOOL, nullptr},
3855  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3856  /* .attributes = */ {true, false, false, false, false},
3857  /* .count = */ 1,
3858  /* .condition = */ {},
3859  },
3860  {
3861  /* .name = */ "manual",
3862  /* .docs = */ "If false, the cutoff frequency is set to half of the\nstreaming rate as configured by the message format command.\nOtherwise, the cutoff frequency is set according to the\nfollowing 'frequency' parameter.",
3863  /* .type = */ {Type::BOOL, nullptr},
3864  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
3865  /* .attributes = */ {true, false, false, false, false},
3866  /* .count = */ 1,
3867  /* .condition = */ {},
3868  },
3869  {
3870  /* .name = */ "frequency",
3871  /* .docs = */ "-3dB cutoff frequency in Hz. Will not affect filtering if 'manual' is false.",
3872  /* .type = */ {Type::U16, nullptr},
3873  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::frequency>,
3874  /* .attributes = */ {true, false, false, false, false},
3875  /* .count = */ 1,
3876  /* .condition = */ {},
3877  },
3878  {
3879  /* .name = */ "reserved",
3880  /* .docs = */ "Reserved, set to 0x00.",
3881  /* .type = */ {Type::U8, nullptr},
3882  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
3883  /* .attributes = */ {true, false, false, false, false},
3884  /* .count = */ 1,
3885  /* .condition = */ {},
3886  },
3887  };
3888 
3889  static constexpr inline FieldInfo value = {
3890  /* .name = */ "commands_3dm::ImuLowpassFilter",
3891  /* .title = */ "Advanced Low-Pass Filter Settings",
3892  /* .docs = */ "Advanced configuration for the IMU data quantity low-pass filters.\n\nDeprecated, use the lowpass filter (0x0C,0x54) command instead.\n\nThe scaled data quantities are by default filtered through a single-pole IIR low-pass filter\nwhich is configured with a -3dB cutoff frequency of half the reporting frequency (set by\ndecimation factor in the IMU Message Format command) to prevent aliasing on a per data\nquantity basis. This advanced configuration command allows for the cutoff frequency to\nbe configured independently of the data reporting frequency as well as allowing for a\ncomplete bypass of the digital low-pass filter.\n\nPossible data descriptors:\n0x04 - Scaled accelerometer data\n0x05 - Scaled gyro data\n0x06 - Scaled magnetometer data (if applicable)\n0x17 - Scaled pressure data (if applicable)",
3893  /* .parameters = */ parameters,
3894  /* .descriptor = */ type::DESCRIPTOR,
3895  /* .functions = */ {true, true, true, true, true},
3896  /* .response = */ &MetadataFor<type::Response>::value,
3897  };
3898 };
3899 
3900 template<>
3901 struct MetadataFor<commands_3dm::ComplementaryFilter::Response>
3902 {
3904 
3905  static constexpr inline ParameterInfo parameters[] = {
3906  {
3907  /* .name = */ "pitch_roll_enable",
3908  /* .docs = */ "Enable Pitch/Roll corrections",
3909  /* .type = */ {Type::BOOL, nullptr},
3910  /* .accessor = */ nullptr, //utils::access<type, bool, &type::pitch_roll_enable>,
3911  /* .attributes = */ {true, false, false, false, false},
3912  /* .count = */ 1,
3913  /* .condition = */ {},
3914  },
3915  {
3916  /* .name = */ "heading_enable",
3917  /* .docs = */ "Enable Heading corrections (only available on devices with magnetometer)",
3918  /* .type = */ {Type::BOOL, nullptr},
3919  /* .accessor = */ nullptr, //utils::access<type, bool, &type::heading_enable>,
3920  /* .attributes = */ {true, false, false, false, false},
3921  /* .count = */ 1,
3922  /* .condition = */ {},
3923  },
3924  {
3925  /* .name = */ "pitch_roll_time_constant",
3926  /* .docs = */ "Time constant associated with the pitch/roll corrections [s]",
3927  /* .type = */ {Type::FLOAT, nullptr},
3928  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch_roll_time_constant>,
3929  /* .attributes = */ {true, false, false, false, false},
3930  /* .count = */ 1,
3931  /* .condition = */ {},
3932  },
3933  {
3934  /* .name = */ "heading_time_constant",
3935  /* .docs = */ "Time constant associated with the heading corrections [s]",
3936  /* .type = */ {Type::FLOAT, nullptr},
3937  /* .accessor = */ nullptr, //utils::access<type, float, &type::heading_time_constant>,
3938  /* .attributes = */ {true, false, false, false, false},
3939  /* .count = */ 1,
3940  /* .condition = */ {},
3941  },
3942  };
3943 
3944  static constexpr inline FieldInfo value = {
3945  /* .name = */ "commands_3dm::ComplementaryFilter::Response",
3946  /* .title = */ "response",
3947  /* .docs = */ "",
3948  /* .parameters = */ parameters,
3949  /* .descriptor = */ type::DESCRIPTOR,
3950  /* .functions = */ NO_FUNCTIONS,
3951  /* .response = */ nullptr,
3952  };
3953 };
3954 
3955 template<>
3956 struct MetadataFor<commands_3dm::ComplementaryFilter>
3957 {
3959 
3960  static constexpr inline ParameterInfo parameters[] = {
3961  FUNCTION_SELECTOR_PARAM,
3962  {
3963  /* .name = */ "pitch_roll_enable",
3964  /* .docs = */ "Enable Pitch/Roll corrections",
3965  /* .type = */ {Type::BOOL, nullptr},
3966  /* .accessor = */ nullptr, //utils::access<type, bool, &type::pitch_roll_enable>,
3967  /* .attributes = */ {true, false, false, false, false},
3968  /* .count = */ 1,
3969  /* .condition = */ {},
3970  },
3971  {
3972  /* .name = */ "heading_enable",
3973  /* .docs = */ "Enable Heading corrections (only available on devices with magnetometer)",
3974  /* .type = */ {Type::BOOL, nullptr},
3975  /* .accessor = */ nullptr, //utils::access<type, bool, &type::heading_enable>,
3976  /* .attributes = */ {true, false, false, false, false},
3977  /* .count = */ 1,
3978  /* .condition = */ {},
3979  },
3980  {
3981  /* .name = */ "pitch_roll_time_constant",
3982  /* .docs = */ "Time constant associated with the pitch/roll corrections [s]",
3983  /* .type = */ {Type::FLOAT, nullptr},
3984  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch_roll_time_constant>,
3985  /* .attributes = */ {true, false, false, false, false},
3986  /* .count = */ 1,
3987  /* .condition = */ {},
3988  },
3989  {
3990  /* .name = */ "heading_time_constant",
3991  /* .docs = */ "Time constant associated with the heading corrections [s]",
3992  /* .type = */ {Type::FLOAT, nullptr},
3993  /* .accessor = */ nullptr, //utils::access<type, float, &type::heading_time_constant>,
3994  /* .attributes = */ {true, false, false, false, false},
3995  /* .count = */ 1,
3996  /* .condition = */ {},
3997  },
3998  };
3999 
4000  static constexpr inline FieldInfo value = {
4001  /* .name = */ "commands_3dm::ComplementaryFilter",
4002  /* .title = */ "Complementary Filter Configuration",
4003  /* .docs = */ "Configure the settings for the complementary filter which produces the following (0x80) descriptor set values: attitude matrix (0x80,09), quaternion (0x80,0A), and Euler angle (0x80,0C) outputs.\n\nThe filter can be configured to correct for pitch and roll using the accelerometer (with the assumption that linear acceleration is minimal),\nand to correct for heading using the magnetometer (with the assumption that the local magnetic field is dominated by the Earth's own magnetic field).\nPitch/roll and heading corrections each have their own configurable time constants, with a valid range of 1-1000 seconds. The default time constant is 10 seconds.",
4004  /* .parameters = */ parameters,
4005  /* .descriptor = */ type::DESCRIPTOR,
4006  /* .functions = */ {true, true, true, true, true},
4007  /* .response = */ &MetadataFor<type::Response>::value,
4008  };
4009 };
4010 
4011 template<>
4012 struct MetadataFor<commands_3dm::SensorRangeType>
4013 {
4015 
4016  static constexpr inline EnumInfo::Entry entries[] = {
4017  { uint32_t(0), "ALL", "Only allowed for SAVE, LOAD, and DEFAULT function selectors." },
4018  { uint32_t(1), "ACCEL", "Accelerometer. Range is specified in g." },
4019  { uint32_t(2), "GYRO", "Gyroscope. Range is specified in degrees/s." },
4020  { uint32_t(3), "MAG", "Magnetometer. Range is specified in Gauss." },
4021  { uint32_t(4), "PRESS", "Pressure sensor. Range is specified in hPa." },
4022  };
4023 
4024  static constexpr inline EnumInfo value = {
4025  /* .name = */ "SensorRangeType",
4026  /* .docs = */ "",
4027  /* .type = */ Type::U8,
4028  /* .entries = */ entries,
4029  };
4030 
4031 };
4032 
4033 template<>
4034 struct MetadataFor<commands_3dm::SensorRange::Response>
4035 {
4037 
4038  static constexpr inline ParameterInfo parameters[] = {
4039  {
4040  /* .name = */ "sensor",
4041  /* .docs = */ "Which type of sensor will get the new range value.",
4043  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4044  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4045  /* .count = */ 1,
4046  /* .condition = */ {},
4047  },
4048  {
4049  /* .name = */ "setting",
4050  /* .docs = */ "Use the 3DM Get Calibrated Sensor Ranges (0x0C,0x53) command to determine this value.",
4051  /* .type = */ {Type::U8, nullptr},
4052  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::setting>,
4053  /* .attributes = */ {true, false, false, false, false},
4054  /* .count = */ 1,
4055  /* .condition = */ {},
4056  },
4057  };
4058 
4059  static constexpr inline FieldInfo value = {
4060  /* .name = */ "commands_3dm::SensorRange::Response",
4061  /* .title = */ "response",
4062  /* .docs = */ "",
4063  /* .parameters = */ parameters,
4064  /* .descriptor = */ type::DESCRIPTOR,
4065  /* .functions = */ NO_FUNCTIONS,
4066  /* .response = */ nullptr,
4067  };
4068 };
4069 
4070 template<>
4071 struct MetadataFor<commands_3dm::SensorRange>
4072 {
4074 
4075  static constexpr inline ParameterInfo parameters[] = {
4076  FUNCTION_SELECTOR_PARAM,
4077  {
4078  /* .name = */ "sensor",
4079  /* .docs = */ "Which type of sensor will get the new range value.",
4081  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4082  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4083  /* .count = */ 1,
4084  /* .condition = */ {},
4085  },
4086  {
4087  /* .name = */ "setting",
4088  /* .docs = */ "Use the 3DM Get Calibrated Sensor Ranges (0x0C,0x53) command to determine this value.",
4089  /* .type = */ {Type::U8, nullptr},
4090  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::setting>,
4091  /* .attributes = */ {true, false, false, false, false},
4092  /* .count = */ 1,
4093  /* .condition = */ {},
4094  },
4095  };
4096 
4097  static constexpr inline FieldInfo value = {
4098  /* .name = */ "commands_3dm::SensorRange",
4099  /* .title = */ "Sensor Range",
4100  /* .docs = */ "Changes the IMU sensor gain.\n\nThis allows you to optimize the range to get the best accuracy and performance\nwhile minimizing over-range events.\n\nUse the 3DM Get Calibrated Sensor Ranges (0x0C,0x53) command to determine\nthe appropriate setting value for your application. Using values other than\nthose specified may result in a NACK or inaccurate measurement data.",
4101  /* .parameters = */ parameters,
4102  /* .descriptor = */ type::DESCRIPTOR,
4103  /* .functions = */ {true, true, true, true, true},
4104  /* .response = */ &MetadataFor<type::Response>::value,
4105  };
4106 };
4107 
4108 template<>
4109 struct MetadataFor<commands_3dm::CalibratedSensorRanges::Entry>
4110 {
4112 
4113  static constexpr inline ParameterInfo parameters[] = {
4114  {
4115  /* .name = */ "setting",
4116  /* .docs = */ "The value used in the 3DM Sensor Range command and response.",
4117  /* .type = */ {Type::U8, nullptr},
4118  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::setting>,
4119  /* .attributes = */ NO_FUNCTIONS,
4120  /* .count = */ 1,
4121  /* .condition = */ {},
4122  },
4123  {
4124  /* .name = */ "range",
4125  /* .docs = */ "The actual range value. Units depend on the sensor type.",
4126  /* .type = */ {Type::FLOAT, nullptr},
4127  /* .accessor = */ nullptr, //utils::access<type, float, &type::range>,
4128  /* .attributes = */ NO_FUNCTIONS,
4129  /* .count = */ 1,
4130  /* .condition = */ {},
4131  },
4132  };
4133 
4134  static constexpr inline StructInfo value = {
4135  /* .name = */ "Entry",
4136  /* .title = */ "Sensor Range Entry",
4137  /* .docs = */ "",
4138  /* .parameters = */ parameters,
4139  };
4140 };
4141 
4142 template<>
4143 struct MetadataFor<commands_3dm::CalibratedSensorRanges::Response>
4144 {
4146 
4147  static constexpr inline ParameterInfo parameters[] = {
4148  {
4149  /* .name = */ "sensor",
4150  /* .docs = */ "The sensor type from the command.",
4152  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4153  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
4154  /* .count = */ 1,
4155  /* .condition = */ {},
4156  },
4157  {
4158  /* .name = */ "num_ranges",
4159  /* .docs = */ "Number of supported ranges.",
4160  /* .type = */ {Type::U8, nullptr},
4161  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_ranges>,
4162  /* .attributes = */ {true, false, false, false, false},
4163  /* .count = */ 1,
4164  /* .condition = */ {},
4165  },
4166  {
4167  /* .name = */ "ranges",
4168  /* .docs = */ "List of possible range settings.",
4170  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::CalibratedSensorRanges::Entry, &type::ranges>,
4171  /* .attributes = */ {true, false, false, false, false},
4172  /* .count = */ {0, microstrain::Index(1) /* num_ranges */},
4173  /* .condition = */ {},
4174  },
4175  };
4176 
4177  static constexpr inline FieldInfo value = {
4178  /* .name = */ "commands_3dm::CalibratedSensorRanges::Response",
4179  /* .title = */ "response",
4180  /* .docs = */ "",
4181  /* .parameters = */ parameters,
4182  /* .descriptor = */ type::DESCRIPTOR,
4183  /* .functions = */ NO_FUNCTIONS,
4184  /* .response = */ nullptr,
4185  };
4186 };
4187 
4188 template<>
4189 struct MetadataFor<commands_3dm::CalibratedSensorRanges>
4190 {
4192 
4193  static constexpr inline ParameterInfo parameters[] = {
4194  {
4195  /* .name = */ "sensor",
4196  /* .docs = */ "The sensor to query. Cannot be ALL.",
4198  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4199  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
4200  /* .count = */ 1,
4201  /* .condition = */ {},
4202  },
4203  };
4204 
4205  static constexpr inline FieldInfo value = {
4206  /* .name = */ "commands_3dm::CalibratedSensorRanges",
4207  /* .title = */ "Get Calibrated Sensor Ranges",
4208  /* .docs = */ "Returns the supported sensor ranges which may be used with the 3DM Sensor Range (0x0C,0x52) command.\n\nThe response includes an array of (u8, float) pairs which map each allowed setting\nto the corresponding maximum range in physical units. See SensorRangeType for units.",
4209  /* .parameters = */ parameters,
4210  /* .descriptor = */ type::DESCRIPTOR,
4211  /* .functions = */ NO_FUNCTIONS,
4212  /* .response = */ &MetadataFor<type::Response>::value,
4213  };
4214 };
4215 
4216 template<>
4217 struct MetadataFor<commands_3dm::LowpassFilter::Response>
4218 {
4220 
4221  static constexpr inline ParameterInfo parameters[] = {
4222  {
4223  /* .name = */ "desc_set",
4224  /* .docs = */ "Descriptor set of the quantity to be filtered.",
4225  /* .type = */ {Type::U8, nullptr},
4226  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
4227  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4228  /* .count = */ 1,
4229  /* .condition = */ {},
4230  },
4231  {
4232  /* .name = */ "field_desc",
4233  /* .docs = */ "Field descriptor of the quantity to be filtered.",
4234  /* .type = */ {Type::U8, nullptr},
4235  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::field_desc>,
4236  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4237  /* .count = */ 1,
4238  /* .condition = */ {},
4239  },
4240  {
4241  /* .name = */ "enable",
4242  /* .docs = */ "The filter will be enabled if this is true.",
4243  /* .type = */ {Type::BOOL, nullptr},
4244  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
4245  /* .attributes = */ {true, false, false, false, false},
4246  /* .count = */ 1,
4247  /* .condition = */ {},
4248  },
4249  {
4250  /* .name = */ "manual",
4251  /* .docs = */ "If false, the frequency parameter is ignored and the filter\nwill track to half of the configured message format frequency.",
4252  /* .type = */ {Type::BOOL, nullptr},
4253  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
4254  /* .attributes = */ {true, false, false, false, false},
4255  /* .count = */ 1,
4256  /* .condition = */ {},
4257  },
4258  {
4259  /* .name = */ "frequency",
4260  /* .docs = */ "Cutoff frequency in Hz. This will return the actual frequency\nwhen read out in automatic mode.",
4261  /* .type = */ {Type::FLOAT, nullptr},
4262  /* .accessor = */ nullptr, //utils::access<type, float, &type::frequency>,
4263  /* .attributes = */ {true, false, false, false, false},
4264  /* .count = */ 1,
4265  /* .condition = */ {},
4266  },
4267  };
4268 
4269  static constexpr inline FieldInfo value = {
4270  /* .name = */ "commands_3dm::LowpassFilter::Response",
4271  /* .title = */ "response",
4272  /* .docs = */ "",
4273  /* .parameters = */ parameters,
4274  /* .descriptor = */ type::DESCRIPTOR,
4275  /* .functions = */ NO_FUNCTIONS,
4276  /* .response = */ nullptr,
4277  };
4278 };
4279 
4280 template<>
4281 struct MetadataFor<commands_3dm::LowpassFilter>
4282 {
4284 
4285  static constexpr inline ParameterInfo parameters[] = {
4286  FUNCTION_SELECTOR_PARAM,
4287  {
4288  /* .name = */ "desc_set",
4289  /* .docs = */ "Descriptor set of the quantity to be filtered.",
4290  /* .type = */ {Type::U8, nullptr},
4291  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
4292  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4293  /* .count = */ 1,
4294  /* .condition = */ {},
4295  },
4296  {
4297  /* .name = */ "field_desc",
4298  /* .docs = */ "Field descriptor of the quantity to be filtered.",
4299  /* .type = */ {Type::U8, nullptr},
4300  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::field_desc>,
4301  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4302  /* .count = */ 1,
4303  /* .condition = */ {},
4304  },
4305  {
4306  /* .name = */ "enable",
4307  /* .docs = */ "The filter will be enabled if this is true.",
4308  /* .type = */ {Type::BOOL, nullptr},
4309  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
4310  /* .attributes = */ {true, false, false, false, false},
4311  /* .count = */ 1,
4312  /* .condition = */ {},
4313  },
4314  {
4315  /* .name = */ "manual",
4316  /* .docs = */ "If false, the frequency parameter is ignored and the filter\nwill track to half of the configured message format frequency.",
4317  /* .type = */ {Type::BOOL, nullptr},
4318  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
4319  /* .attributes = */ {true, false, false, false, false},
4320  /* .count = */ 1,
4321  /* .condition = */ {},
4322  },
4323  {
4324  /* .name = */ "frequency",
4325  /* .docs = */ "Cutoff frequency in Hz. This will return the actual frequency\nwhen read out in automatic mode.",
4326  /* .type = */ {Type::FLOAT, nullptr},
4327  /* .accessor = */ nullptr, //utils::access<type, float, &type::frequency>,
4328  /* .attributes = */ {true, false, false, false, false},
4329  /* .count = */ 1,
4330  /* .condition = */ {},
4331  },
4332  };
4333 
4334  static constexpr inline FieldInfo value = {
4335  /* .name = */ "commands_3dm::LowpassFilter",
4336  /* .title = */ "Low-Pass Anti-Aliasing Filter",
4337  /* .docs = */ "This command controls the low-pass anti-aliasing filter supported data quantities.\n\nSee the device user manual for data quantities which support the anti-aliasing filter.\n\nIf set to automatic mode, the frequency will track half of the transmission rate\nof the target descriptor according to the configured message format (0x0C,0x0F).\nFor example, if scaled accel (0x80,0x04) is set to stream at 100 Hz, the filter would\nbe set to 50 Hz. Changing the message format to 200 Hz would automatically adjust the\nfilter to 100 Hz.\n\nFor WRITE, SAVE, LOAD, and DEFAULT function selectors, the descriptor set and/or field descriptor\nmay be 0x00 to set, save, load, or reset the setting for all supported descriptors. The\nfield descriptor must be 0x00 if the descriptor set is 0x00.",
4338  /* .parameters = */ parameters,
4339  /* .descriptor = */ type::DESCRIPTOR,
4340  /* .functions = */ {true, true, true, true, true},
4341  /* .response = */ &MetadataFor<type::Response>::value,
4342  };
4343 };
4344 
4345 
4346 static constexpr inline const FieldInfo* COMMANDS_3DM_FIELDS[] = {
4432 };
4433 
4434 static constexpr DescriptorSetInfo COMMANDS_3DM = {
4435  /*.descriptor =*/ mip::commands_3dm::DESCRIPTOR_SET,
4436  /*.name =*/ "3dm Commands",
4437  /*.fields =*/ COMMANDS_3DM_FIELDS,
4438 };
4439 
4440 } // namespace mip::metadata
4441 
commands_3dm.hpp
mip::metadata::MetadataFor< commands_3dm::CalibratedSensorRanges::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4177
mip::commands_3dm::ConstellationSettings::Response
Definition: commands_3dm.hpp:1339
mip::metadata::MetadataFor< commands_3dm::GyroBias::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3074
mip::commands_3dm::GpioConfig
Definition: commands_3dm.hpp:3422
mip::metadata::MetadataFor< commands_3dm::GnssGetBaseRate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:376
mip::commands_3dm::ConstellationSettings
Definition: commands_3dm.hpp:1254
mip::commands_3dm::PollImuMessage
Definition: commands_3dm.hpp:188
mip::commands_3dm::GyroBias::Response
Definition: commands_3dm.hpp:2951
mip::metadata::MetadataFor< commands_3dm::FilterMessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:563
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformDcm >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2989
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformQuaternion >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2932
mip::commands_3dm::UartBaudrate::Response
Definition: commands_3dm.hpp:3363
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformEuler >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2875
mip::metadata::MetadataFor< commands_3dm::ImuGetBaseRate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:332
mip::commands_3dm::SensorRange::Response
Definition: commands_3dm.hpp:3980
mip::commands_3dm::GnssAssistedFix::Response
Definition: commands_3dm.hpp:1551
mip::metadata::Type::ENUM
@ ENUM
mip::commands_3dm::ImuLowpassFilter::Response
Definition: commands_3dm.hpp:3801
mip::commands_3dm::GnssMessageFormat::Response
Definition: commands_3dm.hpp:624
mip::metadata::MetadataFor< commands_3dm::LowpassFilter >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4334
mip::commands_3dm::GnssMessageFormat
Definition: commands_3dm.hpp:588
mip::commands_3dm::Sensor2VehicleTransformQuaternion
Definition: commands_3dm.hpp:2647
mip::metadata::BitfieldInfo
Definition: mip_structures.hpp:91
mip::metadata::MetadataFor< commands_3dm::MessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:886
mip::commands_3dm::MagSoftIronMatrix::Response
Definition: commands_3dm.hpp:3193
mip::metadata
Definition: commands_3dm.hpp:10
mip::metadata::MetadataFor< commands_3dm::CaptureGyroBias >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3159
mip::commands_3dm::PpsSource
Definition: commands_3dm.hpp:1677
mip::metadata::MetadataFor< commands_3dm::GnssSbasSettings >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1400
mip::commands_3dm::GnssGetBaseRate
Definition: commands_3dm.hpp:441
mip::commands_3dm::GpioConfig::Response
Definition: commands_3dm.hpp:3520
mip::commands_3dm::SensorRangeType
SensorRangeType
Definition: commands_3dm.hpp:161
mip::commands_3dm::ImuGetBaseRate
Definition: commands_3dm.hpp:375
mip::commands_3dm::GetEventSupport::Info
Definition: commands_3dm.hpp:1788
mip::metadata::MetadataFor< commands_3dm::GyroBias >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3103
mip::commands_3dm::DeviceSettings
Definition: commands_3dm.hpp:2458
mip::commands_3dm::Sensor2VehicleTransformDcm
Definition: commands_3dm.hpp:2756
mip::commands_3dm::Sensor2VehicleTransformDcm::Response
Definition: commands_3dm.hpp:2791
mip::metadata::MetadataFor< commands_3dm::CalibratedSensorRanges >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4205
mip::commands_3dm::PpsSource::Response
Definition: commands_3dm.hpp:1721
mip::metadata::MetadataFor< commands_3dm::GetEventActionStatus >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2134
mip::commands_3dm::GetBaseRate::Response
Definition: commands_3dm.hpp:972
mip::metadata::MetadataFor< commands_3dm::PollFilterMessage >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:141
mip::metadata::MetadataFor< commands_3dm::DatastreamControl >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1065
mip::metadata::MetadataFor< commands_3dm::MessageFormat >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:933
mip::commands_3dm::NmeaMessageFormat::Response
Definition: commands_3dm.hpp:852
mip::commands_3dm::EventTrigger::Type::GPIO
@ GPIO
Trigger based on the state of a GPIO pin. See GpioParams.
mip::metadata::MetadataFor< commands_3dm::MagHardIronOffset >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3216
mip::commands_3dm::GetBaseRate
Definition: commands_3dm.hpp:945
mip::metadata::MetadataFor< commands_3dm::ConstellationSettings::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1222
mip::commands_3dm::Odometer::Mode
Mode
Definition: commands_3dm.hpp:3660
mip::commands_3dm::EventControl
Definition: commands_3dm.hpp:1875
mip::metadata::MetadataFor< commands_3dm::Odometer >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3760
mip::metadata::Type::U16
@ U16
mip::metadata::MetadataFor
Definition: mip_metadata.hpp:15
mip::metadata::MetadataFor< commands_3dm::GpioConfig >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3573
mip::commands_3dm::ImuLowpassFilter
Definition: commands_3dm.hpp:3761
mip::commands_3dm::EventAction::Parameters
Definition: commands_3dm.hpp:2364
mip::commands_3dm::Sensor2VehicleTransformEuler
Definition: commands_3dm.hpp:2533
mip::commands_3dm::PpsSource::Source
Source
Definition: commands_3dm.hpp:1679
mip::metadata::Type::STRUCT
@ STRUCT
mip::commands_3dm::EventTrigger::ThresholdParams
Definition: commands_3dm.hpp:2171
mip::commands_3dm::EventTrigger::Type::THRESHOLD
@ THRESHOLD
Compare a data quantity against a high and low threshold. See ThresholdParams.
mip::commands_3dm::NmeaMessage::MessageID
MessageID
Definition: commands_3dm.hpp:127
mip::commands_3dm::MessageFormat
Definition: commands_3dm.hpp:1014
mip::commands_3dm::GnssSbasSettings::Response
Definition: commands_3dm.hpp:1453
mip::metadata::MetadataFor< commands_3dm::GetBaseRate::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:812
mip::commands_3dm::EventTrigger
Definition: commands_3dm.hpp:2150
mip::commands_3dm::FilterGetBaseRate::Response
Definition: commands_3dm.hpp:777
mip::commands_3dm::GetEventTriggerStatus
Definition: commands_3dm.hpp:1963
mip::metadata::Type::DOUBLE
@ DOUBLE
mip::commands_3dm::GpioConfig::PinMode
Definition: commands_3dm.hpp:3453
mip::commands_3dm::DatastreamControl::Response
Definition: commands_3dm.hpp:1193
mip::commands_3dm::GetEventActionStatus::Entry
Definition: commands_3dm.hpp:2073
mip::metadata::Type
Type
Definition: mip_structures.hpp:23
mip::commands_3dm::GetEventSupport::Response
Definition: commands_3dm.hpp:1824
mip::commands_3dm::DatastreamControl
Definition: commands_3dm.hpp:1152
mip::metadata::MetadataFor< commands_3dm::FactoryStreaming >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:990
mip::commands_3dm::ImuGetBaseRate::Response
Definition: commands_3dm.hpp:399
mip::commands_3dm::CaptureGyroBias::Response
Definition: commands_3dm.hpp:3026
mip::commands_3dm::GetEventSupport::Query
Query
Definition: commands_3dm.hpp:1782
mip::commands_3dm::CaptureGyroBias
Definition: commands_3dm.hpp:2999
mip::commands_3dm::EventTrigger::Parameters
Definition: commands_3dm.hpp:2232
mip::metadata::MetadataFor< commands_3dm::GnssGetBaseRate::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:360
mip::metadata::ParameterInfo
Definition: mip_structures.hpp:161
mip::commands_3dm::EventAction::Response
Definition: commands_3dm.hpp:2408
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformEuler::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2828
mip::metadata::MetadataFor< commands_3dm::PpsSource >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1666
mip::commands_3dm::EventTrigger::Type::COMBINATION
@ COMBINATION
Logical combination of two or more triggers. See CombinationParams.
mip::metadata::EnumInfo::Entry
Definition: mip_structures.hpp:67
mip::metadata::Type::UNION
@ UNION
mip::commands_3dm::ConingScullingEnable
Definition: commands_3dm.hpp:3236
mip::metadata::MetadataFor< commands_3dm::ImuLowpassFilter::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3824
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformDcm::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2960
mip::commands_3dm::GnssGetBaseRate::Response
Definition: commands_3dm.hpp:465
mip::metadata::MetadataFor< commands_3dm::GetEventTriggerStatus >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2026
mip_metadata.hpp
mip::commands_3dm::EventTrigger::ThresholdParams::Type::INTERVAL
@ INTERVAL
Trigger at evenly spaced intervals. Normally used with time fields to trigger periodically....
mip::commands_3dm::GpioState
Definition: commands_3dm.hpp:3581
mip::commands_3dm::EventControl::Mode
Mode
Definition: commands_3dm.hpp:1877
mip::commands_3dm::MagHardIronOffset
Definition: commands_3dm.hpp:3071
mip::commands_3dm::DESCRIPTOR_SET
@ DESCRIPTOR_SET
Definition: commands_3dm.hpp:31
mip::metadata::MetadataFor< commands_3dm::GnssTimeAssistance >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1587
mip::commands_3dm::EventAction::Type::GPIO
@ GPIO
Control the state of a GPIO pin. See GpioParameters.
mip::commands_3dm::PollGnssMessage
Definition: commands_3dm.hpp:236
mip::commands_3dm::ImuMessageFormat
Definition: commands_3dm.hpp:506
mip::metadata::MetadataFor< commands_3dm::FilterMessageFormat >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:601
mip::commands_3dm::EventTrigger::ThresholdParams::Type::WINDOW
@ WINDOW
Window comparison. Trigger is active if low_thres <= value <= high_thres. If the thresholds are rever...
mip::metadata::MetadataFor< commands_3dm::GetEventActionStatus::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2097
mip::metadata::Type::FLOAT
@ FLOAT
mip::metadata::MetadataFor< commands_3dm::PollData >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:775
mip::commands_3dm::EventTrigger::CombinationParams
Definition: commands_3dm.hpp:2200
mip::commands_3dm::EventTrigger::GpioParams::Mode
Mode
Definition: commands_3dm.hpp:2154
mip::metadata::MetadataFor< commands_3dm::PpsSource::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1637
mip::metadata::MetadataFor< commands_3dm::PollImuMessage >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:49
mip::metadata::MetadataFor< commands_3dm::GpioState::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3610
mip::commands_3dm::GetEventSupport
Definition: commands_3dm.hpp:1780
mip::metadata::MetadataFor< commands_3dm::GnssMessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:488
mip::commands_3dm::FilterGetBaseRate
Definition: commands_3dm.hpp:753
mip::metadata::MetadataFor< commands_3dm::PollGnssMessage >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:95
mip::metadata::MetadataFor< commands_3dm::GpioConfig::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3517
mip::metadata::MetadataFor< commands_3dm::SensorRange >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4097
mip::metadata::MetadataFor< commands_3dm::EventTrigger::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2440
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformQuaternion::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2903
mip::commands_3dm::EventAction::GpioParams::Mode
Mode
Definition: commands_3dm.hpp:2325
mip::metadata::MetadataFor< commands_3dm::EventControl >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1898
mip::metadata::MetadataFor< commands_3dm::NmeaMessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:682
mip::metadata::MetadataFor< commands_3dm::Odometer::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3713
mip::commands_3dm::ImuMessageFormat::Response
Definition: commands_3dm.hpp:542
mip::metadata::MetadataFor< commands_3dm::EventAction >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2761
mip::commands_3dm::GpioConfig::Behavior
Behavior
Definition: commands_3dm.hpp:3434
mip::commands_3dm::GetEventActionStatus::Response
Definition: commands_3dm.hpp:2110
mip::metadata::MetadataFor< commands_3dm::GetEventSupport::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1774
mip::commands_3dm::EventTrigger::ThresholdParams::Type
Type
Definition: commands_3dm.hpp:2173
mip::metadata::MetadataFor< commands_3dm::GnssMessageFormat >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:526
mip::commands_3dm::GpioState::Response
Definition: commands_3dm.hpp:3617
mip::commands_3dm::EventAction::Type
Type
Definition: commands_3dm.hpp:2357
mip::metadata::MetadataFor< commands_3dm::ImuMessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:413
mip::commands_3dm::NmeaPollData
Definition: commands_3dm.hpp:331
mip::metadata::Type::BOOL
@ BOOL
microstrain::Index
Represents an index ranging from 0..N excluding N.
Definition: index.hpp:28
mip::commands_3dm::EventAction::Type::MESSAGE
@ MESSAGE
Output a data packet. See MessageParameters.
mip::commands_3dm::MessageFormat::Response
Definition: commands_3dm.hpp:1052
mip::metadata::MetadataFor< commands_3dm::EventAction::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2705
mip::metadata::FieldInfo
Definition: mip_structures.hpp:216
mip::metadata::Type::U8
@ U8
mip::metadata::ParameterInfo::Condition::Type::ENUM
@ ENUM
Enum value selector (e.g. for parameters in unions)
mip::commands_3dm::EventTrigger::Type
Type
Definition: commands_3dm.hpp:2224
mip::commands_3dm::Sensor2VehicleTransformEuler::Response
Definition: commands_3dm.hpp:2570
mip::metadata::MetadataFor< commands_3dm::SensorRange::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4059
mip::commands_3dm::Sensor2VehicleTransformQuaternion::Response
Definition: commands_3dm.hpp:2682
mip::metadata::MetadataFor< commands_3dm::AccelBias >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3046
mip::metadata::MetadataFor< commands_3dm::DatastreamControl::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1027
mip::commands_3dm::FilterMessageFormat
Definition: commands_3dm.hpp:670
mip::metadata::MetadataFor< commands_3dm::UartBaudrate::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3358
mip::commands_3dm::GetEventTriggerStatus::Status
Definition: commands_3dm.hpp:1965
mip::metadata::MetadataFor< commands_3dm::FilterGetBaseRate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:645
mip::commands_3dm::GnssAssistedFix::AssistedFixOption
AssistedFixOption
Definition: commands_3dm.hpp:1511
mip::metadata::MetadataFor< commands_3dm::GpioState >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3648
mip::commands_3dm::EventAction::GpioParams
Definition: commands_3dm.hpp:2323
mip::commands_3dm::Odometer
Definition: commands_3dm.hpp:3658
mip::commands_3dm::LowpassFilter::Response
Definition: commands_3dm.hpp:4159
mip::commands_3dm::ConingScullingEnable::Response
Definition: commands_3dm.hpp:3271
mip::metadata::MetadataFor< commands_3dm::EventTrigger >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2487
mip::commands_3dm::GetEventActionStatus
Definition: commands_3dm.hpp:2071
mip::metadata::MetadataFor< commands_3dm::MagSoftIronMatrix::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3244
mip::metadata::MetadataFor< commands_3dm::ImuGetBaseRate::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:316
mip::metadata::MetadataFor< commands_3dm::MagSoftIronMatrix >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3273
mip::metadata::MetadataFor< commands_3dm::AccelBias::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3017
mip::metadata::MetadataFor< commands_3dm::GnssSbasSettings::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1344
mip::metadata::MetadataFor< commands_3dm::ConingScullingEnable::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3301
mip::metadata::EnumInfo
Definition: mip_structures.hpp:65
mip::commands_3dm::AccelBias::Response
Definition: commands_3dm.hpp:2871
mip::commands_3dm::EventTrigger::Response
Definition: commands_3dm.hpp:2276
mip::commands_3dm::EventControl::Response
Definition: commands_3dm.hpp:1920
mip::commands_3dm::FactoryStreaming::Action
Action
Definition: commands_3dm.hpp:1102
mip::commands_3dm::FilterMessageFormat::Response
Definition: commands_3dm.hpp:706
mip::commands_3dm::AccelBias
Definition: commands_3dm.hpp:2836
mip::metadata::MetadataFor< commands_3dm::NmeaMessageFormat >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:720
mip::commands_3dm::GnssSbasSettings
Definition: commands_3dm.hpp:1385
mip::commands_3dm::UartBaudrate
Definition: commands_3dm.hpp:3328
mip::commands_3dm::ConstellationSettings::OptionFlags
Definition: commands_3dm.hpp:1266
mip::commands_3dm::GyroBias
Definition: commands_3dm.hpp:2916
mip::commands_3dm::GnssTimeAssistance
Definition: commands_3dm.hpp:1598
mip::metadata::MetadataFor< commands_3dm::FilterGetBaseRate::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:629
mip::metadata::MetadataFor< commands_3dm::GetEventSupport >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1802
mip::commands_3dm::CalibratedSensorRanges::Response
Definition: commands_3dm.hpp:4065
mip::commands_3dm::Odometer::Response
Definition: commands_3dm.hpp:3701
mip::metadata::MetadataFor< commands_3dm::GetEventTriggerStatus::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1989
mip::commands_3dm::PollData
Definition: commands_3dm.hpp:903
mip::commands_3dm::GetEventTriggerStatus::Entry
Definition: commands_3dm.hpp:1995
mip::metadata::MetadataFor< commands_3dm::DeviceSettings >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2782
mip::commands_3dm::GnssSbasSettings::SBASOptions
Definition: commands_3dm.hpp:1387
mip::commands_3dm::EventTrigger::GpioParams
Definition: commands_3dm.hpp:2152
mip::metadata::MetadataFor< commands_3dm::ImuMessageFormat >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:451
mip::commands_3dm::GnssAssistedFix
Definition: commands_3dm.hpp:1509
mip::metadata::MetadataFor< commands_3dm::GnssTimeAssistance::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1540
mip::metadata::MetadataFor< commands_3dm::MagHardIronOffset::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3187
mip::commands_3dm::GetEventTriggerStatus::Response
Definition: commands_3dm.hpp:2032
mip::metadata::MetadataFor< commands_3dm::GetBaseRate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:840
mip::commands_3dm::ComplementaryFilter::Response
Definition: commands_3dm.hpp:3890
mip::commands_3dm::CalibratedSensorRanges::Entry
Definition: commands_3dm.hpp:4029
mip::metadata::MetadataFor< commands_3dm::ComplementaryFilter >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4000
mip::metadata::Type::BITS
@ BITS
mip::commands_3dm::MagHardIronOffset::Response
Definition: commands_3dm.hpp:3106
mip::commands_3dm::GpioConfig::Feature
Feature
Definition: commands_3dm.hpp:3424
mip::metadata::StructInfo
Definition: mip_structures.hpp:205
mip::commands_3dm::GnssTimeAssistance::Response
Definition: commands_3dm.hpp:1635
mip::commands_3dm::EventAction::MessageParams
Definition: commands_3dm.hpp:2344
mip::commands_3dm::ComplementaryFilter
Definition: commands_3dm.hpp:3852
mip::metadata::MetadataFor< commands_3dm::ImuLowpassFilter >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3889
mip::metadata::MetadataFor< commands_3dm::CaptureGyroBias::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3131
mip::commands_3dm::ConstellationSettings::ConstellationId
ConstellationId
Definition: commands_3dm.hpp:1256
mip::commands_3dm::LowpassFilter
Definition: commands_3dm.hpp:4118
mip::commands_3dm::FactoryStreaming
Definition: commands_3dm.hpp:1100
mip::metadata::MetadataFor< commands_3dm::GnssAssistedFix >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1494
mip::commands_3dm::ConstellationSettings::Settings
Definition: commands_3dm.hpp:1290
common.hpp
mip::metadata::MetadataFor< commands_3dm::ConstellationSettings >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1269
mip::metadata::Type::U32
@ U32
mip::metadata::MetadataFor< commands_3dm::UartBaudrate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3387
mip::commands_3dm::NmeaMessage::TalkerID
TalkerID
Definition: commands_3dm.hpp:141
mip::commands_3dm::NmeaMessage
Definition: commands_3dm.hpp:125
mip::commands_3dm::NmeaMessageFormat
Definition: commands_3dm.hpp:816
mip::metadata::MetadataFor< commands_3dm::NmeaPollData >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:288
mip::metadata::MetadataFor< commands_3dm::ConingScullingEnable >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3330
mip::commands_3dm::SensorRange
Definition: commands_3dm.hpp:3943
mip::metadata::MetadataFor< commands_3dm::EventControl::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1860
mip::metadata::MetadataFor< commands_3dm::GnssAssistedFix::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1456
mip::metadata::MetadataFor< commands_3dm::LowpassFilter::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4269
mip::metadata::MetadataFor< commands_3dm::ComplementaryFilter::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3944
mip::commands_3dm::CalibratedSensorRanges
Definition: commands_3dm.hpp:4027
mip::commands_3dm::PollFilterMessage
Definition: commands_3dm.hpp:284
mip::commands_3dm::MagSoftIronMatrix
Definition: commands_3dm.hpp:3158
mip::commands_3dm::EventAction
Definition: commands_3dm.hpp:2321