normativeTypesCPP 6.0.2
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
13using namespace std;
14using namespace epics::pvData;
15
16namespace epics { namespace nt {
17
18static NTFieldPtr ntField = NTField::get();
19
20namespace detail {
21
22NTHistogramBuilder::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
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
63NTHistogramBuilder::shared_pointer NTHistogramBuilder::addDescriptor()
64{
65 descriptor = true;
66 return shared_from_this();
67}
68
69NTHistogramBuilder::shared_pointer NTHistogramBuilder::addAlarm()
70{
71 alarm = true;
72 return shared_from_this();
73}
74
75NTHistogramBuilder::shared_pointer NTHistogramBuilder::addTimeStamp()
76{
77 timeStamp = true;
78 return shared_from_this();
79}
80
81
83{
84 return getPVDataCreate()->createPVStructure(createStructure());
85}
86
91
92NTHistogramBuilder::NTHistogramBuilder()
93{
94 reset();
95}
96
97void NTHistogramBuilder::reset()
98{
99 valueTypeSet = false;
100 descriptor = false;
101 alarm = false;
102 timeStamp = false;
103 extraFieldNames.clear();
104 extraFields.clear();
105}
106
107NTHistogramBuilder::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
115const std::string NTHistogram::URI("epics:nt/NTHistogram:1.0");
116
117NTHistogram::shared_pointer NTHistogram::wrap(PVStructurePtr const & pvStructure)
118{
119 if(!isCompatible(pvStructure)) return shared_pointer();
120 return wrapUnsafe(pvStructure);
121}
122
123NTHistogram::shared_pointer NTHistogram::wrapUnsafe(PVStructurePtr const & pvStructure)
124{
125 return shared_pointer(new NTHistogram(pvStructure));
126}
127
128bool NTHistogram::is_a(StructureConstPtr const & structure)
129{
130 return NTUtils::is_a(structure->getID(), URI);
131}
132
133bool NTHistogram::is_a(PVStructurePtr const & pvStructure)
134{
135 return is_a(pvStructure->getStructure());
136}
137
138bool 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
155bool NTHistogram::isCompatible(PVStructurePtr const & pvStructure)
156{
157 if(!pvStructure.get()) return false;
158
159 return isCompatible(pvStructure->getStructure());
160}
161
163{
164 return (getValue()->getLength()+1 == getRanges()->getLength());
165}
166
171
172bool 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
181bool 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
190PVStructurePtr NTHistogram::getPVStructure() const
191{
192 return pvNTHistogram;
193}
194
195PVStringPtr NTHistogram::getDescriptor() const
196{
197 return pvNTHistogram->getSubField<PVString>("descriptor");
198}
199
200PVStructurePtr NTHistogram::getTimeStamp() const
201{
202 return pvNTHistogram->getSubField<PVStructure>("timeStamp");
203}
204
205PVStructurePtr NTHistogram::getAlarm() const
206{
207 return pvNTHistogram->getSubField<PVStructure>("alarm");
208}
209
210PVDoubleArrayPtr NTHistogram::getRanges() const
211{
212 return pvNTHistogram->getSubField<PVDoubleArray>("ranges");
213}
214
215PVScalarArrayPtr NTHistogram::getValue() const
216{
217 return pvValue;
218}
219
220NTHistogram::NTHistogram(PVStructurePtr const & pvStructure) :
221 pvNTHistogram(pvStructure),
222 pvValue(pvNTHistogram->getSubField<PVScalarArray>("value"))
223{}
224
225
226}}
bool isAlarm(epics::pvData::FieldConstPtr const &field)
static NTFieldPtr get()
Definition ntfield.cpp:18
Convenience Class for NTHistogram.
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
static const std::string URI
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVDoubleArrayPtr getRanges() const
epics::pvData::PVScalarArrayPtr getValue() const
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVStringPtr getDescriptor() const
epics::pvData::PVStructurePtr getAlarm() const
static NTHistogramBuilderPtr createBuilder()
static bool is_a(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStructurePtr getPVStructure() const
epics::pvData::PVStructurePtr getTimeStamp() const
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTHistogram.
Definition nthistogram.h:40
friend class ::epics::nt::NTHistogram
shared_pointer value(epics::pvData::ScalarType scalarType)
epics::pvData::StructureConstPtr createStructure()
epics::pvData::PVStructurePtr createPVStructure()
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< detail::NTHistogramBuilder > NTHistogramBuilderPtr
std::tr1::shared_ptr< NTHistogram > NTHistogramPtr
Definition nthistogram.h:27