MIP_SDK  v3.0.0-208-gdb90bae
MicroStrain Communications Library for embedded systems
commands_3dm.hpp
Go to the documentation of this file.
1 #pragma once
2 
5 
7 
8 namespace mip::metadata
9 {
10 
11 
12 template<>
13 struct MetadataFor<commands_3dm::PollImuMessage>
14 {
16 
17  static constexpr inline ParameterInfo parameters[] = {
18  {
19  /* .name = */ "suppress_ack",
20  /* .docs = */ "Suppress the usual ACK/NACK reply.",
21  /* .type = */ {Type::BOOL, nullptr},
22  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
23  /* .attributes = */ {true, false, false, false, false},
24  /* .count = */ 1,
25  /* .condition = */ {},
26  },
27  {
28  /* .name = */ "num_descriptors",
29  /* .docs = */ "Number of descriptors in the descriptor list.",
30  /* .type = */ {Type::U8, nullptr},
31  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
32  /* .attributes = */ {true, false, false, false, false},
33  /* .count = */ 1,
34  /* .condition = */ {},
35  },
36  {
37  /* .name = */ "descriptors",
38  /* .docs = */ "Descriptor list.",
40  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
41  /* .attributes = */ {true, false, false, false, false},
42  /* .count = */ {83, microstrain::Index(1) /* num_descriptors */},
43  /* .condition = */ {},
44  },
45  };
46 
47  static constexpr inline FieldInfo value = {
48  {
49  /* .name = */ "commands_3dm::PollImuMessage",
50  /* .title = */ "Poll IMU Message",
51  /* .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.",
52  /* .parameters = */ parameters,
53  },
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  {
97  /* .name = */ "commands_3dm::PollGnssMessage",
98  /* .title = */ "Poll GNSS Message",
99  /* .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.",
100  /* .parameters = */ parameters,
101  },
102  /* .descriptor = */ type::DESCRIPTOR,
103  /* .functions = */ NO_FUNCTIONS,
104  /* .response = */ nullptr,
105  };
106 };
107 
108 template<>
109 struct MetadataFor<commands_3dm::PollFilterMessage>
110 {
112 
113  static constexpr inline ParameterInfo parameters[] = {
114  {
115  /* .name = */ "suppress_ack",
116  /* .docs = */ "Suppress the usual ACK/NACK reply.",
117  /* .type = */ {Type::BOOL, nullptr},
118  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
119  /* .attributes = */ {true, false, false, false, false},
120  /* .count = */ 1,
121  /* .condition = */ {},
122  },
123  {
124  /* .name = */ "num_descriptors",
125  /* .docs = */ "Number of descriptors in the format list.",
126  /* .type = */ {Type::U8, nullptr},
127  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
128  /* .attributes = */ {true, false, false, false, false},
129  /* .count = */ 1,
130  /* .condition = */ {},
131  },
132  {
133  /* .name = */ "descriptors",
134  /* .docs = */ "Descriptor format list.",
136  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
137  /* .attributes = */ {true, false, false, false, false},
138  /* .count = */ {83, microstrain::Index(1) /* num_descriptors */},
139  /* .condition = */ {},
140  },
141  };
142 
143  static constexpr inline FieldInfo value = {
144  {
145  /* .name = */ "commands_3dm::PollFilterMessage",
146  /* .title = */ "Poll Estimation Filter Message",
147  /* .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.",
148  /* .parameters = */ parameters,
149  },
150  /* .descriptor = */ type::DESCRIPTOR,
151  /* .functions = */ NO_FUNCTIONS,
152  /* .response = */ nullptr,
153  };
154 };
155 
156 template<>
157 struct MetadataFor<commands_3dm::NmeaMessage::MessageID>
158 {
160 
161  static constexpr inline EnumInfo::Entry entries[] = {
162  { uint32_t(1), "GGA", "GPS System Fix Data. Source can be the Filter or GNSS1/2 datasets." },
163  { uint32_t(2), "GLL", "Geographic Position Lat/Lon. Source can be the Filter or GNSS1/2 datasets." },
164  { uint32_t(3), "GSV", "GNSS Satellites in View. Source must be either GNSS1 or GNSS2 datasets. The talker ID must be set to IGNORED." },
165  { uint32_t(4), "RMC", "Recommended Minimum Specific GNSS Data. Source can be the Filter or GNSS1/2 datasets." },
166  { uint32_t(5), "VTG", "Course over Ground. Source can be the Filter or GNSS1/2 datasets." },
167  { uint32_t(6), "HDT", "Heading, True. Source can be the Filter or GNSS1/2 datasets." },
168  { uint32_t(7), "ZDA", "Time & Date. Source must be the GNSS1 or GNSS2 datasets." },
169  { uint32_t(8), "GST", "Position Error Statistics. Source can be the Filter or GNSS1/2 datasets." },
170  { uint32_t(129), "MSRA", "MicroStrain proprietary Euler angles. Source must be the Filter dataset. The talker ID must be set to IGNORED." },
171  { uint32_t(130), "MSRR", "MicroStrain proprietary Angular Rate/Acceleration. Source must be the Sensor dataset. The talker ID must be set to IGNORED." },
172  };
173 
174  static constexpr inline EnumInfo value = {
175  /* .name = */ "MessageID",
176  /* .docs = */ "",
177  /* .type = */ Type::U8,
178  /* .entries = */ entries,
179  };
180 
181 };
182 
183 template<>
184 struct MetadataFor<commands_3dm::NmeaMessage::TalkerID>
185 {
187 
188  static constexpr inline EnumInfo::Entry entries[] = {
189  { uint32_t(0), "IGNORED", "Talker ID cannot be changed." },
190  { uint32_t(1), "GNSS", "NMEA message will be produced with talker id 'GN'." },
191  { uint32_t(2), "GPS", "NMEA message will be produced with talker id 'GP'." },
192  { uint32_t(3), "GALILEO", "NMEA message will be produced with talker id 'GA'." },
193  { uint32_t(4), "GLONASS", "NMEA message will be produced with talker id 'GL'." },
194  };
195 
196  static constexpr inline EnumInfo value = {
197  /* .name = */ "TalkerID",
198  /* .docs = */ "",
199  /* .type = */ Type::U8,
200  /* .entries = */ entries,
201  };
202 
203 };
204 
205 template<>
206 struct MetadataFor<commands_3dm::NmeaMessage>
207 {
209 
210  static constexpr inline ParameterInfo parameters[] = {
211  {
212  /* .name = */ "message_id",
213  /* .docs = */ "NMEA sentence type.",
215  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage::MessageID, &type::message_id>,
216  /* .attributes = */ NO_FUNCTIONS,
217  /* .count = */ 1,
218  /* .condition = */ {},
219  },
220  {
221  /* .name = */ "talker_id",
222  /* .docs = */ "NMEA talker ID. Ignored for proprietary sentences.",
224  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage::TalkerID, &type::talker_id>,
225  /* .attributes = */ NO_FUNCTIONS,
226  /* .count = */ 1,
227  /* .condition = */ {},
228  },
229  {
230  /* .name = */ "source_desc_set",
231  /* .docs = */ "Data descriptor set where the data will be sourced. Available options depend on the sentence.",
232  /* .type = */ {Type::U8, nullptr},
233  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::source_desc_set>,
234  /* .attributes = */ NO_FUNCTIONS,
235  /* .count = */ 1,
236  /* .condition = */ {},
237  },
238  {
239  /* .name = */ "decimation",
240  /* .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.",
241  /* .type = */ {Type::U16, nullptr},
242  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::decimation>,
243  /* .attributes = */ NO_FUNCTIONS,
244  /* .count = */ 1,
245  /* .condition = */ {},
246  },
247  };
248 
249  static constexpr inline StructInfo value = {
250  /* .name = */ "NmeaMessage",
251  /* .title = */ "NMEA Message",
252  /* .docs = */ "",
253  /* .parameters = */ parameters,
254  };
255 };
256 
257 template<>
258 struct MetadataFor<commands_3dm::NmeaPollData>
259 {
261 
262  static constexpr inline ParameterInfo parameters[] = {
263  {
264  /* .name = */ "suppress_ack",
265  /* .docs = */ "Suppress the usual ACK/NACK reply.",
266  /* .type = */ {Type::BOOL, nullptr},
267  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
268  /* .attributes = */ {true, false, false, false, false},
269  /* .count = */ 1,
270  /* .condition = */ {},
271  },
272  {
273  /* .name = */ "count",
274  /* .docs = */ "Number of format entries (limited by payload size)",
275  /* .type = */ {Type::U8, nullptr},
276  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
277  /* .attributes = */ {true, false, false, false, false},
278  /* .count = */ 1,
279  /* .condition = */ {},
280  },
281  {
282  /* .name = */ "format_entries",
283  /* .docs = */ "List of format entries.",
285  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage, &type::format_entries>,
286  /* .attributes = */ {true, false, false, false, false},
287  /* .count = */ {40, microstrain::Index(1) /* count */},
288  /* .condition = */ {},
289  },
290  };
291 
292  static constexpr inline FieldInfo value = {
293  {
294  /* .name = */ "commands_3dm::NmeaPollData",
295  /* .title = */ "Poll NMEA Data",
296  /* .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.",
297  /* .parameters = */ parameters,
298  },
299  /* .descriptor = */ type::DESCRIPTOR,
300  /* .functions = */ NO_FUNCTIONS,
301  /* .response = */ nullptr,
302  };
303 };
304 
305 template<>
306 struct MetadataFor<commands_3dm::ImuGetBaseRate::Response>
307 {
309 
310  static constexpr inline ParameterInfo parameters[] = {
311  {
312  /* .name = */ "rate",
313  /* .docs = */ "[hz]",
314  /* .type = */ {Type::U16, nullptr},
315  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
316  /* .attributes = */ {true, false, false, false, false},
317  /* .count = */ 1,
318  /* .condition = */ {},
319  },
320  };
321 
322  static constexpr inline FieldInfo value = {
323  {
324  /* .name = */ "commands_3dm::ImuGetBaseRate::Response",
325  /* .title = */ "response",
326  /* .docs = */ "",
327  /* .parameters = */ parameters,
328  },
329  /* .descriptor = */ type::DESCRIPTOR,
330  /* .functions = */ NO_FUNCTIONS,
331  /* .response = */ nullptr,
332  };
333 };
334 
335 template<>
336 struct MetadataFor<commands_3dm::ImuGetBaseRate>
337 {
339 
340  static constexpr inline FieldInfo value = {
341  {
342  /* .name = */ "commands_3dm::ImuGetBaseRate",
343  /* .title = */ "Get IMU Data Base Rate",
344  /* .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.",
345  /* .parameters = */ {},
346  },
347  /* .descriptor = */ type::DESCRIPTOR,
348  /* .functions = */ NO_FUNCTIONS,
349  /* .response = */ &MetadataFor<type::Response>::value,
350  };
351 };
352 
353 template<>
354 struct MetadataFor<commands_3dm::GnssGetBaseRate::Response>
355 {
357 
358  static constexpr inline ParameterInfo parameters[] = {
359  {
360  /* .name = */ "rate",
361  /* .docs = */ "[hz]",
362  /* .type = */ {Type::U16, nullptr},
363  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
364  /* .attributes = */ {true, false, false, false, false},
365  /* .count = */ 1,
366  /* .condition = */ {},
367  },
368  };
369 
370  static constexpr inline FieldInfo value = {
371  {
372  /* .name = */ "commands_3dm::GnssGetBaseRate::Response",
373  /* .title = */ "response",
374  /* .docs = */ "",
375  /* .parameters = */ parameters,
376  },
377  /* .descriptor = */ type::DESCRIPTOR,
378  /* .functions = */ NO_FUNCTIONS,
379  /* .response = */ nullptr,
380  };
381 };
382 
383 template<>
384 struct MetadataFor<commands_3dm::GnssGetBaseRate>
385 {
387 
388  static constexpr inline FieldInfo value = {
389  {
390  /* .name = */ "commands_3dm::GnssGetBaseRate",
391  /* .title = */ "Get GNSS Data Base Rate",
392  /* .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.",
393  /* .parameters = */ {},
394  },
395  /* .descriptor = */ type::DESCRIPTOR,
396  /* .functions = */ NO_FUNCTIONS,
397  /* .response = */ &MetadataFor<type::Response>::value,
398  };
399 };
400 
401 template<>
402 struct MetadataFor<commands_3dm::ImuMessageFormat::Response>
403 {
405 
406  static constexpr inline ParameterInfo parameters[] = {
407  {
408  /* .name = */ "num_descriptors",
409  /* .docs = */ "Number of descriptors",
410  /* .type = */ {Type::U8, nullptr},
411  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
412  /* .attributes = */ {true, false, false, false, false},
413  /* .count = */ 1,
414  /* .condition = */ {},
415  },
416  {
417  /* .name = */ "descriptors",
418  /* .docs = */ "Descriptor format list.",
420  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
421  /* .attributes = */ {true, false, false, false, false},
422  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
423  /* .condition = */ {},
424  },
425  };
426 
427  static constexpr inline FieldInfo value = {
428  {
429  /* .name = */ "commands_3dm::ImuMessageFormat::Response",
430  /* .title = */ "response",
431  /* .docs = */ "",
432  /* .parameters = */ parameters,
433  },
434  /* .descriptor = */ type::DESCRIPTOR,
435  /* .functions = */ NO_FUNCTIONS,
436  /* .response = */ nullptr,
437  };
438 };
439 
440 template<>
441 struct MetadataFor<commands_3dm::ImuMessageFormat>
442 {
444 
445  static constexpr inline ParameterInfo parameters[] = {
446  FUNCTION_SELECTOR_PARAM,
447  {
448  /* .name = */ "num_descriptors",
449  /* .docs = */ "Number of descriptors",
450  /* .type = */ {Type::U8, nullptr},
451  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
452  /* .attributes = */ {true, false, false, false, false},
453  /* .count = */ 1,
454  /* .condition = */ {},
455  },
456  {
457  /* .name = */ "descriptors",
458  /* .docs = */ "Descriptor format list.",
460  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
461  /* .attributes = */ {true, false, false, false, false},
462  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
463  /* .condition = */ {},
464  },
465  };
466 
467  static constexpr inline FieldInfo value = {
468  {
469  /* .name = */ "commands_3dm::ImuMessageFormat",
470  /* .title = */ "IMU Message Format",
471  /* .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.",
472  /* .parameters = */ parameters,
473  },
474  /* .descriptor = */ type::DESCRIPTOR,
475  /* .functions = */ {true, true, true, true, true},
476  /* .response = */ &MetadataFor<type::Response>::value,
477  };
478 };
479 
480 template<>
481 struct MetadataFor<commands_3dm::GnssMessageFormat::Response>
482 {
484 
485  static constexpr inline ParameterInfo parameters[] = {
486  {
487  /* .name = */ "num_descriptors",
488  /* .docs = */ "Number of descriptors",
489  /* .type = */ {Type::U8, nullptr},
490  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
491  /* .attributes = */ {true, false, false, false, false},
492  /* .count = */ 1,
493  /* .condition = */ {},
494  },
495  {
496  /* .name = */ "descriptors",
497  /* .docs = */ "Descriptor format list.",
499  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
500  /* .attributes = */ {true, false, false, false, false},
501  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
502  /* .condition = */ {},
503  },
504  };
505 
506  static constexpr inline FieldInfo value = {
507  {
508  /* .name = */ "commands_3dm::GnssMessageFormat::Response",
509  /* .title = */ "response",
510  /* .docs = */ "",
511  /* .parameters = */ parameters,
512  },
513  /* .descriptor = */ type::DESCRIPTOR,
514  /* .functions = */ NO_FUNCTIONS,
515  /* .response = */ nullptr,
516  };
517 };
518 
519 template<>
520 struct MetadataFor<commands_3dm::GnssMessageFormat>
521 {
523 
524  static constexpr inline ParameterInfo parameters[] = {
525  FUNCTION_SELECTOR_PARAM,
526  {
527  /* .name = */ "num_descriptors",
528  /* .docs = */ "Number of descriptors",
529  /* .type = */ {Type::U8, nullptr},
530  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
531  /* .attributes = */ {true, false, false, false, false},
532  /* .count = */ 1,
533  /* .condition = */ {},
534  },
535  {
536  /* .name = */ "descriptors",
537  /* .docs = */ "Descriptor format list.",
539  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
540  /* .attributes = */ {true, false, false, false, false},
541  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
542  /* .condition = */ {},
543  },
544  };
545 
546  static constexpr inline FieldInfo value = {
547  {
548  /* .name = */ "commands_3dm::GnssMessageFormat",
549  /* .title = */ "GNSS Message Format",
550  /* .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.",
551  /* .parameters = */ parameters,
552  },
553  /* .descriptor = */ type::DESCRIPTOR,
554  /* .functions = */ {true, true, true, true, true},
555  /* .response = */ &MetadataFor<type::Response>::value,
556  };
557 };
558 
559 template<>
560 struct MetadataFor<commands_3dm::FilterMessageFormat::Response>
561 {
563 
564  static constexpr inline ParameterInfo parameters[] = {
565  {
566  /* .name = */ "num_descriptors",
567  /* .docs = */ "Number of descriptors (limited by payload size)",
568  /* .type = */ {Type::U8, nullptr},
569  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
570  /* .attributes = */ {true, false, false, false, false},
571  /* .count = */ 1,
572  /* .condition = */ {},
573  },
574  {
575  /* .name = */ "descriptors",
576  /* .docs = */ "",
578  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
579  /* .attributes = */ {true, false, false, false, false},
580  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
581  /* .condition = */ {},
582  },
583  };
584 
585  static constexpr inline FieldInfo value = {
586  {
587  /* .name = */ "commands_3dm::FilterMessageFormat::Response",
588  /* .title = */ "response",
589  /* .docs = */ "",
590  /* .parameters = */ parameters,
591  },
592  /* .descriptor = */ type::DESCRIPTOR,
593  /* .functions = */ NO_FUNCTIONS,
594  /* .response = */ nullptr,
595  };
596 };
597 
598 template<>
599 struct MetadataFor<commands_3dm::FilterMessageFormat>
600 {
602 
603  static constexpr inline ParameterInfo parameters[] = {
604  FUNCTION_SELECTOR_PARAM,
605  {
606  /* .name = */ "num_descriptors",
607  /* .docs = */ "Number of descriptors (limited by payload size)",
608  /* .type = */ {Type::U8, nullptr},
609  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
610  /* .attributes = */ {true, false, false, false, false},
611  /* .count = */ 1,
612  /* .condition = */ {},
613  },
614  {
615  /* .name = */ "descriptors",
616  /* .docs = */ "",
618  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
619  /* .attributes = */ {true, false, false, false, false},
620  /* .count = */ {82, microstrain::Index(0) /* num_descriptors */},
621  /* .condition = */ {},
622  },
623  };
624 
625  static constexpr inline FieldInfo value = {
626  {
627  /* .name = */ "commands_3dm::FilterMessageFormat",
628  /* .title = */ "Estimation Filter Message Format",
629  /* .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.",
630  /* .parameters = */ parameters,
631  },
632  /* .descriptor = */ type::DESCRIPTOR,
633  /* .functions = */ {true, true, true, true, true},
634  /* .response = */ &MetadataFor<type::Response>::value,
635  };
636 };
637 
638 template<>
639 struct MetadataFor<commands_3dm::FilterGetBaseRate::Response>
640 {
642 
643  static constexpr inline ParameterInfo parameters[] = {
644  {
645  /* .name = */ "rate",
646  /* .docs = */ "[hz]",
647  /* .type = */ {Type::U16, nullptr},
648  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
649  /* .attributes = */ {true, false, false, false, false},
650  /* .count = */ 1,
651  /* .condition = */ {},
652  },
653  };
654 
655  static constexpr inline FieldInfo value = {
656  {
657  /* .name = */ "commands_3dm::FilterGetBaseRate::Response",
658  /* .title = */ "response",
659  /* .docs = */ "",
660  /* .parameters = */ parameters,
661  },
662  /* .descriptor = */ type::DESCRIPTOR,
663  /* .functions = */ NO_FUNCTIONS,
664  /* .response = */ nullptr,
665  };
666 };
667 
668 template<>
669 struct MetadataFor<commands_3dm::FilterGetBaseRate>
670 {
672 
673  static constexpr inline FieldInfo value = {
674  {
675  /* .name = */ "commands_3dm::FilterGetBaseRate",
676  /* .title = */ "Get Estimation Filter Data Base Rate",
677  /* .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.",
678  /* .parameters = */ {},
679  },
680  /* .descriptor = */ type::DESCRIPTOR,
681  /* .functions = */ NO_FUNCTIONS,
682  /* .response = */ &MetadataFor<type::Response>::value,
683  };
684 };
685 
686 template<>
687 struct MetadataFor<commands_3dm::NmeaMessageFormat::Response>
688 {
690 
691  static constexpr inline ParameterInfo parameters[] = {
692  {
693  /* .name = */ "count",
694  /* .docs = */ "Number of format entries (limited by payload size)",
695  /* .type = */ {Type::U8, nullptr},
696  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
697  /* .attributes = */ {true, false, false, false, false},
698  /* .count = */ 1,
699  /* .condition = */ {},
700  },
701  {
702  /* .name = */ "format_entries",
703  /* .docs = */ "List of format entries.",
705  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage, &type::format_entries>,
706  /* .attributes = */ {true, false, false, false, false},
707  /* .count = */ {40, microstrain::Index(0) /* count */},
708  /* .condition = */ {},
709  },
710  };
711 
712  static constexpr inline FieldInfo value = {
713  {
714  /* .name = */ "commands_3dm::NmeaMessageFormat::Response",
715  /* .title = */ "response",
716  /* .docs = */ "",
717  /* .parameters = */ parameters,
718  },
719  /* .descriptor = */ type::DESCRIPTOR,
720  /* .functions = */ NO_FUNCTIONS,
721  /* .response = */ nullptr,
722  };
723 };
724 
725 template<>
726 struct MetadataFor<commands_3dm::NmeaMessageFormat>
727 {
729 
730  static constexpr inline ParameterInfo parameters[] = {
731  FUNCTION_SELECTOR_PARAM,
732  {
733  /* .name = */ "count",
734  /* .docs = */ "Number of format entries (limited by payload size)",
735  /* .type = */ {Type::U8, nullptr},
736  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
737  /* .attributes = */ {true, false, false, false, false},
738  /* .count = */ 1,
739  /* .condition = */ {},
740  },
741  {
742  /* .name = */ "format_entries",
743  /* .docs = */ "List of format entries.",
745  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::NmeaMessage, &type::format_entries>,
746  /* .attributes = */ {true, false, false, false, false},
747  /* .count = */ {40, microstrain::Index(0) /* count */},
748  /* .condition = */ {},
749  },
750  };
751 
752  static constexpr inline FieldInfo value = {
753  {
754  /* .name = */ "commands_3dm::NmeaMessageFormat",
755  /* .title = */ "NMEA Message Format",
756  /* .docs = */ "Set, read, or save the NMEA message format.",
757  /* .parameters = */ parameters,
758  },
759  /* .descriptor = */ type::DESCRIPTOR,
760  /* .functions = */ {true, true, true, true, true},
761  /* .response = */ &MetadataFor<type::Response>::value,
762  };
763 };
764 
765 template<>
766 struct MetadataFor<commands_3dm::PollData>
767 {
769 
770  static constexpr inline ParameterInfo parameters[] = {
771  {
772  /* .name = */ "desc_set",
773  /* .docs = */ "Data descriptor set. Must be supported.",
774  /* .type = */ {Type::U8, nullptr},
775  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
776  /* .attributes = */ {true, false, false, false, false},
777  /* .count = */ 1,
778  /* .condition = */ {},
779  },
780  {
781  /* .name = */ "suppress_ack",
782  /* .docs = */ "Suppress the usual ACK/NACK reply.",
783  /* .type = */ {Type::BOOL, nullptr},
784  /* .accessor = */ nullptr, //utils::access<type, bool, &type::suppress_ack>,
785  /* .attributes = */ {true, false, false, false, false},
786  /* .count = */ 1,
787  /* .condition = */ {},
788  },
789  {
790  /* .name = */ "num_descriptors",
791  /* .docs = */ "Number of descriptors in the format list.",
792  /* .type = */ {Type::U8, nullptr},
793  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
794  /* .attributes = */ {true, false, false, false, false},
795  /* .count = */ 1,
796  /* .condition = */ {},
797  },
798  {
799  /* .name = */ "descriptors",
800  /* .docs = */ "Descriptor format list.",
801  /* .type = */ {Type::U8, nullptr},
802  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::descriptors>,
803  /* .attributes = */ {true, false, false, false, false},
804  /* .count = */ {82, microstrain::Index(2) /* num_descriptors */},
805  /* .condition = */ {},
806  },
807  };
808 
809  static constexpr inline FieldInfo value = {
810  {
811  /* .name = */ "commands_3dm::PollData",
812  /* .title = */ "Poll Data",
813  /* .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.",
814  /* .parameters = */ parameters,
815  },
816  /* .descriptor = */ type::DESCRIPTOR,
817  /* .functions = */ NO_FUNCTIONS,
818  /* .response = */ nullptr,
819  };
820 };
821 
822 template<>
823 struct MetadataFor<commands_3dm::GetBaseRate::Response>
824 {
826 
827  static constexpr inline ParameterInfo parameters[] = {
828  {
829  /* .name = */ "desc_set",
830  /* .docs = */ "Echoes the parameter in the command.",
831  /* .type = */ {Type::U8, nullptr},
832  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
833  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
834  /* .count = */ 1,
835  /* .condition = */ {},
836  },
837  {
838  /* .name = */ "rate",
839  /* .docs = */ "Base rate in Hz (0 = variable, unknown, or user-defined rate. Data will be sent when received).",
840  /* .type = */ {Type::U16, nullptr},
841  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::rate>,
842  /* .attributes = */ {true, false, false, false, false},
843  /* .count = */ 1,
844  /* .condition = */ {},
845  },
846  };
847 
848  static constexpr inline FieldInfo value = {
849  {
850  /* .name = */ "commands_3dm::GetBaseRate::Response",
851  /* .title = */ "response",
852  /* .docs = */ "",
853  /* .parameters = */ parameters,
854  },
855  /* .descriptor = */ type::DESCRIPTOR,
856  /* .functions = */ NO_FUNCTIONS,
857  /* .response = */ nullptr,
858  };
859 };
860 
861 template<>
862 struct MetadataFor<commands_3dm::GetBaseRate>
863 {
865 
866  static constexpr inline ParameterInfo parameters[] = {
867  {
868  /* .name = */ "desc_set",
869  /* .docs = */ "This is the data descriptor set. It must be a supported descriptor.",
870  /* .type = */ {Type::U8, nullptr},
871  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
872  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
873  /* .count = */ 1,
874  /* .condition = */ {},
875  },
876  };
877 
878  static constexpr inline FieldInfo value = {
879  {
880  /* .name = */ "commands_3dm::GetBaseRate",
881  /* .title = */ "Get Data Base Rate",
882  /* .docs = */ "Get the base rate for the specified descriptor set in Hz.",
883  /* .parameters = */ parameters,
884  },
885  /* .descriptor = */ type::DESCRIPTOR,
886  /* .functions = */ NO_FUNCTIONS,
887  /* .response = */ &MetadataFor<type::Response>::value,
888  };
889 };
890 
891 template<>
892 struct MetadataFor<commands_3dm::MessageFormat::Response>
893 {
895 
896  static constexpr inline ParameterInfo parameters[] = {
897  {
898  /* .name = */ "desc_set",
899  /* .docs = */ "Echoes the descriptor set from the command.",
900  /* .type = */ {Type::U8, nullptr},
901  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
902  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
903  /* .count = */ 1,
904  /* .condition = */ {},
905  },
906  {
907  /* .name = */ "num_descriptors",
908  /* .docs = */ "Number of descriptors in the list.",
909  /* .type = */ {Type::U8, nullptr},
910  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
911  /* .attributes = */ {true, false, false, false, false},
912  /* .count = */ 1,
913  /* .condition = */ {},
914  },
915  {
916  /* .name = */ "descriptors",
917  /* .docs = */ "List of descriptors and decimations.",
919  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
920  /* .attributes = */ {true, false, false, false, false},
921  /* .count = */ {82, microstrain::Index(1) /* num_descriptors */},
922  /* .condition = */ {},
923  },
924  };
925 
926  static constexpr inline FieldInfo value = {
927  {
928  /* .name = */ "commands_3dm::MessageFormat::Response",
929  /* .title = */ "response",
930  /* .docs = */ "",
931  /* .parameters = */ parameters,
932  },
933  /* .descriptor = */ type::DESCRIPTOR,
934  /* .functions = */ NO_FUNCTIONS,
935  /* .response = */ nullptr,
936  };
937 };
938 
939 template<>
940 struct MetadataFor<commands_3dm::MessageFormat>
941 {
943 
944  static constexpr inline ParameterInfo parameters[] = {
945  FUNCTION_SELECTOR_PARAM,
946  {
947  /* .name = */ "desc_set",
948  /* .docs = */ "Data descriptor set. Must be supported. When function is SAVE, LOAD, or DEFAULT, can be 0 to apply to all descriptor sets.",
949  /* .type = */ {Type::U8, nullptr},
950  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
951  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
952  /* .count = */ 1,
953  /* .condition = */ {},
954  },
955  {
956  /* .name = */ "num_descriptors",
957  /* .docs = */ "Number of descriptors (limited by payload size)",
958  /* .type = */ {Type::U8, nullptr},
959  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_descriptors>,
960  /* .attributes = */ {true, false, false, false, false},
961  /* .count = */ 1,
962  /* .condition = */ {},
963  },
964  {
965  /* .name = */ "descriptors",
966  /* .docs = */ "List of descriptors and decimations.",
968  /* .accessor = */ nullptr, //utils::access<type, DescriptorRate, &type::descriptors>,
969  /* .attributes = */ {true, false, false, false, false},
970  /* .count = */ {82, microstrain::Index(1) /* num_descriptors */},
971  /* .condition = */ {},
972  },
973  };
974 
975  static constexpr inline FieldInfo value = {
976  {
977  /* .name = */ "commands_3dm::MessageFormat",
978  /* .title = */ "Message Format",
979  /* .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.",
980  /* .parameters = */ parameters,
981  },
982  /* .descriptor = */ type::DESCRIPTOR,
983  /* .functions = */ {true, true, true, true, true},
984  /* .response = */ &MetadataFor<type::Response>::value,
985  };
986 };
987 
988 template<>
989 struct MetadataFor<commands_3dm::FactoryStreaming::Action>
990 {
992 
993  static constexpr inline EnumInfo::Entry entries[] = {
994  { uint32_t(0), "OVERWRITE", "Replaces the message format(s), removing any existing descriptors." },
995  { uint32_t(1), "MERGE", "Merges support descriptors into existing format(s). May reorder descriptors." },
996  { uint32_t(2), "ADD", "Adds descriptors to the current message format(s) without changing existing descriptors. May result in duplicates." },
997  };
998 
999  static constexpr inline EnumInfo value = {
1000  /* .name = */ "Action",
1001  /* .docs = */ "",
1002  /* .type = */ Type::U8,
1003  /* .entries = */ entries,
1004  };
1005 
1006 };
1007 
1008 template<>
1009 struct MetadataFor<commands_3dm::FactoryStreaming>
1010 {
1012 
1013  static constexpr inline ParameterInfo parameters[] = {
1014  {
1015  /* .name = */ "action",
1016  /* .docs = */ "",
1018  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::FactoryStreaming::Action, &type::action>,
1019  /* .attributes = */ {true, false, false, false, false},
1020  /* .count = */ 1,
1021  /* .condition = */ {},
1022  },
1023  {
1024  /* .name = */ "reserved",
1025  /* .docs = */ "Reserved. Set to 0x00.",
1026  /* .type = */ {Type::U8, nullptr},
1027  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
1028  /* .attributes = */ {true, false, false, false, false},
1029  /* .count = */ 1,
1030  /* .condition = */ {},
1031  },
1032  };
1033 
1034  static constexpr inline FieldInfo value = {
1035  {
1036  /* .name = */ "commands_3dm::FactoryStreaming",
1037  /* .title = */ "Factory Streaming",
1038  /* .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.",
1039  /* .parameters = */ parameters,
1040  },
1041  /* .descriptor = */ type::DESCRIPTOR,
1042  /* .functions = */ NO_FUNCTIONS,
1043  /* .response = */ nullptr,
1044  };
1045 };
1046 
1047 template<>
1048 struct MetadataFor<commands_3dm::DatastreamControl::Response>
1049 {
1051 
1052  static constexpr inline ParameterInfo parameters[] = {
1053  {
1054  /* .name = */ "desc_set",
1055  /* .docs = */ "",
1056  /* .type = */ {Type::U8, nullptr},
1057  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
1058  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
1059  /* .count = */ 1,
1060  /* .condition = */ {},
1061  },
1062  {
1063  /* .name = */ "enabled",
1064  /* .docs = */ "",
1065  /* .type = */ {Type::BOOL, nullptr},
1066  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enabled>,
1067  /* .attributes = */ {true, false, false, false, false},
1068  /* .count = */ 1,
1069  /* .condition = */ {},
1070  },
1071  };
1072 
1073  static constexpr inline FieldInfo value = {
1074  {
1075  /* .name = */ "commands_3dm::DatastreamControl::Response",
1076  /* .title = */ "response",
1077  /* .docs = */ "",
1078  /* .parameters = */ parameters,
1079  },
1080  /* .descriptor = */ type::DESCRIPTOR,
1081  /* .functions = */ NO_FUNCTIONS,
1082  /* .response = */ nullptr,
1083  };
1084 };
1085 
1086 template<>
1087 struct MetadataFor<commands_3dm::DatastreamControl>
1088 {
1090 
1091  static constexpr inline ParameterInfo parameters[] = {
1092  FUNCTION_SELECTOR_PARAM,
1093  {
1094  /* .name = */ "desc_set",
1095  /* .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.",
1096  /* .type = */ {Type::U8, nullptr},
1097  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
1098  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
1099  /* .count = */ 1,
1100  /* .condition = */ {},
1101  },
1102  {
1103  /* .name = */ "enable",
1104  /* .docs = */ "True or false to enable or disable the stream.",
1105  /* .type = */ {Type::BOOL, nullptr},
1106  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
1107  /* .attributes = */ {true, false, false, false, false},
1108  /* .count = */ 1,
1109  /* .condition = */ {},
1110  },
1111  };
1112 
1113  static constexpr inline FieldInfo value = {
1114  {
1115  /* .name = */ "commands_3dm::DatastreamControl",
1116  /* .title = */ "Data Stream Control",
1117  /* .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.",
1118  /* .parameters = */ parameters,
1119  },
1120  /* .descriptor = */ type::DESCRIPTOR,
1121  /* .functions = */ {true, true, true, true, true},
1122  /* .response = */ &MetadataFor<type::Response>::value,
1123  };
1124 };
1125 
1126 template<>
1127 struct MetadataFor<commands_3dm::ConstellationSettings::ConstellationId>
1128 {
1130 
1131  static constexpr inline EnumInfo::Entry entries[] = {
1132  { uint32_t(0), "GPS", "GPS (G1-G32)" },
1133  { uint32_t(1), "SBAS", "SBAS (S120-S158)" },
1134  { uint32_t(2), "GALILEO", "GALILEO (E1-E36)" },
1135  { uint32_t(3), "BeiDou", "BeiDou (B1-B37)" },
1136  { uint32_t(5), "QZSS", "QZSS (Q1-Q5)" },
1137  { uint32_t(6), "GLONASS", "GLONASS (R1-R32)" },
1138  };
1139 
1140  static constexpr inline EnumInfo value = {
1141  /* .name = */ "ConstellationId",
1142  /* .docs = */ "",
1143  /* .type = */ Type::U8,
1144  /* .entries = */ entries,
1145  };
1146 
1147 };
1148 
1149 template<>
1150 struct MetadataFor<commands_3dm::ConstellationSettings::OptionFlags>
1151 {
1153 
1154  static constexpr inline BitfieldInfo::Entry entries[] = {
1155  { uint32_t(1), "L1SAIF", "Available only for QZSS" },
1156  };
1157 
1158  static constexpr inline BitfieldInfo value = {
1159  /* .name = */ "OptionFlags",
1160  /* .docs = */ "",
1161  /* .type = */ Type::U16,
1162  /* .entries = */ entries,
1163  };
1164 
1165 };
1166 
1167 template<>
1168 struct MetadataFor<commands_3dm::ConstellationSettings::Settings>
1169 {
1171 
1172  static constexpr inline ParameterInfo parameters[] = {
1173  {
1174  /* .name = */ "constellation_id",
1175  /* .docs = */ "Constellation ID",
1177  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::ConstellationId, &type::constellation_id>,
1178  /* .attributes = */ NO_FUNCTIONS,
1179  /* .count = */ 1,
1180  /* .condition = */ {},
1181  },
1182  {
1183  /* .name = */ "enable",
1184  /* .docs = */ "Enable/Disable constellation",
1185  /* .type = */ {Type::U8, nullptr},
1186  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::enable>,
1187  /* .attributes = */ NO_FUNCTIONS,
1188  /* .count = */ 1,
1189  /* .condition = */ {},
1190  },
1191  {
1192  /* .name = */ "reserved_channels",
1193  /* .docs = */ "Minimum number of channels reserved for this constellation",
1194  /* .type = */ {Type::U8, nullptr},
1195  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved_channels>,
1196  /* .attributes = */ NO_FUNCTIONS,
1197  /* .count = */ 1,
1198  /* .condition = */ {},
1199  },
1200  {
1201  /* .name = */ "max_channels",
1202  /* .docs = */ "Maximum number of channels to use for this constallation",
1203  /* .type = */ {Type::U8, nullptr},
1204  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::max_channels>,
1205  /* .attributes = */ NO_FUNCTIONS,
1206  /* .count = */ 1,
1207  /* .condition = */ {},
1208  },
1209  {
1210  /* .name = */ "option_flags",
1211  /* .docs = */ "Constellation option Flags",
1213  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::OptionFlags, &type::option_flags>,
1214  /* .attributes = */ NO_FUNCTIONS,
1215  /* .count = */ 1,
1216  /* .condition = */ {},
1217  },
1218  };
1219 
1220  static constexpr inline StructInfo value = {
1221  /* .name = */ "Settings",
1222  /* .title = */ "Settings",
1223  /* .docs = */ "",
1224  /* .parameters = */ parameters,
1225  };
1226 };
1227 
1228 template<>
1229 struct MetadataFor<commands_3dm::ConstellationSettings::Response>
1230 {
1232 
1233  static constexpr inline ParameterInfo parameters[] = {
1234  {
1235  /* .name = */ "max_channels_available",
1236  /* .docs = */ "Maximum channels available",
1237  /* .type = */ {Type::U16, nullptr},
1238  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::max_channels_available>,
1239  /* .attributes = */ {true, false, false, false, false},
1240  /* .count = */ 1,
1241  /* .condition = */ {},
1242  },
1243  {
1244  /* .name = */ "max_channels_use",
1245  /* .docs = */ "Maximum channels to use",
1246  /* .type = */ {Type::U16, nullptr},
1247  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::max_channels_use>,
1248  /* .attributes = */ {true, false, false, false, false},
1249  /* .count = */ 1,
1250  /* .condition = */ {},
1251  },
1252  {
1253  /* .name = */ "config_count",
1254  /* .docs = */ "Number of constellation configurations",
1255  /* .type = */ {Type::U8, nullptr},
1256  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::config_count>,
1257  /* .attributes = */ {true, false, false, false, false},
1258  /* .count = */ 1,
1259  /* .condition = */ {},
1260  },
1261  {
1262  /* .name = */ "settings",
1263  /* .docs = */ "Constellation Settings",
1265  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::Settings, &type::settings>,
1266  /* .attributes = */ {true, false, false, false, false},
1267  /* .count = */ {0, microstrain::Index(2) /* config_count */},
1268  /* .condition = */ {},
1269  },
1270  };
1271 
1272  static constexpr inline FieldInfo value = {
1273  {
1274  /* .name = */ "commands_3dm::ConstellationSettings::Response",
1275  /* .title = */ "response",
1276  /* .docs = */ "",
1277  /* .parameters = */ parameters,
1278  },
1279  /* .descriptor = */ type::DESCRIPTOR,
1280  /* .functions = */ NO_FUNCTIONS,
1281  /* .response = */ nullptr,
1282  };
1283 };
1284 
1285 template<>
1286 struct MetadataFor<commands_3dm::ConstellationSettings>
1287 {
1289 
1290  static constexpr inline ParameterInfo parameters[] = {
1291  FUNCTION_SELECTOR_PARAM,
1292  {
1293  /* .name = */ "max_channels",
1294  /* .docs = */ "",
1295  /* .type = */ {Type::U16, nullptr},
1296  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::max_channels>,
1297  /* .attributes = */ {true, false, false, false, false},
1298  /* .count = */ 1,
1299  /* .condition = */ {},
1300  },
1301  {
1302  /* .name = */ "config_count",
1303  /* .docs = */ "",
1304  /* .type = */ {Type::U8, nullptr},
1305  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::config_count>,
1306  /* .attributes = */ {true, false, false, false, false},
1307  /* .count = */ 1,
1308  /* .condition = */ {},
1309  },
1310  {
1311  /* .name = */ "settings",
1312  /* .docs = */ "",
1314  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::ConstellationSettings::Settings, &type::settings>,
1315  /* .attributes = */ {true, false, false, false, false},
1316  /* .count = */ {0, microstrain::Index(1) /* config_count */},
1317  /* .condition = */ {},
1318  },
1319  };
1320 
1321  static constexpr inline FieldInfo value = {
1322  {
1323  /* .name = */ "commands_3dm::ConstellationSettings",
1324  /* .title = */ "Constellation Settings",
1325  /* .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.",
1326  /* .parameters = */ parameters,
1327  },
1328  /* .descriptor = */ type::DESCRIPTOR,
1329  /* .functions = */ {true, true, true, true, true},
1330  /* .response = */ &MetadataFor<type::Response>::value,
1331  };
1332 };
1333 
1334 template<>
1335 struct MetadataFor<commands_3dm::GnssSbasSettings::SBASOptions>
1336 {
1338 
1339  static constexpr inline BitfieldInfo::Entry entries[] = {
1340  { uint32_t(1), "enable_ranging", "Use SBAS pseudoranges in position solution" },
1341  { uint32_t(2), "enable_corrections", "Use SBAS differential corrections" },
1342  { uint32_t(4), "apply_integrity", "Use SBAS integrity information. If enabled, only GPS satellites for which integrity information is available will be used." },
1343  };
1344 
1345  static constexpr inline BitfieldInfo value = {
1346  /* .name = */ "SBASOptions",
1347  /* .docs = */ "",
1348  /* .type = */ Type::U16,
1349  /* .entries = */ entries,
1350  };
1351 
1352 };
1353 
1354 template<>
1355 struct MetadataFor<commands_3dm::GnssSbasSettings::Response>
1356 {
1358 
1359  static constexpr inline ParameterInfo parameters[] = {
1360  {
1361  /* .name = */ "enable_sbas",
1362  /* .docs = */ "0 - SBAS Disabled, 1 - SBAS enabled",
1363  /* .type = */ {Type::U8, nullptr},
1364  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::enable_sbas>,
1365  /* .attributes = */ {true, false, false, false, false},
1366  /* .count = */ 1,
1367  /* .condition = */ {},
1368  },
1369  {
1370  /* .name = */ "sbas_options",
1371  /* .docs = */ "SBAS options, see definition",
1373  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssSbasSettings::SBASOptions, &type::sbas_options>,
1374  /* .attributes = */ {true, false, false, false, false},
1375  /* .count = */ 1,
1376  /* .condition = */ {},
1377  },
1378  {
1379  /* .name = */ "num_included_prns",
1380  /* .docs = */ "Number of SBAS PRNs to include in search (0 = include all)",
1381  /* .type = */ {Type::U8, nullptr},
1382  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_included_prns>,
1383  /* .attributes = */ {true, false, false, false, false},
1384  /* .count = */ 1,
1385  /* .condition = */ {},
1386  },
1387  {
1388  /* .name = */ "included_prns",
1389  /* .docs = */ "List of specific SBAS PRNs to search for",
1390  /* .type = */ {Type::U16, nullptr},
1391  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::included_prns>,
1392  /* .attributes = */ {true, false, false, false, false},
1393  /* .count = */ {39, microstrain::Index(2) /* num_included_prns */},
1394  /* .condition = */ {},
1395  },
1396  };
1397 
1398  static constexpr inline FieldInfo value = {
1399  {
1400  /* .name = */ "commands_3dm::GnssSbasSettings::Response",
1401  /* .title = */ "response",
1402  /* .docs = */ "",
1403  /* .parameters = */ parameters,
1404  },
1405  /* .descriptor = */ type::DESCRIPTOR,
1406  /* .functions = */ NO_FUNCTIONS,
1407  /* .response = */ nullptr,
1408  };
1409 };
1410 
1411 template<>
1412 struct MetadataFor<commands_3dm::GnssSbasSettings>
1413 {
1415 
1416  static constexpr inline ParameterInfo parameters[] = {
1417  FUNCTION_SELECTOR_PARAM,
1418  {
1419  /* .name = */ "enable_sbas",
1420  /* .docs = */ "0 - SBAS Disabled, 1 - SBAS enabled",
1421  /* .type = */ {Type::U8, nullptr},
1422  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::enable_sbas>,
1423  /* .attributes = */ {true, false, false, false, false},
1424  /* .count = */ 1,
1425  /* .condition = */ {},
1426  },
1427  {
1428  /* .name = */ "sbas_options",
1429  /* .docs = */ "SBAS options, see definition",
1431  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssSbasSettings::SBASOptions, &type::sbas_options>,
1432  /* .attributes = */ {true, false, false, false, false},
1433  /* .count = */ 1,
1434  /* .condition = */ {},
1435  },
1436  {
1437  /* .name = */ "num_included_prns",
1438  /* .docs = */ "Number of SBAS PRNs to include in search (0 = include all)",
1439  /* .type = */ {Type::U8, nullptr},
1440  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_included_prns>,
1441  /* .attributes = */ {true, false, false, false, false},
1442  /* .count = */ 1,
1443  /* .condition = */ {},
1444  },
1445  {
1446  /* .name = */ "included_prns",
1447  /* .docs = */ "List of specific SBAS PRNs to search for",
1448  /* .type = */ {Type::U16, nullptr},
1449  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::included_prns>,
1450  /* .attributes = */ {true, false, false, false, false},
1451  /* .count = */ {39, microstrain::Index(2) /* num_included_prns */},
1452  /* .condition = */ {},
1453  },
1454  };
1455 
1456  static constexpr inline FieldInfo value = {
1457  {
1458  /* .name = */ "commands_3dm::GnssSbasSettings",
1459  /* .title = */ "GNSS SBAS Settings",
1460  /* .docs = */ "Configure the GNSS SBAS subsystem",
1461  /* .parameters = */ parameters,
1462  },
1463  /* .descriptor = */ type::DESCRIPTOR,
1464  /* .functions = */ {true, true, true, true, true},
1465  /* .response = */ &MetadataFor<type::Response>::value,
1466  };
1467 };
1468 
1469 template<>
1470 struct MetadataFor<commands_3dm::GnssAssistedFix::AssistedFixOption>
1471 {
1473 
1474  static constexpr inline EnumInfo::Entry entries[] = {
1475  { uint32_t(0), "NONE", "No assisted fix (default)" },
1476  { uint32_t(1), "ENABLED", "Enable assisted fix" },
1477  };
1478 
1479  static constexpr inline EnumInfo value = {
1480  /* .name = */ "AssistedFixOption",
1481  /* .docs = */ "",
1482  /* .type = */ Type::U8,
1483  /* .entries = */ entries,
1484  };
1485 
1486 };
1487 
1488 template<>
1489 struct MetadataFor<commands_3dm::GnssAssistedFix::Response>
1490 {
1492 
1493  static constexpr inline ParameterInfo parameters[] = {
1494  {
1495  /* .name = */ "option",
1496  /* .docs = */ "Assisted fix options",
1498  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssAssistedFix::AssistedFixOption, &type::option>,
1499  /* .attributes = */ {true, false, false, false, false},
1500  /* .count = */ 1,
1501  /* .condition = */ {},
1502  },
1503  {
1504  /* .name = */ "flags",
1505  /* .docs = */ "Assisted fix flags (set to 0xFF)",
1506  /* .type = */ {Type::U8, nullptr},
1507  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::flags>,
1508  /* .attributes = */ {true, false, false, false, false},
1509  /* .count = */ 1,
1510  /* .condition = */ {},
1511  },
1512  };
1513 
1514  static constexpr inline FieldInfo value = {
1515  {
1516  /* .name = */ "commands_3dm::GnssAssistedFix::Response",
1517  /* .title = */ "response",
1518  /* .docs = */ "",
1519  /* .parameters = */ parameters,
1520  },
1521  /* .descriptor = */ type::DESCRIPTOR,
1522  /* .functions = */ NO_FUNCTIONS,
1523  /* .response = */ nullptr,
1524  };
1525 };
1526 
1527 template<>
1528 struct MetadataFor<commands_3dm::GnssAssistedFix>
1529 {
1531 
1532  static constexpr inline ParameterInfo parameters[] = {
1533  FUNCTION_SELECTOR_PARAM,
1534  {
1535  /* .name = */ "option",
1536  /* .docs = */ "Assisted fix options",
1538  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GnssAssistedFix::AssistedFixOption, &type::option>,
1539  /* .attributes = */ {true, false, false, false, false},
1540  /* .count = */ 1,
1541  /* .condition = */ {},
1542  },
1543  {
1544  /* .name = */ "flags",
1545  /* .docs = */ "Assisted fix flags (set to 0xFF)",
1546  /* .type = */ {Type::U8, nullptr},
1547  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::flags>,
1548  /* .attributes = */ {true, false, false, false, false},
1549  /* .count = */ 1,
1550  /* .condition = */ {},
1551  },
1552  };
1553 
1554  static constexpr inline FieldInfo value = {
1555  {
1556  /* .name = */ "commands_3dm::GnssAssistedFix",
1557  /* .title = */ "GNSS Assisted Fix Settings",
1558  /* .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",
1559  /* .parameters = */ parameters,
1560  },
1561  /* .descriptor = */ type::DESCRIPTOR,
1562  /* .functions = */ {true, true, true, true, true},
1563  /* .response = */ &MetadataFor<type::Response>::value,
1564  };
1565 };
1566 
1567 template<>
1568 struct MetadataFor<commands_3dm::GnssTimeAssistance::Response>
1569 {
1571 
1572  static constexpr inline ParameterInfo parameters[] = {
1573  {
1574  /* .name = */ "tow",
1575  /* .docs = */ "GPS Time of week [seconds]",
1576  /* .type = */ {Type::DOUBLE, nullptr},
1577  /* .accessor = */ nullptr, //utils::access<type, double, &type::tow>,
1578  /* .attributes = */ {true, false, false, false, false},
1579  /* .count = */ 1,
1580  /* .condition = */ {},
1581  },
1582  {
1583  /* .name = */ "week_number",
1584  /* .docs = */ "GPS Weeks since 1980 [weeks]",
1585  /* .type = */ {Type::U16, nullptr},
1586  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1587  /* .attributes = */ {true, false, false, false, false},
1588  /* .count = */ 1,
1589  /* .condition = */ {},
1590  },
1591  {
1592  /* .name = */ "accuracy",
1593  /* .docs = */ "Accuracy of time information [seconds]",
1594  /* .type = */ {Type::FLOAT, nullptr},
1595  /* .accessor = */ nullptr, //utils::access<type, float, &type::accuracy>,
1596  /* .attributes = */ {true, false, false, false, false},
1597  /* .count = */ 1,
1598  /* .condition = */ {},
1599  },
1600  };
1601 
1602  static constexpr inline FieldInfo value = {
1603  {
1604  /* .name = */ "commands_3dm::GnssTimeAssistance::Response",
1605  /* .title = */ "response",
1606  /* .docs = */ "",
1607  /* .parameters = */ parameters,
1608  },
1609  /* .descriptor = */ type::DESCRIPTOR,
1610  /* .functions = */ NO_FUNCTIONS,
1611  /* .response = */ nullptr,
1612  };
1613 };
1614 
1615 template<>
1616 struct MetadataFor<commands_3dm::GnssTimeAssistance>
1617 {
1619 
1620  static constexpr inline ParameterInfo parameters[] = {
1621  FUNCTION_SELECTOR_PARAM,
1622  {
1623  /* .name = */ "tow",
1624  /* .docs = */ "GPS Time of week [seconds]",
1625  /* .type = */ {Type::DOUBLE, nullptr},
1626  /* .accessor = */ nullptr, //utils::access<type, double, &type::tow>,
1627  /* .attributes = */ {true, false, false, false, false},
1628  /* .count = */ 1,
1629  /* .condition = */ {},
1630  },
1631  {
1632  /* .name = */ "week_number",
1633  /* .docs = */ "GPS Weeks since 1980 [weeks]",
1634  /* .type = */ {Type::U16, nullptr},
1635  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::week_number>,
1636  /* .attributes = */ {true, false, false, false, false},
1637  /* .count = */ 1,
1638  /* .condition = */ {},
1639  },
1640  {
1641  /* .name = */ "accuracy",
1642  /* .docs = */ "Accuracy of time information [seconds]",
1643  /* .type = */ {Type::FLOAT, nullptr},
1644  /* .accessor = */ nullptr, //utils::access<type, float, &type::accuracy>,
1645  /* .attributes = */ {true, false, false, false, false},
1646  /* .count = */ 1,
1647  /* .condition = */ {},
1648  },
1649  };
1650 
1651  static constexpr inline FieldInfo value = {
1652  {
1653  /* .name = */ "commands_3dm::GnssTimeAssistance",
1654  /* .title = */ "GNSS Time Assistance",
1655  /* .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).",
1656  /* .parameters = */ parameters,
1657  },
1658  /* .descriptor = */ type::DESCRIPTOR,
1659  /* .functions = */ {true, true, false, false, false},
1660  /* .response = */ &MetadataFor<type::Response>::value,
1661  };
1662 };
1663 
1664 template<>
1665 struct MetadataFor<commands_3dm::PpsSource::Source>
1666 {
1668 
1669  static constexpr inline EnumInfo::Entry entries[] = {
1670  { uint32_t(0), "DISABLED", "PPS output is disabled. Not valid for PPS source command." },
1671  { uint32_t(1), "RECEIVER_1", "PPS is provided by GNSS receiver 1." },
1672  { uint32_t(2), "RECEIVER_2", "PPS is provided by GNSS receiver 2." },
1673  { uint32_t(3), "GPIO", "PPS is provided to an external GPIO pin. Use the GPIO Setup command to choose and configure the pin." },
1674  { uint32_t(4), "GENERATED", "PPS is generated from the system oscillator." },
1675  };
1676 
1677  static constexpr inline EnumInfo value = {
1678  /* .name = */ "Source",
1679  /* .docs = */ "",
1680  /* .type = */ Type::U8,
1681  /* .entries = */ entries,
1682  };
1683 
1684 };
1685 
1686 template<>
1687 struct MetadataFor<commands_3dm::PpsSource::Response>
1688 {
1690 
1691  static constexpr inline ParameterInfo parameters[] = {
1692  {
1693  /* .name = */ "source",
1694  /* .docs = */ "",
1696  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::PpsSource::Source, &type::source>,
1697  /* .attributes = */ {true, false, false, false, false},
1698  /* .count = */ 1,
1699  /* .condition = */ {},
1700  },
1701  };
1702 
1703  static constexpr inline FieldInfo value = {
1704  {
1705  /* .name = */ "commands_3dm::PpsSource::Response",
1706  /* .title = */ "response",
1707  /* .docs = */ "",
1708  /* .parameters = */ parameters,
1709  },
1710  /* .descriptor = */ type::DESCRIPTOR,
1711  /* .functions = */ NO_FUNCTIONS,
1712  /* .response = */ nullptr,
1713  };
1714 };
1715 
1716 template<>
1717 struct MetadataFor<commands_3dm::PpsSource>
1718 {
1720 
1721  static constexpr inline ParameterInfo parameters[] = {
1722  FUNCTION_SELECTOR_PARAM,
1723  {
1724  /* .name = */ "source",
1725  /* .docs = */ "",
1727  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::PpsSource::Source, &type::source>,
1728  /* .attributes = */ {true, false, false, false, false},
1729  /* .count = */ 1,
1730  /* .condition = */ {},
1731  },
1732  };
1733 
1734  static constexpr inline FieldInfo value = {
1735  {
1736  /* .name = */ "commands_3dm::PpsSource",
1737  /* .title = */ "PPS Source Control",
1738  /* .docs = */ "Controls the Pulse Per Second (PPS) source.",
1739  /* .parameters = */ parameters,
1740  },
1741  /* .descriptor = */ type::DESCRIPTOR,
1742  /* .functions = */ {true, true, true, true, true},
1743  /* .response = */ &MetadataFor<type::Response>::value,
1744  };
1745 };
1746 
1747 template<>
1748 struct MetadataFor<commands_3dm::GetEventSupport::Query>
1749 {
1751 
1752  static constexpr inline EnumInfo::Entry entries[] = {
1753  { uint32_t(1), "TRIGGER_TYPES", "Query the supported trigger types and max count for each." },
1754  { uint32_t(2), "ACTION_TYPES", "Query the supported action types and max count for each." },
1755  };
1756 
1757  static constexpr inline EnumInfo value = {
1758  /* .name = */ "Query",
1759  /* .docs = */ "",
1760  /* .type = */ Type::U8,
1761  /* .entries = */ entries,
1762  };
1763 
1764 };
1765 
1766 template<>
1767 struct MetadataFor<commands_3dm::GetEventSupport::Info>
1768 {
1770 
1771  static constexpr inline ParameterInfo parameters[] = {
1772  {
1773  /* .name = */ "type",
1774  /* .docs = */ "Trigger or action type, as defined in the respective setup command.",
1775  /* .type = */ {Type::U8, nullptr},
1776  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::type>,
1777  /* .attributes = */ NO_FUNCTIONS,
1778  /* .count = */ 1,
1779  /* .condition = */ {},
1780  },
1781  {
1782  /* .name = */ "count",
1783  /* .docs = */ "This is the maximum number of instances supported for this type.",
1784  /* .type = */ {Type::U8, nullptr},
1785  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
1786  /* .attributes = */ NO_FUNCTIONS,
1787  /* .count = */ 1,
1788  /* .condition = */ {},
1789  },
1790  };
1791 
1792  static constexpr inline StructInfo value = {
1793  /* .name = */ "Info",
1794  /* .title = */ "Event Info",
1795  /* .docs = */ "",
1796  /* .parameters = */ parameters,
1797  };
1798 };
1799 
1800 template<>
1801 struct MetadataFor<commands_3dm::GetEventSupport::Response>
1802 {
1804 
1805  static constexpr inline ParameterInfo parameters[] = {
1806  {
1807  /* .name = */ "query",
1808  /* .docs = */ "Query type specified in the command.",
1810  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventSupport::Query, &type::query>,
1811  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
1812  /* .count = */ 1,
1813  /* .condition = */ {},
1814  },
1815  {
1816  /* .name = */ "max_instances",
1817  /* .docs = */ "Number of slots available. The 'instance' number for\nthe configuration or control commands must be between 1 and this value.",
1818  /* .type = */ {Type::U8, nullptr},
1819  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::max_instances>,
1820  /* .attributes = */ {true, false, false, false, false},
1821  /* .count = */ 1,
1822  /* .condition = */ {},
1823  },
1824  {
1825  /* .name = */ "num_entries",
1826  /* .docs = */ "Number of supported types.",
1827  /* .type = */ {Type::U8, nullptr},
1828  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_entries>,
1829  /* .attributes = */ {true, false, false, false, false},
1830  /* .count = */ 1,
1831  /* .condition = */ {},
1832  },
1833  {
1834  /* .name = */ "entries",
1835  /* .docs = */ "List of supported types.",
1837  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventSupport::Info, &type::entries>,
1838  /* .attributes = */ {true, false, false, false, false},
1839  /* .count = */ {0, microstrain::Index(2) /* num_entries */},
1840  /* .condition = */ {},
1841  },
1842  };
1843 
1844  static constexpr inline FieldInfo value = {
1845  {
1846  /* .name = */ "commands_3dm::GetEventSupport::Response",
1847  /* .title = */ "response",
1848  /* .docs = */ "",
1849  /* .parameters = */ parameters,
1850  },
1851  /* .descriptor = */ type::DESCRIPTOR,
1852  /* .functions = */ NO_FUNCTIONS,
1853  /* .response = */ nullptr,
1854  };
1855 };
1856 
1857 template<>
1858 struct MetadataFor<commands_3dm::GetEventSupport>
1859 {
1861 
1862  static constexpr inline ParameterInfo parameters[] = {
1863  {
1864  /* .name = */ "query",
1865  /* .docs = */ "What type of information to retrieve.",
1867  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventSupport::Query, &type::query>,
1868  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
1869  /* .count = */ 1,
1870  /* .condition = */ {},
1871  },
1872  };
1873 
1874  static constexpr inline FieldInfo value = {
1875  {
1876  /* .name = */ "commands_3dm::GetEventSupport",
1877  /* .title = */ "Get Supported Events",
1878  /* .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",
1879  /* .parameters = */ parameters,
1880  },
1881  /* .descriptor = */ type::DESCRIPTOR,
1882  /* .functions = */ NO_FUNCTIONS,
1883  /* .response = */ &MetadataFor<type::Response>::value,
1884  };
1885 };
1886 
1887 template<>
1888 struct MetadataFor<commands_3dm::EventControl::Mode>
1889 {
1891 
1892  static constexpr inline EnumInfo::Entry entries[] = {
1893  { uint32_t(0), "DISABLED", "Trigger is disabled." },
1894  { uint32_t(1), "ENABLED", "Trigger is enabled and will work normally." },
1895  { uint32_t(2), "TEST", "Forces the trigger to the active state for testing purposes." },
1896  { 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)." },
1897  };
1898 
1899  static constexpr inline EnumInfo value = {
1900  /* .name = */ "Mode",
1901  /* .docs = */ "",
1902  /* .type = */ Type::U8,
1903  /* .entries = */ entries,
1904  };
1905 
1906 };
1907 
1908 template<>
1909 struct MetadataFor<commands_3dm::EventControl::Response>
1910 {
1912 
1913  static constexpr inline ParameterInfo parameters[] = {
1914  {
1915  /* .name = */ "instance",
1916  /* .docs = */ "Trigger instance to affect. 0 can be used to apply the mode to all\nconfigured triggers, except when the function selector is READ.",
1917  /* .type = */ {Type::U8, nullptr},
1918  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
1919  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
1920  /* .count = */ 1,
1921  /* .condition = */ {},
1922  },
1923  {
1924  /* .name = */ "mode",
1925  /* .docs = */ "How to change the trigger state. Except when instance is 0, the\ncorresponding trigger must be configured, i.e. not have type 0.",
1927  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventControl::Mode, &type::mode>,
1928  /* .attributes = */ {true, false, false, false, false},
1929  /* .count = */ 1,
1930  /* .condition = */ {},
1931  },
1932  };
1933 
1934  static constexpr inline FieldInfo value = {
1935  {
1936  /* .name = */ "commands_3dm::EventControl::Response",
1937  /* .title = */ "response",
1938  /* .docs = */ "",
1939  /* .parameters = */ parameters,
1940  },
1941  /* .descriptor = */ type::DESCRIPTOR,
1942  /* .functions = */ NO_FUNCTIONS,
1943  /* .response = */ nullptr,
1944  };
1945 };
1946 
1947 template<>
1948 struct MetadataFor<commands_3dm::EventControl>
1949 {
1951 
1952  static constexpr inline ParameterInfo parameters[] = {
1953  FUNCTION_SELECTOR_PARAM,
1954  {
1955  /* .name = */ "instance",
1956  /* .docs = */ "Trigger instance to affect. 0 can be used to apply the mode to all\nconfigured triggers, except when the function selector is READ.",
1957  /* .type = */ {Type::U8, nullptr},
1958  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
1959  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
1960  /* .count = */ 1,
1961  /* .condition = */ {},
1962  },
1963  {
1964  /* .name = */ "mode",
1965  /* .docs = */ "How to change the trigger state. Except when instance is 0, the\ncorresponding trigger must be configured, i.e. not have type 0.",
1967  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventControl::Mode, &type::mode>,
1968  /* .attributes = */ {true, false, false, false, false},
1969  /* .count = */ 1,
1970  /* .condition = */ {},
1971  },
1972  };
1973 
1974  static constexpr inline FieldInfo value = {
1975  {
1976  /* .name = */ "commands_3dm::EventControl",
1977  /* .title = */ "Event Control",
1978  /* .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.",
1979  /* .parameters = */ parameters,
1980  },
1981  /* .descriptor = */ type::DESCRIPTOR,
1982  /* .functions = */ {true, true, true, true, true},
1983  /* .response = */ &MetadataFor<type::Response>::value,
1984  };
1985 };
1986 
1987 template<>
1988 struct MetadataFor<commands_3dm::GetEventTriggerStatus::Status>
1989 {
1991 
1992  static constexpr inline BitfieldInfo::Entry entries[] = {
1993  { uint32_t(1), "active", "True if the trigger is currently active (either due to its logic or being in test mode)." },
1994  { uint32_t(2), "enabled", "True if the trigger is enabled." },
1995  { uint32_t(4), "test", "True if the trigger is in test mode." },
1996  };
1997 
1998  static constexpr inline BitfieldInfo value = {
1999  /* .name = */ "Status",
2000  /* .docs = */ "",
2001  /* .type = */ Type::U8,
2002  /* .entries = */ entries,
2003  };
2004 
2005 };
2006 
2007 template<>
2008 struct MetadataFor<commands_3dm::GetEventTriggerStatus::Entry>
2009 {
2011 
2012  static constexpr inline ParameterInfo parameters[] = {
2013  {
2014  /* .name = */ "type",
2015  /* .docs = */ "Configured trigger type.",
2016  /* .type = */ {Type::U8, nullptr},
2017  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::type>,
2018  /* .attributes = */ NO_FUNCTIONS,
2019  /* .count = */ 1,
2020  /* .condition = */ {},
2021  },
2022  {
2023  /* .name = */ "status",
2024  /* .docs = */ "Trigger status.",
2026  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventTriggerStatus::Status, &type::status>,
2027  /* .attributes = */ NO_FUNCTIONS,
2028  /* .count = */ 1,
2029  /* .condition = */ {},
2030  },
2031  };
2032 
2033  static constexpr inline StructInfo value = {
2034  /* .name = */ "Entry",
2035  /* .title = */ "Trigger Entry",
2036  /* .docs = */ "",
2037  /* .parameters = */ parameters,
2038  };
2039 };
2040 
2041 template<>
2042 struct MetadataFor<commands_3dm::GetEventTriggerStatus::Response>
2043 {
2045 
2046  static constexpr inline ParameterInfo parameters[] = {
2047  {
2048  /* .name = */ "count",
2049  /* .docs = */ "Number of entries requested. If requested_count was 0, this is the number of supported trigger slots.",
2050  /* .type = */ {Type::U8, nullptr},
2051  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
2052  /* .attributes = */ {true, false, false, false, false},
2053  /* .count = */ 1,
2054  /* .condition = */ {},
2055  },
2056  {
2057  /* .name = */ "triggers",
2058  /* .docs = */ "A list of the configured triggers. Entries are in the order requested, or in increasing order if count was 0.",
2060  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventTriggerStatus::Entry, &type::triggers>,
2061  /* .attributes = */ {true, false, false, false, false},
2062  /* .count = */ {20, microstrain::Index(0) /* count */},
2063  /* .condition = */ {},
2064  },
2065  };
2066 
2067  static constexpr inline FieldInfo value = {
2068  {
2069  /* .name = */ "commands_3dm::GetEventTriggerStatus::Response",
2070  /* .title = */ "response",
2071  /* .docs = */ "",
2072  /* .parameters = */ parameters,
2073  },
2074  /* .descriptor = */ type::DESCRIPTOR,
2075  /* .functions = */ NO_FUNCTIONS,
2076  /* .response = */ nullptr,
2077  };
2078 };
2079 
2080 template<>
2081 struct MetadataFor<commands_3dm::GetEventTriggerStatus>
2082 {
2084 
2085  static constexpr inline ParameterInfo parameters[] = {
2086  {
2087  /* .name = */ "requested_count",
2088  /* .docs = */ "Number of entries requested. If 0, requests all trigger slots.",
2089  /* .type = */ {Type::U8, nullptr},
2090  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_count>,
2091  /* .attributes = */ {true, false, false, false, false},
2092  /* .count = */ 1,
2093  /* .condition = */ {},
2094  },
2095  {
2096  /* .name = */ "requested_instances",
2097  /* .docs = */ "List of trigger instances to query.",
2098  /* .type = */ {Type::U8, nullptr},
2099  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_instances>,
2100  /* .attributes = */ {true, false, false, false, false},
2101  /* .count = */ {20, microstrain::Index(0) /* requested_count */},
2102  /* .condition = */ {},
2103  },
2104  };
2105 
2106  static constexpr inline FieldInfo value = {
2107  {
2108  /* .name = */ "commands_3dm::GetEventTriggerStatus",
2109  /* .title = */ "Get Event Trigger Status",
2110  /* .docs = */ "",
2111  /* .parameters = */ parameters,
2112  },
2113  /* .descriptor = */ type::DESCRIPTOR,
2114  /* .functions = */ NO_FUNCTIONS,
2115  /* .response = */ &MetadataFor<type::Response>::value,
2116  };
2117 };
2118 
2119 template<>
2120 struct MetadataFor<commands_3dm::GetEventActionStatus::Entry>
2121 {
2123 
2124  static constexpr inline ParameterInfo parameters[] = {
2125  {
2126  /* .name = */ "action_type",
2127  /* .docs = */ "Configured action type.",
2128  /* .type = */ {Type::U8, nullptr},
2129  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::action_type>,
2130  /* .attributes = */ NO_FUNCTIONS,
2131  /* .count = */ 1,
2132  /* .condition = */ {},
2133  },
2134  {
2135  /* .name = */ "trigger_id",
2136  /* .docs = */ "Associated trigger instance.",
2137  /* .type = */ {Type::U8, nullptr},
2138  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::trigger_id>,
2139  /* .attributes = */ NO_FUNCTIONS,
2140  /* .count = */ 1,
2141  /* .condition = */ {},
2142  },
2143  };
2144 
2145  static constexpr inline StructInfo value = {
2146  /* .name = */ "Entry",
2147  /* .title = */ "Action Entry",
2148  /* .docs = */ "",
2149  /* .parameters = */ parameters,
2150  };
2151 };
2152 
2153 template<>
2154 struct MetadataFor<commands_3dm::GetEventActionStatus::Response>
2155 {
2157 
2158  static constexpr inline ParameterInfo parameters[] = {
2159  {
2160  /* .name = */ "count",
2161  /* .docs = */ "Number of entries requested. If requested_count was 0, this is the number of supported action slots.",
2162  /* .type = */ {Type::U8, nullptr},
2163  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::count>,
2164  /* .attributes = */ {true, false, false, false, false},
2165  /* .count = */ 1,
2166  /* .condition = */ {},
2167  },
2168  {
2169  /* .name = */ "actions",
2170  /* .docs = */ "A list of the configured actions. Entries are in the order requested, or in increasing order if count was 0.",
2172  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GetEventActionStatus::Entry, &type::actions>,
2173  /* .attributes = */ {true, false, false, false, false},
2174  /* .count = */ {20, microstrain::Index(0) /* count */},
2175  /* .condition = */ {},
2176  },
2177  };
2178 
2179  static constexpr inline FieldInfo value = {
2180  {
2181  /* .name = */ "commands_3dm::GetEventActionStatus::Response",
2182  /* .title = */ "response",
2183  /* .docs = */ "",
2184  /* .parameters = */ parameters,
2185  },
2186  /* .descriptor = */ type::DESCRIPTOR,
2187  /* .functions = */ NO_FUNCTIONS,
2188  /* .response = */ nullptr,
2189  };
2190 };
2191 
2192 template<>
2193 struct MetadataFor<commands_3dm::GetEventActionStatus>
2194 {
2196 
2197  static constexpr inline ParameterInfo parameters[] = {
2198  {
2199  /* .name = */ "requested_count",
2200  /* .docs = */ "Number of entries requested. If 0, requests all action slots.",
2201  /* .type = */ {Type::U8, nullptr},
2202  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_count>,
2203  /* .attributes = */ {true, false, false, false, false},
2204  /* .count = */ 1,
2205  /* .condition = */ {},
2206  },
2207  {
2208  /* .name = */ "requested_instances",
2209  /* .docs = */ "List of action instances to query.",
2210  /* .type = */ {Type::U8, nullptr},
2211  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::requested_instances>,
2212  /* .attributes = */ {true, false, false, false, false},
2213  /* .count = */ {20, microstrain::Index(0) /* requested_count */},
2214  /* .condition = */ {},
2215  },
2216  };
2217 
2218  static constexpr inline FieldInfo value = {
2219  {
2220  /* .name = */ "commands_3dm::GetEventActionStatus",
2221  /* .title = */ "Get Event Action Status",
2222  /* .docs = */ "",
2223  /* .parameters = */ parameters,
2224  },
2225  /* .descriptor = */ type::DESCRIPTOR,
2226  /* .functions = */ NO_FUNCTIONS,
2227  /* .response = */ &MetadataFor<type::Response>::value,
2228  };
2229 };
2230 
2231 template<>
2232 struct MetadataFor<commands_3dm::EventTrigger::GpioParams::Mode>
2233 {
2235 
2236  static constexpr inline EnumInfo::Entry entries[] = {
2237  { uint32_t(0), "DISABLED", "The pin will have no effect and the trigger will never activate." },
2238  { uint32_t(1), "WHILE_HIGH", "The trigger will be active while the pin is high." },
2239  { uint32_t(2), "WHILE_LOW", "The trigger will be active while the pin is low." },
2240  { uint32_t(4), "EDGE", "Use if the pin is configured for timestamping via the 3DM Gpio Configuration command (0x0C41)." },
2241  };
2242 
2243  static constexpr inline EnumInfo value = {
2244  /* .name = */ "Mode",
2245  /* .docs = */ "",
2246  /* .type = */ Type::U8,
2247  /* .entries = */ entries,
2248  };
2249 
2250 };
2251 
2252 template<>
2253 struct MetadataFor<commands_3dm::EventTrigger::GpioParams>
2254 {
2256 
2257  static constexpr inline ParameterInfo parameters[] = {
2258  {
2259  /* .name = */ "pin",
2260  /* .docs = */ "GPIO pin number.",
2261  /* .type = */ {Type::U8, nullptr},
2262  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
2263  /* .attributes = */ NO_FUNCTIONS,
2264  /* .count = */ 1,
2265  /* .condition = */ {},
2266  },
2267  {
2268  /* .name = */ "mode",
2269  /* .docs = */ "How the pin state affects the trigger.",
2271  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::GpioParams::Mode, &type::mode>,
2272  /* .attributes = */ NO_FUNCTIONS,
2273  /* .count = */ 1,
2274  /* .condition = */ {},
2275  },
2276  };
2277 
2278  static constexpr inline StructInfo value = {
2279  /* .name = */ "GpioParams",
2280  /* .title = */ "Trigger GPIO Parameters",
2281  /* .docs = */ "",
2282  /* .parameters = */ parameters,
2283  };
2284 };
2285 
2286 template<>
2288 {
2290 
2291  static constexpr inline EnumInfo::Entry entries[] = {
2292  { 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." },
2293  { 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." },
2294  };
2295 
2296  static constexpr inline EnumInfo value = {
2297  /* .name = */ "Type",
2298  /* .docs = */ "",
2299  /* .type = */ Type::U8,
2300  /* .entries = */ entries,
2301  };
2302 
2303 };
2304 
2305 template<>
2306 struct MetadataFor<commands_3dm::EventTrigger::ThresholdParams>
2307 {
2309 
2310  static constexpr inline ParameterInfo parameters[] = {
2311  {
2312  /* .name = */ "desc_set",
2313  /* .docs = */ "Descriptor set of target data quantity.",
2314  /* .type = */ {Type::U8, nullptr},
2315  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
2316  /* .attributes = */ NO_FUNCTIONS,
2317  /* .count = */ 1,
2318  /* .condition = */ {},
2319  },
2320  {
2321  /* .name = */ "field_desc",
2322  /* .docs = */ "Field descriptor of target data quantity.",
2323  /* .type = */ {Type::U8, nullptr},
2324  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::field_desc>,
2325  /* .attributes = */ NO_FUNCTIONS,
2326  /* .count = */ 1,
2327  /* .condition = */ {},
2328  },
2329  {
2330  /* .name = */ "param_id",
2331  /* .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.",
2332  /* .type = */ {Type::U8, nullptr},
2333  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::param_id>,
2334  /* .attributes = */ NO_FUNCTIONS,
2335  /* .count = */ 1,
2336  /* .condition = */ {},
2337  },
2338  {
2339  /* .name = */ "type",
2340  /* .docs = */ "Determines the type of comparison.",
2342  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::ThresholdParams::Type, &type::type>,
2343  /* .attributes = */ NO_FUNCTIONS,
2344  /* .count = */ 1,
2345  /* .condition = */ {},
2346  },
2347  {
2348  /* .name = */ "low_thres",
2349  /* .docs = */ "",
2350  /* .type = */ {Type::DOUBLE, nullptr},
2351  /* .accessor = */ nullptr, //utils::access<type, double, &type::low_thres>,
2352  /* .attributes = */ NO_FUNCTIONS,
2353  /* .count = */ 1,
2354  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::WINDOW)} /* type == WINDOW */,
2355  },
2356  {
2357  /* .name = */ "int_thres",
2358  /* .docs = */ "",
2359  /* .type = */ {Type::DOUBLE, nullptr},
2360  /* .accessor = */ nullptr, //utils::access<type, double, &type::int_thres>,
2361  /* .attributes = */ NO_FUNCTIONS,
2362  /* .count = */ 1,
2363  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::INTERVAL)} /* type == INTERVAL */,
2364  },
2365  {
2366  /* .name = */ "high_thres",
2367  /* .docs = */ "",
2368  /* .type = */ {Type::DOUBLE, nullptr},
2369  /* .accessor = */ nullptr, //utils::access<type, double, &type::high_thres>,
2370  /* .attributes = */ NO_FUNCTIONS,
2371  /* .count = */ 1,
2372  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::WINDOW)} /* type == WINDOW */,
2373  },
2374  {
2375  /* .name = */ "interval",
2376  /* .docs = */ "",
2377  /* .type = */ {Type::DOUBLE, nullptr},
2378  /* .accessor = */ nullptr, //utils::access<type, double, &type::interval>,
2379  /* .attributes = */ NO_FUNCTIONS,
2380  /* .count = */ 1,
2381  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(3) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::ThresholdParams::Type::INTERVAL)} /* type == INTERVAL */,
2382  },
2383  };
2384 
2385  static constexpr inline StructInfo value = {
2386  /* .name = */ "ThresholdParams",
2387  /* .title = */ "Trigger Threshold Parameters",
2388  /* .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.",
2389  /* .parameters = */ parameters,
2390  };
2391 };
2392 
2393 template<>
2394 struct MetadataFor<commands_3dm::EventTrigger::CombinationParams>
2395 {
2397 
2398  static constexpr inline ParameterInfo parameters[] = {
2399  {
2400  /* .name = */ "logic_table",
2401  /* .docs = */ "The last column of a truth table describing the output given the state of each input.",
2402  /* .type = */ {Type::U16, nullptr},
2403  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::logic_table>,
2404  /* .attributes = */ NO_FUNCTIONS,
2405  /* .count = */ 1,
2406  /* .condition = */ {},
2407  },
2408  {
2409  /* .name = */ "input_triggers",
2410  /* .docs = */ "List of trigger IDs for inputs. Use 0 for unused inputs.",
2411  /* .type = */ {Type::U8, nullptr},
2412  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::input_triggers>,
2413  /* .attributes = */ NO_FUNCTIONS,
2414  /* .count = */ 4,
2415  /* .condition = */ {},
2416  },
2417  };
2418 
2419  static constexpr inline StructInfo value = {
2420  /* .name = */ "CombinationParams",
2421  /* .title = */ "Trigger Combination Parameters",
2422  /* .docs = */ "",
2423  /* .parameters = */ parameters,
2424  };
2425 };
2426 
2427 template<>
2428 struct MetadataFor<commands_3dm::EventTrigger::Type>
2429 {
2431 
2432  static constexpr inline EnumInfo::Entry entries[] = {
2433  { uint32_t(0), "NONE", "No trigger selected. The state will always be inactive." },
2434  { uint32_t(1), "GPIO", "Trigger based on the state of a GPIO pin. See GpioParams." },
2435  { uint32_t(2), "THRESHOLD", "Compare a data quantity against a high and low threshold. See ThresholdParams." },
2436  { uint32_t(3), "COMBINATION", "Logical combination of two or more triggers. See CombinationParams." },
2437  };
2438 
2439  static constexpr inline EnumInfo value = {
2440  /* .name = */ "Type",
2441  /* .docs = */ "",
2442  /* .type = */ Type::U8,
2443  /* .entries = */ entries,
2444  };
2445 
2446 };
2447 
2448 template<>
2449 struct MetadataFor<commands_3dm::EventTrigger::Parameters>
2450 {
2452 
2453  static constexpr inline ParameterInfo parameters[] = {
2454  {
2455  /* .name = */ "gpio",
2456  /* .docs = */ "",
2458  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::GpioParams, &type::gpio>,
2459  /* .attributes = */ NO_FUNCTIONS,
2460  /* .count = */ 1,
2461  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(1) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::Type::GPIO)} /* type == GPIO */,
2462  },
2463  {
2464  /* .name = */ "threshold",
2465  /* .docs = */ "",
2467  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::ThresholdParams, &type::threshold>,
2468  /* .attributes = */ NO_FUNCTIONS,
2469  /* .count = */ 1,
2470  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(1) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::Type::THRESHOLD)} /* type == THRESHOLD */,
2471  },
2472  {
2473  /* .name = */ "combination",
2474  /* .docs = */ "",
2476  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::CombinationParams, &type::combination>,
2477  /* .attributes = */ NO_FUNCTIONS,
2478  /* .count = */ 1,
2479  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(1) /* type */, static_cast<uint16_t>(commands_3dm::EventTrigger::Type::COMBINATION)} /* type == COMBINATION */,
2480  },
2481  };
2482 
2483  static constexpr inline StructInfo value = {
2484  /* .name = */ "Parameters",
2485  /* .title = */ "Parameters",
2486  /* .docs = */ "",
2487  /* .parameters = */ parameters,
2488  };
2489 };
2490 
2491 template<>
2492 struct MetadataFor<commands_3dm::EventTrigger::Response>
2493 {
2495 
2496  static constexpr inline ParameterInfo parameters[] = {
2497  {
2498  /* .name = */ "instance",
2499  /* .docs = */ "Trigger number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2500  /* .type = */ {Type::U8, nullptr},
2501  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2502  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2503  /* .count = */ 1,
2504  /* .condition = */ {},
2505  },
2506  {
2507  /* .name = */ "type",
2508  /* .docs = */ "Type of trigger to configure.",
2510  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Type, &type::type>,
2511  /* .attributes = */ {true, false, false, false, false},
2512  /* .count = */ 1,
2513  /* .condition = */ {},
2514  },
2515  {
2516  /* .name = */ "parameters",
2517  /* .docs = */ "",
2519  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Parameters, &type::parameters>,
2520  /* .attributes = */ {true, false, false, false, false},
2521  /* .count = */ 1,
2522  /* .condition = */ {},
2523  },
2524  };
2525 
2526  static constexpr inline FieldInfo value = {
2527  {
2528  /* .name = */ "commands_3dm::EventTrigger::Response",
2529  /* .title = */ "response",
2530  /* .docs = */ "",
2531  /* .parameters = */ parameters,
2532  },
2533  /* .descriptor = */ type::DESCRIPTOR,
2534  /* .functions = */ NO_FUNCTIONS,
2535  /* .response = */ nullptr,
2536  };
2537 };
2538 
2539 template<>
2540 struct MetadataFor<commands_3dm::EventTrigger>
2541 {
2543 
2544  static constexpr inline ParameterInfo parameters[] = {
2545  FUNCTION_SELECTOR_PARAM,
2546  {
2547  /* .name = */ "instance",
2548  /* .docs = */ "Trigger number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2549  /* .type = */ {Type::U8, nullptr},
2550  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2551  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2552  /* .count = */ 1,
2553  /* .condition = */ {},
2554  },
2555  {
2556  /* .name = */ "type",
2557  /* .docs = */ "Type of trigger to configure.",
2559  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Type, &type::type>,
2560  /* .attributes = */ {true, false, false, false, false},
2561  /* .count = */ 1,
2562  /* .condition = */ {},
2563  },
2564  {
2565  /* .name = */ "parameters",
2566  /* .docs = */ "",
2568  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventTrigger::Parameters, &type::parameters>,
2569  /* .attributes = */ {true, false, false, false, false},
2570  /* .count = */ 1,
2571  /* .condition = */ {},
2572  },
2573  };
2574 
2575  static constexpr inline FieldInfo value = {
2576  {
2577  /* .name = */ "commands_3dm::EventTrigger",
2578  /* .title = */ "Event Trigger Configuration",
2579  /* .docs = */ "Configures various types of event triggers.",
2580  /* .parameters = */ parameters,
2581  },
2582  /* .descriptor = */ type::DESCRIPTOR,
2583  /* .functions = */ {true, true, true, true, true},
2584  /* .response = */ &MetadataFor<type::Response>::value,
2585  };
2586 };
2587 
2588 template<>
2589 struct MetadataFor<commands_3dm::EventAction::GpioParams::Mode>
2590 {
2592 
2593  static constexpr inline EnumInfo::Entry entries[] = {
2594  { uint32_t(0), "DISABLED", "Pin state will not be changed." },
2595  { uint32_t(1), "ACTIVE_HIGH", "Pin will be set high when the trigger is active and low otherwise." },
2596  { uint32_t(2), "ACTIVE_LOW", "Pin will be set low when the trigger is active and high otherwise." },
2597  { uint32_t(5), "ONESHOT_HIGH", "Pin will be set high each time the trigger activates. It will not be set low." },
2598  { uint32_t(6), "ONESHOT_LOW", "Pin will be set low each time the trigger activates. It will not be set high." },
2599  { uint32_t(7), "TOGGLE", "Pin will change to the opposite state each time the trigger activates." },
2600  };
2601 
2602  static constexpr inline EnumInfo value = {
2603  /* .name = */ "Mode",
2604  /* .docs = */ "",
2605  /* .type = */ Type::U8,
2606  /* .entries = */ entries,
2607  };
2608 
2609 };
2610 
2611 template<>
2612 struct MetadataFor<commands_3dm::EventAction::GpioParams>
2613 {
2615 
2616  static constexpr inline ParameterInfo parameters[] = {
2617  {
2618  /* .name = */ "pin",
2619  /* .docs = */ "GPIO pin number.",
2620  /* .type = */ {Type::U8, nullptr},
2621  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
2622  /* .attributes = */ NO_FUNCTIONS,
2623  /* .count = */ 1,
2624  /* .condition = */ {},
2625  },
2626  {
2627  /* .name = */ "mode",
2628  /* .docs = */ "Behavior of the pin.",
2630  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::GpioParams::Mode, &type::mode>,
2631  /* .attributes = */ NO_FUNCTIONS,
2632  /* .count = */ 1,
2633  /* .condition = */ {},
2634  },
2635  };
2636 
2637  static constexpr inline StructInfo value = {
2638  /* .name = */ "GpioParams",
2639  /* .title = */ "Action GPIO Parameters",
2640  /* .docs = */ "",
2641  /* .parameters = */ parameters,
2642  };
2643 };
2644 
2645 template<>
2646 struct MetadataFor<commands_3dm::EventAction::MessageParams>
2647 {
2649 
2650  static constexpr inline ParameterInfo parameters[] = {
2651  {
2652  /* .name = */ "desc_set",
2653  /* .docs = */ "MIP data descriptor set.",
2654  /* .type = */ {Type::U8, nullptr},
2655  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
2656  /* .attributes = */ NO_FUNCTIONS,
2657  /* .count = */ 1,
2658  /* .condition = */ {},
2659  },
2660  {
2661  /* .name = */ "decimation",
2662  /* .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.",
2663  /* .type = */ {Type::U16, nullptr},
2664  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::decimation>,
2665  /* .attributes = */ NO_FUNCTIONS,
2666  /* .count = */ 1,
2667  /* .condition = */ {},
2668  },
2669  {
2670  /* .name = */ "num_fields",
2671  /* .docs = */ "Number of mip fields in the packet. Limited to 12.",
2672  /* .type = */ {Type::U8, nullptr},
2673  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_fields>,
2674  /* .attributes = */ NO_FUNCTIONS,
2675  /* .count = */ 1,
2676  /* .condition = */ {},
2677  },
2678  {
2679  /* .name = */ "descriptors",
2680  /* .docs = */ "List of field descriptors.",
2681  /* .type = */ {Type::U8, nullptr},
2682  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::descriptors>,
2683  /* .attributes = */ NO_FUNCTIONS,
2684  /* .count = */ {20, microstrain::Index(2) /* num_fields */},
2685  /* .condition = */ {},
2686  },
2687  };
2688 
2689  static constexpr inline StructInfo value = {
2690  /* .name = */ "MessageParams",
2691  /* .title = */ "Action Message Parameters",
2692  /* .docs = */ "",
2693  /* .parameters = */ parameters,
2694  };
2695 };
2696 
2697 template<>
2698 struct MetadataFor<commands_3dm::EventAction::Type>
2699 {
2701 
2702  static constexpr inline EnumInfo::Entry entries[] = {
2703  { uint32_t(0), "NONE", "No action. Parameters should be empty." },
2704  { uint32_t(1), "GPIO", "Control the state of a GPIO pin. See GpioParameters." },
2705  { uint32_t(2), "MESSAGE", "Output a data packet. See MessageParameters." },
2706  };
2707 
2708  static constexpr inline EnumInfo value = {
2709  /* .name = */ "Type",
2710  /* .docs = */ "",
2711  /* .type = */ Type::U8,
2712  /* .entries = */ entries,
2713  };
2714 
2715 };
2716 
2717 template<>
2718 struct MetadataFor<commands_3dm::EventAction::Parameters>
2719 {
2721 
2722  static constexpr inline ParameterInfo parameters[] = {
2723  {
2724  /* .name = */ "gpio",
2725  /* .docs = */ "Gpio parameters, if type == GPIO. Ignore otherwise.",
2727  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::GpioParams, &type::gpio>,
2728  /* .attributes = */ NO_FUNCTIONS,
2729  /* .count = */ 1,
2730  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(2) /* type */, static_cast<uint16_t>(commands_3dm::EventAction::Type::GPIO)} /* type == GPIO */,
2731  },
2732  {
2733  /* .name = */ "message",
2734  /* .docs = */ "Message parameters, if type == MESSAGE. Ignore otherwise.",
2736  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::MessageParams, &type::message>,
2737  /* .attributes = */ NO_FUNCTIONS,
2738  /* .count = */ 1,
2739  /* .condition = */ {ParameterInfo::Condition::Type::ENUM, microstrain::Index(2) /* type */, static_cast<uint16_t>(commands_3dm::EventAction::Type::MESSAGE)} /* type == MESSAGE */,
2740  },
2741  };
2742 
2743  static constexpr inline StructInfo value = {
2744  /* .name = */ "Parameters",
2745  /* .title = */ "Parameters",
2746  /* .docs = */ "",
2747  /* .parameters = */ parameters,
2748  };
2749 };
2750 
2751 template<>
2752 struct MetadataFor<commands_3dm::EventAction::Response>
2753 {
2755 
2756  static constexpr inline ParameterInfo parameters[] = {
2757  {
2758  /* .name = */ "instance",
2759  /* .docs = */ "Action number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2760  /* .type = */ {Type::U8, nullptr},
2761  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2762  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2763  /* .count = */ 1,
2764  /* .condition = */ {},
2765  },
2766  {
2767  /* .name = */ "trigger",
2768  /* .docs = */ "Trigger ID number.",
2769  /* .type = */ {Type::U8, nullptr},
2770  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::trigger>,
2771  /* .attributes = */ {true, false, false, false, false},
2772  /* .count = */ 1,
2773  /* .condition = */ {},
2774  },
2775  {
2776  /* .name = */ "type",
2777  /* .docs = */ "Type of action to configure.",
2779  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Type, &type::type>,
2780  /* .attributes = */ {true, false, false, false, false},
2781  /* .count = */ 1,
2782  /* .condition = */ {},
2783  },
2784  {
2785  /* .name = */ "parameters",
2786  /* .docs = */ "",
2788  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Parameters, &type::parameters>,
2789  /* .attributes = */ {true, false, false, false, false},
2790  /* .count = */ 1,
2791  /* .condition = */ {},
2792  },
2793  };
2794 
2795  static constexpr inline FieldInfo value = {
2796  {
2797  /* .name = */ "commands_3dm::EventAction::Response",
2798  /* .title = */ "response",
2799  /* .docs = */ "",
2800  /* .parameters = */ parameters,
2801  },
2802  /* .descriptor = */ type::DESCRIPTOR,
2803  /* .functions = */ NO_FUNCTIONS,
2804  /* .response = */ nullptr,
2805  };
2806 };
2807 
2808 template<>
2809 struct MetadataFor<commands_3dm::EventAction>
2810 {
2812 
2813  static constexpr inline ParameterInfo parameters[] = {
2814  FUNCTION_SELECTOR_PARAM,
2815  {
2816  /* .name = */ "instance",
2817  /* .docs = */ "Action number. When function is SAVE, LOAD, or DEFAULT, this can be 0 to apply to all instances.",
2818  /* .type = */ {Type::U8, nullptr},
2819  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::instance>,
2820  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
2821  /* .count = */ 1,
2822  /* .condition = */ {},
2823  },
2824  {
2825  /* .name = */ "trigger",
2826  /* .docs = */ "Trigger ID number.",
2827  /* .type = */ {Type::U8, nullptr},
2828  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::trigger>,
2829  /* .attributes = */ {true, false, false, false, false},
2830  /* .count = */ 1,
2831  /* .condition = */ {},
2832  },
2833  {
2834  /* .name = */ "type",
2835  /* .docs = */ "Type of action to configure.",
2837  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Type, &type::type>,
2838  /* .attributes = */ {true, false, false, false, false},
2839  /* .count = */ 1,
2840  /* .condition = */ {},
2841  },
2842  {
2843  /* .name = */ "parameters",
2844  /* .docs = */ "",
2846  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::EventAction::Parameters, &type::parameters>,
2847  /* .attributes = */ {true, false, false, false, false},
2848  /* .count = */ 1,
2849  /* .condition = */ {},
2850  },
2851  };
2852 
2853  static constexpr inline FieldInfo value = {
2854  {
2855  /* .name = */ "commands_3dm::EventAction",
2856  /* .title = */ "Event Action Configuration",
2857  /* .docs = */ "Configures various types of event actions.",
2858  /* .parameters = */ parameters,
2859  },
2860  /* .descriptor = */ type::DESCRIPTOR,
2861  /* .functions = */ {true, true, true, true, true},
2862  /* .response = */ &MetadataFor<type::Response>::value,
2863  };
2864 };
2865 
2866 template<>
2867 struct MetadataFor<commands_3dm::DeviceSettings>
2868 {
2870 
2871  static constexpr inline ParameterInfo parameters[] = {
2872  FUNCTION_SELECTOR_PARAM,
2873 
2874  };
2875 
2876  static constexpr inline FieldInfo value = {
2877  {
2878  /* .name = */ "commands_3dm::DeviceSettings",
2879  /* .title = */ "Device Start Up Settings",
2880  /* .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.",
2881  /* .parameters = */ parameters,
2882  },
2883  /* .descriptor = */ type::DESCRIPTOR,
2884  /* .functions = */ {false, false, true, true, true},
2885  /* .response = */ nullptr,
2886  };
2887 };
2888 
2889 template<>
2890 struct MetadataFor<commands_3dm::Sensor2VehicleTransformEuler::Response>
2891 {
2893 
2894  static constexpr inline ParameterInfo parameters[] = {
2895  {
2896  /* .name = */ "roll",
2897  /* .docs = */ "[radians]",
2898  /* .type = */ {Type::FLOAT, nullptr},
2899  /* .accessor = */ nullptr, //utils::access<type, float, &type::roll>,
2900  /* .attributes = */ {true, false, false, false, false},
2901  /* .count = */ 1,
2902  /* .condition = */ {},
2903  },
2904  {
2905  /* .name = */ "pitch",
2906  /* .docs = */ "[radians]",
2907  /* .type = */ {Type::FLOAT, nullptr},
2908  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch>,
2909  /* .attributes = */ {true, false, false, false, false},
2910  /* .count = */ 1,
2911  /* .condition = */ {},
2912  },
2913  {
2914  /* .name = */ "yaw",
2915  /* .docs = */ "[radians]",
2916  /* .type = */ {Type::FLOAT, nullptr},
2917  /* .accessor = */ nullptr, //utils::access<type, float, &type::yaw>,
2918  /* .attributes = */ {true, false, false, false, false},
2919  /* .count = */ 1,
2920  /* .condition = */ {},
2921  },
2922  };
2923 
2924  static constexpr inline FieldInfo value = {
2925  {
2926  /* .name = */ "commands_3dm::Sensor2VehicleTransformEuler::Response",
2927  /* .title = */ "response",
2928  /* .docs = */ "",
2929  /* .parameters = */ parameters,
2930  },
2931  /* .descriptor = */ type::DESCRIPTOR,
2932  /* .functions = */ NO_FUNCTIONS,
2933  /* .response = */ nullptr,
2934  };
2935 };
2936 
2937 template<>
2938 struct MetadataFor<commands_3dm::Sensor2VehicleTransformEuler>
2939 {
2941 
2942  static constexpr inline ParameterInfo parameters[] = {
2943  FUNCTION_SELECTOR_PARAM,
2944  {
2945  /* .name = */ "roll",
2946  /* .docs = */ "[radians]",
2947  /* .type = */ {Type::FLOAT, nullptr},
2948  /* .accessor = */ nullptr, //utils::access<type, float, &type::roll>,
2949  /* .attributes = */ {true, false, false, false, false},
2950  /* .count = */ 1,
2951  /* .condition = */ {},
2952  },
2953  {
2954  /* .name = */ "pitch",
2955  /* .docs = */ "[radians]",
2956  /* .type = */ {Type::FLOAT, nullptr},
2957  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch>,
2958  /* .attributes = */ {true, false, false, false, false},
2959  /* .count = */ 1,
2960  /* .condition = */ {},
2961  },
2962  {
2963  /* .name = */ "yaw",
2964  /* .docs = */ "[radians]",
2965  /* .type = */ {Type::FLOAT, nullptr},
2966  /* .accessor = */ nullptr, //utils::access<type, float, &type::yaw>,
2967  /* .attributes = */ {true, false, false, false, false},
2968  /* .count = */ 1,
2969  /* .condition = */ {},
2970  },
2971  };
2972 
2973  static constexpr inline FieldInfo value = {
2974  {
2975  /* .name = */ "commands_3dm::Sensor2VehicleTransformEuler",
2976  /* .title = */ "Sensor-to-Vehicle Frame Transformation Euler",
2977  /* .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.",
2978  /* .parameters = */ parameters,
2979  },
2980  /* .descriptor = */ type::DESCRIPTOR,
2981  /* .functions = */ {true, true, true, true, true},
2982  /* .response = */ &MetadataFor<type::Response>::value,
2983  };
2984 };
2985 
2986 template<>
2987 struct MetadataFor<commands_3dm::Sensor2VehicleTransformQuaternion::Response>
2988 {
2990 
2991  static constexpr inline ParameterInfo parameters[] = {
2992  {
2993  /* .name = */ "q",
2994  /* .docs = */ "Unit length quaternion representing transform [w, i, j, k]",
2995  /* .type = */ {Type::STRUCT, &MetadataFor<Quatf>::value},
2996  /* .accessor = */ nullptr, //utils::access<type, Quatf, &type::q>,
2997  /* .attributes = */ {true, false, false, false, false},
2998  /* .count = */ 1,
2999  /* .condition = */ {},
3000  },
3001  };
3002 
3003  static constexpr inline FieldInfo value = {
3004  {
3005  /* .name = */ "commands_3dm::Sensor2VehicleTransformQuaternion::Response",
3006  /* .title = */ "response",
3007  /* .docs = */ "",
3008  /* .parameters = */ parameters,
3009  },
3010  /* .descriptor = */ type::DESCRIPTOR,
3011  /* .functions = */ NO_FUNCTIONS,
3012  /* .response = */ nullptr,
3013  };
3014 };
3015 
3016 template<>
3017 struct MetadataFor<commands_3dm::Sensor2VehicleTransformQuaternion>
3018 {
3020 
3021  static constexpr inline ParameterInfo parameters[] = {
3022  FUNCTION_SELECTOR_PARAM,
3023  {
3024  /* .name = */ "q",
3025  /* .docs = */ "Unit length quaternion representing transform [w, i, j, k]",
3026  /* .type = */ {Type::STRUCT, &MetadataFor<Quatf>::value},
3027  /* .accessor = */ nullptr, //utils::access<type, Quatf, &type::q>,
3028  /* .attributes = */ {true, false, false, false, false},
3029  /* .count = */ 1,
3030  /* .condition = */ {},
3031  },
3032  };
3033 
3034  static constexpr inline FieldInfo value = {
3035  {
3036  /* .name = */ "commands_3dm::Sensor2VehicleTransformQuaternion",
3037  /* .title = */ "Sensor-to-Vehicle Frame Transformation Quaternion",
3038  /* .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.",
3039  /* .parameters = */ parameters,
3040  },
3041  /* .descriptor = */ type::DESCRIPTOR,
3042  /* .functions = */ {true, true, true, true, true},
3043  /* .response = */ &MetadataFor<type::Response>::value,
3044  };
3045 };
3046 
3047 template<>
3048 struct MetadataFor<commands_3dm::Sensor2VehicleTransformDcm::Response>
3049 {
3051 
3052  static constexpr inline ParameterInfo parameters[] = {
3053  {
3054  /* .name = */ "dcm",
3055  /* .docs = */ "3 x 3 direction cosine matrix, stored in row-major order",
3056  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
3057  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::dcm>,
3058  /* .attributes = */ {true, false, false, false, false},
3059  /* .count = */ 1,
3060  /* .condition = */ {},
3061  },
3062  };
3063 
3064  static constexpr inline FieldInfo value = {
3065  {
3066  /* .name = */ "commands_3dm::Sensor2VehicleTransformDcm::Response",
3067  /* .title = */ "response",
3068  /* .docs = */ "",
3069  /* .parameters = */ parameters,
3070  },
3071  /* .descriptor = */ type::DESCRIPTOR,
3072  /* .functions = */ NO_FUNCTIONS,
3073  /* .response = */ nullptr,
3074  };
3075 };
3076 
3077 template<>
3078 struct MetadataFor<commands_3dm::Sensor2VehicleTransformDcm>
3079 {
3081 
3082  static constexpr inline ParameterInfo parameters[] = {
3083  FUNCTION_SELECTOR_PARAM,
3084  {
3085  /* .name = */ "dcm",
3086  /* .docs = */ "3 x 3 direction cosine matrix, stored in row-major order",
3087  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
3088  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::dcm>,
3089  /* .attributes = */ {true, false, false, false, false},
3090  /* .count = */ 1,
3091  /* .condition = */ {},
3092  },
3093  };
3094 
3095  static constexpr inline FieldInfo value = {
3096  {
3097  /* .name = */ "commands_3dm::Sensor2VehicleTransformDcm",
3098  /* .title = */ "Sensor-to-Vehicle Frame Transformation Direction Cosine Matrix",
3099  /* .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.",
3100  /* .parameters = */ parameters,
3101  },
3102  /* .descriptor = */ type::DESCRIPTOR,
3103  /* .functions = */ {true, true, true, true, true},
3104  /* .response = */ &MetadataFor<type::Response>::value,
3105  };
3106 };
3107 
3108 template<>
3109 struct MetadataFor<commands_3dm::AccelBias::Response>
3110 {
3112 
3113  static constexpr inline ParameterInfo parameters[] = {
3114  {
3115  /* .name = */ "bias",
3116  /* .docs = */ "accelerometer bias in the sensor frame (x,y,z) [g]",
3117  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3118  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3119  /* .attributes = */ {true, false, false, false, false},
3120  /* .count = */ 1,
3121  /* .condition = */ {},
3122  },
3123  };
3124 
3125  static constexpr inline FieldInfo value = {
3126  {
3127  /* .name = */ "commands_3dm::AccelBias::Response",
3128  /* .title = */ "response",
3129  /* .docs = */ "",
3130  /* .parameters = */ parameters,
3131  },
3132  /* .descriptor = */ type::DESCRIPTOR,
3133  /* .functions = */ NO_FUNCTIONS,
3134  /* .response = */ nullptr,
3135  };
3136 };
3137 
3138 template<>
3139 struct MetadataFor<commands_3dm::AccelBias>
3140 {
3142 
3143  static constexpr inline ParameterInfo parameters[] = {
3144  FUNCTION_SELECTOR_PARAM,
3145  {
3146  /* .name = */ "bias",
3147  /* .docs = */ "accelerometer bias in the sensor frame (x,y,z) [g]",
3148  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3149  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3150  /* .attributes = */ {true, false, false, false, false},
3151  /* .count = */ 1,
3152  /* .condition = */ {},
3153  },
3154  };
3155 
3156  static constexpr inline FieldInfo value = {
3157  {
3158  /* .name = */ "commands_3dm::AccelBias",
3159  /* .title = */ "Accelerometer Bias Configuration",
3160  /* .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.",
3161  /* .parameters = */ parameters,
3162  },
3163  /* .descriptor = */ type::DESCRIPTOR,
3164  /* .functions = */ {true, true, true, true, true},
3165  /* .response = */ &MetadataFor<type::Response>::value,
3166  };
3167 };
3168 
3169 template<>
3170 struct MetadataFor<commands_3dm::GyroBias::Response>
3171 {
3173 
3174  static constexpr inline ParameterInfo parameters[] = {
3175  {
3176  /* .name = */ "bias",
3177  /* .docs = */ "gyro bias in the sensor frame (x,y,z) [radians/second]",
3178  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3179  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3180  /* .attributes = */ {true, false, false, false, false},
3181  /* .count = */ 1,
3182  /* .condition = */ {},
3183  },
3184  };
3185 
3186  static constexpr inline FieldInfo value = {
3187  {
3188  /* .name = */ "commands_3dm::GyroBias::Response",
3189  /* .title = */ "response",
3190  /* .docs = */ "",
3191  /* .parameters = */ parameters,
3192  },
3193  /* .descriptor = */ type::DESCRIPTOR,
3194  /* .functions = */ NO_FUNCTIONS,
3195  /* .response = */ nullptr,
3196  };
3197 };
3198 
3199 template<>
3200 struct MetadataFor<commands_3dm::GyroBias>
3201 {
3203 
3204  static constexpr inline ParameterInfo parameters[] = {
3205  FUNCTION_SELECTOR_PARAM,
3206  {
3207  /* .name = */ "bias",
3208  /* .docs = */ "gyro bias in the sensor frame (x,y,z) [radians/second]",
3209  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3210  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3211  /* .attributes = */ {true, false, false, false, false},
3212  /* .count = */ 1,
3213  /* .condition = */ {},
3214  },
3215  };
3216 
3217  static constexpr inline FieldInfo value = {
3218  {
3219  /* .name = */ "commands_3dm::GyroBias",
3220  /* .title = */ "Gyroscope Bias Configuration",
3221  /* .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.",
3222  /* .parameters = */ parameters,
3223  },
3224  /* .descriptor = */ type::DESCRIPTOR,
3225  /* .functions = */ {true, true, true, true, true},
3226  /* .response = */ &MetadataFor<type::Response>::value,
3227  };
3228 };
3229 
3230 template<>
3231 struct MetadataFor<commands_3dm::CaptureGyroBias::Response>
3232 {
3234 
3235  static constexpr inline ParameterInfo parameters[] = {
3236  {
3237  /* .name = */ "bias",
3238  /* .docs = */ "gyro bias in the sensor frame (x,y,z) [radians/second]",
3239  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3240  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::bias>,
3241  /* .attributes = */ {true, false, false, false, false},
3242  /* .count = */ 1,
3243  /* .condition = */ {},
3244  },
3245  };
3246 
3247  static constexpr inline FieldInfo value = {
3248  {
3249  /* .name = */ "commands_3dm::CaptureGyroBias::Response",
3250  /* .title = */ "response",
3251  /* .docs = */ "",
3252  /* .parameters = */ parameters,
3253  },
3254  /* .descriptor = */ type::DESCRIPTOR,
3255  /* .functions = */ NO_FUNCTIONS,
3256  /* .response = */ nullptr,
3257  };
3258 };
3259 
3260 template<>
3261 struct MetadataFor<commands_3dm::CaptureGyroBias>
3262 {
3264 
3265  static constexpr inline ParameterInfo parameters[] = {
3266  {
3267  /* .name = */ "averaging_time_ms",
3268  /* .docs = */ "Averaging time [milliseconds]",
3269  /* .type = */ {Type::U16, nullptr},
3270  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::averaging_time_ms>,
3271  /* .attributes = */ {true, false, false, false, false},
3272  /* .count = */ 1,
3273  /* .condition = */ {},
3274  },
3275  };
3276 
3277  static constexpr inline FieldInfo value = {
3278  {
3279  /* .name = */ "commands_3dm::CaptureGyroBias",
3280  /* .title = */ "Capture Gyroscope Bias",
3281  /* .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",
3282  /* .parameters = */ parameters,
3283  },
3284  /* .descriptor = */ type::DESCRIPTOR,
3285  /* .functions = */ NO_FUNCTIONS,
3286  /* .response = */ &MetadataFor<type::Response>::value,
3287  };
3288 };
3289 
3290 template<>
3291 struct MetadataFor<commands_3dm::MagHardIronOffset::Response>
3292 {
3294 
3295  static constexpr inline ParameterInfo parameters[] = {
3296  {
3297  /* .name = */ "offset",
3298  /* .docs = */ "hard iron offset in the sensor frame (x,y,z) [Gauss]",
3299  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3300  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::offset>,
3301  /* .attributes = */ {true, false, false, false, false},
3302  /* .count = */ 1,
3303  /* .condition = */ {},
3304  },
3305  };
3306 
3307  static constexpr inline FieldInfo value = {
3308  {
3309  /* .name = */ "commands_3dm::MagHardIronOffset::Response",
3310  /* .title = */ "response",
3311  /* .docs = */ "",
3312  /* .parameters = */ parameters,
3313  },
3314  /* .descriptor = */ type::DESCRIPTOR,
3315  /* .functions = */ NO_FUNCTIONS,
3316  /* .response = */ nullptr,
3317  };
3318 };
3319 
3320 template<>
3321 struct MetadataFor<commands_3dm::MagHardIronOffset>
3322 {
3324 
3325  static constexpr inline ParameterInfo parameters[] = {
3326  FUNCTION_SELECTOR_PARAM,
3327  {
3328  /* .name = */ "offset",
3329  /* .docs = */ "hard iron offset in the sensor frame (x,y,z) [Gauss]",
3330  /* .type = */ {Type::STRUCT, &MetadataFor<Vector3f>::value},
3331  /* .accessor = */ nullptr, //utils::access<type, Vector3f, &type::offset>,
3332  /* .attributes = */ {true, false, false, false, false},
3333  /* .count = */ 1,
3334  /* .condition = */ {},
3335  },
3336  };
3337 
3338  static constexpr inline FieldInfo value = {
3339  {
3340  /* .name = */ "commands_3dm::MagHardIronOffset",
3341  /* .title = */ "Magnetometer Hard Iron Offset",
3342  /* .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.",
3343  /* .parameters = */ parameters,
3344  },
3345  /* .descriptor = */ type::DESCRIPTOR,
3346  /* .functions = */ {true, true, true, true, true},
3347  /* .response = */ &MetadataFor<type::Response>::value,
3348  };
3349 };
3350 
3351 template<>
3352 struct MetadataFor<commands_3dm::MagSoftIronMatrix::Response>
3353 {
3355 
3356  static constexpr inline ParameterInfo parameters[] = {
3357  {
3358  /* .name = */ "offset",
3359  /* .docs = */ "soft iron matrix [dimensionless]",
3360  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
3361  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::offset>,
3362  /* .attributes = */ {true, false, false, false, false},
3363  /* .count = */ 1,
3364  /* .condition = */ {},
3365  },
3366  };
3367 
3368  static constexpr inline FieldInfo value = {
3369  {
3370  /* .name = */ "commands_3dm::MagSoftIronMatrix::Response",
3371  /* .title = */ "response",
3372  /* .docs = */ "",
3373  /* .parameters = */ parameters,
3374  },
3375  /* .descriptor = */ type::DESCRIPTOR,
3376  /* .functions = */ NO_FUNCTIONS,
3377  /* .response = */ nullptr,
3378  };
3379 };
3380 
3381 template<>
3382 struct MetadataFor<commands_3dm::MagSoftIronMatrix>
3383 {
3385 
3386  static constexpr inline ParameterInfo parameters[] = {
3387  FUNCTION_SELECTOR_PARAM,
3388  {
3389  /* .name = */ "offset",
3390  /* .docs = */ "soft iron matrix [dimensionless]",
3391  /* .type = */ {Type::STRUCT, &MetadataFor<Matrix3f>::value},
3392  /* .accessor = */ nullptr, //utils::access<type, Matrix3f, &type::offset>,
3393  /* .attributes = */ {true, false, false, false, false},
3394  /* .count = */ 1,
3395  /* .condition = */ {},
3396  },
3397  };
3398 
3399  static constexpr inline FieldInfo value = {
3400  {
3401  /* .name = */ "commands_3dm::MagSoftIronMatrix",
3402  /* .title = */ "Magnetometer Soft Iron Matrix",
3403  /* .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",
3404  /* .parameters = */ parameters,
3405  },
3406  /* .descriptor = */ type::DESCRIPTOR,
3407  /* .functions = */ {true, true, true, true, true},
3408  /* .response = */ &MetadataFor<type::Response>::value,
3409  };
3410 };
3411 
3412 template<>
3413 struct MetadataFor<commands_3dm::ConingScullingEnable::Response>
3414 {
3416 
3417  static constexpr inline ParameterInfo parameters[] = {
3418  {
3419  /* .name = */ "enable",
3420  /* .docs = */ "If true, coning and sculling compensation is enabled.",
3421  /* .type = */ {Type::BOOL, nullptr},
3422  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3423  /* .attributes = */ {true, false, false, false, false},
3424  /* .count = */ 1,
3425  /* .condition = */ {},
3426  },
3427  };
3428 
3429  static constexpr inline FieldInfo value = {
3430  {
3431  /* .name = */ "commands_3dm::ConingScullingEnable::Response",
3432  /* .title = */ "response",
3433  /* .docs = */ "",
3434  /* .parameters = */ parameters,
3435  },
3436  /* .descriptor = */ type::DESCRIPTOR,
3437  /* .functions = */ NO_FUNCTIONS,
3438  /* .response = */ nullptr,
3439  };
3440 };
3441 
3442 template<>
3443 struct MetadataFor<commands_3dm::ConingScullingEnable>
3444 {
3446 
3447  static constexpr inline ParameterInfo parameters[] = {
3448  FUNCTION_SELECTOR_PARAM,
3449  {
3450  /* .name = */ "enable",
3451  /* .docs = */ "If true, coning and sculling compensation is enabled.",
3452  /* .type = */ {Type::BOOL, nullptr},
3453  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3454  /* .attributes = */ {true, false, false, false, false},
3455  /* .count = */ 1,
3456  /* .condition = */ {},
3457  },
3458  };
3459 
3460  static constexpr inline FieldInfo value = {
3461  {
3462  /* .name = */ "commands_3dm::ConingScullingEnable",
3463  /* .title = */ "Coning and Sculling Enable",
3464  /* .docs = */ "Controls the Coning and Sculling Compenstation setting.",
3465  /* .parameters = */ parameters,
3466  },
3467  /* .descriptor = */ type::DESCRIPTOR,
3468  /* .functions = */ {true, true, true, true, true},
3469  /* .response = */ &MetadataFor<type::Response>::value,
3470  };
3471 };
3472 
3473 template<>
3474 struct MetadataFor<commands_3dm::UartBaudrate::Response>
3475 {
3477 
3478  static constexpr inline ParameterInfo parameters[] = {
3479  {
3480  /* .name = */ "baud",
3481  /* .docs = */ "",
3482  /* .type = */ {Type::U32, nullptr},
3483  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::baud>,
3484  /* .attributes = */ {true, false, false, false, false},
3485  /* .count = */ 1,
3486  /* .condition = */ {},
3487  },
3488  };
3489 
3490  static constexpr inline FieldInfo value = {
3491  {
3492  /* .name = */ "commands_3dm::UartBaudrate::Response",
3493  /* .title = */ "response",
3494  /* .docs = */ "",
3495  /* .parameters = */ parameters,
3496  },
3497  /* .descriptor = */ type::DESCRIPTOR,
3498  /* .functions = */ NO_FUNCTIONS,
3499  /* .response = */ nullptr,
3500  };
3501 };
3502 
3503 template<>
3504 struct MetadataFor<commands_3dm::UartBaudrate>
3505 {
3507 
3508  static constexpr inline ParameterInfo parameters[] = {
3509  FUNCTION_SELECTOR_PARAM,
3510  {
3511  /* .name = */ "baud",
3512  /* .docs = */ "",
3513  /* .type = */ {Type::U32, nullptr},
3514  /* .accessor = */ nullptr, //utils::access<type, uint32_t, &type::baud>,
3515  /* .attributes = */ {true, false, false, false, false},
3516  /* .count = */ 1,
3517  /* .condition = */ {},
3518  },
3519  };
3520 
3521  static constexpr inline FieldInfo value = {
3522  {
3523  /* .name = */ "commands_3dm::UartBaudrate",
3524  /* .title = */ "UART Baudrate",
3525  /* .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.",
3526  /* .parameters = */ parameters,
3527  },
3528  /* .descriptor = */ type::DESCRIPTOR,
3529  /* .functions = */ {true, true, true, true, true},
3530  /* .response = */ &MetadataFor<type::Response>::value,
3531  };
3532 };
3533 
3534 template<>
3535 struct MetadataFor<commands_3dm::GpioConfig::Feature>
3536 {
3538 
3539  static constexpr inline EnumInfo::Entry entries[] = {
3540  { 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." },
3541  { 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." },
3542  { uint32_t(2), "PPS", "Pulse per second input or output." },
3543  { uint32_t(3), "ENCODER", "Motor encoder/odometer input." },
3544  { uint32_t(4), "TIMESTAMP", "Precision Timestamping. Use with Event Trigger Configuration (0x0C,0x2E)." },
3545  { uint32_t(5), "UART", "UART data or control lines." },
3546  };
3547 
3548  static constexpr inline EnumInfo value = {
3549  /* .name = */ "Feature",
3550  /* .docs = */ "",
3551  /* .type = */ Type::U8,
3552  /* .entries = */ entries,
3553  };
3554 
3555 };
3556 
3557 template<>
3558 struct MetadataFor<commands_3dm::GpioConfig::Behavior>
3559 {
3561 
3562  static constexpr inline EnumInfo::Entry entries[] = {
3563  { uint32_t(0), "UNUSED", "Use 0 unless otherwise specified." },
3564  { 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." },
3565  { 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." },
3566  { 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." },
3567  { 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." },
3568  { uint32_t(2), "PPS_OUTPUT", "Pin will transmit the pulse-per-second signal from the device." },
3569  { 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." },
3570  { 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." },
3571  { uint32_t(1), "TIMESTAMP_RISING", "Rising edges will be timestamped." },
3572  { uint32_t(2), "TIMESTAMP_FALLING", "Falling edges will be timestamped." },
3573  { uint32_t(3), "TIMESTAMP_EITHER", "Both rising and falling edges will be timestamped." },
3574  { uint32_t(33), "UART_PORT2_TX", "(0x21) UART port 2 transmit." },
3575  { uint32_t(34), "UART_PORT2_RX", "(0x22) UART port 2 receive." },
3576  { uint32_t(49), "UART_PORT3_TX", "(0x31) UART port 3 transmit." },
3577  { uint32_t(50), "UART_PORT3_RX", "(0x32) UART port 3 receive." },
3578  };
3579 
3580  static constexpr inline EnumInfo value = {
3581  /* .name = */ "Behavior",
3582  /* .docs = */ "",
3583  /* .type = */ Type::U8,
3584  /* .entries = */ entries,
3585  };
3586 
3587 };
3588 
3589 template<>
3590 struct MetadataFor<commands_3dm::GpioConfig::PinMode>
3591 {
3593 
3594  static constexpr inline BitfieldInfo::Entry entries[] = {
3595  { 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." },
3596  { 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." },
3597  { 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." },
3598  };
3599 
3600  static constexpr inline BitfieldInfo value = {
3601  /* .name = */ "PinMode",
3602  /* .docs = */ "",
3603  /* .type = */ Type::U8,
3604  /* .entries = */ entries,
3605  };
3606 
3607 };
3608 
3609 template<>
3610 struct MetadataFor<commands_3dm::GpioConfig::Response>
3611 {
3613 
3614  static constexpr inline ParameterInfo parameters[] = {
3615  {
3616  /* .name = */ "pin",
3617  /* .docs = */ "GPIO pin number counting from 1. For save, load, and default function selectors, this can be 0 to select all pins.",
3618  /* .type = */ {Type::U8, nullptr},
3619  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3620  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
3621  /* .count = */ 1,
3622  /* .condition = */ {},
3623  },
3624  {
3625  /* .name = */ "feature",
3626  /* .docs = */ "Determines how the pin will be used.",
3628  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Feature, &type::feature>,
3629  /* .attributes = */ {true, false, false, false, false},
3630  /* .count = */ 1,
3631  /* .condition = */ {},
3632  },
3633  {
3634  /* .name = */ "behavior",
3635  /* .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_.)",
3637  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Behavior, &type::behavior>,
3638  /* .attributes = */ {true, false, false, false, false},
3639  /* .count = */ 1,
3640  /* .condition = */ {},
3641  },
3642  {
3643  /* .name = */ "pin_mode",
3644  /* .docs = */ "GPIO configuration. May be restricted depending on device, pin, feature, and behavior. See device user manual.",
3646  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::PinMode, &type::pin_mode>,
3647  /* .attributes = */ {true, false, false, false, false},
3648  /* .count = */ 1,
3649  /* .condition = */ {},
3650  },
3651  };
3652 
3653  static constexpr inline FieldInfo value = {
3654  {
3655  /* .name = */ "commands_3dm::GpioConfig::Response",
3656  /* .title = */ "response",
3657  /* .docs = */ "",
3658  /* .parameters = */ parameters,
3659  },
3660  /* .descriptor = */ type::DESCRIPTOR,
3661  /* .functions = */ NO_FUNCTIONS,
3662  /* .response = */ nullptr,
3663  };
3664 };
3665 
3666 template<>
3667 struct MetadataFor<commands_3dm::GpioConfig>
3668 {
3670 
3671  static constexpr inline ParameterInfo parameters[] = {
3672  FUNCTION_SELECTOR_PARAM,
3673  {
3674  /* .name = */ "pin",
3675  /* .docs = */ "GPIO pin number counting from 1. For save, load, and default function selectors, this can be 0 to select all pins.",
3676  /* .type = */ {Type::U8, nullptr},
3677  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3678  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
3679  /* .count = */ 1,
3680  /* .condition = */ {},
3681  },
3682  {
3683  /* .name = */ "feature",
3684  /* .docs = */ "Determines how the pin will be used.",
3686  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Feature, &type::feature>,
3687  /* .attributes = */ {true, false, false, false, false},
3688  /* .count = */ 1,
3689  /* .condition = */ {},
3690  },
3691  {
3692  /* .name = */ "behavior",
3693  /* .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_.)",
3695  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::Behavior, &type::behavior>,
3696  /* .attributes = */ {true, false, false, false, false},
3697  /* .count = */ 1,
3698  /* .condition = */ {},
3699  },
3700  {
3701  /* .name = */ "pin_mode",
3702  /* .docs = */ "GPIO configuration. May be restricted depending on device, pin, feature, and behavior. See device user manual.",
3704  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::GpioConfig::PinMode, &type::pin_mode>,
3705  /* .attributes = */ {true, false, false, false, false},
3706  /* .count = */ 1,
3707  /* .condition = */ {},
3708  },
3709  };
3710 
3711  static constexpr inline FieldInfo value = {
3712  {
3713  /* .name = */ "commands_3dm::GpioConfig",
3714  /* .title = */ "GPIO Configuration",
3715  /* .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",
3716  /* .parameters = */ parameters,
3717  },
3718  /* .descriptor = */ type::DESCRIPTOR,
3719  /* .functions = */ {true, true, true, true, true},
3720  /* .response = */ &MetadataFor<type::Response>::value,
3721  };
3722 };
3723 
3724 template<>
3725 struct MetadataFor<commands_3dm::GpioState::Response>
3726 {
3728 
3729  static constexpr inline ParameterInfo parameters[] = {
3730  {
3731  /* .name = */ "pin",
3732  /* .docs = */ "GPIO pin number counting from 1. Cannot be 0.",
3733  /* .type = */ {Type::U8, nullptr},
3734  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3735  /* .attributes = */ {true, true, false, false, false, /*echo*/true},
3736  /* .count = */ 1,
3737  /* .condition = */ {},
3738  },
3739  {
3740  /* .name = */ "state",
3741  /* .docs = */ "The pin state.",
3742  /* .type = */ {Type::BOOL, nullptr},
3743  /* .accessor = */ nullptr, //utils::access<type, bool, &type::state>,
3744  /* .attributes = */ {true, false, false, false, false},
3745  /* .count = */ 1,
3746  /* .condition = */ {},
3747  },
3748  };
3749 
3750  static constexpr inline FieldInfo value = {
3751  {
3752  /* .name = */ "commands_3dm::GpioState::Response",
3753  /* .title = */ "response",
3754  /* .docs = */ "",
3755  /* .parameters = */ parameters,
3756  },
3757  /* .descriptor = */ type::DESCRIPTOR,
3758  /* .functions = */ NO_FUNCTIONS,
3759  /* .response = */ nullptr,
3760  };
3761 };
3762 
3763 template<>
3764 struct MetadataFor<commands_3dm::GpioState>
3765 {
3767 
3768  static constexpr inline ParameterInfo parameters[] = {
3769  FUNCTION_SELECTOR_PARAM,
3770  {
3771  /* .name = */ "pin",
3772  /* .docs = */ "GPIO pin number counting from 1. Cannot be 0.",
3773  /* .type = */ {Type::U8, nullptr},
3774  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::pin>,
3775  /* .attributes = */ {true, true, false, false, false, /*echo*/true},
3776  /* .count = */ 1,
3777  /* .condition = */ {},
3778  },
3779  {
3780  /* .name = */ "state",
3781  /* .docs = */ "The pin state.",
3782  /* .type = */ {Type::BOOL, nullptr},
3783  /* .accessor = */ nullptr, //utils::access<type, bool, &type::state>,
3784  /* .attributes = */ {true, false, false, false, false},
3785  /* .count = */ 1,
3786  /* .condition = */ {},
3787  },
3788  };
3789 
3790  static constexpr inline FieldInfo value = {
3791  {
3792  /* .name = */ "commands_3dm::GpioState",
3793  /* .title = */ "GPIO State",
3794  /* .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.",
3795  /* .parameters = */ parameters,
3796  },
3797  /* .descriptor = */ type::DESCRIPTOR,
3798  /* .functions = */ {true, true, false, false, false},
3799  /* .response = */ &MetadataFor<type::Response>::value,
3800  };
3801 };
3802 
3803 template<>
3804 struct MetadataFor<commands_3dm::Odometer::Mode>
3805 {
3807 
3808  static constexpr inline EnumInfo::Entry entries[] = {
3809  { uint32_t(0), "DISABLED", "Encoder is disabled." },
3810  { uint32_t(2), "QUADRATURE", "Quadrature encoder mode." },
3811  };
3812 
3813  static constexpr inline EnumInfo value = {
3814  /* .name = */ "Mode",
3815  /* .docs = */ "",
3816  /* .type = */ Type::U8,
3817  /* .entries = */ entries,
3818  };
3819 
3820 };
3821 
3822 template<>
3823 struct MetadataFor<commands_3dm::Odometer::Response>
3824 {
3826 
3827  static constexpr inline ParameterInfo parameters[] = {
3828  {
3829  /* .name = */ "mode",
3830  /* .docs = */ "Mode setting.",
3832  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::Odometer::Mode, &type::mode>,
3833  /* .attributes = */ {true, false, false, false, false},
3834  /* .count = */ 1,
3835  /* .condition = */ {},
3836  },
3837  {
3838  /* .name = */ "scaling",
3839  /* .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.",
3840  /* .type = */ {Type::FLOAT, nullptr},
3841  /* .accessor = */ nullptr, //utils::access<type, float, &type::scaling>,
3842  /* .attributes = */ {true, false, false, false, false},
3843  /* .count = */ 1,
3844  /* .condition = */ {},
3845  },
3846  {
3847  /* .name = */ "uncertainty",
3848  /* .docs = */ "Uncertainty in encoder counts to distance translation (1-sigma value) [m/m].",
3849  /* .type = */ {Type::FLOAT, nullptr},
3850  /* .accessor = */ nullptr, //utils::access<type, float, &type::uncertainty>,
3851  /* .attributes = */ {true, false, false, false, false},
3852  /* .count = */ 1,
3853  /* .condition = */ {},
3854  },
3855  };
3856 
3857  static constexpr inline FieldInfo value = {
3858  {
3859  /* .name = */ "commands_3dm::Odometer::Response",
3860  /* .title = */ "response",
3861  /* .docs = */ "",
3862  /* .parameters = */ parameters,
3863  },
3864  /* .descriptor = */ type::DESCRIPTOR,
3865  /* .functions = */ NO_FUNCTIONS,
3866  /* .response = */ nullptr,
3867  };
3868 };
3869 
3870 template<>
3871 struct MetadataFor<commands_3dm::Odometer>
3872 {
3874 
3875  static constexpr inline ParameterInfo parameters[] = {
3876  FUNCTION_SELECTOR_PARAM,
3877  {
3878  /* .name = */ "mode",
3879  /* .docs = */ "Mode setting.",
3881  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::Odometer::Mode, &type::mode>,
3882  /* .attributes = */ {true, false, false, false, false},
3883  /* .count = */ 1,
3884  /* .condition = */ {},
3885  },
3886  {
3887  /* .name = */ "scaling",
3888  /* .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.",
3889  /* .type = */ {Type::FLOAT, nullptr},
3890  /* .accessor = */ nullptr, //utils::access<type, float, &type::scaling>,
3891  /* .attributes = */ {true, false, false, false, false},
3892  /* .count = */ 1,
3893  /* .condition = */ {},
3894  },
3895  {
3896  /* .name = */ "uncertainty",
3897  /* .docs = */ "Uncertainty in encoder counts to distance translation (1-sigma value) [m/m].",
3898  /* .type = */ {Type::FLOAT, nullptr},
3899  /* .accessor = */ nullptr, //utils::access<type, float, &type::uncertainty>,
3900  /* .attributes = */ {true, false, false, false, false},
3901  /* .count = */ 1,
3902  /* .condition = */ {},
3903  },
3904  };
3905 
3906  static constexpr inline FieldInfo value = {
3907  {
3908  /* .name = */ "commands_3dm::Odometer",
3909  /* .title = */ "Odometer Configuration",
3910  /* .docs = */ "Configures the hardware odometer interface.",
3911  /* .parameters = */ parameters,
3912  },
3913  /* .descriptor = */ type::DESCRIPTOR,
3914  /* .functions = */ {true, true, true, true, true},
3915  /* .response = */ &MetadataFor<type::Response>::value,
3916  };
3917 };
3918 
3919 template<>
3920 struct MetadataFor<commands_3dm::ImuLowpassFilter::Response>
3921 {
3923 
3924  static constexpr inline ParameterInfo parameters[] = {
3925  {
3926  /* .name = */ "target_descriptor",
3927  /* .docs = */ "",
3928  /* .type = */ {Type::U8, nullptr},
3929  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::target_descriptor>,
3930  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
3931  /* .count = */ 1,
3932  /* .condition = */ {},
3933  },
3934  {
3935  /* .name = */ "enable",
3936  /* .docs = */ "True if the filter is currently enabled.",
3937  /* .type = */ {Type::BOOL, nullptr},
3938  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
3939  /* .attributes = */ {true, false, false, false, false},
3940  /* .count = */ 1,
3941  /* .condition = */ {},
3942  },
3943  {
3944  /* .name = */ "manual",
3945  /* .docs = */ "True if the filter cutoff was manually configured.",
3946  /* .type = */ {Type::BOOL, nullptr},
3947  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
3948  /* .attributes = */ {true, false, false, false, false},
3949  /* .count = */ 1,
3950  /* .condition = */ {},
3951  },
3952  {
3953  /* .name = */ "frequency",
3954  /* .docs = */ "The cutoff frequency of the filter. If the filter is in\nauto mode, this value is unspecified.",
3955  /* .type = */ {Type::U16, nullptr},
3956  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::frequency>,
3957  /* .attributes = */ {true, false, false, false, false},
3958  /* .count = */ 1,
3959  /* .condition = */ {},
3960  },
3961  {
3962  /* .name = */ "reserved",
3963  /* .docs = */ "Reserved and must be ignored.",
3964  /* .type = */ {Type::U8, nullptr},
3965  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
3966  /* .attributes = */ {true, false, false, false, false},
3967  /* .count = */ 1,
3968  /* .condition = */ {},
3969  },
3970  };
3971 
3972  static constexpr inline FieldInfo value = {
3973  {
3974  /* .name = */ "commands_3dm::ImuLowpassFilter::Response",
3975  /* .title = */ "response",
3976  /* .docs = */ "",
3977  /* .parameters = */ parameters,
3978  },
3979  /* .descriptor = */ type::DESCRIPTOR,
3980  /* .functions = */ NO_FUNCTIONS,
3981  /* .response = */ nullptr,
3982  };
3983 };
3984 
3985 template<>
3986 struct MetadataFor<commands_3dm::ImuLowpassFilter>
3987 {
3989 
3990  static constexpr inline ParameterInfo parameters[] = {
3991  FUNCTION_SELECTOR_PARAM,
3992  {
3993  /* .name = */ "target_descriptor",
3994  /* .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.",
3995  /* .type = */ {Type::U8, nullptr},
3996  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::target_descriptor>,
3997  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
3998  /* .count = */ 1,
3999  /* .condition = */ {},
4000  },
4001  {
4002  /* .name = */ "enable",
4003  /* .docs = */ "The target data will be filtered if this is true.",
4004  /* .type = */ {Type::BOOL, nullptr},
4005  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
4006  /* .attributes = */ {true, false, false, false, false},
4007  /* .count = */ 1,
4008  /* .condition = */ {},
4009  },
4010  {
4011  /* .name = */ "manual",
4012  /* .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.",
4013  /* .type = */ {Type::BOOL, nullptr},
4014  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
4015  /* .attributes = */ {true, false, false, false, false},
4016  /* .count = */ 1,
4017  /* .condition = */ {},
4018  },
4019  {
4020  /* .name = */ "frequency",
4021  /* .docs = */ "-3dB cutoff frequency in Hz. Will not affect filtering if 'manual' is false.",
4022  /* .type = */ {Type::U16, nullptr},
4023  /* .accessor = */ nullptr, //utils::access<type, uint16_t, &type::frequency>,
4024  /* .attributes = */ {true, false, false, false, false},
4025  /* .count = */ 1,
4026  /* .condition = */ {},
4027  },
4028  {
4029  /* .name = */ "reserved",
4030  /* .docs = */ "Reserved, set to 0x00.",
4031  /* .type = */ {Type::U8, nullptr},
4032  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::reserved>,
4033  /* .attributes = */ {true, false, false, false, false},
4034  /* .count = */ 1,
4035  /* .condition = */ {},
4036  },
4037  };
4038 
4039  static constexpr inline FieldInfo value = {
4040  {
4041  /* .name = */ "commands_3dm::ImuLowpassFilter",
4042  /* .title = */ "Advanced Low-Pass Filter Settings",
4043  /* .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)",
4044  /* .parameters = */ parameters,
4045  },
4046  /* .descriptor = */ type::DESCRIPTOR,
4047  /* .functions = */ {true, true, true, true, true},
4048  /* .response = */ &MetadataFor<type::Response>::value,
4049  };
4050 };
4051 
4052 template<>
4053 struct MetadataFor<commands_3dm::ComplementaryFilter::Response>
4054 {
4056 
4057  static constexpr inline ParameterInfo parameters[] = {
4058  {
4059  /* .name = */ "pitch_roll_enable",
4060  /* .docs = */ "Enable Pitch/Roll corrections",
4061  /* .type = */ {Type::BOOL, nullptr},
4062  /* .accessor = */ nullptr, //utils::access<type, bool, &type::pitch_roll_enable>,
4063  /* .attributes = */ {true, false, false, false, false},
4064  /* .count = */ 1,
4065  /* .condition = */ {},
4066  },
4067  {
4068  /* .name = */ "heading_enable",
4069  /* .docs = */ "Enable Heading corrections (only available on devices with magnetometer)",
4070  /* .type = */ {Type::BOOL, nullptr},
4071  /* .accessor = */ nullptr, //utils::access<type, bool, &type::heading_enable>,
4072  /* .attributes = */ {true, false, false, false, false},
4073  /* .count = */ 1,
4074  /* .condition = */ {},
4075  },
4076  {
4077  /* .name = */ "pitch_roll_time_constant",
4078  /* .docs = */ "Time constant associated with the pitch/roll corrections [s]",
4079  /* .type = */ {Type::FLOAT, nullptr},
4080  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch_roll_time_constant>,
4081  /* .attributes = */ {true, false, false, false, false},
4082  /* .count = */ 1,
4083  /* .condition = */ {},
4084  },
4085  {
4086  /* .name = */ "heading_time_constant",
4087  /* .docs = */ "Time constant associated with the heading corrections [s]",
4088  /* .type = */ {Type::FLOAT, nullptr},
4089  /* .accessor = */ nullptr, //utils::access<type, float, &type::heading_time_constant>,
4090  /* .attributes = */ {true, false, false, false, false},
4091  /* .count = */ 1,
4092  /* .condition = */ {},
4093  },
4094  };
4095 
4096  static constexpr inline FieldInfo value = {
4097  {
4098  /* .name = */ "commands_3dm::ComplementaryFilter::Response",
4099  /* .title = */ "response",
4100  /* .docs = */ "",
4101  /* .parameters = */ parameters,
4102  },
4103  /* .descriptor = */ type::DESCRIPTOR,
4104  /* .functions = */ NO_FUNCTIONS,
4105  /* .response = */ nullptr,
4106  };
4107 };
4108 
4109 template<>
4110 struct MetadataFor<commands_3dm::ComplementaryFilter>
4111 {
4113 
4114  static constexpr inline ParameterInfo parameters[] = {
4115  FUNCTION_SELECTOR_PARAM,
4116  {
4117  /* .name = */ "pitch_roll_enable",
4118  /* .docs = */ "Enable Pitch/Roll corrections",
4119  /* .type = */ {Type::BOOL, nullptr},
4120  /* .accessor = */ nullptr, //utils::access<type, bool, &type::pitch_roll_enable>,
4121  /* .attributes = */ {true, false, false, false, false},
4122  /* .count = */ 1,
4123  /* .condition = */ {},
4124  },
4125  {
4126  /* .name = */ "heading_enable",
4127  /* .docs = */ "Enable Heading corrections (only available on devices with magnetometer)",
4128  /* .type = */ {Type::BOOL, nullptr},
4129  /* .accessor = */ nullptr, //utils::access<type, bool, &type::heading_enable>,
4130  /* .attributes = */ {true, false, false, false, false},
4131  /* .count = */ 1,
4132  /* .condition = */ {},
4133  },
4134  {
4135  /* .name = */ "pitch_roll_time_constant",
4136  /* .docs = */ "Time constant associated with the pitch/roll corrections [s]",
4137  /* .type = */ {Type::FLOAT, nullptr},
4138  /* .accessor = */ nullptr, //utils::access<type, float, &type::pitch_roll_time_constant>,
4139  /* .attributes = */ {true, false, false, false, false},
4140  /* .count = */ 1,
4141  /* .condition = */ {},
4142  },
4143  {
4144  /* .name = */ "heading_time_constant",
4145  /* .docs = */ "Time constant associated with the heading corrections [s]",
4146  /* .type = */ {Type::FLOAT, nullptr},
4147  /* .accessor = */ nullptr, //utils::access<type, float, &type::heading_time_constant>,
4148  /* .attributes = */ {true, false, false, false, false},
4149  /* .count = */ 1,
4150  /* .condition = */ {},
4151  },
4152  };
4153 
4154  static constexpr inline FieldInfo value = {
4155  {
4156  /* .name = */ "commands_3dm::ComplementaryFilter",
4157  /* .title = */ "Complementary Filter Configuration",
4158  /* .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.",
4159  /* .parameters = */ parameters,
4160  },
4161  /* .descriptor = */ type::DESCRIPTOR,
4162  /* .functions = */ {true, true, true, true, true},
4163  /* .response = */ &MetadataFor<type::Response>::value,
4164  };
4165 };
4166 
4167 template<>
4168 struct MetadataFor<commands_3dm::SensorRangeType>
4169 {
4171 
4172  static constexpr inline EnumInfo::Entry entries[] = {
4173  { uint32_t(0), "ALL", "Only allowed for SAVE, LOAD, and DEFAULT function selectors." },
4174  { uint32_t(1), "ACCEL", "Accelerometer. Range is specified in g." },
4175  { uint32_t(2), "GYRO", "Gyroscope. Range is specified in degrees/s." },
4176  { uint32_t(3), "MAG", "Magnetometer. Range is specified in Gauss." },
4177  { uint32_t(4), "PRESS", "Pressure sensor. Range is specified in hPa." },
4178  };
4179 
4180  static constexpr inline EnumInfo value = {
4181  /* .name = */ "SensorRangeType",
4182  /* .docs = */ "",
4183  /* .type = */ Type::U8,
4184  /* .entries = */ entries,
4185  };
4186 
4187 };
4188 
4189 template<>
4190 struct MetadataFor<commands_3dm::SensorRange::Response>
4191 {
4193 
4194  static constexpr inline ParameterInfo parameters[] = {
4195  {
4196  /* .name = */ "sensor",
4197  /* .docs = */ "Which type of sensor will get the new range value.",
4199  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4200  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4201  /* .count = */ 1,
4202  /* .condition = */ {},
4203  },
4204  {
4205  /* .name = */ "setting",
4206  /* .docs = */ "Use the 3DM Get Calibrated Sensor Ranges (0x0C,0x53) command to determine this value.",
4207  /* .type = */ {Type::U8, nullptr},
4208  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::setting>,
4209  /* .attributes = */ {true, false, false, false, false},
4210  /* .count = */ 1,
4211  /* .condition = */ {},
4212  },
4213  };
4214 
4215  static constexpr inline FieldInfo value = {
4216  {
4217  /* .name = */ "commands_3dm::SensorRange::Response",
4218  /* .title = */ "response",
4219  /* .docs = */ "",
4220  /* .parameters = */ parameters,
4221  },
4222  /* .descriptor = */ type::DESCRIPTOR,
4223  /* .functions = */ NO_FUNCTIONS,
4224  /* .response = */ nullptr,
4225  };
4226 };
4227 
4228 template<>
4229 struct MetadataFor<commands_3dm::SensorRange>
4230 {
4232 
4233  static constexpr inline ParameterInfo parameters[] = {
4234  FUNCTION_SELECTOR_PARAM,
4235  {
4236  /* .name = */ "sensor",
4237  /* .docs = */ "Which type of sensor will get the new range value.",
4239  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4240  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4241  /* .count = */ 1,
4242  /* .condition = */ {},
4243  },
4244  {
4245  /* .name = */ "setting",
4246  /* .docs = */ "Use the 3DM Get Calibrated Sensor Ranges (0x0C,0x53) command to determine this value.",
4247  /* .type = */ {Type::U8, nullptr},
4248  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::setting>,
4249  /* .attributes = */ {true, false, false, false, false},
4250  /* .count = */ 1,
4251  /* .condition = */ {},
4252  },
4253  };
4254 
4255  static constexpr inline FieldInfo value = {
4256  {
4257  /* .name = */ "commands_3dm::SensorRange",
4258  /* .title = */ "Sensor Range",
4259  /* .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.",
4260  /* .parameters = */ parameters,
4261  },
4262  /* .descriptor = */ type::DESCRIPTOR,
4263  /* .functions = */ {true, true, true, true, true},
4264  /* .response = */ &MetadataFor<type::Response>::value,
4265  };
4266 };
4267 
4268 template<>
4269 struct MetadataFor<commands_3dm::CalibratedSensorRanges::Entry>
4270 {
4272 
4273  static constexpr inline ParameterInfo parameters[] = {
4274  {
4275  /* .name = */ "setting",
4276  /* .docs = */ "The value used in the 3DM Sensor Range command and response.",
4277  /* .type = */ {Type::U8, nullptr},
4278  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::setting>,
4279  /* .attributes = */ NO_FUNCTIONS,
4280  /* .count = */ 1,
4281  /* .condition = */ {},
4282  },
4283  {
4284  /* .name = */ "range",
4285  /* .docs = */ "The actual range value. Units depend on the sensor type.",
4286  /* .type = */ {Type::FLOAT, nullptr},
4287  /* .accessor = */ nullptr, //utils::access<type, float, &type::range>,
4288  /* .attributes = */ NO_FUNCTIONS,
4289  /* .count = */ 1,
4290  /* .condition = */ {},
4291  },
4292  };
4293 
4294  static constexpr inline StructInfo value = {
4295  /* .name = */ "Entry",
4296  /* .title = */ "Sensor Range Entry",
4297  /* .docs = */ "",
4298  /* .parameters = */ parameters,
4299  };
4300 };
4301 
4302 template<>
4303 struct MetadataFor<commands_3dm::CalibratedSensorRanges::Response>
4304 {
4306 
4307  static constexpr inline ParameterInfo parameters[] = {
4308  {
4309  /* .name = */ "sensor",
4310  /* .docs = */ "The sensor type from the command.",
4312  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4313  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
4314  /* .count = */ 1,
4315  /* .condition = */ {},
4316  },
4317  {
4318  /* .name = */ "num_ranges",
4319  /* .docs = */ "Number of supported ranges.",
4320  /* .type = */ {Type::U8, nullptr},
4321  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::num_ranges>,
4322  /* .attributes = */ {true, false, false, false, false},
4323  /* .count = */ 1,
4324  /* .condition = */ {},
4325  },
4326  {
4327  /* .name = */ "ranges",
4328  /* .docs = */ "List of possible range settings.",
4330  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::CalibratedSensorRanges::Entry, &type::ranges>,
4331  /* .attributes = */ {true, false, false, false, false},
4332  /* .count = */ {0, microstrain::Index(1) /* num_ranges */},
4333  /* .condition = */ {},
4334  },
4335  };
4336 
4337  static constexpr inline FieldInfo value = {
4338  {
4339  /* .name = */ "commands_3dm::CalibratedSensorRanges::Response",
4340  /* .title = */ "response",
4341  /* .docs = */ "",
4342  /* .parameters = */ parameters,
4343  },
4344  /* .descriptor = */ type::DESCRIPTOR,
4345  /* .functions = */ NO_FUNCTIONS,
4346  /* .response = */ nullptr,
4347  };
4348 };
4349 
4350 template<>
4351 struct MetadataFor<commands_3dm::CalibratedSensorRanges>
4352 {
4354 
4355  static constexpr inline ParameterInfo parameters[] = {
4356  {
4357  /* .name = */ "sensor",
4358  /* .docs = */ "The sensor to query. Cannot be ALL.",
4360  /* .accessor = */ nullptr, //utils::access<type, commands_3dm::SensorRangeType, &type::sensor>,
4361  /* .attributes = */ {true, false, false, false, false, /*echo*/true},
4362  /* .count = */ 1,
4363  /* .condition = */ {},
4364  },
4365  };
4366 
4367  static constexpr inline FieldInfo value = {
4368  {
4369  /* .name = */ "commands_3dm::CalibratedSensorRanges",
4370  /* .title = */ "Get Calibrated Sensor Ranges",
4371  /* .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.",
4372  /* .parameters = */ parameters,
4373  },
4374  /* .descriptor = */ type::DESCRIPTOR,
4375  /* .functions = */ NO_FUNCTIONS,
4376  /* .response = */ &MetadataFor<type::Response>::value,
4377  };
4378 };
4379 
4380 template<>
4381 struct MetadataFor<commands_3dm::LowpassFilter::Response>
4382 {
4384 
4385  static constexpr inline ParameterInfo parameters[] = {
4386  {
4387  /* .name = */ "desc_set",
4388  /* .docs = */ "Descriptor set of the quantity to be filtered.",
4389  /* .type = */ {Type::U8, nullptr},
4390  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
4391  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4392  /* .count = */ 1,
4393  /* .condition = */ {},
4394  },
4395  {
4396  /* .name = */ "field_desc",
4397  /* .docs = */ "Field descriptor of the quantity to be filtered.",
4398  /* .type = */ {Type::U8, nullptr},
4399  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::field_desc>,
4400  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4401  /* .count = */ 1,
4402  /* .condition = */ {},
4403  },
4404  {
4405  /* .name = */ "enable",
4406  /* .docs = */ "The filter will be enabled if this is true.",
4407  /* .type = */ {Type::BOOL, nullptr},
4408  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
4409  /* .attributes = */ {true, false, false, false, false},
4410  /* .count = */ 1,
4411  /* .condition = */ {},
4412  },
4413  {
4414  /* .name = */ "manual",
4415  /* .docs = */ "If false, the frequency parameter is ignored and the filter\nwill track to half of the configured message format frequency.",
4416  /* .type = */ {Type::BOOL, nullptr},
4417  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
4418  /* .attributes = */ {true, false, false, false, false},
4419  /* .count = */ 1,
4420  /* .condition = */ {},
4421  },
4422  {
4423  /* .name = */ "frequency",
4424  /* .docs = */ "Cutoff frequency in Hz. This will return the actual frequency\nwhen read out in automatic mode.",
4425  /* .type = */ {Type::FLOAT, nullptr},
4426  /* .accessor = */ nullptr, //utils::access<type, float, &type::frequency>,
4427  /* .attributes = */ {true, false, false, false, false},
4428  /* .count = */ 1,
4429  /* .condition = */ {},
4430  },
4431  };
4432 
4433  static constexpr inline FieldInfo value = {
4434  {
4435  /* .name = */ "commands_3dm::LowpassFilter::Response",
4436  /* .title = */ "response",
4437  /* .docs = */ "",
4438  /* .parameters = */ parameters,
4439  },
4440  /* .descriptor = */ type::DESCRIPTOR,
4441  /* .functions = */ NO_FUNCTIONS,
4442  /* .response = */ nullptr,
4443  };
4444 };
4445 
4446 template<>
4447 struct MetadataFor<commands_3dm::LowpassFilter>
4448 {
4450 
4451  static constexpr inline ParameterInfo parameters[] = {
4452  FUNCTION_SELECTOR_PARAM,
4453  {
4454  /* .name = */ "desc_set",
4455  /* .docs = */ "Descriptor set of the quantity to be filtered.",
4456  /* .type = */ {Type::U8, nullptr},
4457  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::desc_set>,
4458  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4459  /* .count = */ 1,
4460  /* .condition = */ {},
4461  },
4462  {
4463  /* .name = */ "field_desc",
4464  /* .docs = */ "Field descriptor of the quantity to be filtered.",
4465  /* .type = */ {Type::U8, nullptr},
4466  /* .accessor = */ nullptr, //utils::access<type, uint8_t, &type::field_desc>,
4467  /* .attributes = */ {true, true, true, true, true, /*echo*/true},
4468  /* .count = */ 1,
4469  /* .condition = */ {},
4470  },
4471  {
4472  /* .name = */ "enable",
4473  /* .docs = */ "The filter will be enabled if this is true.",
4474  /* .type = */ {Type::BOOL, nullptr},
4475  /* .accessor = */ nullptr, //utils::access<type, bool, &type::enable>,
4476  /* .attributes = */ {true, false, false, false, false},
4477  /* .count = */ 1,
4478  /* .condition = */ {},
4479  },
4480  {
4481  /* .name = */ "manual",
4482  /* .docs = */ "If false, the frequency parameter is ignored and the filter\nwill track to half of the configured message format frequency.",
4483  /* .type = */ {Type::BOOL, nullptr},
4484  /* .accessor = */ nullptr, //utils::access<type, bool, &type::manual>,
4485  /* .attributes = */ {true, false, false, false, false},
4486  /* .count = */ 1,
4487  /* .condition = */ {},
4488  },
4489  {
4490  /* .name = */ "frequency",
4491  /* .docs = */ "Cutoff frequency in Hz. This will return the actual frequency\nwhen read out in automatic mode.",
4492  /* .type = */ {Type::FLOAT, nullptr},
4493  /* .accessor = */ nullptr, //utils::access<type, float, &type::frequency>,
4494  /* .attributes = */ {true, false, false, false, false},
4495  /* .count = */ 1,
4496  /* .condition = */ {},
4497  },
4498  };
4499 
4500  static constexpr inline FieldInfo value = {
4501  {
4502  /* .name = */ "commands_3dm::LowpassFilter",
4503  /* .title = */ "Low-Pass Anti-Aliasing Filter",
4504  /* .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.",
4505  /* .parameters = */ parameters,
4506  },
4507  /* .descriptor = */ type::DESCRIPTOR,
4508  /* .functions = */ {true, true, true, true, true},
4509  /* .response = */ &MetadataFor<type::Response>::value,
4510  };
4511 };
4512 
4513 
4514 static constexpr inline const FieldInfo* COMMANDS_3DM_FIELDS[] = {
4600 };
4601 
4602 static constexpr DescriptorSetInfo COMMANDS_3DM = {
4603  /* .descriptor = */ mip::commands_3dm::DESCRIPTOR_SET,
4604  /* .name = */ "3dm Commands",
4605  /* .fields = */ COMMANDS_3DM_FIELDS,
4606 };
4607 
4608 } // namespace mip::metadata
4609 
commands_3dm.hpp
mip::metadata::MetadataFor< commands_3dm::CalibratedSensorRanges::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4337
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:3186
mip::commands_3dm::GpioConfig
Definition: commands_3dm.hpp:3422
mip::metadata::MetadataFor< commands_3dm::GnssGetBaseRate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:388
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
common.hpp
mip::metadata::MetadataFor< commands_3dm::FilterMessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:585
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformDcm >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3095
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformQuaternion >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3034
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:2973
mip::metadata::MetadataFor< commands_3dm::ImuGetBaseRate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:340
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:4500
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:89
mip::metadata::MetadataFor< commands_3dm::MessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:926
mip::commands_3dm::MagSoftIronMatrix::Response
Definition: commands_3dm.hpp:3193
mip::metadata
Definition: common.hpp:8
mip::metadata::MetadataFor< commands_3dm::CaptureGyroBias >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3277
mip::commands_3dm::PpsSource
Definition: commands_3dm.hpp:1677
mip::metadata::MetadataFor< commands_3dm::GnssSbasSettings >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1456
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:3217
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:4367
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:2218
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:143
mip::metadata::MetadataFor< commands_3dm::DatastreamControl >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1113
mip::metadata::MetadataFor< commands_3dm::MessageFormat >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:975
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:3338
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:1272
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:3906
mip::metadata::Type::U16
@ U16
mip::metadata::MetadataFor
Definition: mip_metadata.hpp:13
mip::metadata::MetadataFor< commands_3dm::GpioConfig >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3711
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:848
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:21
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:1034
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:370
mip::metadata::ParameterInfo
Definition: mip_structures.hpp:158
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:2924
mip::metadata::MetadataFor< commands_3dm::PpsSource >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1734
mip::commands_3dm::EventTrigger::Type::COMBINATION
@ COMBINATION
Logical combination of two or more triggers. See CombinationParams.
mip::metadata::EnumInfo::Entry
Definition: mip_structures.hpp:65
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:3972
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformDcm::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3064
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:2106
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:1651
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:625
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:2179
mip::metadata::Type::FLOAT
@ FLOAT
mip::metadata::MetadataFor< commands_3dm::PollData >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:809
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:1703
mip::metadata::MetadataFor< commands_3dm::PollImuMessage >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:47
mip::metadata::MetadataFor< commands_3dm::GpioState::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3750
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:506
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:3653
mip::metadata::MetadataFor< commands_3dm::SensorRange >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4255
mip::metadata::MetadataFor< commands_3dm::EventTrigger::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:2526
mip::metadata::MetadataFor< commands_3dm::Sensor2VehicleTransformQuaternion::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3003
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:1974
mip::metadata::MetadataFor< commands_3dm::NmeaMessageFormat::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:712
mip::metadata::MetadataFor< commands_3dm::Odometer::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3857
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:2853
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:1844
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:546
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:427
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:2795
mip::metadata::FieldInfo
Definition: mip_structures.hpp:212
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:4215
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:3156
mip::metadata::MetadataFor< commands_3dm::DatastreamControl::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1073
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:3490
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:673
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:3790
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:2575
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:3368
mip::metadata::MetadataFor< commands_3dm::ImuGetBaseRate::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:322
mip::metadata::MetadataFor< commands_3dm::MagSoftIronMatrix >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3399
mip::metadata::MetadataFor< commands_3dm::AccelBias::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3125
mip::metadata::MetadataFor< commands_3dm::GnssSbasSettings::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1398
mip::metadata::MetadataFor< commands_3dm::ConingScullingEnable::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3429
mip::metadata::EnumInfo
Definition: mip_structures.hpp:63
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:752
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:655
mip::metadata::MetadataFor< commands_3dm::GetEventSupport >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1874
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:2067
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:2876
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:467
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:1602
mip::metadata::MetadataFor< commands_3dm::MagHardIronOffset::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3307
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:878
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:4154
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:201
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:4039
mip::metadata::MetadataFor< commands_3dm::CaptureGyroBias::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3247
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:1554
mip::commands_3dm::ConstellationSettings::Settings
Definition: commands_3dm.hpp:1290
mip::metadata::MetadataFor< commands_3dm::ConstellationSettings >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1321
mip::metadata::Type::U32
@ U32
mip::metadata::MetadataFor< commands_3dm::UartBaudrate >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3521
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:292
mip::metadata::MetadataFor< commands_3dm::ConingScullingEnable >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:3460
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:1934
mip::metadata::MetadataFor< commands_3dm::GnssAssistedFix::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:1514
mip::metadata::MetadataFor< commands_3dm::LowpassFilter::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4433
mip::metadata::MetadataFor< commands_3dm::ComplementaryFilter::Response >::value
static constexpr FieldInfo value
Definition: commands_3dm.hpp:4096
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