11#define epicsExportSharedSymbols
16using namespace epics::pvData;
18namespace epics {
namespace nt {
21static FieldCreatePtr fieldCreate = getFieldCreate();
22static PVDataCreatePtr pvDataCreate = getPVDataCreate();
30 return shared_from_this();
37 return shared_from_this();
43 return shared_from_this();
49 return shared_from_this();
55 return shared_from_this();
61 return shared_from_this();
67 return shared_from_this();
72 secondsPastEpoch =
true;
73 return shared_from_this();
79 return shared_from_this();
85 return shared_from_this();
91 return shared_from_this();
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];
181NTMultiChannelBuilder::NTMultiChannelBuilder()
186void NTMultiChannelBuilder::reset()
189 extraFieldNames.clear();
197 secondsPastEpoch =
false;
206 extraFields.push_back(field); extraFieldNames.push_back(name);
207 return shared_from_this();
232 return is_a(pvStructure->getStructure());
240 Result result(structure);
244 .has<UnionArray>(
"value")
245 .has<ScalarArray>(
"channelName")
246 .maybeHas<ScalarArray>(
"severity")
247 .maybeHas<ScalarArray>(
"status")
248 .maybeHas<ScalarArray>(
"message")
249 .maybeHas<ScalarArray>(
"secondsPastEpoch")
250 .maybeHas<ScalarArray>(
"nanoseconds")
251 .maybeHas<ScalarArray>(
"userTag")
252 .maybeHas<Scalar>(
"descriptor")
254 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
260 if(!pvStructure.get())
return false;
268 size_t valueLength =
getValue()->getLength();
271 PVScalarArrayPtr arrayFields[] = {
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)
293NTMultiChannel::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);
bool isAlarm(epics::pvData::FieldConstPtr const &field)
Convenience Class for NTMultiChannel.
static const std::string URI
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
epics::pvData::PVIntArrayPtr getSeverity() const
epics::pvData::PVIntArrayPtr getStatus() const
static bool is_a(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStringArrayPtr getChannelName() const
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVIntArrayPtr getUserTag() const
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
epics::pvData::PVLongArrayPtr getSecondsPastEpoch() const
epics::pvData::PVUnionArrayPtr getValue() const
epics::pvData::PVStringArrayPtr getMessage() const
static NTMultiChannelBuilderPtr createBuilder()
epics::pvData::PVIntArrayPtr getNanoseconds() const
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
static bool is_a(const std::string &u1, const std::string &u2)
Interface for in-line creating of NTMultiChannel.
shared_pointer addUserTag()
NTMultiChannelPtr create()
friend class ::epics::nt::NTMultiChannel
shared_pointer addAlarm()
epics::pvData::StructureConstPtr createStructure()
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
shared_pointer addStatus()
shared_pointer value(epics::pvData::UnionConstPtr valuePtr)
shared_pointer addDescriptor()
shared_pointer addNanoseconds()
shared_pointer addMessage()
epics::pvData::PVStructurePtr createPVStructure()
shared_pointer addSeverity()
shared_pointer addIsConnected()
shared_pointer addTimeStamp()
shared_pointer addSecondsPastEpoch()
std::tr1::shared_ptr< NTField > NTFieldPtr
std::tr1::shared_ptr< NTMultiChannel > NTMultiChannelPtr
std::tr1::shared_ptr< detail::NTMultiChannelBuilder > NTMultiChannelBuilderPtr