MIP_SDK  v3.0.0-208-gdb90bae
MicroStrain Communications Library for embedded systems
mip_structures.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <microstrain/index.hpp>
4 #include <microstrain/span.hpp>
6 
7 #include <cstdint>
8 
9 namespace mip::metadata
10 {
11  template<class T>
13 
14  struct EnumInfo;
15  struct BitfieldInfo;
16  struct UnionInfo;
17  struct StructInfo;
18  struct FieldInfo;
19  struct ParameterInfo;
20 
21  enum class Type
22  {
23  NONE = 0,
24 
25  CHAR,
26  BOOL,
27  U8,
28  S8,
29  U16,
30  S16,
31  U32,
32  S32,
33  U64,
34  S64,
35  FLOAT,
36  DOUBLE,
37 
38  ENUM,
39  BITS,
40  STRUCT,
41  UNION,
42  };
43 
44  struct TypeInfo
45  {
46  //template<class Field, class T>
47  //TypeInfo(T Field::*member);
48 
50 
51  const void* infoPtr = nullptr;
52 
53  const EnumInfo* enumPointer() const { return (type == Type::ENUM ) ? static_cast<const EnumInfo* >(infoPtr) : nullptr; }
54  const BitfieldInfo* bitfieldPointer() const { return (type == Type::BITS ) ? static_cast<const BitfieldInfo*>(infoPtr) : nullptr; }
55  const UnionInfo* unionPointer() const { return (type == Type::UNION ) ? static_cast<const UnionInfo* >(infoPtr) : nullptr; }
56  const StructInfo* structPointer() const { return (type == Type::STRUCT) ? static_cast<const StructInfo* >(infoPtr) : nullptr; }
57 
58  bool isBasicType() const { return type <= Type::DOUBLE; }
59  bool isCustom() const { return type != Type::NONE && type >= Type::ENUM; }
60  bool isClass() const { return type != Type::NONE && type >= Type::STRUCT; }
61  };
62 
63  struct EnumInfo
64  {
65  struct Entry
66  {
67  uint32_t value = 0;
68  const char* name = nullptr;
69  const char* docs = nullptr;
70  };
71 
72  const char* name = nullptr;
73  const char* docs = nullptr;
75 
77 
78  const char* nameForValue(uint32_t value) const
79  {
80  for (const Entry& entry : entries)
81  {
82  if (entry.value == value)
83  return entry.name;
84  }
85  return nullptr;
86  }
87  };
88 
89  struct BitfieldInfo : public EnumInfo {};
90 
91  // Basic attribute bitfield for fields and parameters.
92  struct FunctionBits
93  {
94  constexpr FunctionBits() = default;
95  constexpr FunctionBits(bool w, bool r, bool s, bool l, bool d) : bits(0x00)
96  {
97  setCanWrite(w);
98  setCanRead(r);
99  setCanSave(s);
100  setCanLoad(l);
101  setCanReset(d);
102  }
103 
104  constexpr bool canWrite() const { return bits & 0b00000001; }
105  constexpr bool canRead() const { return bits & 0b00000010; }
106  constexpr bool canSave() const { return bits & 0b00000100; }
107  constexpr bool canLoad() const { return bits & 0b00001000; }
108  constexpr bool canReset() const { return bits & 0b00010000; }
109 
110  constexpr FunctionBits& setCanWrite (bool w) { bits = (bits & 0b11111110) | (uint8_t(w) << 0); return *this; }
111  constexpr FunctionBits& setCanRead (bool r) { bits = (bits & 0b11111101) | (uint8_t(r) << 1); return *this; }
112  constexpr FunctionBits& setCanSave (bool s) { bits = (bits & 0b11111011) | (uint8_t(s) << 2); return *this; }
113  constexpr FunctionBits& setCanLoad (bool l) { bits = (bits & 0b11110111) | (uint8_t(l) << 3); return *this; }
114  constexpr FunctionBits& setCanReset (bool d) { bits = (bits & 0b11101111) | (uint8_t(d) << 4); return *this; }
115 
116  constexpr bool has(mip::FunctionSelector function) const { return (bits >> (static_cast<uint8_t>(function) - static_cast<uint8_t>(mip::FunctionSelector::WRITE))) & 1; }
117 
118  uint8_t bits = 0x00;
119  };
120 
121  // Extended attributes for parameters.
123  {
124  constexpr ParamAttributes() = default;
126  constexpr ParamAttributes(bool w, bool r, bool s, bool l, bool d, bool e = false, bool x=false) : FunctionBits(w, r, s, l, d)
127  {
128  setNotSerialized(x);
129  setIsEchoed(e);
130  }
131 
132  constexpr bool isNotSerialized() const { return bits & 0b01000000; }
133  constexpr bool isEchoed() const { return bits & 0b10000000; }
134  constexpr bool isSerialized() const { return !isNotSerialized(); }
135 
136  constexpr ParamAttributes& setNotSerialized (bool x) { bits = (bits & 0b10111111) | (uint8_t(x) << 6); return *this; }
137  constexpr ParamAttributes& setIsEchoed (bool e) { bits = (bits & 0b01111111) | (uint8_t(e) << 7); return *this; }
138  };
139 
140  // Extended attributes for fields.
142  {
143  constexpr FieldAttributes() = default;
145  constexpr FieldAttributes(bool w, bool r, bool s, bool l, bool d, bool p = false) : FunctionBits(w, r, s, l, d) { setProprietary(p); }
146 
147  constexpr bool hasFunctionSelector() const { return (bits & 0b00011111) > 0; }
148 
149  constexpr bool isProprietary() const { return bits & 0b10000000; }
150 
151  constexpr FieldAttributes& setProprietary(bool p) { bits = (bits & 0b01111111) | (uint8_t(p) << 7); return *this; }
152  };
153 
154  static constexpr inline FunctionBits ALL_FUNCTIONS = {true, true, true, true, true};
155  static constexpr inline FunctionBits NO_FUNCTIONS = {false, false, false, false, false};
156 
157 
159  {
160  struct Count
161  {
162  constexpr Count() = default;
163  constexpr Count(uint8_t n) : count(n) {}
164  constexpr Count(uint8_t n, microstrain::Id id) : count(n), paramIdx(id) {}
165 
166  uint8_t count = 1;
168 
169  constexpr bool isFixed() const { return count > 0 && !paramIdx.isAssigned(); }
170  constexpr bool hasCounter() const { return paramIdx.isAssigned(); }
171  };
172 
173  struct Condition
174  {
175  enum class Type : uint8_t
176  {
177  NONE = 0,
178  ENUM = 1,
179  //PRODUCT = 2, ///< Depends on product variant (TBD)
180  //OPTIONAL = 2, ///< Parameter can be omitted (TBD)
181  };
182 
185  uint16_t value = 0;
186 
187  constexpr bool hasCondition() const { return type != Type::NONE; }
188  };
189 
190  using Accessor = void* (*)(void*);
191 
192  const char* name = nullptr;
193  const char* docs = nullptr;
195  Accessor accessor = nullptr;
199  };
200 
201  struct StructInfo
202  {
203  const char* name = nullptr;
204  const char* title = nullptr;
205  const char* docs = nullptr;
206 
208  };
209 
210  struct UnionInfo : public StructInfo {};
211 
212  struct FieldInfo : public StructInfo
213  {
215  FieldAttributes functions = {false, false, false, false, false, false};
216  const FieldInfo* response = nullptr;
217  };
218 
220  {
221  uint8_t descriptor = mip::INVALID_DESCRIPTOR_SET;
222  const char* name = nullptr;
224 
225  //const FieldInfo* findField(uint8_t field_desc) const
226  //{
227  // // Binary search assumes fields are sorted by descriptor.
228  // auto it = std::lower_bound(fields.begin(), fields.end(), field_desc, [](const FieldInfo* a, uint8_t b){ return a->descriptor.fieldDescriptor < b; });
229  // return (it != fields.end()) && ((*it)->descriptor.fieldDescriptor==field_desc) ? *it : nullptr;
230  //}
231  };
232 } // namespace mip::metadata
microstrain::Id::isAssigned
constexpr bool isAssigned() const
Definition: index.hpp:93
mip::metadata::ParameterInfo::Count::isFixed
constexpr bool isFixed() const
Definition: mip_structures.hpp:169
mip::metadata::EnumInfo::name
const char * name
Definition: mip_structures.hpp:72
mip::metadata::ParameterInfo::Count::paramIdx
microstrain::Id paramIdx
If assigned, specifies a parameter that holds the actual runtime count.
Definition: mip_structures.hpp:167
mip::metadata::FieldAttributes::FieldAttributes
constexpr FieldAttributes(FunctionBits bits)
Definition: mip_structures.hpp:144
mip_descriptors.hpp
index.hpp
mip::metadata::EnumInfo::type
Type type
Definition: mip_structures.hpp:74
mip::metadata::Type::ENUM
@ ENUM
mip::metadata::ParameterInfo::accessor
Accessor accessor
Obtains a reference to the member variable.
Definition: mip_structures.hpp:195
mip::metadata::ParameterInfo::Condition
Definition: mip_structures.hpp:173
mip::metadata::FieldInfo::response
const FieldInfo * response
Definition: mip_structures.hpp:216
mip::metadata::ParameterInfo::Condition::Type::NONE
@ NONE
No condition, member always valid.
mip::metadata::Type::NONE
@ NONE
Invalid/unknown.
mip::metadata::FunctionBits::bits
uint8_t bits
Definition: mip_structures.hpp:118
mip::metadata::EnumInfo::docs
const char * docs
Definition: mip_structures.hpp:73
mip::metadata::BitfieldInfo
Definition: mip_structures.hpp:89
mip::metadata::ParameterInfo::Condition::hasCondition
constexpr bool hasCondition() const
Definition: mip_structures.hpp:187
mip::metadata::FieldAttributes::setProprietary
constexpr FieldAttributes & setProprietary(bool p)
Definition: mip_structures.hpp:151
mip::metadata
Definition: common.hpp:8
mip::metadata::ParameterInfo::attributes
ParamAttributes attributes
This parameter is required for the specified function selectors.
Definition: mip_structures.hpp:196
mip::metadata::ParameterInfo::Count::Count
constexpr Count()=default
mip::metadata::ParameterInfo::Count::Count
constexpr Count(uint8_t n, microstrain::Id id)
Definition: mip_structures.hpp:164
mip::metadata::ParameterInfo::Count::count
uint8_t count
Fixed size if paramIdx unassigned.
Definition: mip_structures.hpp:166
mip::metadata::FunctionBits::canRead
constexpr bool canRead() const
Definition: mip_structures.hpp:105
mip::metadata::ParameterInfo::Count::Count
constexpr Count(uint8_t n)
Definition: mip_structures.hpp:163
mip::metadata::ParameterInfo::name
const char * name
Programmatic name (e.g. for printing or language bindings).
Definition: mip_structures.hpp:192
mip::metadata::ParamAttributes::isEchoed
constexpr bool isEchoed() const
Definition: mip_structures.hpp:133
mip::metadata::ParameterInfo::Accessor
void *(*)(void *) Accessor
Definition: mip_structures.hpp:190
mip::metadata::FieldAttributes
Definition: mip_structures.hpp:141
mip::metadata::Type::U16
@ U16
microstrain::Span
Implementation of std::span from C++20.
Definition: span.hpp:41
mip::metadata::Type::STRUCT
@ STRUCT
mip::metadata::FunctionBits::canReset
constexpr bool canReset() const
Definition: mip_structures.hpp:108
mip::metadata::StructInfo::title
const char * title
Definition: mip_structures.hpp:204
mip::metadata::Type::S32
@ S32
mip::metadata::ParameterInfo::Condition::type
Type type
Type of condition.
Definition: mip_structures.hpp:183
mip::metadata::FunctionBits::setCanReset
constexpr FunctionBits & setCanReset(bool d)
Definition: mip_structures.hpp:114
mip::metadata::Type::DOUBLE
@ DOUBLE
mip::metadata::FunctionBits::setCanWrite
constexpr FunctionBits & setCanWrite(bool w)
Definition: mip_structures.hpp:110
mip::metadata::Type
Type
Definition: mip_structures.hpp:21
mip::metadata::Type::CHAR
@ CHAR
mip::metadata::ParameterInfo
Definition: mip_structures.hpp:158
mip::metadata::TypeInfo::isCustom
bool isCustom() const
Definition: mip_structures.hpp:59
mip::metadata::FunctionBits::setCanSave
constexpr FunctionBits & setCanSave(bool s)
Definition: mip_structures.hpp:112
mip::metadata::ParameterInfo::type
TypeInfo type
Data type.
Definition: mip_structures.hpp:194
mip::metadata::ParameterInfo::count
Count count
Number of instances for arrays.
Definition: mip_structures.hpp:197
mip::metadata::EnumInfo::Entry
Definition: mip_structures.hpp:65
mip::metadata::EnumInfo::Entry::value
uint32_t value
Definition: mip_structures.hpp:67
mip::metadata::Type::UNION
@ UNION
mip::metadata::TypeInfo::isClass
bool isClass() const
Definition: mip_structures.hpp:60
mip::metadata::TypeInfo::structPointer
const StructInfo * structPointer() const
Definition: mip_structures.hpp:56
mip::metadata::FunctionBits::setCanRead
constexpr FunctionBits & setCanRead(bool r)
Definition: mip_structures.hpp:111
mip::metadata::Type::S8
@ S8
mip::FunctionSelector
FunctionSelector
Definition: mip_descriptors.hpp:66
mip::metadata::ParamAttributes::ParamAttributes
constexpr ParamAttributes(bool w, bool r, bool s, bool l, bool d, bool e=false, bool x=false)
Definition: mip_structures.hpp:126
mip::metadata::FunctionBits::canLoad
constexpr bool canLoad() const
Definition: mip_structures.hpp:107
mip::metadata::StructInfo::docs
const char * docs
Definition: mip_structures.hpp:205
mip::metadata::DescriptorSetInfo::name
const char * name
Definition: mip_structures.hpp:222
mip::metadata::ParameterInfo::condition
Condition condition
For conditionally-enabled parameters like those in unions.
Definition: mip_structures.hpp:198
mip::metadata::Type::FLOAT
@ FLOAT
mip::metadata::ParamAttributes::ParamAttributes
constexpr ParamAttributes()=default
mip::metadata::FunctionBits::has
constexpr bool has(mip::FunctionSelector function) const
Definition: mip_structures.hpp:116
mip::metadata::DescriptorSetInfo::descriptor
uint8_t descriptor
Definition: mip_structures.hpp:221
mip::metadata::Type::S16
@ S16
mip::metadata::EnumInfo::entries
Span< const Entry > entries
Definition: mip_structures.hpp:76
mip::metadata::Type::S64
@ S64
mip::metadata::TypeInfo::isBasicType
bool isBasicType() const
Definition: mip_structures.hpp:58
mip::metadata::FunctionBits::canWrite
constexpr bool canWrite() const
Definition: mip_structures.hpp:104
mip::metadata::FunctionBits
Definition: mip_structures.hpp:92
mip::metadata::EnumInfo::nameForValue
const char * nameForValue(uint32_t value) const
Definition: mip_structures.hpp:78
mip::metadata::Type::U64
@ U64
mip::metadata::ParameterInfo::Count
Definition: mip_structures.hpp:160
mip::metadata::ParamAttributes
Definition: mip_structures.hpp:122
mip::metadata::FieldAttributes::FieldAttributes
constexpr FieldAttributes(bool w, bool r, bool s, bool l, bool d, bool p=false)
Definition: mip_structures.hpp:145
mip::FunctionSelector::WRITE
@ WRITE
mip::metadata::FieldInfo::functions
FieldAttributes functions
Definition: mip_structures.hpp:215
mip::metadata::Type::BOOL
@ BOOL
mip::metadata::FieldInfo
Definition: mip_structures.hpp:212
mip::metadata::DescriptorSetInfo
Definition: mip_structures.hpp:219
mip::metadata::Type::U8
@ U8
mip::metadata::ParameterInfo::Condition::Type::ENUM
@ ENUM
Enum value selector (e.g. for parameters in unions)
mip::metadata::EnumInfo::Entry::docs
const char * docs
Definition: mip_structures.hpp:69
mip::metadata::FunctionBits::FunctionBits
constexpr FunctionBits()=default
mip::metadata::StructInfo::parameters
Span< const ParameterInfo > parameters
Definition: mip_structures.hpp:207
mip::metadata::TypeInfo::infoPtr
const void * infoPtr
Definition: mip_structures.hpp:51
mip::metadata::ParameterInfo::Condition::value
uint16_t value
Value of the enum parameter which activates this parameter.
Definition: mip_structures.hpp:185
mip::metadata::TypeInfo::bitfieldPointer
const BitfieldInfo * bitfieldPointer() const
Definition: mip_structures.hpp:54
mip::metadata::FieldAttributes::hasFunctionSelector
constexpr bool hasFunctionSelector() const
Definition: mip_structures.hpp:147
mip::metadata::ParamAttributes::isNotSerialized
constexpr bool isNotSerialized() const
Definition: mip_structures.hpp:132
mip::metadata::EnumInfo
Definition: mip_structures.hpp:63
mip::metadata::TypeInfo::unionPointer
const UnionInfo * unionPointer() const
Definition: mip_structures.hpp:55
mip::metadata::TypeInfo::type
Type type
Definition: mip_structures.hpp:49
mip::metadata::ParamAttributes::isSerialized
constexpr bool isSerialized() const
Definition: mip_structures.hpp:134
mip::metadata::TypeInfo
Definition: mip_structures.hpp:44
microstrain::Id
Representes an ID number ranging from 1..N including N.
Definition: index.hpp:75
mip::metadata::DescriptorSetInfo::fields
Span< const FieldInfo *const > fields
Definition: mip_structures.hpp:223
mip::CompositeDescriptor
Convenience struct holding both descriptor set and field descriptor.
Definition: mip_descriptors.hpp:21
mip::metadata::ParamAttributes::setIsEchoed
constexpr ParamAttributes & setIsEchoed(bool e)
Definition: mip_structures.hpp:137
mip::metadata::FieldInfo::descriptor
CompositeDescriptor descriptor
Definition: mip_structures.hpp:214
mip::metadata::ParameterInfo::Count::hasCounter
constexpr bool hasCounter() const
Definition: mip_structures.hpp:170
mip::metadata::FunctionBits::canSave
constexpr bool canSave() const
Definition: mip_structures.hpp:106
mip::metadata::Type::BITS
@ BITS
mip::metadata::StructInfo
Definition: mip_structures.hpp:201
mip::metadata::ParameterInfo::Condition::paramIdx
microstrain::Id paramIdx
Index of enum parameter identifying whether this parameter is enabled.
Definition: mip_structures.hpp:184
span.hpp
mip::metadata::TypeInfo::enumPointer
const EnumInfo * enumPointer() const
Definition: mip_structures.hpp:53
mip::metadata::ParamAttributes::ParamAttributes
constexpr ParamAttributes(FunctionBits bits)
Definition: mip_structures.hpp:125
mip::metadata::FunctionBits::setCanLoad
constexpr FunctionBits & setCanLoad(bool l)
Definition: mip_structures.hpp:113
mip::metadata::StructInfo::name
const char * name
Definition: mip_structures.hpp:203
mip::metadata::ParameterInfo::Condition::Type
Type
Definition: mip_structures.hpp:175
mip::metadata::Type::U32
@ U32
mip::metadata::FieldAttributes::isProprietary
constexpr bool isProprietary() const
Definition: mip_structures.hpp:149
mip::metadata::ParameterInfo::docs
const char * docs
Human-readable documentation.
Definition: mip_structures.hpp:193
mip::metadata::ParamAttributes::setNotSerialized
constexpr ParamAttributes & setNotSerialized(bool x)
Definition: mip_structures.hpp:136
mip::metadata::FunctionBits::FunctionBits
constexpr FunctionBits(bool w, bool r, bool s, bool l, bool d)
Definition: mip_structures.hpp:95
mip::metadata::EnumInfo::Entry::name
const char * name
Definition: mip_structures.hpp:68
mip::metadata::UnionInfo
Definition: mip_structures.hpp:210
mip::metadata::FieldAttributes::FieldAttributes
constexpr FieldAttributes()=default