20 template<
typename RefT,
typename MetadataT>
22 auto index =
static_cast<int32_t
>(field);
23 if (index > metadata.float_field_count_ || index < 0) {
26 auto has_offset =
static_cast<size_t>(index + metadata.float_field_bitfield_offset_);
27 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
28 if (!has_bits.
get(has_offset)) {
31 if (value !=
nullptr) {
32 *value = ref.float_fields_[index];
38 return floatGetter(ref, command_metadata, field, value);
42 return floatGetter(ref, feedback_metadata, field, value);
46 return floatGetter(ref, info_metadata, field, value);
49 template<
typename RefT,
typename MetadataT>
51 auto index =
static_cast<int32_t
>(field);
52 if (index > metadata.high_res_angle_field_count_ || index < 0) {
55 auto has_offset =
static_cast<size_t>(index + metadata.high_res_angle_field_bitfield_offset_);
56 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
57 if (!has_bits.
get(has_offset)) {
60 if (revs !=
nullptr && offset !=
nullptr) {
61 const auto& val = ref.high_res_angle_fields_[index];
62 *revs = val.revolutions_;
63 *offset = val.offset_;
80 template<
typename RefT,
typename MetadataT>
82 auto index =
static_cast<int32_t
>(field);
83 if (index > metadata.numbered_float_field_count_ || index < 0) {
86 if (number == 0 || number > metadata.numbered_float_field_sizes_[index] ) {
89 const auto relativeOffset =
static_cast<size_t>(metadata.numbered_float_relative_offsets_[index] + number - 1);
90 const auto has_offset =
static_cast<size_t>(metadata.numbered_float_field_bitfield_offset_ + relativeOffset);
91 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
92 if (!has_bits.
get(has_offset)) {
95 if (value !=
nullptr) {
96 *value = ref.numbered_float_fields_[relativeOffset];
113 template<
typename RefT,
typename MetadataT>
115 auto index =
static_cast<int32_t
>(field);
116 if (index > metadata.vector3f_field_count_ || index < 0) {
119 auto has_offset =
static_cast<size_t>(index + metadata.vector3f_field_bitfield_offset_);
120 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
121 if (!has_bits.
get(has_offset)) {
124 if (value !=
nullptr) {
125 *value = ref.vector3f_fields_[index];
142 template<
typename RefT,
typename MetadataT>
144 auto index =
static_cast<int32_t
>(field);
145 if (index > metadata.quaternionf_field_count_ || index < 0) {
148 auto has_offset =
static_cast<size_t>(index + metadata.quaternionf_field_bitfield_offset_);
149 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
150 if (!has_bits.
get(has_offset)) {
153 if (value !=
nullptr) {
154 *value = ref.quaternionf_fields_[index];
171 template<
typename RefT,
typename MetadataT>
173 if (index > metadata.io_field_count_ || index < 0) {
176 if (pin_number == 0 || pin_number > metadata.io_field_sizes_[index] ) {
179 const auto relativeOffset =
static_cast<size_t>(metadata.io_relative_offsets_[index] + pin_number - 1);
180 const auto has_offset =
static_cast<size_t>(metadata.io_field_bitfield_offset_ + relativeOffset);
181 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
182 if (!has_bits.
get(has_offset)) {
186 const auto& field = ref.io_fields_[relativeOffset];
190 if (value !=
nullptr) {
191 *value = field.float_value_;
208 template<
typename RefT,
typename MetadataT>
210 if (index > metadata.io_field_count_ || index < 0) {
213 if (pin_number == 0 || pin_number > metadata.io_field_sizes_[index] ) {
216 const auto relativeOffset =
static_cast<size_t>(metadata.io_relative_offsets_[index] + pin_number - 1);
217 const auto has_offset =
static_cast<size_t>(metadata.io_field_bitfield_offset_ + relativeOffset);
218 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
219 if (!has_bits.
get(has_offset)) {
223 const auto& field = ref.io_fields_[relativeOffset];
227 if (value !=
nullptr) {
228 *value = field.int_value_;
234 return intIoPinGetter(ref, command_metadata, index, pin_number, value);
238 return intIoPinGetter(ref, feedback_metadata, index, pin_number, value);
242 return intIoPinGetter(ref, info_metadata, index, pin_number, value);
245 template<
typename RefT,
typename MetadataT>
246 bool flagGetter(
const RefT& ref, MetadataT& metadata,
int field) {
247 auto index =
static_cast<size_t>(field);
248 if (index > metadata.flag_field_count_ || index < 0) {
251 auto has_offset =
static_cast<size_t>(index + metadata.flag_field_bitfield_offset_);
252 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
253 return has_bits.
get(has_offset);
257 return flagGetter(ref, command_metadata, field);
261 return flagGetter(ref, feedback_metadata, field);
268 template<
typename RefT,
typename MetadataT>
270 auto index =
static_cast<int32_t
>(field);
271 if (index > metadata.bool_field_count_ || index < 0) {
274 auto has_offset =
static_cast<size_t>(index + metadata.bool_field_bitfield_offset_);
275 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
276 if (!has_bits.
get(has_offset)) {
279 if (value !=
nullptr) {
280 *value = ref.bool_fields_[index];
286 return boolGetter(ref, command_metadata, field, value);
290 return boolGetter(ref, feedback_metadata, field, value);
294 return boolGetter(ref, info_metadata, field, value);
297 template<
typename RefT,
typename MetadataT>
299 auto index =
static_cast<int32_t
>(field);
300 if (index > metadata.enum_field_count_ || index < 0) {
303 auto has_offset =
static_cast<size_t>(index + metadata.enum_field_bitfield_offset_);
304 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
305 if (!has_bits.
get(has_offset)) {
308 if (value !=
nullptr) {
309 *value = ref.enum_fields_[index];
315 return enumGetter(ref, command_metadata, field, value);
319 return enumGetter(ref, feedback_metadata, field, value);
323 return enumGetter(ref, info_metadata, field, value);
326 template<
typename RefT,
typename MetadataT>
328 auto index =
static_cast<int32_t
>(field);
329 if (index > metadata.uint64_field_count_ || index < 0) {
332 auto has_offset =
static_cast<size_t>(index + metadata.uint64_field_bitfield_offset_);
333 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
334 if (!has_bits.
get(has_offset)) {
337 if (value !=
nullptr) {
338 *value = ref.uint64_fields_[index];
344 return uint64Getter(ref, command_metadata, field, value);
348 return uint64Getter(ref, feedback_metadata, field, value);
355 template<
typename RefT,
typename MetadataT>
357 auto index =
static_cast<int32_t
>(field);
358 if (index > metadata.led_field_count_ || index < 0) {
361 auto has_offset =
static_cast<size_t>(index + metadata.led_field_bitfield_offset_);
362 hebi::ProxyBitSet has_bits(ref.message_bitfield_, metadata.message_bitfield_count_);
363 if (!has_bits.
get(has_offset)) {
366 if (r !=
nullptr && g !=
nullptr && b !=
nullptr && a !=
nullptr) {
367 uint32_t color = ref.led_fields_[index];
368 *r = (color & (0xFF << 24)) >> 24;
369 *g = (color & (0xFF << 16)) >> 16;
370 *b = (color & (0xFF << 8)) >> 8;
377 return ledGetter(ref, command_metadata, field, r, g, b, a);
381 return ledGetter(ref, feedback_metadata, field, r, g, b, a);
385 return ledGetter(ref, info_metadata, field, r, g, b, a);
389 auto index =
static_cast<size_t>(field);
395 if (value ==
nullptr) {
396 hasBits.
reset(hasOffset);
398 hasBits.
set(hasOffset);
404 auto index =
static_cast<size_t>(field);
410 if (value ==
nullptr) {
411 has_bits.
reset(has_offset);
413 has_bits.
set(has_offset);
419 const float* dec_part) {
420 auto index =
static_cast<size_t>(field);
426 if (int_part !=
nullptr && dec_part !=
nullptr) {
427 has_bits.
set(has_offset);
430 val.offset_ = *dec_part;
432 has_bits.
reset(has_offset);
437 const float* value) {
438 auto index =
static_cast<size_t>(field);
449 if (value !=
nullptr) {
450 has_bits.
set(has_offset);
453 has_bits.
reset(has_offset);
458 auto index =
static_cast<size_t>(field);
464 if (value ==
nullptr) {
465 has_bits.
reset(has_offset);
467 has_bits.
set(has_offset);
468 command.
bool_fields_[index] =
static_cast<bool>(*value);
473 auto index =
static_cast<size_t>(field);
480 has_bits.
set(has_offset);
482 has_bits.
reset(has_offset);
487 auto index =
static_cast<size_t>(bank);
491 if (pin_number > 8 || pin_number < 1) {
494 const auto relativeOffset =
static_cast<size_t>(command_metadata.
io_relative_offsets_[index] + pin_number - 1);
497 auto& field = command.
io_fields_[relativeOffset];
498 if (value ==
nullptr) {
499 has_bits.
reset(has_offset);
502 has_bits.
set(has_offset);
504 field.int_value_ = *value;
509 auto index =
static_cast<size_t>(bank);
513 if (pin_number > 8 || pin_number < 1) {
516 const auto relativeOffset =
static_cast<size_t>(command_metadata.
io_relative_offsets_[index] + pin_number - 1);
519 auto& field = command.
io_fields_[relativeOffset];
520 if (value ==
nullptr) {
521 has_bits.
reset(has_offset);
524 has_bits.
set(has_offset);
526 field.float_value_ = *value;
531 auto index =
static_cast<size_t>(field);
538 if (color ==
nullptr) {
540 has_bits.
reset(has_offset);
544 has_bits.
set(has_offset);
546 val = (
static_cast<int>(color->
getRed()) << 24) |
547 (
static_cast<int>(color->
getGreen()) << 16) |
548 (
static_cast<int>(color->
getBlue()) << 8) |
549 (
static_cast<int>(color->
getAlpha()));
void hebiCommandSetBool(HebiCommandRef &command, HebiCommandBoolField field, const int32_t *value)
void hebiFeedbackGetMetadata(HebiFeedbackMetadata *metadata)
HebiCommandHighResAngleField
void hebiCommandSetIoPinFloat(HebiCommandRef &command, HebiCommandIoPinBank bank, size_t pin_number, const float *value)
void hebiCommandSetNumberedFloat(HebiCommandRef &command, HebiCommandNumberedFloatField field, size_t number, const float *value)
HebiStatusCode numberedFloatGetter(const HebiInfoRef &ref, int field, size_t number, float *value)
static HebiFeedbackMetadata feedback_metadata
void hebiCommandSetEnum(HebiCommandRef &command, HebiCommandEnumField field, const int32_t *value)
bool get(size_t index) const
HebiStatusCode intIoPinGetter(const HebiInfoRef &ref, int index, size_t pin_number, int64_t *value)
A buffer supplied to the routine was too small (normally determined by a size parameter) ...
HebiStatusCode enumGetter(const HebiInfoRef &ref, int field, int32_t *value)
void hebiCommandGetMetadata(HebiCommandMetadata *metadata)
void hebiCommandSetHighResAngle(HebiCommandRef &command, HebiCommandHighResAngleField field, const int64_t *int_part, const float *dec_part)
HebiStatusCode boolGetter(const HebiInfoRef &ref, int field, bool *value)
uint8_t getBlue() const
Returns the blue channel; value is between 0 and 255.
int32_t * message_bitfield_
HebiIoBankPinStruct * io_fields_
HebiHighResAngleStruct * high_res_angle_fields_
void hebiInfoGetMetadata(HebiInfoMetadata *metadata)
static HebiCommandMetadata command_metadata
bool flagGetter(const HebiInfoRef &ref, int field)
HebiStatusCode quaternionfGetter(const HebiInfoRef &ref, int field, HebiQuaternionf *value)
HebiStatusCode uint64Getter(const HebiInfoRef &ref, int field, uint64_t *value)
HebiCommandFloatField
Command Enums.
uint8_t getRed() const
Returns the red channel; value is between 0 and 255.
HebiCommandNumberedFloatField
float * numbered_float_fields_
HebiStatusCode floatGetter(const HebiInfoRef &ref, int field, float *value)
void hebiCommandSetLed(HebiCommandRef &command, HebiCommandLedField field, const Color *color)
void hebiCommandSetFlag(HebiCommandRef &command, HebiCommandFlagField field, int32_t value)
HebiStatusCode vector3fGetter(const HebiInfoRef &ref, int field, HebiVector3f *value)
Success; no failures occurred.
HebiStatusCode ledGetter(const HebiInfoRef ref, int field, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *a)
static HebiInfoMetadata info_metadata
void hebiCommandSetIoPinInt(HebiCommandRef &command, HebiCommandIoPinBank bank, size_t pin_number, const int64_t *value)
HebiStatusCode floatIoPinGetter(const HebiInfoRef &ref, int index, size_t pin_number, float *value)
uint8_t getGreen() const
Returns the green channel; value is between 0 and 255.
void hebiCommandSetFloat(HebiCommandRef &command, HebiCommandFloatField field, const float *value)
Structure to describe an RGB color.
HebiStatusCode highResAngleGetter(const HebiInfoRef &ref, int field, int64_t *revs, float *offset)
HebiStatusCode
Enum Types.