9 #define epicsExportSharedSymbols 16 namespace epics {
namespace nt {
22 StructureConstPtr NTMatrixBuilder::createStructure()
24 FieldBuilderPtr builder =
25 getFieldCreate()->createFieldBuilder()->
26 setId(NTMatrix::URI)->
27 addArray(
"value", pvDouble);
30 builder->addArray(
"dim", pvInt);
33 builder->add(
"descriptor", pvString);
36 builder->add(
"alarm", ntField->createAlarm());
39 builder->add(
"timeStamp", ntField->createTimeStamp());
42 builder->add(
"display", ntField->createDisplay());
44 size_t extraCount = extraFieldNames.size();
45 for (
size_t i = 0; i< extraCount; i++)
46 builder->add(extraFieldNames[i], extraFields[i]);
49 StructureConstPtr s = builder->createStructure();
55 NTMatrixBuilder::shared_pointer NTMatrixBuilder::addDim()
58 return shared_from_this();
61 NTMatrixBuilder::shared_pointer NTMatrixBuilder::addDescriptor()
64 return shared_from_this();
67 NTMatrixBuilder::shared_pointer NTMatrixBuilder::addAlarm()
70 return shared_from_this();
73 NTMatrixBuilder::shared_pointer NTMatrixBuilder::addTimeStamp()
76 return shared_from_this();
79 NTMatrixBuilder::shared_pointer NTMatrixBuilder::addDisplay()
82 return shared_from_this();
85 PVStructurePtr NTMatrixBuilder::createPVStructure()
87 return getPVDataCreate()->createPVStructure(createStructure());
95 NTMatrixBuilder::NTMatrixBuilder()
100 void NTMatrixBuilder::reset()
107 extraFieldNames.clear();
111 NTMatrixBuilder::shared_pointer NTMatrixBuilder::add(
string const & name, FieldConstPtr
const & field)
113 extraFields.push_back(field); extraFieldNames.push_back(name);
114 return shared_from_this();
119 const std::string NTMatrix::URI(
"epics:nt/NTMatrix:1.0");
121 NTMatrix::shared_pointer NTMatrix::wrap(PVStructurePtr
const & pvStructure)
123 if(!isCompatible(pvStructure))
return shared_pointer();
124 return wrapUnsafe(pvStructure);
127 NTMatrix::shared_pointer NTMatrix::wrapUnsafe(PVStructurePtr
const & pvStructure)
129 return shared_pointer(
new NTMatrix(pvStructure));
132 bool NTMatrix::is_a(StructureConstPtr
const & structure)
134 return NTUtils::is_a(structure->getID(), URI);
137 bool NTMatrix::is_a(PVStructurePtr
const & pvStructure)
139 return is_a(pvStructure->getStructure());
142 bool NTMatrix::isCompatible(StructureConstPtr
const & structure)
151 .has<ScalarArray>(
"value")
153 .maybeHas<Scalar>(
"descriptor")
154 .
maybeHas<&NTField::isAlarm, Structure>(
"alarm")
155 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
156 .
maybeHas<&NTField::isDisplay, Structure>(
"display")
160 bool NTMatrix::isCompatible(PVStructurePtr
const & pvStructure)
162 if(!pvStructure)
return false;
164 return isCompatible(pvStructure->getStructure());
167 bool NTMatrix::isValid()
169 int valueLength = getValue()->getLength();
170 if (valueLength == 0)
173 PVIntArrayPtr pvDim = getDim();
176 int length = pvDim->getLength();
177 if (length != 1 && length !=2)
180 PVIntArray::const_svector data = pvDim->view();
181 int expectedLength = 1;
182 for (PVIntArray::const_svector::const_iterator it = data.begin();
183 it != data.end(); ++it)
185 expectedLength *= *it;
187 if (expectedLength != valueLength)
198 bool NTMatrix::attachTimeStamp(PVTimeStamp &pvTimeStamp)
const 200 PVStructurePtr ts = getTimeStamp();
202 return pvTimeStamp.attach(ts);
207 bool NTMatrix::attachAlarm(PVAlarm &pvAlarm)
const 209 PVStructurePtr al = getAlarm();
211 return pvAlarm.attach(al);
216 bool NTMatrix::attachDisplay(PVDisplay &pvDisplay)
const 218 PVStructurePtr dp = getDisplay();
220 return pvDisplay.attach(dp);
225 PVStructurePtr NTMatrix::getPVStructure()
const 230 PVStringPtr NTMatrix::getDescriptor()
const 232 return pvNTMatrix->getSubField<PVString>(
"descriptor");
235 PVStructurePtr NTMatrix::getTimeStamp()
const 237 return pvNTMatrix->getSubField<PVStructure>(
"timeStamp");
240 PVStructurePtr NTMatrix::getAlarm()
const 242 return pvNTMatrix->getSubField<PVStructure>(
"alarm");
245 PVStructurePtr NTMatrix::getDisplay()
const 247 return pvNTMatrix->getSubField<PVStructure>(
"display");
250 PVDoubleArrayPtr NTMatrix::getValue()
const 255 PVIntArrayPtr NTMatrix::getDim()
const 257 return pvNTMatrix->getSubField<PVIntArray>(
"dim");
260 NTMatrix::NTMatrix(PVStructurePtr
const & pvStructure) :
261 pvNTMatrix(pvStructure),
262 pvValue(pvNTMatrix->getSubField<PVDoubleArray>(
"value"))
Interface for in-line creating of NTMatrix.
Convenience Class for NTMatrix.
Result & maybeHas(const std::string &name)
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
std::tr1::shared_ptr< NTMatrix > NTMatrixPtr
std::tr1::shared_ptr< detail::NTMatrixBuilder > NTMatrixBuilderPtr