11 #define epicsExportSharedSymbols 18 namespace epics {
namespace nt {
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();
98 size_t extraCount = extraFieldNames.size();
99 nfields += extraCount;
100 if(descriptor) ++nfields;
102 if(timeStamp) ++nfields;
103 if(severity) ++nfields;
105 if(message) ++nfields;
106 if(secondsPastEpoch) ++nfields;
107 if(nanoseconds) ++nfields;
108 if(userTag) ++nfields;
109 if(isConnected) ++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);
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)
227 return NTUtils::is_a(structure->getID(), URI);
232 return is_a(pvStructure->getStructure());
244 .has<UnionArray>(
"value")
246 .maybeHas<ScalarArray>(
"severity")
248 .maybeHas<ScalarArray>(
"message")
250 .maybeHas<ScalarArray>(
"nanoseconds")
252 .maybeHas<Scalar>(
"descriptor")
253 .maybeHas<&NTField::isAlarm,
Structure>(
"alarm")
254 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
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;
272 getSeverity(), getStatus(), getMessage(),
273 getSecondsPastEpoch(), getNanoseconds(), getUserTag()
275 size_t N =
sizeof(arrayFields)/
sizeof(arrayFields[0]);
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"))
314 return pv.
attach(pvTimeStamp);
322 return pv.
attach(pvAlarm);
Data class for a unionArray.
bool attach(PVFieldPtr const &pvField)
Interface for in-line creating of NTMultiChannel.
Validation methods for NT types.
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
std::tr1::shared_ptr< NTField > NTFieldPtr
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< const Union > UnionConstPtr
This class implements introspection object for a structure.
template class for all extensions of PVArray.
Methods for accessing a timeStamp structure.
Methods for accessing an alarm structure.
std::vector< FieldConstPtr > FieldConstPtrArray
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.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Convenience Class for NTMultiChannel.
std::vector< std::string > StringArray
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
std::tr1::shared_ptr< NTMultiChannel > NTMultiChannelPtr
std::tr1::shared_ptr< detail::NTMultiChannelBuilder > NTMultiChannelBuilderPtr
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
bool attach(PVFieldPtr const &pvField)