normativeTypesCPP 6.0.2
ntndarrayAttribute.cpp
Go to the documentation of this file.
1/* ntndarrayAttribute.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
11#include <pv/ntattribute.h>
12#include <pv/ntutils.h>
13
14using namespace std;
15using namespace epics::pvData;
16
17namespace epics { namespace nt {
18
19static NTFieldPtr ntField = NTField::get();
20
21namespace detail {
22
24{
25 FieldBuilderPtr builder =
26 getFieldCreate()->createFieldBuilder()->
28 add("name", pvString)->
29 add("value", getFieldCreate()->createVariantUnion());
30
31 if (tags)
32 builder->addArray("tags", pvString);
33
34 builder->add("descriptor", pvString);
35
36 builder->add("sourceType", pvInt);
37
38 builder->add("source", pvString);
39
40 if (alarm)
41 builder->add("alarm", ntField->createAlarm());
42
43 if (timeStamp)
44 builder->add("timeStamp", ntField->createTimeStamp());
45
46 size_t extraCount = extraFieldNames.size();
47 for (size_t i = 0; i< extraCount; i++)
48 builder->add(extraFieldNames[i], extraFields[i]);
49
50
51 StructureConstPtr s = builder->createStructure();
52
53 reset();
54 return s;
55}
56
57NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addTags()
58{
59 tags = true;
60 return shared_from_this();
61}
62
63NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addDescriptor()
64{
65 descriptor = true;
66 return shared_from_this();
67}
68
69NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addAlarm()
70{
71 alarm = true;
72 return shared_from_this();
73}
74
75NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::addTimeStamp()
76{
77 timeStamp = true;
78 return shared_from_this();
79}
80
82{
83 return getPVDataCreate()->createPVStructure(createStructure());
84}
85
90
95
97{
98 tags = false;
99 descriptor = false;
100 alarm = false;
101 timeStamp = false;
102 extraFieldNames.clear();
103 extraFields.clear();
104}
105
106NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::add(string const & name, FieldConstPtr const & field)
107{
108 extraFields.push_back(field); extraFieldNames.push_back(name);
109 return shared_from_this();
110}
111
112}
113
114const std::string NTNDArrayAttribute::URI("epics:nt/NTAttribute:1.0");
115
116NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrap(PVStructurePtr const & pvStructure)
117{
118 if(!isCompatible(pvStructure)) return shared_pointer();
119 return wrapUnsafe(pvStructure);
120}
121
122NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrapUnsafe(PVStructurePtr const & pvStructure)
123{
124 return shared_pointer(new NTNDArrayAttribute(pvStructure));
125}
126
127bool NTNDArrayAttribute::is_a(StructureConstPtr const & structure)
128{
129 return NTUtils::is_a(structure->getID(), URI);
130}
131
132bool NTNDArrayAttribute::is_a(PVStructurePtr const & pvStructure)
133{
134 return is_a(pvStructure->getStructure());
135}
136
137Result& NTNDArrayAttribute::isAttribute(Result& result) {
138 return result
139 .has<Scalar>("name")
140 .has<Union>("value")
141 .maybeHas<ScalarArray>("tags")
142 .has<Scalar>("descriptor")
143 .maybeHas<&NTField::isAlarm, Structure>("alarm")
144 .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
145 .has<Scalar>("sourceType")
146 .has<Scalar>("source");
147}
148
149bool NTNDArrayAttribute::isCompatible(StructureConstPtr const & structure)
150{
151 if (!structure)
152 return false;
153
154 Result result(structure);
155 return isAttribute(result.is<Structure>()).valid();
156}
157
158bool NTNDArrayAttribute::isCompatible(PVStructurePtr const & pvStructure)
159{
160 if(!pvStructure) return false;
161
162 return isCompatible(pvStructure->getStructure());
163}
164
166{
167 return true;
168}
169
174
175bool NTNDArrayAttribute::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
176{
177 PVStructurePtr ts = getTimeStamp();
178 if (ts)
179 return pvTimeStamp.attach(ts);
180 else
181 return false;
182}
183
184bool NTNDArrayAttribute::attachAlarm(PVAlarm &pvAlarm) const
185{
186 PVStructurePtr al = getAlarm();
187 if (al)
188 return pvAlarm.attach(al);
189 else
190 return false;
191}
192
194{
195 return pvNTNDArrayAttribute;
196}
197
199{
200 return pvNTNDArrayAttribute->getSubField<PVString>("descriptor");
201}
202
204{
205 return pvNTNDArrayAttribute->getSubField<PVStructure>("timeStamp");
206}
207
208PVStructurePtr NTNDArrayAttribute::getAlarm() const
209{
210 return pvNTNDArrayAttribute->getSubField<PVStructure>("alarm");
211}
212
213
215{
216 return pvNTNDArrayAttribute->getSubField<PVString>("name");
217}
218
220{
221 return pvValue;
222}
223
224PVStringArrayPtr NTNDArrayAttribute::getTags() const
225{
226 return pvNTNDArrayAttribute->getSubField<PVStringArray>("tags");
227}
228
230{
231 return pvNTNDArrayAttribute->getSubField<PVInt>("sourceType");
232}
233
235{
236 return pvNTNDArrayAttribute->getSubField<PVString>("source");
237}
238
239NTNDArrayAttribute::NTNDArrayAttribute(PVStructurePtr const & pvStructure) :
240 pvNTNDArrayAttribute(pvStructure), pvValue(pvNTNDArrayAttribute->getSubField<PVUnion>("value"))
241{
242}
243
244
245}}
bool isAlarm(epics::pvData::FieldConstPtr const &field)
static NTFieldPtr get()
Definition ntfield.cpp:18
Convenience Class for NTNDArrayAttribute.
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVIntPtr getSourceType() const
static const std::string URI
epics::pvData::PVStringPtr getDescriptor() const
epics::pvData::PVStructurePtr getAlarm() const
epics::pvData::PVStructurePtr getTimeStamp() const
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
epics::pvData::PVStringPtr getName() const
epics::pvData::PVUnionPtr getValue() const
epics::pvData::PVStructurePtr getPVStructure() const
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
static NTNDArrayAttributeBuilderPtr createBuilder()
epics::pvData::PVStringPtr getSource() const
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStringArrayPtr getTags() const
static bool is_a(epics::pvData::StructureConstPtr const &structure)
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTAttribute extended as required by NTNDArray.
epics::pvData::StructureConstPtr createStructure()
epics::pvData::FieldConstPtrArray extraFields
epics::pvData::PVStructurePtr createPVStructure()
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< NTNDArrayAttribute > NTNDArrayAttributePtr
std::tr1::shared_ptr< detail::NTNDArrayAttributeBuilder > NTNDArrayAttributeBuilderPtr
bool valid(void) const
Definition validator.h:77