9#define epicsExportSharedSymbols
14using namespace epics::pvData;
16namespace epics {
namespace nt {
19static FieldCreatePtr fieldCreate = getFieldCreate();
20static PVDataCreatePtr pvDataCreate = getPVDataCreate();
27 valueType = scalarType;
28 return shared_from_this();
35 return shared_from_this();
41 return shared_from_this();
47 return shared_from_this();
53 return shared_from_this();
59 return shared_from_this();
65 return shared_from_this();
70 secondsPastEpoch =
true;
71 return shared_from_this();
77 return shared_from_this();
83 return shared_from_this();
89 return shared_from_this();
94 StandardFieldPtr standardField = getStandardField();
96 size_t extraCount = extraFieldNames.size();
97 nfields += extraCount;
98 if(descriptor) ++nfields;
100 if(timeStamp) ++nfields;
101 if(severity) ++nfields;
102 if(status) ++nfields;
103 if(message) ++nfields;
104 if(secondsPastEpoch) ++nfields;
105 if(nanoseconds) ++nfields;
106 if(userTag) ++nfields;
107 if(isConnected) ++nfields;
108 FieldConstPtrArray fields(nfields);
109 StringArray names(nfields);
111 names[ind] =
"value";
112 fields[ind++] = fieldCreate->createScalarArray(valueType);
113 names[ind] =
"channelName";
114 fields[ind++] = fieldCreate->createScalarArray(pvString);
116 names[ind] =
"descriptor";
117 fields[ind++] = fieldCreate->createScalar(pvString);
120 names[ind] =
"alarm";
121 fields[ind++] = standardField->alarm();
124 names[ind] =
"timeStamp";
125 fields[ind++] = standardField->timeStamp();
128 names[ind] =
"severity";
129 fields[ind++] = fieldCreate->createScalarArray(pvInt);
132 names[ind] =
"status";
133 fields[ind++] = fieldCreate->createScalarArray(pvInt);
136 names[ind] =
"message";
137 fields[ind++] = fieldCreate->createScalarArray(pvString);
139 if(secondsPastEpoch) {
140 names[ind] =
"secondsPastEpoch";
141 fields[ind++] = fieldCreate->createScalarArray(pvLong);
144 names[ind] =
"nanoseconds";
145 fields[ind++] = fieldCreate->createScalarArray(pvInt);
148 names[ind] =
"userTag";
149 fields[ind++] = fieldCreate->createScalarArray(pvInt);
152 names[ind] =
"isConnected";
153 fields[ind++] = fieldCreate->createScalarArray(pvBoolean);
155 for (
size_t i = 0; i< extraCount; i++) {
156 names[ind] = extraFieldNames[i];
157 fields[ind++] = extraFields[i];
175NTScalarMultiChannelBuilder::NTScalarMultiChannelBuilder()
181void NTScalarMultiChannelBuilder::reset()
183 extraFieldNames.clear();
185 valueType = pvDouble;
192 secondsPastEpoch =
false;
201 extraFields.push_back(field); extraFieldNames.push_back(name);
202 return shared_from_this();
227 return is_a(pvStructure->getStructure());
235 Result result(structure);
239 .has<ScalarArray>(
"value")
240 .has<ScalarArray>(
"channelName")
241 .maybeHas<ScalarArray>(
"severity")
242 .maybeHas<ScalarArray>(
"status")
243 .maybeHas<ScalarArray>(
"message")
244 .maybeHas<ScalarArray>(
"secondsPastEpoch")
245 .maybeHas<ScalarArray>(
"nanoseconds")
246 .maybeHas<ScalarArray>(
"userTag")
247 .maybeHas<Scalar>(
"descriptor")
249 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
255 if(!pvStructure.get())
return false;
262 size_t valueLength =
getValue()->getLength();
265 PVScalarArrayPtr arrayFields[] = {
269 size_t N =
sizeof(arrayFields)/
sizeof(arrayFields[0]);
271 PVScalarArrayPtr arrayField;
272 for (PVScalarArrayPtr * pa = arrayFields; pa != arrayFields+N; ++pa)
275 if (arrayField.get() && arrayField->getLength() != valueLength)
287NTScalarMultiChannel::NTScalarMultiChannel(PVStructurePtr
const & pvStructure)
288: pvNTScalarMultiChannel(pvStructure),
289 pvTimeStamp(pvStructure->getSubField<PVStructure>(
"timeStamp")),
290 pvAlarm(pvStructure->getSubField<PVStructure>(
"alarm")),
291 pvValue(pvStructure->getSubField<PVScalarArray>(
"value")),
292 pvChannelName(pvStructure->getSubField<PVStringArray>(
"channelName")),
293 pvIsConnected(pvStructure->getSubField<PVBooleanArray>(
"isConnected")),
294 pvSeverity(pvStructure->getSubField<PVIntArray>(
"severity")),
295 pvStatus(pvStructure->getSubField<PVIntArray>(
"status")),
296 pvMessage(pvStructure->getSubField<PVStringArray>(
"message")),
297 pvSecondsPastEpoch(pvStructure->getSubField<PVLongArray>(
"secondsPastEpoch")),
298 pvNanoseconds(pvStructure->getSubField<PVIntArray>(
"nanoseconds")),
299 pvUserTag(pvStructure->getSubField<PVIntArray>(
"userTag")),
300 pvDescriptor(pvStructure->getSubField<PVString>(
"descriptor"))
308 return pv.attach(pvTimeStamp);
316 return pv.attach(pvAlarm);
bool isAlarm(epics::pvData::FieldConstPtr const &field)
Convenience Class for NTScalarMultiChannel.
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
static bool is_a(epics::pvData::StructureConstPtr const &structure)
static const std::string URI
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
epics::pvData::PVScalarArrayPtr getValue() const
epics::pvData::PVIntArrayPtr getNanoseconds() const
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVIntArrayPtr getStatus() const
epics::pvData::PVIntArrayPtr getUserTag() const
epics::pvData::PVIntArrayPtr getSeverity() const
epics::pvData::PVLongArrayPtr getSecondsPastEpoch() const
static NTScalarMultiChannelBuilderPtr createBuilder()
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStringArrayPtr getMessage() const
epics::pvData::PVStringArrayPtr getChannelName() const
static bool is_a(const std::string &u1, const std::string &u2)
Interface for in-line creating of NTScalarMultiChannel.
shared_pointer addStatus()
shared_pointer addIsConnected()
shared_pointer addSeverity()
shared_pointer addUserTag()
shared_pointer addMessage()
NTScalarMultiChannelPtr create()
shared_pointer addAlarm()
friend class ::epics::nt::NTScalarMultiChannel
shared_pointer value(epics::pvData::ScalarType scalarType)
shared_pointer addSecondsPastEpoch()
shared_pointer addDescriptor()
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
shared_pointer addTimeStamp()
epics::pvData::StructureConstPtr createStructure()
shared_pointer addNanoseconds()
epics::pvData::PVStructurePtr createPVStructure()
std::tr1::shared_ptr< NTField > NTFieldPtr
std::tr1::shared_ptr< NTScalarMultiChannel > NTScalarMultiChannelPtr
std::tr1::shared_ptr< detail::NTScalarMultiChannelBuilder > NTScalarMultiChannelBuilderPtr