normativeTypesCPP 6.0.2
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
13using namespace std;
14using namespace epics::pvData;
15
16namespace epics { namespace nt {
17
18static NTFieldPtr ntField = NTField::get();
19
20namespace detail {
21
22
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
50NTEnumBuilder::shared_pointer NTEnumBuilder::addDescriptor()
51{
52 descriptor = true;
53 return shared_from_this();
54}
55
56NTEnumBuilder::shared_pointer NTEnumBuilder::addAlarm()
57{
58 alarm = true;
59 return shared_from_this();
60}
61
62NTEnumBuilder::shared_pointer NTEnumBuilder::addTimeStamp()
63{
64 timeStamp = true;
65 return shared_from_this();
66}
67
69{
70 return getPVDataCreate()->createPVStructure(createStructure());
71}
72
77
78NTEnumBuilder::NTEnumBuilder()
79{
80 reset();
81}
82
83void NTEnumBuilder::reset()
84{
85 descriptor = false;
86 alarm = false;
87 timeStamp = false;
88 extraFieldNames.clear();
89 extraFields.clear();
90}
91
92NTEnumBuilder::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
101const std::string NTEnum::URI("epics:nt/NTEnum:1.0");
102
103NTEnum::shared_pointer NTEnum::wrap(PVStructurePtr const & pvStructure)
104{
105 if(!isCompatible(pvStructure)) return shared_pointer();
106 return wrapUnsafe(pvStructure);
107}
108
109NTEnum::shared_pointer NTEnum::wrapUnsafe(PVStructurePtr const & pvStructure)
110{
111 return shared_pointer(new NTEnum(pvStructure));
112}
113
114bool NTEnum::is_a(StructureConstPtr const & structure)
115{
116 return NTUtils::is_a(structure->getID(), URI);
117}
118
119bool NTEnum::is_a(PVStructurePtr const & pvStructure)
120{
121 return is_a(pvStructure->getStructure());
122}
123
124bool 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
140bool NTEnum::isCompatible(PVStructurePtr const & pvStructure)
141{
142 if(!pvStructure) return false;
143
144 return isCompatible(pvStructure->getStructure());
145}
146
148{
149 return true;
150}
151
156
157bool 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
166bool 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
175PVStructurePtr NTEnum::getPVStructure() const
176{
177 return pvNTEnum;
178}
179
180PVStringPtr NTEnum::getDescriptor() const
181{
182 return pvNTEnum->getSubField<PVString>("descriptor");
183}
184
185PVStructurePtr NTEnum::getTimeStamp() const
186{
187 return pvNTEnum->getSubField<PVStructure>("timeStamp");
188}
189
190PVStructurePtr NTEnum::getAlarm() const
191{
192 return pvNTEnum->getSubField<PVStructure>("alarm");
193}
194
195PVStructurePtr NTEnum::getValue() const
196{
197 return pvValue;
198}
199
200NTEnum::NTEnum(PVStructurePtr const & pvStructure) :
201 pvNTEnum(pvStructure), pvValue(pvNTEnum->getSubField<PVStructure>("value"))
202{}
203
204
205}}
Convenience Class for NTEnum.
Definition ntenum.h:118
epics::pvData::PVStringPtr getDescriptor() const
Definition ntenum.cpp:180
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
Definition ntenum.cpp:166
static const std::string URI
Definition ntenum.h:122
epics::pvData::PVStructurePtr getAlarm() const
Definition ntenum.cpp:190
epics::pvData::PVStructurePtr getValue() const
Definition ntenum.cpp:195
static NTEnumBuilderPtr createBuilder()
Definition ntenum.cpp:152
static bool is_a(epics::pvData::StructureConstPtr const &structure)
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
Definition ntenum.cpp:103
epics::pvData::PVStructurePtr getTimeStamp() const
Definition ntenum.cpp:185
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
Definition ntenum.cpp:109
epics::pvData::PVStructurePtr getPVStructure() const
Definition ntenum.cpp:175
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
Definition ntenum.cpp:157
static NTFieldPtr get()
Definition ntfield.cpp:18
bool isTimeStamp(epics::pvData::FieldConstPtr const &field)
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTEnum.
Definition ntenum.h:39
epics::pvData::PVStructurePtr createPVStructure()
Definition ntenum.cpp:68
shared_pointer addTimeStamp()
Definition ntenum.cpp:62
shared_pointer addDescriptor()
Definition ntenum.cpp:50
epics::pvData::StructureConstPtr createStructure()
Definition ntenum.cpp:23
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
Definition ntenum.cpp:92
friend class ::epics::nt::NTEnum
Definition ntenum.h:103
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< NTEnum > NTEnumPtr
Definition ntenum.h:26
std::tr1::shared_ptr< detail::NTEnumBuilder > NTEnumBuilderPtr
Definition ntenum.h:108