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