9 #define epicsExportSharedSymbols 16 namespace epics {
namespace nt {
19 static FieldCreatePtr fieldCreate = getFieldCreate();
20 static PVDataCreatePtr pvDataCreate = getPVDataCreate();
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();
92 StructureConstPtr NTScalarMultiChannelBuilder::createStructure()
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];
160 StructureConstPtr st = fieldCreate->createStructure(NTScalarMultiChannel::URI,names,fields);
165 PVStructurePtr NTScalarMultiChannelBuilder::createPVStructure()
167 return pvDataCreate->createPVStructure(createStructure());
175 NTScalarMultiChannelBuilder::NTScalarMultiChannelBuilder()
176 : valueType(pvDouble)
181 void NTScalarMultiChannelBuilder::reset()
183 extraFieldNames.clear();
185 valueType = pvDouble;
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)
220 bool NTScalarMultiChannel::is_a(StructureConstPtr
const &structure)
222 return NTUtils::is_a(structure->getID(), URI);
225 bool NTScalarMultiChannel::is_a(PVStructurePtr
const & pvStructure)
227 return is_a(pvStructure->getStructure());
230 bool NTScalarMultiChannel::isCompatible(StructureConstPtr
const & structure)
239 .has<ScalarArray>(
"value")
240 .
has<ScalarArray>(
"channelName")
241 .maybeHas<ScalarArray>(
"severity")
243 .maybeHas<ScalarArray>(
"message")
244 .
maybeHas<ScalarArray>(
"secondsPastEpoch")
245 .maybeHas<ScalarArray>(
"nanoseconds")
247 .maybeHas<Scalar>(
"descriptor")
248 .
maybeHas<&NTField::isAlarm, Structure>(
"alarm")
249 .maybeHas<&NTField::isTimeStamp, Structure>(
"timeStamp")
253 bool NTScalarMultiChannel::isCompatible(PVStructurePtr
const &pvStructure)
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;
265 PVScalarArrayPtr arrayFields[] = {
266 getSeverity(), getStatus(), getMessage(),
267 getSecondsPastEpoch(), getNanoseconds(), getUserTag()
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)
287 NTScalarMultiChannel::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"))
305 bool NTScalarMultiChannel::attachTimeStamp(PVTimeStamp &pv)
const 308 return pv.attach(pvTimeStamp);
313 bool NTScalarMultiChannel::attachAlarm(PVAlarm &pv)
const 316 return pv.attach(pvAlarm);
Result & maybeHas(const std::string &name)
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
Interface for in-line creating of NTScalarMultiChannel.
std::tr1::shared_ptr< detail::NTScalarMultiChannelBuilder > NTScalarMultiChannelBuilderPtr
Result & has(const std::string &name)
Convenience Class for NTScalarMultiChannel.
std::tr1::shared_ptr< NTScalarMultiChannel > NTScalarMultiChannelPtr