This is Unofficial EPICS BASE Doxygen Site
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 
13 using namespace epics::pvData;
15 
16 namespace 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 
29 NTField::NTField()
30 : fieldCreate(getFieldCreate()),
31  standardField(getStandardField())
32 {
33 }
34 
35 Result& NTField::isEnumerated(Result& result)
36 {
37  return result
38  .has<Scalar>("index")
39  .has<ScalarArray>("choices");
40 }
41 
42 bool NTField::isEnumerated(FieldConstPtr const & field)
43 {
44  Result result(field);
45  return isEnumerated(result.is<Structure>()).valid();
46 }
47 
48 Result& NTField::isTimeStamp(Result& result)
49 {
50  return result
51  .has<Scalar>("secondsPastEpoch")
52  .has<Scalar>("nanoseconds")
53  .has<Scalar>("userTag");
54 }
55 
56 bool NTField::isTimeStamp(FieldConstPtr const & field)
57 {
58  Result result(field);
59  return isTimeStamp(result.is<Structure>()).valid();
60 }
61 
62 Result& NTField::isAlarm(Result& result)
63 {
64  return result
65  .has<Scalar>("severity")
66  .has<Scalar>("status")
67  .has<Scalar>("message");
68 }
69 
70 bool NTField::isAlarm(FieldConstPtr const & field)
71 {
72  Result result(field);
73  return isAlarm(result.is<Structure>()).valid();
74 }
75 
76 Result& 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 
87 bool NTField::isDisplay(FieldConstPtr const & field)
88 {
89  Result result(field);
90  return isDisplay(result.is<Structure>()).valid();
91 }
92 
93 Result& 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 
108 bool NTField::isAlarmLimit(FieldConstPtr const & field)
109 {
110  Result result(field);
111  return isAlarmLimit(result.is<Structure>()).valid();
112 }
113 
114 Result& NTField::isControl(Result& result)
115 {
116  return result
117  .has<Scalar>("limitLow")
118  .has<Scalar>("limitHigh")
119  .has<Scalar>("minStep");
120 }
121 
122 bool NTField::isControl(FieldConstPtr const & field)
123 {
124  Result result(field);
125  return isControl(result.is<Structure>()).valid();
126 }
127 
128 StructureConstPtr NTField::createEnumerated()
129 {
130  return standardField->enumerated();
131 }
132 
133 StructureConstPtr NTField::createTimeStamp()
134 {
135  return standardField->timeStamp();
136 }
137 
138 StructureConstPtr NTField::createAlarm()
139 {
140  return standardField->alarm();
141 }
142 
143 StructureConstPtr NTField::createDisplay()
144 {
145  return standardField->display();
146 }
147 
148 StructureConstPtr NTField::createControl()
149 {
150  return standardField->control();
151 }
152 
153 StructureArrayConstPtr NTField::createEnumeratedArray()
154 {
155  return fieldCreate->createStructureArray(createEnumerated());
156 }
157 
158 StructureArrayConstPtr NTField::createTimeStampArray()
159 {
160  StructureConstPtr st = createTimeStamp();
161  return fieldCreate->createStructureArray(st);
162 }
163 
164 StructureArrayConstPtr 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 
181 PVNTField::PVNTField()
182 : pvDataCreate(getPVDataCreate()),
183  standardField(getStandardField()),
184  standardPVField(getStandardPVField()),
185  ntstructureField(NTField::get())
186 {
187 }
188 
189 
190 PVStructurePtr PVNTField::createEnumerated(
191  StringArray const & choices)
192 {
193  return standardPVField->enumerated(choices);
194 }
195 
196 PVStructurePtr PVNTField::createTimeStamp()
197 {
198  StructureConstPtr timeStamp = standardField->timeStamp();
199  return pvDataCreate->createPVStructure(timeStamp);
200 }
201 
202 PVStructurePtr PVNTField::createAlarm()
203 {
204  StructureConstPtr alarm = standardField->alarm();
205  return pvDataCreate->createPVStructure(alarm);
206 }
207 
208 PVStructurePtr PVNTField::createDisplay()
209 {
210  StructureConstPtr display = standardField->display();
211  return pvDataCreate->createPVStructure(display);
212 }
213 
214 
215 PVStructurePtr PVNTField::createControl()
216 {
217  StructureConstPtr control = standardField->control();
218  return pvDataCreate->createPVStructure(control);
219 }
220 
221 PVStructureArrayPtr PVNTField::createEnumeratedArray()
222 {
224  ntstructureField->createEnumeratedArray();
225  return pvDataCreate->createPVStructureArray(sa);
226 }
227 
228 PVStructureArrayPtr PVNTField::createTimeStampArray()
229 {
231  ntstructureField->createTimeStampArray();
232  return pvDataCreate->createPVStructureArray(sa);
233 }
234 
235 PVStructureArrayPtr PVNTField::createAlarmArray()
236 {
237  StructureArrayConstPtr sa = ntstructureField->createAlarmArray();
238  return pvDataCreate->createPVStructureArray(sa);
239 }
240 
241 }}
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
pvac::PutEvent result
Definition: clientSync.cpp:117
Convenience Class for data fields of a Normative Type.
Definition: ntfield.h:186
Result & is(void)
Definition: validator.h:89
StandardPVFieldPtr getStandardPVField()
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
Validation methods for NT types.
Definition: validator.h:23
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
A lock for multithreading.
Definition: lock.h:36
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
Definition: pvIntrospect.h:166
#define NULL
Definition: catime.c:38
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition: ntfield.h:35
FORCE_INLINE const StandardFieldPtr & getStandardField()
std::tr1::shared_ptr< PVNTField > PVNTFieldPtr
Definition: ntfield.h:38
pvData
Definition: monitor.h:428
This class implements introspection object for a structure.
Definition: pvIntrospect.h:697
std::tr1::shared_ptr< PVStructureArray > PVStructureArrayPtr
Definition: pvData.h:100
epicsMutex mutex
Definition: pvAccess.cpp:71
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
Result & has(const std::string &name)
Definition: validator.h:132
std::vector< std::string > StringArray
Definition: pvType.h:110
Convenience Class for introspection fields of a Normative Type.
Definition: ntfield.h:47
Definition: caget.c:48
epicsMutex Mutex
Definition: lock.h:28
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648