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