This is Unofficial EPICS BASE Doxygen Site
ntndarrayAttribute.cpp
Go to the documentation of this file.
1 /* ntndarrayAttribute.cpp */
2 /*
3  * Copyright information and license terms for this software can be
4  * found in the file LICENSE that is included with the distribution
5  */
6 
7 #include "validator.h"
8 
9 #define epicsExportSharedSymbols
10 #include <pv/ntndarrayAttribute.h>
11 #include <pv/ntattribute.h>
12 #include <pv/ntutils.h>
13 
14 using namespace std;
15 using namespace epics::pvData;
16 
17 namespace epics { namespace nt {
18 
19 static NTFieldPtr ntField = NTField::get();
20 
21 namespace detail {
22 
23 StructureConstPtr NTNDArrayAttributeBuilder::createStructure()
24 {
25  FieldBuilderPtr builder =
26  getFieldCreate()->createFieldBuilder()->
27  setId(NTNDArrayAttribute::URI)->
28  add("name", pvString)->
29  add("value", getFieldCreate()->createVariantUnion());
30 
31  if (tags)
32  builder->addArray("tags", pvString);
33 
34  builder->add("descriptor", pvString);
35 
36  builder->add("sourceType", pvInt);
37 
38  builder->add("source", pvString);
39 
40  if (alarm)
41  builder->add("alarm", ntField->createAlarm());
42 
43  if (timeStamp)
44  builder->add("timeStamp", ntField->createTimeStamp());
45 
46  size_t extraCount = extraFieldNames.size();
47  for (size_t i = 0; i< extraCount; i++)
48  builder->add(extraFieldNames[i], extraFields[i]);
49 
50 
51  StructureConstPtr s = builder->createStructure();
52 
53  reset();
54  return s;
55 }
56 
57 NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addTags()
58 {
59  tags = true;
60  return shared_from_this();
61 }
62 
63 NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addDescriptor()
64 {
65  descriptor = true;
66  return shared_from_this();
67 }
68 
69 NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addAlarm()
70 {
71  alarm = true;
72  return shared_from_this();
73 }
74 
75 NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addTimeStamp()
76 {
77  timeStamp = true;
78  return shared_from_this();
79 }
80 
81 PVStructurePtr NTNDArrayAttributeBuilder::createPVStructure()
82 {
83  return getPVDataCreate()->createPVStructure(createStructure());
84 }
85 
86 NTNDArrayAttributePtr NTNDArrayAttributeBuilder::create()
87 {
88  return NTNDArrayAttributePtr(new NTNDArrayAttribute(createPVStructure()));
89 }
90 
91 NTNDArrayAttributeBuilder::NTNDArrayAttributeBuilder()
92 {
93  reset();
94 }
95 
96 void NTNDArrayAttributeBuilder::reset()
97 {
98  tags = false;
99  descriptor = false;
100  alarm = false;
101  timeStamp = false;
102  extraFieldNames.clear();
103  extraFields.clear();
104 }
105 
106 NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::add(string const & name, FieldConstPtr const & field)
107 {
108  extraFields.push_back(field); extraFieldNames.push_back(name);
109  return shared_from_this();
110 }
111 
112 }
113 
114 const std::string NTNDArrayAttribute::URI("epics:nt/NTAttribute:1.0");
115 
116 NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrap(PVStructurePtr const & pvStructure)
117 {
118  if(!isCompatible(pvStructure)) return shared_pointer();
119  return wrapUnsafe(pvStructure);
120 }
121 
122 NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrapUnsafe(PVStructurePtr const & pvStructure)
123 {
124  return shared_pointer(new NTNDArrayAttribute(pvStructure));
125 }
126 
127 bool NTNDArrayAttribute::is_a(StructureConstPtr const & structure)
128 {
129  return NTUtils::is_a(structure->getID(), URI);
130 }
131 
132 bool NTNDArrayAttribute::is_a(PVStructurePtr const & pvStructure)
133 {
134  return is_a(pvStructure->getStructure());
135 }
136 
137 Result& NTNDArrayAttribute::isAttribute(Result& result) {
138  return result
139  .has<Scalar>("name")
140  .has<Union>("value")
141  .maybeHas<ScalarArray>("tags")
142  .has<Scalar>("descriptor")
143  .maybeHas<&NTField::isAlarm, Structure>("alarm")
144  .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
145  .has<Scalar>("sourceType")
146  .has<Scalar>("source");
147 }
148 
149 bool NTNDArrayAttribute::isCompatible(StructureConstPtr const & structure)
150 {
151  if (!structure)
152  return false;
153 
154  Result result(structure);
155  return isAttribute(result.is<Structure>()).valid();
156 }
157 
158 bool NTNDArrayAttribute::isCompatible(PVStructurePtr const & pvStructure)
159 {
160  if(!pvStructure) return false;
161 
162  return isCompatible(pvStructure->getStructure());
163 }
164 
165 bool NTNDArrayAttribute::isValid()
166 {
167  return true;
168 }
169 
170 NTNDArrayAttributeBuilderPtr NTNDArrayAttribute::createBuilder()
171 {
173 }
174 
175 bool NTNDArrayAttribute::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
176 {
177  PVStructurePtr ts = getTimeStamp();
178  if (ts)
179  return pvTimeStamp.attach(ts);
180  else
181  return false;
182 }
183 
184 bool NTNDArrayAttribute::attachAlarm(PVAlarm &pvAlarm) const
185 {
186  PVStructurePtr al = getAlarm();
187  if (al)
188  return pvAlarm.attach(al);
189  else
190  return false;
191 }
192 
193 PVStructurePtr NTNDArrayAttribute::getPVStructure() const
194 {
195  return pvNTNDArrayAttribute;
196 }
197 
198 PVStringPtr NTNDArrayAttribute::getDescriptor() const
199 {
200  return pvNTNDArrayAttribute->getSubField<PVString>("descriptor");
201 }
202 
203 PVStructurePtr NTNDArrayAttribute::getTimeStamp() const
204 {
205  return pvNTNDArrayAttribute->getSubField<PVStructure>("timeStamp");
206 }
207 
208 PVStructurePtr NTNDArrayAttribute::getAlarm() const
209 {
210  return pvNTNDArrayAttribute->getSubField<PVStructure>("alarm");
211 }
212 
213 
214 PVStringPtr NTNDArrayAttribute::getName() const
215 {
216  return pvNTNDArrayAttribute->getSubField<PVString>("name");
217 }
218 
219 PVUnionPtr NTNDArrayAttribute::getValue() const
220 {
221  return pvValue;
222 }
223 
224 PVStringArrayPtr NTNDArrayAttribute::getTags() const
225 {
226  return pvNTNDArrayAttribute->getSubField<PVStringArray>("tags");
227 }
228 
229 PVIntPtr NTNDArrayAttribute::getSourceType() const
230 {
231  return pvNTNDArrayAttribute->getSubField<PVInt>("sourceType");
232 }
233 
234 PVStringPtr NTNDArrayAttribute::getSource() const
235 {
236  return pvNTNDArrayAttribute->getSubField<PVString>("source");
237 }
238 
239 NTNDArrayAttribute::NTNDArrayAttribute(PVStructurePtr const & pvStructure) :
240  pvNTNDArrayAttribute(pvStructure), pvValue(pvNTNDArrayAttribute->getSubField<PVUnion>("value"))
241 {
242 }
243 
244 
245 }}
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
Definition: pvData.h:744
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
std::tr1::shared_ptr< PVInt > PVIntPtr
Definition: pvData.h:507
pvac::PutEvent result
Definition: clientSync.cpp:117
Result & is(void)
Definition: validator.h:89
int i
Definition: scan.c:967
bool attach(PVFieldPtr const &pvField)
Definition: pvAlarm.cpp:26
Validation methods for NT types.
Definition: validator.h:23
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
std::tr1::shared_ptr< detail::NTNDArrayAttributeBuilder > NTNDArrayAttributeBuilderPtr
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition: ntfield.h:35
std::tr1::shared_ptr< PVStringArray > PVStringArrayPtr
Definition: pvData.h:1464
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
Interface for in-line creating of NTAttribute extended as required by NTNDArray.
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< PVUnion > PVUnionPtr
Definition: pvData.h:107
pvData
Definition: monitor.h:428
This class implements introspection object for a structure.
Definition: pvIntrospect.h:697
template class for all extensions of PVArray.
Definition: pvData.h:55
Methods for accessing a timeStamp structure.
Definition: pvTimeStamp.h:38
Methods for accessing an alarm structure.
Definition: pvAlarm.h:37
PVUnion has a single subfield.
Definition: pvData.h:940
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
std::tr1::shared_ptr< NTNDArrayAttribute > NTNDArrayAttributePtr
Convenience Class for NTNDArrayAttribute.
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
This class implements introspection object for scalar array.
Definition: pvIntrospect.h:497
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
Result & has(const std::string &name)
Definition: validator.h:132
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
Class that holds the data for each possible scalar type.
Definition: pvData.h:54
Definition: caget.c:48
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26