This is Unofficial EPICS BASE Doxygen Site
ntaggregate.cpp
Go to the documentation of this file.
1 /* ntaggregate.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/ntaggregate.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 StructureConstPtr NTAggregateBuilder::createStructure()
23 {
24  FieldBuilderPtr builder =
25  getFieldCreate()->createFieldBuilder()->
26  setId(NTAggregate::URI)->
27  add("value", pvDouble)->
28  add("N", pvLong);
29 
30  if (dispersion)
31  builder->add("dispersion", pvDouble);
32 
33  if (first)
34  builder->add("first", pvDouble);
35 
36  if (firstTimeStamp)
37  builder->add("firstTimeStamp", ntField->createTimeStamp());
38 
39  if (last)
40  builder->add("last" , pvDouble);
41 
42  if (lastTimeStamp)
43  builder->add("lastTimeStamp", ntField->createTimeStamp());
44 
45  if (max)
46  builder->add("max", pvDouble);
47 
48  if (min)
49  builder->add("min", pvDouble);
50 
51  if (descriptor)
52  builder->add("descriptor", pvString);
53 
54  if (alarm)
55  builder->add("alarm", ntField->createAlarm());
56 
57  if (timeStamp)
58  builder->add("timeStamp", ntField->createTimeStamp());
59 
60  size_t extraCount = extraFieldNames.size();
61  for (size_t i = 0; i< extraCount; i++)
62  builder->add(extraFieldNames[i], extraFields[i]);
63 
64 
65  StructureConstPtr s = builder->createStructure();
66 
67  reset();
68  return s;
69 }
70 
71 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addDispersion()
72 {
73  dispersion = true;
74  return shared_from_this();
75 }
76 
77 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addFirst()
78 {
79  first = true;
80  return shared_from_this();
81 }
82 
83 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addFirstTimeStamp()
84 {
85  firstTimeStamp = true;
86  return shared_from_this();
87 }
88 
89 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addLast()
90 {
91  last = true;
92  return shared_from_this();
93 }
94 
95 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addLastTimeStamp()
96 {
97  lastTimeStamp = true;
98  return shared_from_this();
99 }
100 
101 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addMax()
102 {
103  max = true;
104  return shared_from_this();
105 }
106 
107 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addMin()
108 {
109  min = true;
110  return shared_from_this();
111 }
112 
113 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addDescriptor()
114 {
115  descriptor = true;
116  return shared_from_this();
117 }
118 
119 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addAlarm()
120 {
121  alarm = true;
122  return shared_from_this();
123 }
124 
125 NTAggregateBuilder::shared_pointer NTAggregateBuilder::addTimeStamp()
126 {
127  timeStamp = true;
128  return shared_from_this();
129 }
130 
131 PVStructurePtr NTAggregateBuilder::createPVStructure()
132 {
133  return getPVDataCreate()->createPVStructure(createStructure());
134 }
135 
136 NTAggregatePtr NTAggregateBuilder::create()
137 {
138  return NTAggregatePtr(new NTAggregate(createPVStructure()));
139 }
140 
141 NTAggregateBuilder::NTAggregateBuilder()
142 {
143  reset();
144 }
145 
146 void NTAggregateBuilder::reset()
147 {
148  dispersion = false;
149  first = false;
150  firstTimeStamp = false;
151  last = false;
152  lastTimeStamp = false;
153  max = false;
154  min = false;
155 
156  descriptor = false;
157  alarm = false;
158  timeStamp = false;
159 
160  extraFieldNames.clear();
161  extraFields.clear();
162 }
163 
164 NTAggregateBuilder::shared_pointer NTAggregateBuilder::add(string const & name, FieldConstPtr const & field)
165 {
166  extraFields.push_back(field); extraFieldNames.push_back(name);
167  return shared_from_this();
168 }
169 
170 
171 }
172 
173 const std::string NTAggregate::URI("epics:nt/NTAggregate:1.0");
174 
175 NTAggregate::shared_pointer NTAggregate::wrap(PVStructurePtr const & pvStructure)
176 {
177  if(!isCompatible(pvStructure)) return shared_pointer();
178  return wrapUnsafe(pvStructure);
179 }
180 
181 NTAggregate::shared_pointer NTAggregate::wrapUnsafe(PVStructurePtr const & pvStructure)
182 {
183  return shared_pointer(new NTAggregate(pvStructure));
184 }
185 
186 bool NTAggregate::is_a(StructureConstPtr const & structure)
187 {
188  return NTUtils::is_a(structure->getID(), URI);
189 }
190 
191 bool NTAggregate::is_a(PVStructurePtr const & pvStructure)
192 {
193  return is_a(pvStructure->getStructure());
194 }
195 
196 
197 bool NTAggregate::isCompatible(StructureConstPtr const &structure)
198 {
199  if (!structure)
200  return false;
201 
202  Result result(structure);
203 
204  return result
205  .is<Structure>()
206  .has<Scalar>("value")
207  .has<Scalar>("N")
208  .maybeHas<Scalar>("dispersion")
209  .maybeHas<Scalar>("first")
210  .maybeHas<&NTField::isTimeStamp, Structure>("firstTimeStamp")
211  .maybeHas<Scalar>("last")
212  .maybeHas<&NTField::isTimeStamp, Structure>("lastTimeStamp")
213  .maybeHas<Scalar>("max")
214  .maybeHas<Scalar>("min")
215  .maybeHas<Scalar>("descriptor")
216  .maybeHas<&NTField::isAlarm, Structure>("alarm")
217  .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
218  .valid();
219 }
220 
221 bool NTAggregate::isCompatible(PVStructurePtr const & pvStructure)
222 {
223  if(!pvStructure) return false;
224 
225  return isCompatible(pvStructure->getStructure());
226 }
227 
228 bool NTAggregate::isValid()
229 {
230  return true;
231 }
232 
233 NTAggregateBuilderPtr NTAggregate::createBuilder()
234 {
236 }
237 
238 bool NTAggregate::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
239 {
240  PVStructurePtr ts = getTimeStamp();
241  if (ts)
242  return pvTimeStamp.attach(ts);
243  else
244  return false;
245 }
246 
247 bool NTAggregate::attachAlarm(PVAlarm &pvAlarm) const
248 {
249  PVStructurePtr al = getAlarm();
250  if (al)
251  return pvAlarm.attach(al);
252  else
253  return false;
254 }
255 
256 PVStructurePtr NTAggregate::getPVStructure() const
257 {
258  return pvNTAggregate;
259 }
260 
261 PVStringPtr NTAggregate::getDescriptor() const
262 {
263  return pvNTAggregate->getSubField<PVString>("descriptor");
264 }
265 
266 PVStructurePtr NTAggregate::getTimeStamp() const
267 {
268  return pvNTAggregate->getSubField<PVStructure>("timeStamp");
269 }
270 
271 PVStructurePtr NTAggregate::getAlarm() const
272 {
273  return pvNTAggregate->getSubField<PVStructure>("alarm");
274 }
275 
276 PVDoublePtr NTAggregate::getValue() const
277 {
278  return pvValue;
279 }
280 
281 PVLongPtr NTAggregate::getN() const
282 {
283  return pvNTAggregate->getSubField<PVLong>("N");
284 }
285 
286 PVDoublePtr NTAggregate::getDispersion() const
287 {
288  return pvNTAggregate->getSubField<PVDouble>("dispersion");
289 }
290 
291 PVDoublePtr NTAggregate::getFirst() const
292 {
293  return pvNTAggregate->getSubField<PVDouble>("first");
294 }
295 
296 PVStructurePtr NTAggregate::getFirstTimeStamp() const
297 {
298  return pvNTAggregate->getSubField<PVStructure>("firstTimeStamp");
299 }
300 
301 PVDoublePtr NTAggregate::getLast() const
302 {
303  return pvNTAggregate->getSubField<PVDouble>("last");
304 }
305 
306 PVStructurePtr NTAggregate::getLastTimeStamp() const
307 {
308  return pvNTAggregate->getSubField<PVStructure>("lastTimeStamp");
309 }
310 
311 PVDoublePtr NTAggregate::getMax() const
312 {
313  return pvNTAggregate->getSubField<PVDouble>("max");
314 }
315 
316 PVDoublePtr NTAggregate::getMin() const
317 {
318  return pvNTAggregate->getSubField<PVDouble>("min");
319 }
320 
321 NTAggregate::NTAggregate(PVStructurePtr const & pvStructure) :
322  pvNTAggregate(pvStructure), pvValue(pvNTAggregate->getSubField<PVDouble>("value"))
323 {}
324 
325 
326 }}
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
#define max(x, y)
Definition: flexdef.h:81
pvac::PutEvent result
Definition: clientSync.cpp:117
Result & is(void)
Definition: validator.h:89
int i
Definition: scan.c:967
#define min(x, y)
Definition: flexdef.h:78
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< NTAggregate > NTAggregatePtr
Definition: ntaggregate.h:25
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition: ntfield.h:35
Convenience Class for NTAggregate.
Definition: ntaggregate.h:166
std::tr1::shared_ptr< PVLong > PVLongPtr
Definition: pvData.h:508
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< detail::NTAggregateBuilder > NTAggregateBuilderPtr
Definition: ntaggregate.h:158
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
Class that holds the data for each possible scalar type.
Definition: pvData.h:54
Interface for in-line creating of NTAggregate.
Definition: ntaggregate.h:37
Definition: caget.c:48
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
std::tr1::shared_ptr< PVDouble > PVDoublePtr
Definition: pvData.h:514
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26