normativeTypesCPP 6.0.2
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
13using namespace std;
14using namespace epics::pvData;
15
16namespace epics { namespace nt {
17
18static NTFieldPtr ntField = NTField::get();
19
20namespace detail {
21
22NTScalarArrayBuilder::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
32NTScalarArrayBuilder::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
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
78NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addDescriptor()
79{
80 descriptor = true;
81 return shared_from_this();
82}
83
84NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addAlarm()
85{
86 alarm = true;
87 return shared_from_this();
88}
89
90NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addTimeStamp()
91{
92 timeStamp = true;
93 return shared_from_this();
94}
95
96NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addDisplay()
97{
98 display = true;
99 return shared_from_this();
100}
101
102NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::addControl()
103{
104 control = true;
105 return shared_from_this();
106}
107
109{
110 return getPVDataCreate()->createPVStructure(createStructure());
111}
112
117
118NTScalarArrayBuilder::NTScalarArrayBuilder()
119{
120 reset();
121}
122
123void NTScalarArrayBuilder::reset()
124{
125 valueTypeSet = false;
126 descriptor = false;
127 alarm = false;
128 timeStamp = false;
129 display = false;
130 control = false;
131}
132
133NTScalarArrayBuilder::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
141const std::string NTScalarArray::URI("epics:nt/NTScalarArray:1.0");
142
143NTScalarArray::shared_pointer NTScalarArray::wrap(PVStructurePtr const & pvStructure)
144{
145 if(!isCompatible(pvStructure)) return shared_pointer();
146 return wrapUnsafe(pvStructure);
147}
148
149NTScalarArray::shared_pointer NTScalarArray::wrapUnsafe(PVStructurePtr const & pvStructure)
150{
151 return shared_pointer(new NTScalarArray(pvStructure));
152}
153
154bool NTScalarArray::is_a(StructureConstPtr const & structure)
155{
156 return NTUtils::is_a(structure->getID(), URI);
157}
158
159bool NTScalarArray::is_a(PVStructurePtr const & pvStructure)
160{
161 return is_a(pvStructure->getStructure());
162}
163
164bool 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
182bool NTScalarArray::isCompatible(PVStructurePtr const & pvStructure)
183{
184 if(!pvStructure) return false;
185
186 return isCompatible(pvStructure->getStructure());
187}
188
190{
191 return true;
192}
193
198
199bool 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
208bool 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
217bool 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
226bool 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
235PVStructurePtr NTScalarArray::getPVStructure() const
236{
237 return pvNTScalarArray;
238}
239
241{
242 return pvNTScalarArray->getSubField<PVString>("descriptor");
243}
244
245PVStructurePtr NTScalarArray::getTimeStamp() const
246{
247 return pvNTScalarArray->getSubField<PVStructure>("timeStamp");
248}
249
250PVStructurePtr NTScalarArray::getAlarm() const
251{
252 return pvNTScalarArray->getSubField<PVStructure>("alarm");
253}
254
255PVStructurePtr NTScalarArray::getDisplay() const
256{
257 return pvNTScalarArray->getSubField<PVStructure>("display");
258}
259
260PVStructurePtr NTScalarArray::getControl() const
261{
262 return pvNTScalarArray->getSubField<PVStructure>("control");
263}
264
265PVFieldPtr NTScalarArray::getValue() const
266{
267 return pvValue;
268}
269
270NTScalarArray::NTScalarArray(PVStructurePtr const & pvStructure) :
271 pvNTScalarArray(pvStructure), pvValue(pvNTScalarArray->getSubField("value"))
272{}
273
274
275}}
bool isControl(epics::pvData::FieldConstPtr const &field)
static NTFieldPtr get()
Definition ntfield.cpp:18
bool isTimeStamp(epics::pvData::FieldConstPtr const &field)
Convenience Class for NTScalarArray.
epics::pvData::PVStructurePtr getControl() const
epics::pvData::PVStructurePtr getPVStructure() const
static NTScalarArrayBuilderPtr createBuilder()
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStructurePtr getDisplay() const
epics::pvData::PVFieldPtr getValue() const
static bool is_a(epics::pvData::StructureConstPtr const &structure)
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const
static const std::string URI
epics::pvData::PVStringPtr getDescriptor() const
epics::pvData::PVStructurePtr getTimeStamp() const
bool attachControl(epics::pvData::PVControl &pvControl) const
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVStructurePtr getAlarm() const
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTScalarArray.
epics::pvData::PVStructurePtr createPVStructure()
shared_pointer arrayValue(epics::pvData::ScalarType elementType)
friend class ::epics::nt::NTScalarArray
shared_pointer value(epics::pvData::ScalarType elementType)
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
epics::pvData::StructureConstPtr createStructure()
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< NTScalarArray > NTScalarArrayPtr
std::tr1::shared_ptr< detail::NTScalarArrayBuilder > NTScalarArrayBuilderPtr