28 #ifndef VALUE_ARRAY_ADAPTER_H 29 #define VALUE_ARRAY_ADAPTER_H 46 #define SW16(s) _byteswap_ushort(s) 47 #define SW32(s) _byteswap_ulong(s) 48 #define SW64(s) _byteswap_uint64(s) 50 #include <libkern/OSByteOrder.h> 51 #define SW16(s) __builtin_bswap16( (s) ) 52 #define SW32(s) __builtin_bswap32( (s) ) 53 #define SW64(s) __builtin_bswap64( (s) ) 56 #define SW16(s) bswap_16(s) 57 #define SW32(s) bswap_32(s) 58 #define SW64(s) bswap_64(s) 69 template<
typename TTargetType>
73 template<
typename TSourceType>
74 static TTargetType Convert (TSourceType src)
76 return static_cast<TTargetType
>(src);
81 class TypeConverter<bool>
84 template<
typename TSourceType>
85 static bool Convert (TSourceType src)
95 template<
size_t TValueSize>
99 static void Extract (
const void *src,
void *dst)
101 std::reverse_copy(reinterpret_cast<const uint8_t*>(src),
102 reinterpret_cast<const uint8_t*>(src) + TValueSize,
103 reinterpret_cast<uint8_t*>(dst));
107 class SwapExtractor<8>
110 static void Extract (
const void *src,
void *dst)
112 *
reinterpret_cast<uint64_t*
>(dst) = SW64(*reinterpret_cast<const uint64_t*>(src));
116 class SwapExtractor<4>
119 static void Extract (
const void *src,
void *dst)
121 *
reinterpret_cast<uint32_t*
>(dst) = SW32(*reinterpret_cast<const uint32_t*>(src));
125 class SwapExtractor<2>
128 static void Extract (
const void *src,
void *dst)
130 *
reinterpret_cast<uint16_t*
>(dst) = SW16(*reinterpret_cast<const uint16_t*>(src));
134 class SwapExtractor<1>
137 static void Extract (
const void *src,
void *dst)
139 *
reinterpret_cast<uint8_t*
>(dst) = *reinterpret_cast<const uint8_t*>(src);
168 void ReadFromPort ();
189 uint64_t current_base_address;
190 uint64_t current_reg_length;
191 uint64_t current_address_step;
192 size_t current_num_values;
193 uint8_t *current_array_shadow;
197 struct ValueArrayInternals;
198 ValueArrayInternals* pinternal;
215 template<
typename TValueNodeType,
typename TOutputValueType,
typename TEffectiveValueType = TOutputValueType>
228 current_array_getter(NULL)
268 std::vector<TOutputValueType> values(current_num_values);
269 GetAllValues (values);
315 assert (current_array_getter != NULL);
316 (this->*current_array_getter) (values);
336 if (!base_value || !selector)
342 INodeMap *node_map = base_value->GetNode()->GetNodeMap();
343 if (node_map != selector->GetNode()->GetNodeMap())
350 CStringPtr candidates_node = node_map->GetNode(
"ValueArrayCandidates");
364 GENICAM_NAMESPACE::gcstring_vector tokens;
365 Tokenize(candidates_str, tokens,
",");
369 +
"[" + selector->GetNode()->GetName() +
"]";
370 return tokens.contains (wanted);
382 template<
typename TFieldType>
383 void GetArrayOfFieldValues (std::vector<TOutputValueType> &values)
385 assert (current_reg_length!=0 && current_address_step != 0);
389 values.resize (current_num_values);
396 ExtractFieldValues_Swap<TFieldType> (current_num_values,
397 static_cast<size_t>(current_address_step),
398 current_array_shadow, &values[0]);
402 ExtractFieldValues_Noswap<TFieldType> (current_num_values,
403 static_cast<size_t>(current_address_step),
404 current_array_shadow, &values[0]);
407 template<
typename TFieldType>
408 void GetArrayOfFieldBits (std::vector<TOutputValueType> &values)
410 assert (current_reg_length!=0 && current_address_step != 0);
414 values.resize (current_num_values);
421 ExtractFieldBits_Swap<TFieldType> (current_num_values,
422 static_cast<size_t>(current_address_step),
424 current_array_shadow, &values[0]);
428 ExtractFieldBits_Noswap<TFieldType> (current_num_values,
429 static_cast<size_t>(current_address_step),
431 current_array_shadow, &values[0]);
438 template<
typename TFieldType>
439 static void ExtractFieldValues_Noswap(
size_t num_values,
size_t address_step,
440 const uint8_t *src, TOutputValueType *dst)
442 for (
size_t i = 0; i < num_values; ++i)
444 const uint8_t *field_ptr = src + i * address_step;
446 TFieldType field_value = *
reinterpret_cast<const TFieldType*
>(field_ptr);
447 dst[i] =
static_cast<TOutputValueType
>(EffectiveValue (field_value));
450 template<
typename TFieldType>
451 static void ExtractFieldValues_Swap(
size_t num_values,
size_t address_step,
452 const uint8_t *src, TOutputValueType *dst)
454 for (
size_t i = 0; i < num_values; ++i)
456 const uint8_t *field_ptr = src + i * address_step;
458 TFieldType field_value = ReadSwapped<TFieldType> (field_ptr);
459 dst[i] =
static_cast<TOutputValueType
>(EffectiveValue (field_value));
462 template<
typename TFieldType>
463 static void ExtractFieldBits_Noswap(
size_t num_values,
size_t address_step,
464 uint64_t mask,
size_t shift,
465 const uint8_t *src, TOutputValueType *dst)
467 for (
size_t i = 0; i < num_values; ++i)
469 const uint8_t *field_ptr = src + i * address_step;
471 TFieldType field_value = *
reinterpret_cast<const TFieldType*
>(field_ptr);
472 uint64_t field_bits = mask & (field_value >> shift);
473 dst[i] =
static_cast<TOutputValueType
>(EffectiveValue (field_bits));
476 template<
typename TFieldType>
477 static void ExtractFieldBits_Swap(
size_t num_values,
size_t address_step,
478 uint64_t mask,
size_t shift,
479 const uint8_t *src, TOutputValueType *dst)
481 for (
size_t i = 0; i < num_values; ++i)
483 const uint8_t *field_ptr = src + i * address_step;
485 TFieldType field_value = ReadSwapped<TFieldType> (field_ptr);
486 uint64_t field_bits = mask & (field_value >> shift);
487 dst[i] =
static_cast<TOutputValueType
>(EffectiveValue (field_bits));
514 assert (
false &&
"Signed MaskeIntReg should be refused in constructor");
519 switch (current_reg_length)
522 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldBits<uint64_t>;
526 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldBits<uint32_t>;
530 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldBits<uint16_t>;
534 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldBits<uint8_t>;
547 switch (current_reg_length)
550 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<int64_t>;
554 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<int32_t>;
558 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<int16_t>;
562 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<int8_t>;
572 switch (current_reg_length)
575 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<uint64_t>;
579 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<uint32_t>;
583 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<uint16_t>;
587 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<uint8_t>;
599 switch (current_reg_length)
602 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<float64_t>;
606 current_array_getter = &CValueArrayAdapter::GetArrayOfFieldValues<float32_t>;
615 template<
typename TRawType>
616 static TEffectiveValueType EffectiveValue (TRawType raw_value)
618 return TypeConverter<TEffectiveValueType>::Convert(raw_value);
621 template<
typename TFieldType>
622 static TFieldType ReadSwapped (
const void *ptr)
625 SwapExtractor<sizeof(TFieldType)>::Extract (ptr, &result);
630 typedef void (
CValueArrayAdapter::*ArrayGetterFunction)(std::vector<TOutputValueType> &values);
631 ArrayGetterFunction current_array_getter;
680 #endif // VALUE_ARRAY_ADAPTER_H CValueArrayAdapter(TValueNodeType *base_value, IInteger *selector)
Creates a CValueArrayAdapter object.
Definition: ValueArrayAdapter.h:226
GENICAM_INTERFACE GENAPI_DECL_ABSTRACT IFloat
Interface for float properties.
Definition: IFloat.h:58
bool IsValid() const
true if the pointer is valid
Definition: Pointer.h:109
Concrete value array implementation to be used with IInteger based target value nodes.
Definition: ValueArrayAdapter.h:640
void GetAllValues(std::vector< TOutputValueType > &values)
Get all values of the array.
Definition: ValueArrayAdapter.h:300
bool IsReadable(EAccessMode AccessMode)
Tests if readable.
Definition: INode.h:176
#define RUNTIME_EXCEPTION
Fires a runtime exception, e.g. throw RUNTIME_EXCEPTION("buh!")
Definition: GCException.h:246
static bool CheckAdvertisedCompatibility(TValueNodeType *base_value, IInteger *selector)
Check value/selector feature pair suitability for use with the adapter.
Definition: ValueArrayAdapter.h:332
Base class wrapping internal implementation details of the value array adapter functionality.
Definition: ValueArrayAdapter.h:151
Encapsulates a GenApi pointer dealing with the dynamic_cast automatically.
Definition: Pointer.h:49
Main include file for using GenApi with smart pointers.
Adapter for accessing structured register known to include an array of selector-iterated values...
Definition: ValueArrayAdapter.h:216
bool IsValid() const
Check if the instance is valid and useable.
Definition: ValueArrayAdapter.h:239
GENICAM_INTERFACE GENAPI_DECL_ABSTRACT IBoolean
Interface for Boolean properties.
Definition: IBoolean.h:59
std::vector< TOutputValueType > GetAllValues()
Get all values of the array.
Definition: ValueArrayAdapter.h:266
GENICAM_INTERFACE INodeMap
Interface to access the node map.
Definition: INode.h:50
Concrete value array implementation to be used with IFloat based target value nodes.
Definition: ValueArrayAdapter.h:654
virtual CLock & GetLock() const =0
Returns the lock which guards the node map.
Standard GenICam Exceptions.
GENICAM_INTERFACE GENAPI_DECL_ABSTRACT IValue
Interface for value properties.
Definition: IValue.h:59
A string class which is a clone of std::string.
Definition: GCString.h:50
Concrete value array implementation to be used with IBoolean based target value nodes.
Definition: ValueArrayAdapter.h:669
GENICAM_INTERFACE IInteger
Interface for integer properties.
Definition: IFloat.h:112
GenICam's exception class.
Definition: GCException.h:62
Definition of Lock classes.
Definition: ChunkAdapter.h:37
A lock class.
Definition: Synch.h:61