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];
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_;
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);
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];
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];
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];
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;
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) {
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) {
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()));