This is Unofficial EPICS BASE Doxygen Site
ntnameValue.cpp
Go to the documentation of this file.
1 /* ntnameValue.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/ntnameValue.h>
11 #include <pv/ntutils.h>
12 
13 using namespace std;
14 using namespace epics::pvData;
15 
16 namespace epics { namespace nt {
17 static NTFieldPtr ntField = NTField::get();
18 
19 namespace detail {
20 
21 
22 NTNameValueBuilder::shared_pointer NTNameValueBuilder::value(
23  epics::pvData::ScalarType scalarType
24  )
25 {
26  valueType = scalarType;
27  valueTypeSet = true;
28 
29  return shared_from_this();
30 }
31 
32 StructureConstPtr NTNameValueBuilder::createStructure()
33 {
34  if (!valueTypeSet)
35  throw std::runtime_error("value type not set");
36 
37  FieldBuilderPtr builder =
38  getFieldCreate()->createFieldBuilder()->
39  setId(NTNameValue::URI)->
40  addArray("name", pvString)->
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  StructureConstPtr s = builder->createStructure();
57 
58  reset();
59  return s;
60 }
61 
62 NTNameValueBuilder::shared_pointer NTNameValueBuilder::addDescriptor()
63 {
64  descriptor = true;
65  return shared_from_this();
66 }
67 
68 NTNameValueBuilder::shared_pointer NTNameValueBuilder::addAlarm()
69 {
70  alarm = true;
71  return shared_from_this();
72 }
73 
74 NTNameValueBuilder::shared_pointer NTNameValueBuilder::addTimeStamp()
75 {
76  timeStamp = true;
77  return shared_from_this();
78 }
79 
80 PVStructurePtr NTNameValueBuilder::createPVStructure()
81 {
82  return getPVDataCreate()->createPVStructure(createStructure());
83 }
84 
85 NTNameValuePtr NTNameValueBuilder::create()
86 {
87  return NTNameValuePtr(new NTNameValue(createPVStructure()));
88 }
89 
90 NTNameValueBuilder::NTNameValueBuilder()
91 {
92  reset();
93 }
94 
95 void NTNameValueBuilder::reset()
96 {
97  valueTypeSet = false;
98  descriptor = false;
99  alarm = false;
100  timeStamp = false;
101  extraFieldNames.clear();
102  extraFields.clear();
103 }
104 
105 NTNameValueBuilder::shared_pointer NTNameValueBuilder::add(string const & name, FieldConstPtr const & field)
106 {
107  extraFields.push_back(field); extraFieldNames.push_back(name);
108  return shared_from_this();
109 }
110 
111 
112 }
113 
114 const std::string NTNameValue::URI("epics:nt/NTNameValue:1.0");
115 
116 NTNameValue::shared_pointer NTNameValue::wrap(PVStructurePtr const & pvStructure)
117 {
118  if(!isCompatible(pvStructure)) return shared_pointer();
119  return wrapUnsafe(pvStructure);
120 }
121 
122 NTNameValue::shared_pointer NTNameValue::wrapUnsafe(PVStructurePtr const & structure)
123 {
124  return shared_pointer(new NTNameValue(structure));
125 }
126 
127 bool NTNameValue::is_a(StructureConstPtr const & structure)
128 {
129  return NTUtils::is_a(structure->getID(), URI);
130 }
131 
132 bool NTNameValue::is_a(PVStructurePtr const & pvStructure)
133 {
134  return is_a(pvStructure->getStructure());
135 }
136 
137 bool NTNameValue::isCompatible(StructureConstPtr const & structure)
138 {
139  if (!structure)
140  return false;
141 
142  Result result(structure);
143 
144  return result
145  .is<Structure>()
146  .has<ScalarArray>("name")
147  .has<ScalarArray>("value")
148  .maybeHas<Scalar>("descriptor")
149  .maybeHas<&NTField::isAlarm, Structure>("alarm")
150  .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
151  .valid();
152 }
153 
154 bool NTNameValue::isCompatible(PVStructurePtr const & pvStructure)
155 {
156  if(!pvStructure) return false;
157 
158  return isCompatible(pvStructure->getStructure());
159 }
160 
161 bool NTNameValue::isValid()
162 {
163  return (getValue<PVScalarArray>()->getLength() == getName()->getLength());
164 }
165 
166 NTNameValueBuilderPtr NTNameValue::createBuilder()
167 {
169 }
170 
171 bool NTNameValue::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
172 {
173  PVStructurePtr ts = getTimeStamp();
174  if (ts)
175  return pvTimeStamp.attach(ts);
176  else
177  return false;
178 }
179 
180 bool NTNameValue::attachAlarm(PVAlarm &pvAlarm) const
181 {
182  PVStructurePtr al = getAlarm();
183  if (al)
184  return pvAlarm.attach(al);
185  else
186  return false;
187 }
188 
189 PVStructurePtr NTNameValue::getPVStructure() const
190 {
191  return pvNTNameValue;
192 }
193 
194 PVStringPtr NTNameValue::getDescriptor() const
195 {
196  return pvNTNameValue->getSubField<PVString>("descriptor");
197 }
198 
199 PVStructurePtr NTNameValue::getTimeStamp() const
200 {
201  return pvNTNameValue->getSubField<PVStructure>("timeStamp");
202 }
203 
204 PVStructurePtr NTNameValue::getAlarm() const
205 {
206  return pvNTNameValue->getSubField<PVStructure>("alarm");
207 }
208 
209 PVStringArrayPtr NTNameValue::getName() const
210 {
211  return pvNTNameValue->getSubField<PVStringArray>("name");
212 }
213 
214 PVFieldPtr NTNameValue::getValue() const
215 {
216  return pvNTNameValue->getSubField("value");
217 }
218 
219 NTNameValue::NTNameValue(PVStructurePtr const & pvStructure) :
220  pvNTNameValue(pvStructure)
221 {}
222 
223 
224 }}
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
Definition: pvData.h:744
Interface for in-line creating of NTNameValue.
Definition: ntnameValue.h:40
std::tr1::shared_ptr< NTNameValue > NTNameValuePtr
Definition: ntnameValue.h:28
pvac::PutEvent result
Definition: clientSync.cpp:117
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< PVStringArray > PVStringArrayPtr
Definition: pvData.h:1464
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
std::tr1::shared_ptr< detail::NTNameValueBuilder > NTNameValueBuilderPtr
Definition: ntnameValue.h:121
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
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
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
Definition: caget.c:48
Convenience Class for NTNameValue.
Definition: ntnameValue.h:128
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26