11 #define epicsExportSharedSymbols 18 namespace epics {
namespace nt {
21 static FieldCreatePtr fieldCreate = getFieldCreate();
22 static PVDataCreatePtr pvDataCreate = getPVDataCreate();
27 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::value(UnionConstPtr valuePtr)
30 return shared_from_this();
34 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addDescriptor()
37 return shared_from_this();
40 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addAlarm()
43 return shared_from_this();
46 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addTimeStamp()
49 return shared_from_this();
52 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addSeverity()
55 return shared_from_this();
58 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addStatus()
61 return shared_from_this();
64 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addMessage()
67 return shared_from_this();
70 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addSecondsPastEpoch()
72 secondsPastEpoch =
true;
73 return shared_from_this();
76 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addNanoseconds()
79 return shared_from_this();
82 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addUserTag()
85 return shared_from_this();
88 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addIsConnected()
91 return shared_from_this();
94 StructureConstPtr NTMultiChannelBuilder::createStructure()
96 StandardFieldPtr standardField = getStandardField();
98 size_t extraCount = extraFieldNames.size();
99 nfields += extraCount;
100 if(descriptor) ++nfields;
102 if(timeStamp) ++nfields;
103 if(severity) ++nfields;
104 if(status) ++nfields;
105 if(message) ++nfields;
106 if(secondsPastEpoch) ++nfields;
107 if(nanoseconds) ++nfields;
108 if(userTag) ++nfields;
109 if(isConnected) ++nfields;
110 FieldConstPtrArray fields(nfields);
111 StringArray names(nfields);
113 names[ind] =
"value";
115 fields[ind++] = fieldCreate->createUnionArray(valueType);
117 fields[ind++] = fieldCreate->createVariantUnionArray();
119 names[ind] =
"channelName";
120 fields[ind++] = fieldCreate->createScalarArray(pvString);
122 names[ind] =
"descriptor";
123 fields[ind++] = fieldCreate->createScalar(pvString);
126 names[ind] =
"alarm";
127 fields[ind++] = standardField->alarm();
130 names[ind] =
"timeStamp";
131 fields[ind++] = standardField->timeStamp();
134 names[ind] =
"severity";
135 fields[ind++] = fieldCreate->createScalarArray(pvInt);
138 names[ind] =
"status";
139 fields[ind++] = fieldCreate->createScalarArray(pvInt);
142 names[ind] =
"message";
143 fields[ind++] = fieldCreate->createScalarArray(pvString);
145 if(secondsPastEpoch) {
146 names[ind] =
"secondsPastEpoch";
147 fields[ind++] = fieldCreate->createScalarArray(pvLong);
150 names[ind] =
"nanoseconds";
151 fields[ind++] = fieldCreate->createScalarArray(pvInt);
154 names[ind] =
"userTag";
155 fields[ind++] = fieldCreate->createScalarArray(pvInt);
158 names[ind] =
"isConnected";
159 fields[ind++] = fieldCreate->createScalarArray(pvBoolean);
161 for (
size_t i = 0; i< extraCount; i++) {
162 names[ind] = extraFieldNames[i];
163 fields[ind++] = extraFields[i];
166 StructureConstPtr st = fieldCreate->createStructure(NTMultiChannel::URI,names,fields);
171 PVStructurePtr NTMultiChannelBuilder::createPVStructure()
173 return pvDataCreate->createPVStructure(createStructure());
181 NTMultiChannelBuilder::NTMultiChannelBuilder()
186 void NTMultiChannelBuilder::reset()
189 extraFieldNames.clear();
197 secondsPastEpoch =
false;
204 NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::add(
string const & name, FieldConstPtr
const & field)
206 extraFields.push_back(field); extraFieldNames.push_back(name);
207 return shared_from_this();
212 const std::string NTMultiChannel::URI(
"epics:nt/NTMultiChannel:1.0");
214 NTMultiChannel::shared_pointer NTMultiChannel::wrap(PVStructurePtr
const & pvStructure)
216 if(!isCompatible(pvStructure))
return shared_pointer();
217 return wrapUnsafe(pvStructure);
220 NTMultiChannel::shared_pointer NTMultiChannel::wrapUnsafe(PVStructurePtr
const & pvStructure)
225 bool NTMultiChannel::is_a(StructureConstPtr
const &structure)
227 return NTUtils::is_a(structure->getID(), URI);
230 bool NTMultiChannel::is_a(PVStructurePtr
const & pvStructure)
232 return is_a(pvStructure->getStructure());
235 bool NTMultiChannel::isCompatible(StructureConstPtr
const & structure)
244 .has<UnionArray>(
"value")
245 .
has<ScalarArray>(
"channelName")
246 .maybeHas<ScalarArray>(
"severity")
248 .maybeHas<ScalarArray>(
"message")
249 .
maybeHas<ScalarArray>(
"secondsPastEpoch")
250 .maybeHas<ScalarArray>(
"nanoseconds")
252 .maybeHas<Scalar>(
"descriptor")
253 .
maybeHas<&NTField::isAlarm, Structure>(
"alarm")
254 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
258 bool NTMultiChannel::isCompatible(PVStructurePtr
const &pvStructure)
260 if(!pvStructure.get())
return false;
262 return isCompatible(pvStructure->getStructure());
266 bool NTMultiChannel::isValid()
268 size_t valueLength = getValue()->getLength();
269 if (getChannelName()->getLength() != valueLength)
return false;
271 PVScalarArrayPtr arrayFields[] = {
272 getSeverity(), getStatus(), getMessage(),
273 getSecondsPastEpoch(), getNanoseconds(), getUserTag()
275 size_t N =
sizeof(arrayFields)/
sizeof(arrayFields[0]);
277 PVScalarArrayPtr arrayField;
278 for (PVScalarArrayPtr * pa = arrayFields; pa != arrayFields+N; ++pa)
281 if (arrayField.get() && arrayField->getLength() != valueLength)
293 NTMultiChannel::NTMultiChannel(PVStructurePtr
const & pvStructure)
294 : pvNTMultiChannel(pvStructure),
295 pvTimeStamp(pvStructure->getSubField<PVStructure>(
"timeStamp")),
296 pvAlarm(pvStructure->getSubField<PVStructure>(
"alarm")),
297 pvValue(pvStructure->getSubField<PVUnionArray>(
"value")),
298 pvChannelName(pvStructure->getSubField<PVStringArray>(
"channelName")),
299 pvIsConnected(pvStructure->getSubField<PVBooleanArray>(
"isConnected")),
300 pvSeverity(pvStructure->getSubField<PVIntArray>(
"severity")),
301 pvStatus(pvStructure->getSubField<PVIntArray>(
"status")),
302 pvMessage(pvStructure->getSubField<PVStringArray>(
"message")),
303 pvSecondsPastEpoch(pvStructure->getSubField<PVLongArray>(
"secondsPastEpoch")),
304 pvNanoseconds(pvStructure->getSubField<PVIntArray>(
"nanoseconds")),
305 pvUserTag(pvStructure->getSubField<PVIntArray>(
"userTag")),
306 pvDescriptor(pvStructure->getSubField<PVString>(
"descriptor"))
311 bool NTMultiChannel::attachTimeStamp(PVTimeStamp &pv)
const 314 return pv.attach(pvTimeStamp);
319 bool NTMultiChannel::attachAlarm(PVAlarm &pv)
const 322 return pv.attach(pvAlarm);
Result & maybeHas(const std::string &name)
Interface for in-line creating of NTMultiChannel.
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
Result & has(const std::string &name)
Convenience Class for NTMultiChannel.
std::tr1::shared_ptr< NTMultiChannel > NTMultiChannelPtr
std::tr1::shared_ptr< detail::NTMultiChannelBuilder > NTMultiChannelBuilderPtr