This is Unofficial EPICS BASE Doxygen Site
nthistogram.cpp
Go to the documentation of this file.
1 /* ntcontinuum.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/nthistogram.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 NTHistogramBuilder::shared_pointer NTHistogramBuilder::value(
23  epics::pvData::ScalarType scalarType
24  )
25 {
26  valueType = scalarType;
27  valueTypeSet = true;
28 
29  return shared_from_this();
30 }
31 
32 StructureConstPtr NTHistogramBuilder::createStructure()
33 {
34  if (!valueTypeSet)
35  throw std::runtime_error("value array element type not set");
36 
37  FieldBuilderPtr builder =
38  getFieldCreate()->createFieldBuilder()->
39  setId(NTHistogram::URI)->
40  addArray("ranges", pvDouble)->
41  addArray("value", valueType);
42 
43  if (descriptor)
44  builder->add("descriptor", pvString);
45 
46  if (alarm)
47  builder->add("alarm", ntField->createAlarm());
48 
49  if (timeStamp)
50  builder->add("timeStamp", ntField->createTimeStamp());
51 
52  size_t extraCount = extraFieldNames.size();
53  for (size_t i = 0; i< extraCount; i++)
54  builder->add(extraFieldNames[i], extraFields[i]);
55 
56 
57  StructureConstPtr s = builder->createStructure();
58 
59  reset();
60  return s;
61 }
62 
63 NTHistogramBuilder::shared_pointer NTHistogramBuilder::addDescriptor()
64 {
65  descriptor = true;
66  return shared_from_this();
67 }
68 
69 NTHistogramBuilder::shared_pointer NTHistogramBuilder::addAlarm()
70 {
71  alarm = true;
72  return shared_from_this();
73 }
74 
75 NTHistogramBuilder::shared_pointer NTHistogramBuilder::addTimeStamp()
76 {
77  timeStamp = true;
78  return shared_from_this();
79 }
80 
81 
82 PVStructurePtr NTHistogramBuilder::createPVStructure()
83 {
84  return getPVDataCreate()->createPVStructure(createStructure());
85 }
86 
87 NTHistogramPtr NTHistogramBuilder::create()
88 {
89  return NTHistogramPtr(new NTHistogram(createPVStructure()));
90 }
91 
92 NTHistogramBuilder::NTHistogramBuilder()
93 {
94  reset();
95 }
96 
97 void NTHistogramBuilder::reset()
98 {
99  valueTypeSet = false;
100  descriptor = false;
101  alarm = false;
102  timeStamp = false;
103  extraFieldNames.clear();
104  extraFields.clear();
105 }
106 
107 NTHistogramBuilder::shared_pointer NTHistogramBuilder::add(string const & name, FieldConstPtr const & field)
108 {
109  extraFields.push_back(field); extraFieldNames.push_back(name);
110  return shared_from_this();
111 }
112 
113 }
114 
115 const std::string NTHistogram::URI("epics:nt/NTHistogram:1.0");
116 
117 NTHistogram::shared_pointer NTHistogram::wrap(PVStructurePtr const & pvStructure)
118 {
119  if(!isCompatible(pvStructure)) return shared_pointer();
120  return wrapUnsafe(pvStructure);
121 }
122 
123 NTHistogram::shared_pointer NTHistogram::wrapUnsafe(PVStructurePtr const & pvStructure)
124 {
125  return shared_pointer(new NTHistogram(pvStructure));
126 }
127 
128 bool NTHistogram::is_a(StructureConstPtr const & structure)
129 {
130  return NTUtils::is_a(structure->getID(), URI);
131 }
132 
133 bool NTHistogram::is_a(PVStructurePtr const & pvStructure)
134 {
135  return is_a(pvStructure->getStructure());
136 }
137 
138 bool NTHistogram::isCompatible(StructureConstPtr const &structure)
139 {
140  if (!structure)
141  return false;
142 
143  Result result(structure);
144 
145  return result
146  .is<Structure>()
147  .has<ScalarArray>("ranges")
148  .has<ScalarArray>("value")
149  .maybeHas<Scalar>("descriptor")
150  .maybeHas<&NTField::isAlarm, Structure>("alarm")
151  .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
152  .valid();
153 }
154 
155 bool NTHistogram::isCompatible(PVStructurePtr const & pvStructure)
156 {
157  if(!pvStructure.get()) return false;
158 
159  return isCompatible(pvStructure->getStructure());
160 }
161 
162 bool NTHistogram::isValid()
163 {
164  return (getValue()->getLength()+1 == getRanges()->getLength());
165 }
166 
167 NTHistogramBuilderPtr NTHistogram::createBuilder()
168 {
170 }
171 
172 bool NTHistogram::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
173 {
174  PVStructurePtr ts = getTimeStamp();
175  if (ts)
176  return pvTimeStamp.attach(ts);
177  else
178  return false;
179 }
180 
181 bool NTHistogram::attachAlarm(PVAlarm &pvAlarm) const
182 {
183  PVStructurePtr al = getAlarm();
184  if (al)
185  return pvAlarm.attach(al);
186  else
187  return false;
188 }
189 
190 PVStructurePtr NTHistogram::getPVStructure() const
191 {
192  return pvNTHistogram;
193 }
194 
195 PVStringPtr NTHistogram::getDescriptor() const
196 {
197  return pvNTHistogram->getSubField<PVString>("descriptor");
198 }
199 
200 PVStructurePtr NTHistogram::getTimeStamp() const
201 {
202  return pvNTHistogram->getSubField<PVStructure>("timeStamp");
203 }
204 
205 PVStructurePtr NTHistogram::getAlarm() const
206 {
207  return pvNTHistogram->getSubField<PVStructure>("alarm");
208 }
209 
210 PVDoubleArrayPtr NTHistogram::getRanges() const
211 {
212  return pvNTHistogram->getSubField<PVDoubleArray>("ranges");
213 }
214 
215 PVScalarArrayPtr NTHistogram::getValue() const
216 {
217  return pvValue;
218 }
219 
220 NTHistogram::NTHistogram(PVStructurePtr const & pvStructure) :
221  pvNTHistogram(pvStructure),
222  pvValue(pvNTHistogram->getSubField<PVScalarArray>("value"))
223 {}
224 
225 
226 }}
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
Definition: pvData.h:744
pvac::PutEvent result
Definition: clientSync.cpp:117
std::tr1::shared_ptr< detail::NTHistogramBuilder > NTHistogramBuilderPtr
Definition: nthistogram.h:119
Convenience Class for NTHistogram.
Definition: nthistogram.h:128
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< NTField > NTFieldPtr
Definition: ntfield.h:35
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
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
Base class for a scalarArray.
Definition: pvData.h:618
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()
This class implements introspection object for scalar array.
Definition: pvIntrospect.h:497
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
Definition: caget.c:48
std::tr1::shared_ptr< NTHistogram > NTHistogramPtr
Definition: nthistogram.h:26
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
Definition: pvData.h:82
Interface for in-line creating of NTHistogram.
Definition: nthistogram.h:38
std::tr1::shared_ptr< PVDoubleArray > PVDoubleArrayPtr
Definition: pvData.h:1461
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26