This is Unofficial EPICS BASE Doxygen Site
pvaClientNTMultiGet.cpp
Go to the documentation of this file.
1 /* pvaClientNTMultiGet.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 
26 PvaClientNTMultiGetPtr PvaClientNTMultiGet::create(
27  PvaClientMultiChannelPtr const &pvaMultiChannel,
28  PvaClientChannelArray const &pvaClientChannelArray,
29  PVStructurePtr const & pvRequest)
30 {
31  UnionConstPtr u = getFieldCreate()->createVariantUnion();
32  PvaClientNTMultiGetPtr pvaClientNTMultiGet(
33  new PvaClientNTMultiGet(u,pvaMultiChannel,pvaClientChannelArray,pvRequest));
34  return pvaClientNTMultiGet;
35 }
36 
37 PvaClientNTMultiGet::PvaClientNTMultiGet(
38  UnionConstPtr const & u,
39  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
40  PvaClientChannelArray const &pvaClientChannelArray,
41  epics::pvData::PVStructurePtr const & pvRequest)
42 : pvaClientMultiChannel(pvaClientMultiChannel),
43  pvaClientChannelArray(pvaClientChannelArray),
44  pvRequest(pvRequest),
45  nchannel(pvaClientChannelArray.size()),
46  pvaClientNTMultiData(
47  PvaClientNTMultiData::create(
48  u,
49  pvaClientMultiChannel,
50  pvaClientChannelArray,
51  pvRequest)),
52  isConnected(false)
53 {
54  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiGet::PvaClientNTMultiGet()\n";
55 }
56 
57 PvaClientNTMultiGet::~PvaClientNTMultiGet()
58 {
59  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiGet::~PvaClientNTMultiGet()\n";
60 }
61 
62 void PvaClientNTMultiGet::connect()
63 {
64  pvaClientGet.resize(nchannel);
65  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
66  for(size_t i=0; i<nchannel; ++i)
67  {
68  if(isConnected[i]) {
69  pvaClientGet[i] = pvaClientChannelArray[i]->createGet(pvRequest);
70  pvaClientGet[i]->issueConnect();
71  }
72  }
73  for(size_t i=0; i<nchannel; ++i)
74  {
75  if(isConnected[i]) {
76  Status status = pvaClientGet[i]->waitConnect();
77  if(status.isOK()) continue;
78  string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
79  + " PvaChannelGet::waitConnect " + status.getMessage();
80  throw std::runtime_error(message);
81  }
82  }
83  this->isConnected = true;
84 }
85 
86 void PvaClientNTMultiGet::get(bool valueOnly)
87 {
88  if(!isConnected) connect();
89  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
90 
91  for(size_t i=0; i<nchannel; ++i)
92  {
93  if(isConnected[i]) {
94  pvaClientGet[i]->issueGet();
95  }
96  }
97  for(size_t i=0; i<nchannel; ++i)
98  {
99  if(isConnected[i]) {
100  Status status = pvaClientGet[i]->waitGet();
101  if(status.isOK()) continue;
102  string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
103  + " PvaChannelGet::waitGet " + status.getMessage();
104  throw std::runtime_error(message);
105  }
106  }
107  pvaClientNTMultiData->startDeltaTime();
108  for(size_t i=0; i<nchannel; ++i)
109  {
110  if(isConnected[i]) {
111  pvaClientNTMultiData->setPVStructure(pvaClientGet[i]->getData()->getPVStructure(),i);
112  }
113  }
114  pvaClientNTMultiData->endDeltaTime(valueOnly);
115 }
116 
117 PvaClientNTMultiDataPtr PvaClientNTMultiGet::getData()
118 {
119  return pvaClientNTMultiData;
120 }
121 
122 }}
void resize(size_t i)
Grow or shrink array.
Definition: sharedVector.h:457
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< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
const std::string & getMessage() const
Definition: status.h:80
Provides channelGet to multiple channels where the value field of each channel is presented as a unio...
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
Holds all PVA related.
Definition: pvif.h:34
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
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
Definition: caget.c:48
bool isOK() const
Definition: status.h:95