This is Unofficial EPICS BASE Doxygen Site
ntscalarArray.cpp
Go to the documentation of this file.
1 /* ntscalarArray.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/ntscalarArray.h>
11 #include <pv/ntutils.h>
12 
13 using namespace std;
14 using namespace epics::pvData;
15 
16 namespace epics { namespace nt {
17 
18 static NTFieldPtr ntField = NTField::get();
19 
20 namespace detail {
21 
22 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::value(
23  epics::pvData::ScalarType elementType
24  )
25 {
26  valueType = elementType;
27  valueTypeSet = true;
28 
29  return shared_from_this();
30 }
31 
32 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::arrayValue(
33  epics::pvData::ScalarType elementType
34  )
35 {
36  valueType = elementType;
37  valueTypeSet = true;
38 
39  return shared_from_this();
40 }
41 
42 StructureConstPtr NTScalarArrayBuilder::createStructure()
43 {
44  if (!valueTypeSet)
45  throw std::runtime_error("value array element type not set");
46 
47  FieldBuilderPtr builder =
48  getFieldCreate()->createFieldBuilder()->
49  setId(NTScalarArray::URI)->
50  addArray("value", valueType);
51 
52  if (descriptor)
53  builder->add("descriptor", pvString);
54 
55  if (alarm)
56  builder->add("alarm", ntField->createAlarm());
57 
58  if (timeStamp)
59  builder->add("timeStamp", ntField->createTimeStamp());
60 
61  if (display)
62  builder->add("display", ntField->createDisplay());
63 
64  if (control)
65  builder->add("control", ntField->createControl());
66 
67  size_t extraCount = extraFieldNames.size();
68  for (size_t i = 0; i< extraCount; i++)
69  builder->add(extraFieldNames[i], extraFields[i]);
70 
71 
72  StructureConstPtr s = builder->createStructure();
73 
74  reset();
75  return s;
76 }
77 
78 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addDescriptor()
79 {
80  descriptor = true;
81  return shared_from_this();
82 }
83 
84 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addAlarm()
85 {
86  alarm = true;
87  return shared_from_this();
88 }
89 
90 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addTimeStamp()
91 {
92  timeStamp = true;
93  return shared_from_this();
94 }
95 
96 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addDisplay()
97 {
98  display = true;
99  return shared_from_this();
100 }
101 
102 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addControl()
103 {
104  control = true;
105  return shared_from_this();
106 }
107 
108 PVStructurePtr NTScalarArrayBuilder::createPVStructure()
109 {
110  return getPVDataCreate()->createPVStructure(createStructure());
111 }
112 
113 NTScalarArrayPtr NTScalarArrayBuilder::create()
114 {
115  return NTScalarArrayPtr(new NTScalarArray(createPVStructure()));
116 }
117 
118 NTScalarArrayBuilder::NTScalarArrayBuilder()
119 {
120  reset();
121 }
122 
123 void NTScalarArrayBuilder::reset()
124 {
125  valueTypeSet = false;
126  descriptor = false;
127  alarm = false;
128  timeStamp = false;
129  display = false;
130  control = false;
131 }
132 
133 NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::add(string const & name, FieldConstPtr const & field)
134 {
135  extraFields.push_back(field); extraFieldNames.push_back(name);
136  return shared_from_this();
137 }
138 
139 }
140 
141 const std::string NTScalarArray::URI("epics:nt/NTScalarArray:1.0");
142 
143 NTScalarArray::shared_pointer NTScalarArray::wrap(PVStructurePtr const & pvStructure)
144 {
145  if(!isCompatible(pvStructure)) return shared_pointer();
146  return wrapUnsafe(pvStructure);
147 }
148 
149 NTScalarArray::shared_pointer NTScalarArray::wrapUnsafe(PVStructurePtr const & pvStructure)
150 {
151  return shared_pointer(new NTScalarArray(pvStructure));
152 }
153 
154 bool NTScalarArray::is_a(StructureConstPtr const & structure)
155 {
156  return NTUtils::is_a(structure->getID(), URI);
157 }
158 
159 bool NTScalarArray::is_a(PVStructurePtr const & pvStructure)
160 {
161  return is_a(pvStructure->getStructure());
162 }
163 
164 bool NTScalarArray::isCompatible(StructureConstPtr const & structure)
165 {
166  if (!structure)
167  return false;
168 
169  Result result(structure);
170 
171  return result
172  .is<Structure>()
173  .has<ScalarArray>("value")
174  .maybeHas<Scalar>("descriptor")
175  .maybeHas<&NTField::isAlarm, Structure>("alarm")
176  .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
177  .maybeHas<&NTField::isDisplay, Structure>("display")
178  .maybeHas<&NTField::isControl, Structure>("control")
179  .valid();
180 }
181 
182 bool NTScalarArray::isCompatible(PVStructurePtr const & pvStructure)
183 {
184  if(!pvStructure) return false;
185 
186  return isCompatible(pvStructure->getStructure());
187 }
188 
189 bool NTScalarArray::isValid()
190 {
191  return true;
192 }
193 
194 NTScalarArrayBuilderPtr NTScalarArray::createBuilder()
195 {
197 }
198 
199 bool NTScalarArray::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
200 {
201  PVStructurePtr ts = getTimeStamp();
202  if (ts)
203  return pvTimeStamp.attach(ts);
204  else
205  return false;
206 }
207 
208 bool NTScalarArray::attachAlarm(PVAlarm &pvAlarm) const
209 {
210  PVStructurePtr al = getAlarm();
211  if (al)
212  return pvAlarm.attach(al);
213  else
214  return false;
215 }
216 
217 bool NTScalarArray::attachDisplay(PVDisplay &pvDisplay) const
218 {
219  PVStructurePtr dp = getDisplay();
220  if (dp)
221  return pvDisplay.attach(dp);
222  else
223  return false;
224 }
225 
226 bool NTScalarArray::attachControl(PVControl &pvControl) const
227 {
228  PVStructurePtr ctrl = getControl();
229  if (ctrl)
230  return pvControl.attach(ctrl);
231  else
232  return false;
233 }
234 
235 PVStructurePtr NTScalarArray::getPVStructure() const
236 {
237  return pvNTScalarArray;
238 }
239 
240 PVStringPtr NTScalarArray::getDescriptor() const
241 {
242  return pvNTScalarArray->getSubField<PVString>("descriptor");
243 }
244 
245 PVStructurePtr NTScalarArray::getTimeStamp() const
246 {
247  return pvNTScalarArray->getSubField<PVStructure>("timeStamp");
248 }
249 
250 PVStructurePtr NTScalarArray::getAlarm() const
251 {
252  return pvNTScalarArray->getSubField<PVStructure>("alarm");
253 }
254 
255 PVStructurePtr NTScalarArray::getDisplay() const
256 {
257  return pvNTScalarArray->getSubField<PVStructure>("display");
258 }
259 
260 PVStructurePtr NTScalarArray::getControl() const
261 {
262  return pvNTScalarArray->getSubField<PVStructure>("control");
263 }
264 
265 PVFieldPtr NTScalarArray::getValue() const
266 {
267  return pvValue;
268 }
269 
270 NTScalarArray::NTScalarArray(PVStructurePtr const & pvStructure) :
271  pvNTScalarArray(pvStructure), pvValue(pvNTScalarArray->getSubField("value"))
272 {}
273 
274 
275 }}
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
Definition: pvData.h:744
bool attach(PVFieldPtr const &pvField)
Definition: pvDisplay.cpp:26
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
pvac::PutEvent result
Definition: clientSync.cpp:117
Result & is(void)
Definition: validator.h:89
Methods for accessing an control structure.
Definition: pvControl.h:34
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< NTScalarArray > NTScalarArrayPtr
Definition: ntscalarArray.h:29
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition: ntfield.h:35
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< detail::NTScalarArrayBuilder > NTScalarArrayBuilderPtr
pvData
Definition: monitor.h:428
This class implements introspection object for a structure.
Definition: pvIntrospect.h:697
Methods for accessing a timeStamp structure.
Definition: pvTimeStamp.h:38
Methods for accessing an alarm structure.
Definition: pvAlarm.h:37
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
Convenience Class for NTScalarArray.
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
Definition: caget.c:48
Methods for accessing an display structure.
Definition: pvDisplay.h:39
Interface for in-line creating of NTScalarArray.
Definition: ntscalarArray.h:41
bool attach(PVFieldPtr const &pvField)
Definition: pvControl.cpp:26
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26