normativeTypesCPP 6.0.2
ntattribute.cpp
Go to the documentation of this file.
1/* ntattribute.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/ntattribute.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(NTAttribute::URI)->
28 add("name", pvString)->
29 add("value", getFieldCreate()->createVariantUnion());
30
31 if (tags)
32 builder->addArray("tags", pvString);
33
34 if (descriptor)
35 builder->add("descriptor", pvString);
36
37 if (alarm)
38 builder->add("alarm", ntField->createAlarm());
39
40 if (timeStamp)
41 builder->add("timeStamp", ntField->createTimeStamp());
42
43 size_t extraCount = extraFieldNames.size();
44 for (size_t i = 0; i< extraCount; i++)
45 builder->add(extraFieldNames[i], extraFields[i]);
46
47
48 StructureConstPtr s = builder->createStructure();
49
50 reset();
51 return s;
52}
53
54NTAttributeBuilder::shared_pointer NTAttributeBuilder::addTags()
55{
56 tags = true;
57 return shared_from_this();
58}
59
60NTAttributeBuilder::shared_pointer NTAttributeBuilder::addDescriptor()
61{
62 descriptor = true;
63 return shared_from_this();
64}
65
66NTAttributeBuilder::shared_pointer NTAttributeBuilder::addAlarm()
67{
68 alarm = true;
69 return shared_from_this();
70}
71
72NTAttributeBuilder::shared_pointer NTAttributeBuilder::addTimeStamp()
73{
74 timeStamp = true;
75 return shared_from_this();
76}
77
79{
80 return getPVDataCreate()->createPVStructure(createStructure());
81}
82
87
92
94{
95 descriptor = false;
96 alarm = false;
97 timeStamp = false;
98 extraFieldNames.clear();
99 extraFields.clear();
100}
101
102NTAttributeBuilder::shared_pointer NTAttributeBuilder::add(string const & name, FieldConstPtr const & field)
103{
104 extraFields.push_back(field); extraFieldNames.push_back(name);
105 return shared_from_this();
106}
107
108}
109
110const std::string NTAttribute::URI("epics:nt/NTAttribute:1.0");
111
112NTAttribute::shared_pointer NTAttribute::wrap(PVStructurePtr const & pvStructure)
113{
114 if(!isCompatible(pvStructure)) return shared_pointer();
115 return wrapUnsafe(pvStructure);
116}
117
118NTAttribute::shared_pointer NTAttribute::wrapUnsafe(PVStructurePtr const & pvStructure)
119{
120 return shared_pointer(new NTAttribute(pvStructure));
121}
122
123bool NTAttribute::is_a(StructureConstPtr const & structure)
124{
125 return NTUtils::is_a(structure->getID(), URI);
126}
127
128bool NTAttribute::is_a(PVStructurePtr const & pvStructure)
129{
130 return is_a(pvStructure->getStructure());
131}
132
133bool NTAttribute::isCompatible(StructureConstPtr const & structure)
134{
135 if (!structure)
136 return false;
137
138 Result result(structure);
139
140 return result
141 .is<Structure>()
142 .has<Scalar>("name")
143 .has<Union>("value")
144 .maybeHas<ScalarArray>("tags")
145 .maybeHas<Scalar>("descriptor")
146 .maybeHas<&NTField::isAlarm, Structure>("alarm")
147 .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
148 .valid();
149}
150
151bool NTAttribute::isCompatible(PVStructurePtr const & pvStructure)
152{
153 if(!pvStructure) return false;
154
155 return isCompatible(pvStructure->getStructure());
156}
157
159{
160 return true;
161}
162
167
168bool NTAttribute::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
169{
170 PVStructurePtr ts = getTimeStamp();
171 if (ts)
172 return pvTimeStamp.attach(ts);
173 else
174 return false;
175}
176
177bool NTAttribute::attachAlarm(PVAlarm &pvAlarm) const
178{
179 PVStructurePtr al = getAlarm();
180 if (al)
181 return pvAlarm.attach(al);
182 else
183 return false;
184}
185
186PVStructurePtr NTAttribute::getPVStructure() const
187{
188 return pvNTAttribute;
189}
190
191PVStringPtr NTAttribute::getDescriptor() const
192{
193 return pvNTAttribute->getSubField<PVString>("descriptor");
194}
195
196PVStructurePtr NTAttribute::getTimeStamp() const
197{
198 return pvNTAttribute->getSubField<PVStructure>("timeStamp");
199}
200
201PVStructurePtr NTAttribute::getAlarm() const
202{
203 return pvNTAttribute->getSubField<PVStructure>("alarm");
204}
205
206
207PVStringPtr NTAttribute::getName() const
208{
209 return pvNTAttribute->getSubField<PVString>("name");
210}
211
212PVUnionPtr NTAttribute::getValue() const
213{
214 return pvValue;
215}
216
217PVStringArrayPtr NTAttribute::getTags() const
218{
219 return pvNTAttribute->getSubField<PVStringArray>("tags");
220}
221
222NTAttribute::NTAttribute(PVStructurePtr const & pvStructure) :
223 pvNTAttribute(pvStructure), pvValue(pvNTAttribute->getSubField<PVUnion>("value"))
224{
225}
226
227
228}}
Convenience Class for NTAttribute.
epics::pvData::PVStringPtr getName() const
epics::pvData::PVStructurePtr getAlarm() const
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVStructurePtr getTimeStamp() const
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
epics::pvData::PVStructurePtr getPVStructure() const
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
static const std::string URI
epics::pvData::PVUnionPtr getValue() const
static NTAttributeBuilderPtr createBuilder()
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStringPtr getDescriptor() const
epics::pvData::PVStringArrayPtr getTags() const
static bool is_a(epics::pvData::StructureConstPtr const &structure)
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
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 NTAttribute.
Definition ntattribute.h:39
epics::pvData::StringArray extraFieldNames
epics::pvData::FieldConstPtrArray extraFields
epics::pvData::StructureConstPtr createStructure()
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
epics::pvData::PVStructurePtr createPVStructure()
friend class ::epics::nt::NTAttribute
std::tr1::shared_ptr< detail::NTAttributeBuilder > NTAttributeBuilderPtr
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< NTAttribute > NTAttributePtr
Definition ntattribute.h:26