normativeTypesCPP 6.0.2
ntscalar.cpp
Go to the documentation of this file.
1/* ntscalar.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/ntscalar.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
22NTScalarBuilder::shared_pointer NTScalarBuilder::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 type not set");
36
37 FieldBuilderPtr builder =
38 getFieldCreate()->createFieldBuilder()->
39 setId(NTScalar::URI)->
40 add("value", valueType);
41
42 if (descriptor)
43 builder->add("descriptor", pvString);
44
45 if (alarm)
46 builder->add("alarm", ntField->createAlarm());
47
48 if (timeStamp)
49 builder->add("timeStamp", ntField->createTimeStamp());
50
51 if (display)
52 builder->add("display", ntField->createDisplay());
53
54 if (control)
55 builder->add("control", ntField->createControl());
56
57 size_t extraCount = extraFieldNames.size();
58 for (size_t i = 0; i< extraCount; i++)
59 builder->add(extraFieldNames[i], extraFields[i]);
60
61
62 StructureConstPtr s = builder->createStructure();
63
64 reset();
65 return s;
66}
67
68NTScalarBuilder::shared_pointer NTScalarBuilder::addDescriptor()
69{
70 descriptor = true;
71 return shared_from_this();
72}
73
74NTScalarBuilder::shared_pointer NTScalarBuilder::addAlarm()
75{
76 alarm = true;
77 return shared_from_this();
78}
79
80NTScalarBuilder::shared_pointer NTScalarBuilder::addTimeStamp()
81{
82 timeStamp = true;
83 return shared_from_this();
84}
85
86NTScalarBuilder::shared_pointer NTScalarBuilder::addDisplay()
87{
88 display = true;
89 return shared_from_this();
90}
91
92NTScalarBuilder::shared_pointer NTScalarBuilder::addControl()
93{
94 control = true;
95 return shared_from_this();
96}
97
99{
100 return getPVDataCreate()->createPVStructure(createStructure());
101}
102
107
108NTScalarBuilder::NTScalarBuilder()
109{
110 reset();
111}
112
113void NTScalarBuilder::reset()
114{
115 valueTypeSet = false;
116 descriptor = false;
117 alarm = false;
118 timeStamp = false;
119 display = false;
120 control = false;
121}
122
123NTScalarBuilder::shared_pointer NTScalarBuilder::add(string const & name, FieldConstPtr const & field)
124{
125 extraFields.push_back(field); extraFieldNames.push_back(name);
126 return shared_from_this();
127}
128
129
130}
131
132const std::string NTScalar::URI("epics:nt/NTScalar:1.0");
133
134NTScalar::shared_pointer NTScalar::wrap(PVStructurePtr const & pvStructure)
135{
136 if(!isCompatible(pvStructure)) return shared_pointer();
137 return wrapUnsafe(pvStructure);
138}
139
140NTScalar::shared_pointer NTScalar::wrapUnsafe(PVStructurePtr const & pvStructure)
141{
142 return shared_pointer(new NTScalar(pvStructure));
143}
144
145bool NTScalar::is_a(StructureConstPtr const & structure)
146{
147 return NTUtils::is_a(structure->getID(), URI);
148}
149
150bool NTScalar::is_a(PVStructurePtr const & pvStructure)
151{
152 return is_a(pvStructure->getStructure());
153}
154
155bool NTScalar::isCompatible(StructureConstPtr const &structure)
156{
157 if (!structure)
158 return false;
159
160 Result result(structure);
161
162 return result
163 .is<Structure>()
164 .has<Scalar>("value")
165 .maybeHas<Scalar>("descriptor")
166 .maybeHas<&NTField::isAlarm, Structure>("alarm")
167 .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
168 .maybeHas<&NTField::isDisplay, Structure>("display")
169 .maybeHas<&NTField::isControl, Structure>("control")
170 .valid();
171}
172
173bool NTScalar::isCompatible(PVStructurePtr const & pvStructure)
174{
175 if(!pvStructure) return false;
176
177 return isCompatible(pvStructure->getStructure());
178}
179
181{
182 return true;
183}
184
189
190bool NTScalar::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
191{
192 PVStructurePtr ts = getTimeStamp();
193 if (ts)
194 return pvTimeStamp.attach(ts);
195 else
196 return false;
197}
198
199bool NTScalar::attachAlarm(PVAlarm &pvAlarm) const
200{
201 PVStructurePtr al = getAlarm();
202 if (al)
203 return pvAlarm.attach(al);
204 else
205 return false;
206}
207
208bool NTScalar::attachDisplay(PVDisplay &pvDisplay) const
209{
210 PVStructurePtr dp = getDisplay();
211 if (dp)
212 return pvDisplay.attach(dp);
213 else
214 return false;
215}
216
217bool NTScalar::attachControl(PVControl &pvControl) const
218{
219 PVStructurePtr ctrl = getControl();
220 if (ctrl)
221 return pvControl.attach(ctrl);
222 else
223 return false;
224}
225
226PVStructurePtr NTScalar::getPVStructure() const
227{
228 return pvNTScalar;
229}
230
231PVStringPtr NTScalar::getDescriptor() const
232{
233 return pvNTScalar->getSubField<PVString>("descriptor");
234}
235
236PVStructurePtr NTScalar::getTimeStamp() const
237{
238 return pvNTScalar->getSubField<PVStructure>("timeStamp");
239}
240
241PVStructurePtr NTScalar::getAlarm() const
242{
243 return pvNTScalar->getSubField<PVStructure>("alarm");
244}
245
246PVStructurePtr NTScalar::getDisplay() const
247{
248 return pvNTScalar->getSubField<PVStructure>("display");
249}
250
251PVStructurePtr NTScalar::getControl() const
252{
253 return pvNTScalar->getSubField<PVStructure>("control");
254}
255
256PVFieldPtr NTScalar::getValue() const
257{
258 return pvValue;
259}
260
261NTScalar::NTScalar(PVStructurePtr const & pvStructure) :
262 pvNTScalar(pvStructure), pvValue(pvNTScalar->getSubField("value"))
263{}
264
265
266}}
bool isControl(epics::pvData::FieldConstPtr const &field)
static NTFieldPtr get()
Definition ntfield.cpp:18
bool isTimeStamp(epics::pvData::FieldConstPtr const &field)
Convenience Class for NTScalar.
Definition ntscalar.h:145
static bool is_a(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStructurePtr getControl() const
Definition ntscalar.cpp:251
bool attachControl(epics::pvData::PVControl &pvControl) const
Definition ntscalar.cpp:217
epics::pvData::PVFieldPtr getValue() const
Definition ntscalar.cpp:256
epics::pvData::PVStructurePtr getAlarm() const
Definition ntscalar.cpp:241
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
Definition ntscalar.cpp:199
epics::pvData::PVStringPtr getDescriptor() const
Definition ntscalar.cpp:231
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
Definition ntscalar.cpp:190
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
Definition ntscalar.cpp:134
epics::pvData::PVStructurePtr getPVStructure() const
Definition ntscalar.cpp:226
epics::pvData::PVStructurePtr getDisplay() const
Definition ntscalar.cpp:246
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const
Definition ntscalar.cpp:208
static const std::string URI
Definition ntscalar.h:149
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
Definition ntscalar.cpp:140
epics::pvData::PVStructurePtr getTimeStamp() const
Definition ntscalar.cpp:236
static NTScalarBuilderPtr createBuilder()
Definition ntscalar.cpp:185
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTScalar.
Definition ntscalar.h:42
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
Definition ntscalar.cpp:123
epics::pvData::StructureConstPtr createStructure()
Definition ntscalar.cpp:32
shared_pointer value(epics::pvData::ScalarType scalarType)
Definition ntscalar.cpp:22
epics::pvData::PVStructurePtr createPVStructure()
Definition ntscalar.cpp:98
friend class ::epics::nt::NTScalar
Definition ntscalar.h:130
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< detail::NTScalarBuilder > NTScalarBuilderPtr
Definition ntscalar.h:135
std::tr1::shared_ptr< NTScalar > NTScalarPtr
Definition ntscalar.h:29