This is Unofficial EPICS BASE Doxygen Site
ntunion.cpp
Go to the documentation of this file.
1 /* ntunion.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/ntunion.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 
23 NTUnionBuilder::shared_pointer NTUnionBuilder::value(UnionConstPtr unionType)
24 {
25  valueType = unionType;
26  return shared_from_this();
27 }
28 
29 StructureConstPtr NTUnionBuilder::createStructure()
30 {
31  FieldBuilderPtr builder =
32  getFieldCreate()->createFieldBuilder()->
33  setId(NTUnion::URI)->
34  add("value", valueType);
35 
36  if (descriptor)
37  builder->add("descriptor", pvString);
38 
39  if (alarm)
40  builder->add("alarm", ntField->createAlarm());
41 
42  if (timeStamp)
43  builder->add("timeStamp", ntField->createTimeStamp());
44 
45  size_t extraCount = extraFieldNames.size();
46  for (size_t i = 0; i< extraCount; i++)
47  builder->add(extraFieldNames[i], extraFields[i]);
48 
49 
50  StructureConstPtr s = builder->createStructure();
51 
52  reset();
53  return s;
54 }
55 
56 NTUnionBuilder::shared_pointer NTUnionBuilder::addDescriptor()
57 {
58  descriptor = true;
59  return shared_from_this();
60 }
61 
62 NTUnionBuilder::shared_pointer NTUnionBuilder::addAlarm()
63 {
64  alarm = true;
65  return shared_from_this();
66 }
67 
68 NTUnionBuilder::shared_pointer NTUnionBuilder::addTimeStamp()
69 {
70  timeStamp = true;
71  return shared_from_this();
72 }
73 
74 PVStructurePtr NTUnionBuilder::createPVStructure()
75 {
76  return getPVDataCreate()->createPVStructure(createStructure());
77 }
78 
79 NTUnionPtr NTUnionBuilder::create()
80 {
81  return NTUnionPtr(new NTUnion(createPVStructure()));
82 }
83 
84 NTUnionBuilder::NTUnionBuilder()
85 {
86  reset();
87 }
88 
89 void NTUnionBuilder::reset()
90 {
91  valueType = getFieldCreate()->createVariantUnion();
92  descriptor = false;
93  alarm = false;
94  timeStamp = false;
95  extraFieldNames.clear();
96  extraFields.clear();
97 }
98 
99 NTUnionBuilder::shared_pointer NTUnionBuilder::add(string const & name, FieldConstPtr const & field)
100 {
101  extraFields.push_back(field); extraFieldNames.push_back(name);
102  return shared_from_this();
103 }
104 
105 
106 }
107 
108 const std::string NTUnion::URI("epics:nt/NTUnion:1.0");
109 
110 NTUnion::shared_pointer NTUnion::wrap(PVStructurePtr const & pvStructure)
111 {
112  if(!isCompatible(pvStructure)) return shared_pointer();
113  return wrapUnsafe(pvStructure);
114 }
115 
116 NTUnion::shared_pointer NTUnion::wrapUnsafe(PVStructurePtr const & pvStructure)
117 {
118  return shared_pointer(new NTUnion(pvStructure));
119 }
120 
121 bool NTUnion::is_a(StructureConstPtr const & structure)
122 {
123  return NTUtils::is_a(structure->getID(), URI);
124 }
125 
126 bool NTUnion::is_a(PVStructurePtr const & pvStructure)
127 {
128  return is_a(pvStructure->getStructure());
129 }
130 
131 bool NTUnion::isCompatible(StructureConstPtr const &structure)
132 {
133  if (!structure)
134  return false;
135 
136  Result result(structure);
137 
138  return result
139  .is<Structure>()
140  .has<Union>("value")
141  .maybeHas<Scalar>("descriptor")
142  .maybeHas<&NTField::isAlarm, Structure>("alarm")
143  .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
144  .valid();
145 }
146 
147 bool NTUnion::isCompatible(PVStructurePtr const & pvStructure)
148 {
149  if(!pvStructure) return false;
150 
151  return isCompatible(pvStructure->getStructure());
152 }
153 
154 bool NTUnion::isValid()
155 {
156  return true;
157 }
158 
159 NTUnionBuilderPtr NTUnion::createBuilder()
160 {
162 }
163 
164 bool NTUnion::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
165 {
166  PVStructurePtr ts = getTimeStamp();
167  if (ts)
168  return pvTimeStamp.attach(ts);
169  else
170  return false;
171 }
172 
173 bool NTUnion::attachAlarm(PVAlarm &pvAlarm) const
174 {
175  PVStructurePtr al = getAlarm();
176  if (al)
177  return pvAlarm.attach(al);
178  else
179  return false;
180 }
181 
182 PVStructurePtr NTUnion::getPVStructure() const
183 {
184  return pvNTUnion;
185 }
186 
187 PVStringPtr NTUnion::getDescriptor() const
188 {
189  return pvNTUnion->getSubField<PVString>("descriptor");
190 }
191 
192 PVStructurePtr NTUnion::getTimeStamp() const
193 {
194  return pvNTUnion->getSubField<PVStructure>("timeStamp");
195 }
196 
197 PVStructurePtr NTUnion::getAlarm() const
198 {
199  return pvNTUnion->getSubField<PVStructure>("alarm");
200 }
201 
202 PVUnionPtr NTUnion::getValue() const
203 {
204  return pvValue;
205 }
206 
207 NTUnion::NTUnion(PVStructurePtr const & pvStructure) :
208  pvNTUnion(pvStructure), pvValue(pvNTUnion->getSubField<PVUnion>("value"))
209 {}
210 
211 
212 }}
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
Definition: pvData.h:744
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
pvac::PutEvent result
Definition: clientSync.cpp:117
Interface for in-line creating of NTUnion.
Definition: ntunion.h:37
Result & is(void)
Definition: validator.h:89
int i
Definition: scan.c:967
Convenience Class for NTUnion.
Definition: ntunion.h:126
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< FieldBuilder > FieldBuilderPtr
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< PVUnion > PVUnionPtr
Definition: pvData.h:107
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< const Union > UnionConstPtr
Definition: pvIntrospect.h:170
This class implements introspection object for a structure.
Definition: pvIntrospect.h:697
Methods for accessing a timeStamp structure.
Definition: pvTimeStamp.h:38
Methods for accessing an alarm structure.
Definition: pvAlarm.h:37
PVUnion has a single subfield.
Definition: pvData.h:940
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< NTUnion > NTUnionPtr
Definition: ntunion.h:25
Definition: caget.c:48
std::tr1::shared_ptr< detail::NTUnionBuilder > NTUnionBuilderPtr
Definition: ntunion.h:117
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
bool attach(PVFieldPtr const &pvField)
Definition: pvTimeStamp.cpp:26