14 #define epicsExportSharedSymbols 22 namespace epics {
namespace nt {
41 const size_t NUMBER_OF_INDICES = DISPLAY_INDEX+1;
42 const size_t NUMBER_OF_STRUCTURES = 1 << NUMBER_OF_INDICES;
55 if (descriptor) index |= 1 << DISCRIPTOR_INDEX;
56 if (timeStamp) index |= 1 << TIMESTAMP_INDEX;
57 if (alarm) index |= 1 << ALARM_INDEX;
58 if (display) index |= 1 << DISPLAY_INDEX;
60 bool isExtended = !extraFieldNames.empty();
62 if (isExtended || !ntndarrayStruc[index])
72 fb->addArray(std::string(ScalarTypeFunc::name(st)) +
"Value", st);
74 valueType = fb->createUnion();
79 codecStruc = fb->setId(
"codec_t")->
81 add(
"parameters", fieldCreate->createVariantUnion())->
87 dimensionStruc = fb->setId(
"dimension_t")->
89 add(
"offset",
pvInt)->
90 add(
"fullSize",
pvInt)->
91 add(
"binning",
pvInt)->
98 attributeStruc = NTNDArrayAttribute::createBuilder()->createStructure();
101 fb->setId(NTNDArray::URI)->
102 add(
"value", valueType)->
103 add(
"codec", codecStruc)->
104 add(
"compressedSize",
pvLong)->
105 add(
"uncompressedSize",
pvLong)->
106 addArray(
"dimension", dimensionStruc)->
107 add(
"uniqueId",
pvInt)->
108 add(
"dataTimeStamp", standardField->timeStamp())->
109 addArray(
"attribute", attributeStruc);
115 fb->add(
"alarm", standardField->alarm());
118 fb->add(
"timeStamp", standardField->timeStamp());
121 fb->add(
"display", standardField->display());
123 size_t extraCount = extraFieldNames.size();
124 for (
size_t i = 0;
i< extraCount;
i++)
125 fb->add(extraFieldNames[
i], extraFields[i]);
127 returnedStruc = fb->createStructure();
130 ntndarrayStruc[index] = returnedStruc;
134 return ntndarrayStruc[index];
137 return returnedStruc;
140 NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addDescriptor()
143 return shared_from_this();
146 NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addAlarm()
149 return shared_from_this();
152 NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addTimeStamp()
155 return shared_from_this();
158 NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::addDisplay()
161 return shared_from_this();
174 NTNDArrayBuilder::NTNDArrayBuilder()
179 void NTNDArrayBuilder::reset()
185 extraFieldNames.clear();
189 NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::add(
string const & name,
FieldConstPtr const & field)
191 extraFields.push_back(field); extraFieldNames.push_back(name);
192 return shared_from_this();
197 const std::string NTNDArray::URI(
"epics:nt/NTNDArray:1.0");
198 const std::string
ntAttrStr(
"epics:nt/NTAttribute:1.0");
202 if(!isCompatible(pvStructure))
return shared_pointer();
203 return wrapUnsafe(pvStructure);
206 NTNDArray::shared_pointer NTNDArray::wrapUnsafe(
PVStructurePtr const & pvStructure)
208 return shared_pointer(
new NTNDArray(pvStructure));
213 return NTUtils::is_a(structure->getID(), URI);
218 return is_a(pvStructure->getStructure());
224 result.
is<
Union>(Union::defaultId());
228 string name(ScalarTypeFunc::name(type));
240 .has<
Union>(
"parameters");
249 .has<Scalar>(
"fullSize")
251 .has<Scalar>(
"reverse");
264 .has<&isValue>(
"value")
265 .has<&isCodec>(
"codec")
266 .has<Scalar>(
"compressedSize")
267 .has<
Scalar>(
"uncompressedSize")
268 .has<&isDimension>(
"dimension")
270 .has<&NTField::isTimeStamp, Structure>(
"dataTimeStamp")
271 .has<&NTNDArrayAttribute::isAttribute,
StructureArray>(
"attribute")
272 .maybeHas<Scalar>(
"descriptor")
273 .maybeHas<&NTField::isAlarm,
Structure>(
"alarm")
274 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
275 .maybeHas<&NTField::isDisplay,
Structure>(
"display")
282 if(!pvStructure.get())
return false;
284 return isCompatible(pvStructure->getStructure());
287 bool NTNDArray::isValid()
289 int64 valueSize = getValueSize();
290 int64 compressedSize = getCompressedDataSize()->get();
291 if (valueSize != compressedSize)
294 long expectedUncompressed = getExpectedUncompressedSize();
295 long uncompressedSize = getUncompressedDataSize()->get();
296 if (uncompressedSize != expectedUncompressed)
299 std::string codecName = getCodec()->getSubField<
PVString>(
"name")->
get();
300 if (codecName ==
"" && valueSize < uncompressedSize)
306 int64 NTNDArray::getExpectedUncompressedSize()
311 if (pvDim->getLength() != 0)
314 size = getValueTypeSize();
315 for (PVStructureArray::const_svector::const_iterator it = data.
begin();
316 it != data.
end(); ++it )
319 size *= dim->getSubField<
PVInt>(
"size")->
get();
326 int64 NTNDArray::getValueSize()
330 if (!storedValue.get())
332 size = storedValue->
getLength()*getValueTypeSize();
337 int64 NTNDArray::getValueTypeSize()
341 if (storedValue.get())
343 switch (storedValue->getScalarArray()->getElementType())
385 return pvTimeStamp.
attach(ts);
390 bool NTNDArray::attachDataTimeStamp(
PVTimeStamp &pvTimeStamp)
const 394 return pvTimeStamp.
attach(ts);
399 bool NTNDArray::attachAlarm(
PVAlarm &pvAlarm)
const 403 return pvAlarm.
attach(al);
408 bool NTNDArray::attachDisplay(
PVDisplay &pvDisplay)
const 412 return pvDisplay.
attach(dp);
424 return pvNTNDArray->getSubField<
PVUnion>(
"value");
429 return pvNTNDArray->getSubField<
PVStructure>(
"codec");
439 return pvNTNDArray->getSubField<
PVLong>(
"uncompressedSize");
449 return pvNTNDArray->getSubField<
PVInt>(
"uniqueId");
454 return pvNTNDArray->getSubField<
PVStructure>(
"dataTimeStamp");
464 return pvNTNDArray->getSubField<
PVString>(
"descriptor");
469 return pvNTNDArray->getSubField<
PVStructure>(
"timeStamp");
484 pvNTNDArray(pvStructure)
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
bool attach(PVFieldPtr const &pvField)
This class implements introspection object for Scalar.
std::tr1::shared_ptr< PVInt > PVIntPtr
This class implements introspection object for a union.
std::tr1::shared_ptr< detail::NTNDArrayBuilder > NTNDArrayBuilderPtr
bool attach(PVFieldPtr const &pvField)
Validation methods for NT types.
pvd::StructureConstPtr type
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
A lock for multithreading.
std::tr1::shared_ptr< PVLong > PVLongPtr
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
std::tr1::shared_ptr< StandardField > StandardFieldPtr
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
PVString is special case, since it implements SerializableArray.
FORCE_INLINE const StandardFieldPtr & getStandardField()
std::tr1::shared_ptr< PVUnion > PVUnionPtr
std::tr1::shared_ptr< const Union > UnionConstPtr
virtual std::size_t getLength() const =0
This class implements introspection object for a structure.
std::tr1::shared_ptr< PVStructureArray > PVStructureArrayPtr
Methods for accessing a timeStamp structure.
Base class for a scalarArray.
Methods for accessing an alarm structure.
PVUnion has a single subfield.
Interface for in-line creating of NTNDArray.
Data interface for a structure,.
std::tr1::shared_ptr< const Field > FieldConstPtr
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
This class implements introspection object for scalar array.
This class implements introspection object for a structureArray.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< NTNDArray > NTNDArrayPtr
Result & has(const std::string &name)
std::tr1::shared_ptr< PVString > PVStringPtr
Data class for a structureArray.
Convenience Class for NTNDArray.
const std::string ntAttrStr("epics:nt/NTAttribute:1.0")
Class that holds the data for each possible scalar type.
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
Methods for accessing an display structure.
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
bool attach(PVFieldPtr const &pvField)