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