pvaClientCPP  4.8.1-dev
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  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  if(!pvaClientGet[i]){
95  pvaClientGet[i]=pvaClientChannelArray[i]->createGet(pvRequest);
96  pvaClientGet[i]->connect();
97  }
98  pvaClientGet[i]->issueGet();
99  }
100  }
101  for(size_t i=0; i<nchannel; ++i)
102  {
103  if(isConnected[i]) {
104  Status status = pvaClientGet[i]->waitGet();
105  if(status.isOK()) continue;
106  string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
107  + " PvaChannelGet::waitGet " + status.getMessage();
108  throw std::runtime_error(message);
109  }
110  }
111  pvaClientNTMultiData->startDeltaTime();
112  for(size_t i=0; i<nchannel; ++i)
113  {
114  if(isConnected[i]) {
115  pvaClientNTMultiData->setPVStructure(pvaClientGet[i]->getData()->getPVStructure(),i);
116  }
117  }
118  pvaClientNTMultiData->endDeltaTime(valueOnly);
119 }
120 
121 PvaClientNTMultiDataPtr PvaClientNTMultiGet::getData()
122 {
123  return pvaClientNTMultiData;
124 }
125 
126 }}
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
STL namespace.
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
Provides channelGet to multiple channels where the value field of each channel is presented as a unio...
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr