normativeTypesCPP 6.0.2
ntnameValue.cpp
Go to the documentation of this file.
1/* ntnameValue.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/ntnameValue.h>
11#include <pv/ntutils.h>
12
13using namespace std;
14using namespace epics::pvData;
15
16namespace epics { namespace nt {
17static NTFieldPtr ntField = NTField::get();
18
19namespace detail {
20
21
22NTNameValueBuilder::shared_pointer NTNameValueBuilder::value(
23 epics::pvData::ScalarType scalarType
24 )
25{
26 valueType = scalarType;
27 valueTypeSet = true;
28
29 return shared_from_this();
30}
31
33{
34 if (!valueTypeSet)
35 throw std::runtime_error("value type not set");
36
37 FieldBuilderPtr builder =
38 getFieldCreate()->createFieldBuilder()->
39 setId(NTNameValue::URI)->
40 addArray("name", pvString)->
41 addArray("value", valueType);
42
43 if (descriptor)
44 builder->add("descriptor", pvString);
45
46 if (alarm)
47 builder->add("alarm", ntField->createAlarm());
48
49 if (timeStamp)
50 builder->add("timeStamp", ntField->createTimeStamp());
51
52 size_t extraCount = extraFieldNames.size();
53 for (size_t i = 0; i< extraCount; i++)
54 builder->add(extraFieldNames[i], extraFields[i]);
55
56 StructureConstPtr s = builder->createStructure();
57
58 reset();
59 return s;
60}
61
62NTNameValueBuilder::shared_pointer NTNameValueBuilder::addDescriptor()
63{
64 descriptor = true;
65 return shared_from_this();
66}
67
68NTNameValueBuilder::shared_pointer NTNameValueBuilder::addAlarm()
69{
70 alarm = true;
71 return shared_from_this();
72}
73
74NTNameValueBuilder::shared_pointer NTNameValueBuilder::addTimeStamp()
75{
76 timeStamp = true;
77 return shared_from_this();
78}
79
81{
82 return getPVDataCreate()->createPVStructure(createStructure());
83}
84
89
90NTNameValueBuilder::NTNameValueBuilder()
91{
92 reset();
93}
94
95void NTNameValueBuilder::reset()
96{
97 valueTypeSet = false;
98 descriptor = false;
99 alarm = false;
100 timeStamp = false;
101 extraFieldNames.clear();
102 extraFields.clear();
103}
104
105NTNameValueBuilder::shared_pointer NTNameValueBuilder::add(string const & name, FieldConstPtr const & field)
106{
107 extraFields.push_back(field); extraFieldNames.push_back(name);
108 return shared_from_this();
109}
110
111
112}
113
114const std::string NTNameValue::URI("epics:nt/NTNameValue:1.0");
115
116NTNameValue::shared_pointer NTNameValue::wrap(PVStructurePtr const & pvStructure)
117{
118 if(!isCompatible(pvStructure)) return shared_pointer();
119 return wrapUnsafe(pvStructure);
120}
121
122NTNameValue::shared_pointer NTNameValue::wrapUnsafe(PVStructurePtr const & structure)
123{
124 return shared_pointer(new NTNameValue(structure));
125}
126
127bool NTNameValue::is_a(StructureConstPtr const & structure)
128{
129 return NTUtils::is_a(structure->getID(), URI);
130}
131
132bool NTNameValue::is_a(PVStructurePtr const & pvStructure)
133{
134 return is_a(pvStructure->getStructure());
135}
136
137bool NTNameValue::isCompatible(StructureConstPtr const & structure)
138{
139 if (!structure)
140 return false;
141
142 Result result(structure);
143
144 return result
145 .is<Structure>()
146 .has<ScalarArray>("name")
147 .has<ScalarArray>("value")
148 .maybeHas<Scalar>("descriptor")
149 .maybeHas<&NTField::isAlarm, Structure>("alarm")
150 .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
151 .valid();
152}
153
154bool NTNameValue::isCompatible(PVStructurePtr const & pvStructure)
155{
156 if(!pvStructure) return false;
157
158 return isCompatible(pvStructure->getStructure());
159}
160
162{
163 return (getValue<PVScalarArray>()->getLength() == getName()->getLength());
164}
165
170
171bool NTNameValue::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
172{
173 PVStructurePtr ts = getTimeStamp();
174 if (ts)
175 return pvTimeStamp.attach(ts);
176 else
177 return false;
178}
179
180bool NTNameValue::attachAlarm(PVAlarm &pvAlarm) const
181{
182 PVStructurePtr al = getAlarm();
183 if (al)
184 return pvAlarm.attach(al);
185 else
186 return false;
187}
188
189PVStructurePtr NTNameValue::getPVStructure() const
190{
191 return pvNTNameValue;
192}
193
194PVStringPtr NTNameValue::getDescriptor() const
195{
196 return pvNTNameValue->getSubField<PVString>("descriptor");
197}
198
199PVStructurePtr NTNameValue::getTimeStamp() const
200{
201 return pvNTNameValue->getSubField<PVStructure>("timeStamp");
202}
203
204PVStructurePtr NTNameValue::getAlarm() const
205{
206 return pvNTNameValue->getSubField<PVStructure>("alarm");
207}
208
209PVStringArrayPtr NTNameValue::getName() const
210{
211 return pvNTNameValue->getSubField<PVStringArray>("name");
212}
213
214PVFieldPtr NTNameValue::getValue() const
215{
216 return pvNTNameValue->getSubField("value");
217}
218
219NTNameValue::NTNameValue(PVStructurePtr const & pvStructure) :
220 pvNTNameValue(pvStructure)
221{}
222
223
224}}
bool isAlarm(epics::pvData::FieldConstPtr const &field)
static NTFieldPtr get()
Definition ntfield.cpp:18
Convenience Class for NTNameValue.
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVStructurePtr getPVStructure() const
epics::pvData::PVStringArrayPtr getName() const
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
static NTNameValueBuilderPtr createBuilder()
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
epics::pvData::PVFieldPtr getValue() const
static const std::string URI
static bool is_a(epics::pvData::StructureConstPtr const &structure)
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
epics::pvData::PVStructurePtr getAlarm() const
epics::pvData::PVStructurePtr getTimeStamp() const
epics::pvData::PVStringPtr getDescriptor() const
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTNameValue.
Definition ntnameValue.h:42
shared_pointer value(epics::pvData::ScalarType scalarType)
epics::pvData::PVStructurePtr createPVStructure()
epics::pvData::StructureConstPtr createStructure()
friend class ::epics::nt::NTNameValue
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< NTNameValue > NTNameValuePtr
Definition ntnameValue.h:29
std::tr1::shared_ptr< detail::NTNameValueBuilder > NTNameValueBuilderPtr