9 #define epicsExportSharedSymbols 16 namespace epics {
namespace nt {
25 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::value(
ScalarType scalarType)
27 valueType = scalarType;
28 return shared_from_this();
32 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addDescriptor()
35 return shared_from_this();
38 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addAlarm()
41 return shared_from_this();
44 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addTimeStamp()
47 return shared_from_this();
50 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addSeverity()
53 return shared_from_this();
56 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addStatus()
59 return shared_from_this();
62 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addMessage()
65 return shared_from_this();
68 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addSecondsPastEpoch()
70 secondsPastEpoch =
true;
71 return shared_from_this();
74 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addNanoseconds()
77 return shared_from_this();
80 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addUserTag()
83 return shared_from_this();
86 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::addIsConnected()
89 return shared_from_this();
96 size_t extraCount = extraFieldNames.size();
97 nfields += extraCount;
98 if(descriptor) ++nfields;
100 if(timeStamp) ++nfields;
101 if(severity) ++nfields;
103 if(message) ++nfields;
104 if(secondsPastEpoch) ++nfields;
105 if(nanoseconds) ++nfields;
106 if(userTag) ++nfields;
107 if(isConnected) ++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];
160 StructureConstPtr st = fieldCreate->createStructure(NTScalarMultiChannel::URI,names,fields);
167 return pvDataCreate->createPVStructure(createStructure());
175 NTScalarMultiChannelBuilder::NTScalarMultiChannelBuilder()
181 void NTScalarMultiChannelBuilder::reset()
183 extraFieldNames.clear();
192 secondsPastEpoch =
false;
199 NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::add(
string const & name,
FieldConstPtr const & field)
201 extraFields.push_back(field); extraFieldNames.push_back(name);
202 return shared_from_this();
207 const std::string NTScalarMultiChannel::URI(
"epics:nt/NTScalarMultiChannel:1.0");
209 NTScalarMultiChannel::shared_pointer NTScalarMultiChannel::wrap(
PVStructurePtr const & pvStructure)
211 if(!isCompatible(pvStructure))
return shared_pointer();
212 return wrapUnsafe(pvStructure);
215 NTScalarMultiChannel::shared_pointer NTScalarMultiChannel::wrapUnsafe(
PVStructurePtr const & pvStructure)
222 return NTUtils::is_a(structure->getID(), URI);
227 return is_a(pvStructure->getStructure());
239 .has<ScalarArray>(
"value")
241 .maybeHas<ScalarArray>(
"severity")
243 .maybeHas<ScalarArray>(
"message")
245 .maybeHas<ScalarArray>(
"nanoseconds")
247 .maybeHas<Scalar>(
"descriptor")
248 .maybeHas<&NTField::isAlarm,
Structure>(
"alarm")
249 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
255 if(!pvStructure.get())
return false;
257 return isCompatible(pvStructure->getStructure());
260 bool NTScalarMultiChannel::isValid()
262 size_t valueLength = getValue()->getLength();
263 if (getChannelName()->getLength() != valueLength)
return false;
266 getSeverity(), getStatus(), getMessage(),
267 getSecondsPastEpoch(), getNanoseconds(), getUserTag()
269 size_t N =
sizeof(arrayFields)/
sizeof(arrayFields[0]);
275 if (arrayField.get() && arrayField->getLength() != valueLength)
287 NTScalarMultiChannel::NTScalarMultiChannel(
PVStructurePtr const & pvStructure)
288 : pvNTScalarMultiChannel(pvStructure),
289 pvTimeStamp(pvStructure->getSubField<
PVStructure>(
"timeStamp")),
290 pvAlarm(pvStructure->getSubField<
PVStructure>(
"alarm")),
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);
313 bool NTScalarMultiChannel::attachAlarm(
PVAlarm &
pv)
const 316 return pv.
attach(pvAlarm);
bool attach(PVFieldPtr const &pvField)
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()
Interface for in-line creating of NTScalarMultiChannel.
This class implements introspection object for a structure.
template class for all extensions of PVArray.
std::tr1::shared_ptr< detail::NTScalarMultiChannelBuilder > NTScalarMultiChannelBuilderPtr
Methods for accessing a timeStamp structure.
Base class for a scalarArray.
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
std::vector< std::string > StringArray
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
Convenience Class for NTScalarMultiChannel.
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
bool attach(PVFieldPtr const &pvField)
std::tr1::shared_ptr< NTScalarMultiChannel > NTScalarMultiChannelPtr