This is Unofficial EPICS BASE Doxygen Site
pvaClientNTMultiData.cpp
Go to the documentation of this file.
1 /* pvaClientNTMultiData.cpp */
12 #include <epicsMath.h>
13 
14 #define epicsExportSharedSymbols
15 
17 
18 using namespace epics::pvData;
19 using namespace epics::pvAccess;
20 using namespace epics::nt;
21 using namespace std;
22 
23 namespace epics { namespace pvaClient {
24 
25 PvaClientNTMultiDataPtr PvaClientNTMultiData::create(
27  PvaClientMultiChannelPtr const &pvaMultiChannel,
28  PvaClientChannelArray const &pvaClientChannelArray,
29  PVStructurePtr const & pvRequest)
30 {
32  new PvaClientNTMultiData(u,pvaMultiChannel,pvaClientChannelArray,pvRequest));
33 }
34 
35 PvaClientNTMultiData::PvaClientNTMultiData(
37  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
38  PvaClientChannelArray const &pvaClientChannelArray,
39  epics::pvData::PVStructurePtr const & pvRequest)
40 : pvaClientMultiChannel(pvaClientMultiChannel),
41  pvaClientChannelArray(pvaClientChannelArray),
42  nchannel(pvaClientChannelArray.size()),
43  gotAlarm(false),
44  gotTimeStamp(false)
45 {
46  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiData::PvaClientNTMultiData()\n";
47  topPVStructure.resize(nchannel);
48  unionValue.resize(nchannel);
49  PVDataCreatePtr pvDataCreate = getPVDataCreate();
50  for(size_t i=0; i< nchannel; ++i) {
51  topPVStructure[i] = PVStructurePtr();
52  unionValue[i] = pvDataCreate->createPVUnion(u);
53  }
54  NTMultiChannelBuilderPtr builder = NTMultiChannel::createBuilder();
55  builder->value(u)->addIsConnected();
56  if(pvRequest->getSubField("field.alarm"))
57  {
58  gotAlarm = true;
59  builder->addAlarm();
60  builder->addSeverity();
61  builder->addStatus();
62  builder->addMessage();
63  severity.resize(nchannel);
64  status.resize(nchannel);
65  message.resize(nchannel);
66 
67  }
68  if(pvRequest->getSubField("field.timeStamp")) {
69  gotTimeStamp = true;
70  builder->addTimeStamp();
71  builder->addSecondsPastEpoch();
72  builder->addNanoseconds();
73  builder->addUserTag();
74  secondsPastEpoch.resize(nchannel);
75  nanoseconds.resize(nchannel);
76  userTag.resize(nchannel);
77  }
78  ntMultiChannelStructure = builder->createStructure();
79 }
80 
81 
82 PvaClientNTMultiData::~PvaClientNTMultiData()
83 {
84  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiData::~PvaClientNTMultiData()\n";
85 }
86 
87 void PvaClientNTMultiData::setPVStructure(
88  PVStructurePtr const &pvStructure,size_t index)
89 {
90  topPVStructure[index] = pvStructure;
91 }
92 
93 
94 size_t PvaClientNTMultiData::getNumber()
95 {
96  return nchannel;
97 }
98 
99 void PvaClientNTMultiData::startDeltaTime()
100 {
101  for(size_t i=0; i<nchannel; ++i)
102  {
103  topPVStructure[i] = PVStructurePtr();
104  if(gotAlarm)
105  {
106  alarm.setSeverity(noAlarm);
107  alarm.setStatus(noStatus);
108  alarm.setMessage("");
109  severity[i] = invalidAlarm;
111  message[i] = "not connected";
112  }
113  if(gotTimeStamp)
114  {
115  timeStamp.getCurrent();
116  secondsPastEpoch[i] = 0;
117  nanoseconds[i] = 0;
118  userTag[i] = 0;
119  }
120  }
121 }
122 
123 
124 void PvaClientNTMultiData::endDeltaTime(bool valueOnly)
125 {
126  for(size_t i=0; i<nchannel; ++i)
127  {
128  PVStructurePtr pvst = topPVStructure[i];
129  if(!pvst) {
130  unionValue[i] = PVUnionPtr();
131  } else if(unionValue[i]) {
132  if(valueOnly) {
133  PVFieldPtr pvValue = pvst->getSubField("value");
134  if(pvValue) {
135  unionValue[i]->set(pvst->getSubField("value"));
136  } else {
137  unionValue[i] = PVUnionPtr();
138  }
139  } else {
140  unionValue[i]->set(pvst);
141  }
142  if(gotAlarm)
143  {
144  PVIntPtr pvSeverity = pvst->getSubField<PVInt>("alarm.severity");
145  PVIntPtr pvStatus = pvst->getSubField<PVInt>("alarm.status");
146  PVStringPtr pvMessage = pvst->getSubField<PVString>("alarm.message");
147  if(pvSeverity&&pvStatus&&pvMessage) {
148  severity[i] = pvSeverity->get();
149  status[i] = pvStatus->get();
150  message[i] = pvMessage->get();
151  } else {
152  severity[i] = undefinedAlarm;
154  message[i] = "no alarm field";
155  }
156  }
157  if(gotTimeStamp)
158  {
159  PVLongPtr pvEpoch = pvst->getSubField<PVLong>("timeStamp.secondsPastEpoch");
160  PVIntPtr pvNano = pvst->getSubField<PVInt>("timeStamp.nanoseconds");
161  PVIntPtr pvTag = pvst->getSubField<PVInt>("timeStamp.userTag");
162  if(pvEpoch&&pvNano&&pvTag) {
163  secondsPastEpoch[i] = pvEpoch->get();
164  nanoseconds[i] = pvNano->get();
165  userTag[i] = pvTag->get();
166  }
167  }
168  }
169  }
170 }
171 
172 TimeStamp PvaClientNTMultiData::getTimeStamp()
173 {
174  pvTimeStamp.get(timeStamp);
175  return timeStamp;
176 }
177 
178 NTMultiChannelPtr PvaClientNTMultiData::getNTMultiChannel()
179 {
180  PVStructurePtr pvStructure = getPVDataCreate()->createPVStructure(ntMultiChannelStructure);
181  NTMultiChannelPtr ntMultiChannel = NTMultiChannel::wrap(pvStructure);
182  ntMultiChannel->getChannelName()->replace(pvaClientMultiChannel->getChannelNames());
184  for(size_t i=0; i<nchannel; ++i) val[i] = unionValue[i];
185  ntMultiChannel->getValue()->replace(freeze(val));
186  shared_vector<epics::pvData::boolean> connected = pvaClientMultiChannel->getIsConnected();
187  shared_vector<epics::pvData::boolean> isConnected(nchannel);
188  for(size_t i=0; i<nchannel; ++i) isConnected[i] = connected[i];
189  ntMultiChannel->getIsConnected()->replace(freeze(isConnected));
190  if(gotAlarm)
191  {
192  shared_vector<int32> sev(nchannel);
193  for(size_t i=0; i<nchannel; ++i) sev[i] = severity[i];
194  ntMultiChannel->getSeverity()->replace(freeze(sev));
195  shared_vector<int32> sta(nchannel);
196  for(size_t i=0; i<nchannel; ++i) sta[i] = status[i];
197  ntMultiChannel->getStatus()->replace(freeze(sta));
198  shared_vector<string> mes(nchannel);
199  for(size_t i=0; i<nchannel; ++i) mes[i] = message[i];
200  ntMultiChannel->getMessage()->replace(freeze(mes));
201  }
202  if(gotTimeStamp)
203  {
204  shared_vector<int64> sec(nchannel);
205  for(size_t i=0; i<nchannel; ++i) sec[i] = secondsPastEpoch[i];
206  ntMultiChannel->getSecondsPastEpoch()->replace(freeze(sec));
207  shared_vector<int32> nano(nchannel);
208  for(size_t i=0; i<nchannel; ++i) nano[i] = nanoseconds[i];
209  ntMultiChannel->getNanoseconds()->replace(freeze(nano));
210  shared_vector<int32> tag(nchannel);
211  for(size_t i=0; i<nchannel; ++i) tag[i] = userTag[i];
212  ntMultiChannel->getUserTag()->replace(freeze(tag));
213  }
214  return ntMultiChannel;
215 }
216 
217 }}
void resize(size_t i)
Grow or shrink array.
Definition: sharedVector.h:457
std::tr1::shared_ptr< PVInt > PVIntPtr
Definition: pvData.h:507
pvd::Status status
int i
Definition: scan.c:967
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< PVLong > PVLongPtr
Definition: pvData.h:508
storage_t::arg_type get() const
Definition: pvData.h:396
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
Holds all PVA related.
Definition: pvif.h:34
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< PVUnion > PVUnionPtr
Definition: pvData.h:107
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< const Union > UnionConstPtr
Definition: pvIntrospect.h:170
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
Class that holds the data for each possible scalar type.
Definition: pvData.h:54
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< NTMultiChannel > NTMultiChannelPtr
std::tr1::shared_ptr< detail::NTMultiChannelBuilder > NTMultiChannelBuilderPtr
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
Methods for manipulating timeStamp.
Definition: timeStamp.h:43