normativeTypesCPP 6.0.2
ntfield.cpp
Go to the documentation of this file.
1/* ntfield.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 <pv/lock.h>
8#include "validator.h"
9
10#define epicsExportSharedSymbols
11#include <pv/ntfield.h>
12
13using namespace epics::pvData;
14using std::tr1::static_pointer_cast;
15
16namespace epics { namespace nt {
17
19{
20 static Mutex mutex;
21 static NTFieldPtr ntstructureField;
22 Lock xx(mutex);
23 if(ntstructureField.get()==NULL) {
24 ntstructureField = NTFieldPtr(new NTField());
25 }
26 return ntstructureField;
27}
28
29NTField::NTField()
30: fieldCreate(getFieldCreate()),
31 standardField(getStandardField())
32{
33}
34
35Result& NTField::isEnumerated(Result& result)
36{
37 return result
38 .has<Scalar>("index")
39 .has<ScalarArray>("choices");
40}
41
42bool NTField::isEnumerated(FieldConstPtr const & field)
43{
44 Result result(field);
45 return isEnumerated(result.is<Structure>()).valid();
46}
47
48Result& NTField::isTimeStamp(Result& result)
49{
50 return result
51 .has<Scalar>("secondsPastEpoch")
52 .has<Scalar>("nanoseconds")
53 .has<Scalar>("userTag");
54}
55
56bool NTField::isTimeStamp(FieldConstPtr const & field)
57{
58 Result result(field);
59 return isTimeStamp(result.is<Structure>()).valid();
60}
61
62Result& NTField::isAlarm(Result& result)
63{
64 return result
65 .has<Scalar>("severity")
66 .has<Scalar>("status")
67 .has<Scalar>("message");
68}
69
70bool NTField::isAlarm(FieldConstPtr const & field)
71{
72 Result result(field);
73 return isAlarm(result.is<Structure>()).valid();
74}
75
76Result& NTField::isDisplay(Result& result)
77{
78 return result
79 .has<Scalar>("limitLow")
80 .has<Scalar>("limitHigh")
81 .has<Scalar>("description")
82 .has<Scalar>("format")
83 .has<Scalar>("units");
84
85}
86
87bool NTField::isDisplay(FieldConstPtr const & field)
88{
89 Result result(field);
90 return isDisplay(result.is<Structure>()).valid();
91}
92
93Result& NTField::isAlarmLimit(Result& result)
94{
95 return result
96 .has<Scalar>("active")
97 .has<Scalar>("lowAlarmLimit")
98 .has<Scalar>("lowWarningLimit")
99 .has<Scalar>("highWarningLimit")
100 .has<Scalar>("highAlarmLimit")
101 .has<Scalar>("lowAlarmSeverity")
102 .has<Scalar>("lowWarningSeverity")
103 .has<Scalar>("highWarningSeverity")
104 .has<Scalar>("highAlarmSeverity")
105 .has<Scalar>("hysteresis");
106}
107
108bool NTField::isAlarmLimit(FieldConstPtr const & field)
109{
110 Result result(field);
111 return isAlarmLimit(result.is<Structure>()).valid();
112}
113
114Result& NTField::isControl(Result& result)
115{
116 return result
117 .has<Scalar>("limitLow")
118 .has<Scalar>("limitHigh")
119 .has<Scalar>("minStep");
120}
121
122bool NTField::isControl(FieldConstPtr const & field)
123{
124 Result result(field);
125 return isControl(result.is<Structure>()).valid();
126}
127
128StructureConstPtr NTField::createEnumerated()
129{
130 return standardField->enumerated();
131}
132
133StructureConstPtr NTField::createTimeStamp()
134{
135 return standardField->timeStamp();
136}
137
138StructureConstPtr NTField::createAlarm()
139{
140 return standardField->alarm();
141}
142
143StructureConstPtr NTField::createDisplay()
144{
145 return standardField->display();
146}
147
148StructureConstPtr NTField::createControl()
149{
150 return standardField->control();
151}
152
153StructureArrayConstPtr NTField::createEnumeratedArray()
154{
155 return fieldCreate->createStructureArray(createEnumerated());
156}
157
158StructureArrayConstPtr NTField::createTimeStampArray()
159{
160 StructureConstPtr st = createTimeStamp();
161 return fieldCreate->createStructureArray(st);
162}
163
164StructureArrayConstPtr NTField::createAlarmArray()
165{
166 StructureConstPtr st = createAlarm();
167 return fieldCreate->createStructureArray(st);
168}
169
171{
172 static Mutex mutex;
173 static PVNTFieldPtr pvntstructureField;
174 Lock xx(mutex);
175 if(pvntstructureField.get()==NULL) {
176 pvntstructureField = PVNTFieldPtr(new PVNTField());
177 }
178 return pvntstructureField;
179}
180
181PVNTField::PVNTField()
182: pvDataCreate(getPVDataCreate()),
183 standardField(getStandardField()),
184 standardPVField(getStandardPVField()),
185 ntstructureField(NTField::get())
186{
187}
188
189
191 StringArray const & choices)
192{
193 return standardPVField->enumerated(choices);
194}
195
197{
198 StructureConstPtr timeStamp = standardField->timeStamp();
199 return pvDataCreate->createPVStructure(timeStamp);
200}
201
203{
204 StructureConstPtr alarm = standardField->alarm();
205 return pvDataCreate->createPVStructure(alarm);
206}
207
209{
210 StructureConstPtr display = standardField->display();
211 return pvDataCreate->createPVStructure(display);
212}
213
214
216{
217 StructureConstPtr control = standardField->control();
218 return pvDataCreate->createPVStructure(control);
219}
220
222{
223 StructureArrayConstPtr sa =
224 ntstructureField->createEnumeratedArray();
225 return pvDataCreate->createPVStructureArray(sa);
226}
227
229{
230 StructureArrayConstPtr sa =
231 ntstructureField->createTimeStampArray();
232 return pvDataCreate->createPVStructureArray(sa);
233}
234
235PVStructureArrayPtr PVNTField::createAlarmArray()
236{
237 StructureArrayConstPtr sa = ntstructureField->createAlarmArray();
238 return pvDataCreate->createPVStructureArray(sa);
239}
240
241}}
Convenience Class for introspection fields of a Normative Type.
Definition ntfield.h:47
epics::pvData::StructureConstPtr createControl()
Definition ntfield.cpp:148
epics::pvData::StructureArrayConstPtr createEnumeratedArray()
Definition ntfield.cpp:153
bool isAlarm(epics::pvData::FieldConstPtr const &field)
epics::pvData::StructureArrayConstPtr createAlarmArray()
Definition ntfield.cpp:164
epics::pvData::StructureConstPtr createDisplay()
Definition ntfield.cpp:143
bool isControl(epics::pvData::FieldConstPtr const &field)
bool isDisplay(epics::pvData::FieldConstPtr const &field)
epics::pvData::StructureArrayConstPtr createTimeStampArray()
Definition ntfield.cpp:158
epics::pvData::StructureConstPtr createTimeStamp()
Definition ntfield.cpp:133
bool isEnumerated(epics::pvData::FieldConstPtr const &field)
epics::pvData::StructureConstPtr createAlarm()
Definition ntfield.cpp:138
static NTFieldPtr get()
Definition ntfield.cpp:18
epics::pvData::StructureConstPtr createEnumerated()
Definition ntfield.cpp:128
bool isAlarmLimit(epics::pvData::FieldConstPtr const &field)
bool isTimeStamp(epics::pvData::FieldConstPtr const &field)
Convenience Class for data fields of a Normative Type.
Definition ntfield.h:186
epics::pvData::PVStructurePtr createDisplay()
Definition ntfield.cpp:208
epics::pvData::PVStructurePtr createEnumerated(epics::pvData::StringArray const &choices)
Definition ntfield.cpp:190
epics::pvData::PVStructurePtr createAlarm()
Definition ntfield.cpp:202
epics::pvData::PVStructurePtr createControl()
Definition ntfield.cpp:215
static PVNTFieldPtr get()
Definition ntfield.cpp:170
epics::pvData::PVStructureArrayPtr createAlarmArray()
Definition ntfield.cpp:235
epics::pvData::PVStructureArrayPtr createEnumeratedArray()
Definition ntfield.cpp:221
epics::pvData::PVStructureArrayPtr createTimeStampArray()
Definition ntfield.cpp:228
epics::pvData::PVStructurePtr createTimeStamp()
Definition ntfield.cpp:196
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< PVNTField > PVNTFieldPtr
Definition ntfield.h:39