This is Unofficial EPICS BASE Doxygen Site
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 
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 NTScalarBuilder::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 
32 StructureConstPtr NTScalarBuilder::createStructure()
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 
68 NTScalarBuilder::shared_pointer NTScalarBuilder::addDescriptor()
69 {
70  descriptor = true;
71  return shared_from_this();
72 }
73 
74 NTScalarBuilder::shared_pointer NTScalarBuilder::addAlarm()
75 {
76  alarm = true;
77  return shared_from_this();
78 }
79 
80 NTScalarBuilder::shared_pointer NTScalarBuilder::addTimeStamp()
81 {
82  timeStamp = true;
83  return shared_from_this();
84 }
85 
86 NTScalarBuilder::shared_pointer NTScalarBuilder::addDisplay()
87 {
88  display = true;
89  return shared_from_this();
90 }
91 
92 NTScalarBuilder::shared_pointer NTScalarBuilder::addControl()
93 {
94  control = true;
95  return shared_from_this();
96 }
97 
98 PVStructurePtr NTScalarBuilder::createPVStructure()
99 {
100  return getPVDataCreate()->createPVStructure(createStructure());
101 }
102 
103 NTScalarPtr NTScalarBuilder::create()
104 {
105  return NTScalarPtr(new NTScalar(createPVStructure()));
106 }
107 
108 NTScalarBuilder::NTScalarBuilder()
109 {
110  reset();
111 }
112 
113 void NTScalarBuilder::reset()
114 {
115  valueTypeSet = false;
116  descriptor = false;
117  alarm = false;
118  timeStamp = false;
119  display = false;
120  control = false;
121 }
122 
123 NTScalarBuilder::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 
132 const std::string NTScalar::URI("epics:nt/NTScalar:1.0");
133 
134 NTScalar::shared_pointer NTScalar::wrap(PVStructurePtr const & pvStructure)
135 {
136  if(!isCompatible(pvStructure)) return shared_pointer();
137  return wrapUnsafe(pvStructure);
138 }
139 
140 NTScalar::shared_pointer NTScalar::wrapUnsafe(PVStructurePtr const & pvStructure)
141 {
142  return shared_pointer(new NTScalar(pvStructure));
143 }
144 
145 bool NTScalar::is_a(StructureConstPtr const & structure)
146 {
147  return NTUtils::is_a(structure->getID(), URI);
148 }
149 
150 bool NTScalar::is_a(PVStructurePtr const & pvStructure)
151 {
152  return is_a(pvStructure->getStructure());
153 }
154 
155 bool 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 
173 bool NTScalar::isCompatible(PVStructurePtr const & pvStructure)
174 {
175  if(!pvStructure) return false;
176 
177  return isCompatible(pvStructure->getStructure());
178 }
179 
180 bool NTScalar::isValid()
181 {
182  return true;
183 }
184 
185 NTScalarBuilderPtr NTScalar::createBuilder()
186 {
188 }
189 
190 bool 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 
199 bool 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 
208 bool 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 
217 bool 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 
226 PVStructurePtr NTScalar::getPVStructure() const
227 {
228  return pvNTScalar;
229 }
230 
231 PVStringPtr NTScalar::getDescriptor() const
232 {
233  return pvNTScalar->getSubField<PVString>("descriptor");
234 }
235 
236 PVStructurePtr NTScalar::getTimeStamp() const
237 {
238  return pvNTScalar->getSubField<PVStructure>("timeStamp");
239 }
240 
241 PVStructurePtr NTScalar::getAlarm() const
242 {
243  return pvNTScalar->getSubField<PVStructure>("alarm");
244 }
245 
246 PVStructurePtr NTScalar::getDisplay() const
247 {
248  return pvNTScalar->getSubField<PVStructure>("display");
249 }
250 
251 PVStructurePtr NTScalar::getControl() const
252 {
253  return pvNTScalar->getSubField<PVStructure>("control");
254 }
255 
256 PVFieldPtr NTScalar::getValue() const
257 {
258  return pvValue;
259 }
260 
261 NTScalar::NTScalar(PVStructurePtr const & pvStructure) :
262  pvNTScalar(pvStructure), pvValue(pvNTScalar->getSubField("value"))
263 {}
264 
265 
266 }}
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
Definition: pvData.h:744
bool attach(PVFieldPtr const &pvField)
Definition: pvDisplay.cpp:26
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
pvac::PutEvent result
Definition: clientSync.cpp:117
Result & is(void)
Definition: validator.h:89
Methods for accessing an control structure.
Definition: pvControl.h:34
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
Convenience Class for NTScalar.
Definition: ntscalar.h:144
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
Methods for accessing a timeStamp structure.
Definition: pvTimeStamp.h:38
Interface for in-line creating of NTScalar.
Definition: ntscalar.h:40
std::tr1::shared_ptr< detail::NTScalarBuilder > NTScalarBuilderPtr
Definition: ntscalar.h:135
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
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
Definition: caget.c:48
Methods for accessing an display structure.
Definition: pvDisplay.h:39
std::tr1::shared_ptr< NTScalar > NTScalarPtr
Definition: ntscalar.h:28
bool attach(PVFieldPtr const &pvField)
Definition: pvControl.cpp:26
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26