This is Unofficial EPICS BASE Doxygen Site
pvaClientMultiChannel.cpp
Go to the documentation of this file.
1 /* pvaClientMultiChannel.cpp */
12 #include <map>
13 #include <pv/event.h>
14 #include <pv/lock.h>
15 
16 #define epicsExportSharedSymbols
17 
19 
20 using namespace epics::pvData;
21 using namespace epics::pvAccess;
22 using namespace std;
23 
24 namespace epics { namespace pvaClient {
25 
26 static FieldCreatePtr fieldCreate = getFieldCreate();
27 static CreateRequest::shared_pointer createRequestPvt = CreateRequest::create();
28 
29 PvaClientMultiChannelPtr PvaClientMultiChannel::create(
30  PvaClientPtr const &pvaClient,
31  epics::pvData::shared_vector<const string> const & channelNames,
32  string const & providerName,
33  size_t maxNotConnected)
34 {
36  new PvaClientMultiChannel(pvaClient,channelNames,providerName,maxNotConnected));
37 }
38 
39 
40 PvaClientMultiChannel::PvaClientMultiChannel(
41  PvaClientPtr const &pvaClient,
43  string const & providerName,
44  size_t maxNotConnected)
45 : pvaClient(pvaClient),
46  channelName(channelName),
47  providerName(providerName),
48  maxNotConnected(maxNotConnected),
49  numChannel(channelName.size()),
50  numConnected(0),
51  pvaClientChannelArray(PvaClientChannelArray(numChannel,PvaClientChannelPtr())),
52  isConnected(shared_vector<epics::pvData::boolean>(numChannel,false)),
54 {
55  if(PvaClient::getDebug()) cout<< "PvaClientMultiChannel::PvaClientMultiChannel()\n";
56 }
57 
58 PvaClientMultiChannel::~PvaClientMultiChannel()
59 {
60  if(PvaClient::getDebug()) cout<< "PvaClientMultiChannel::~PvaClientMultiChannel()\n";
61 }
62 
63 void PvaClientMultiChannel::checkConnected()
64 {
65  if(numConnected==0) connect();
66 }
67 
68 epics::pvData::shared_vector<const string> PvaClientMultiChannel::getChannelNames()
69 {
70  return channelName;
71 }
72 
73 Status PvaClientMultiChannel::connect(double timeout)
74 {
75  for(size_t i=0; i< numChannel; ++i) {
76  pvaClientChannelArray[i] = pvaClient->createChannel(channelName[i],providerName);
77  pvaClientChannelArray[i]->issueConnect();
78  }
79  Status returnStatus = Status::Ok;
81  size_t numBad = 0;
82  for(size_t i=0; i< numChannel; ++i) {
83  if(numBad==0) {
84  status = pvaClientChannelArray[i]->waitConnect(timeout);
85  } else {
86  status = pvaClientChannelArray[i]->waitConnect(.001);
87  }
88  if(status.isOK()) {
89  ++numConnected;
90  isConnected[i] = true;
91  continue;
92  }
93  if(returnStatus.isOK()) returnStatus = status;
94  ++numBad;
95  if(numBad>maxNotConnected) break;
96  }
97  return numBad>maxNotConnected ? returnStatus : Status::Ok;
98 }
99 
100 
101 bool PvaClientMultiChannel::allConnected()
102 {
103  return (numConnected==numChannel) ? true : false;
104 }
105 
106 bool PvaClientMultiChannel::connectionChange()
107 {
108  for(size_t i=0; i<numChannel; ++i) {
109  PvaClientChannelPtr pvaClientChannel = pvaClientChannelArray[i];
110  Channel::shared_pointer channel = pvaClientChannel->getChannel();
111  Channel::ConnectionState stateNow = channel->getConnectionState();
112  bool connectedNow = stateNow==Channel::CONNECTED ? true : false;
113  if(connectedNow!=isConnected[i]) return true;
114  }
115  return false;
116 }
117 
118 epics::pvData::shared_vector<epics::pvData::boolean> PvaClientMultiChannel::getIsConnected()
119 {
120  for(size_t i=0; i<numChannel; ++i) {
121  PvaClientChannelPtr pvaClientChannel = pvaClientChannelArray[i];
122  if(!pvaClientChannel) {
123  isConnected[i] = false;
124  continue;
125  }
126  Channel::shared_pointer channel = pvaClientChannel->getChannel();
127  Channel::ConnectionState stateNow = channel->getConnectionState();
128  isConnected[i] = (stateNow==Channel::CONNECTED) ? true : false;
129  }
130  return isConnected;
131 }
132 
133 PvaClientChannelArray PvaClientMultiChannel::getPvaClientChannelArray()
134 {
135  return pvaClientChannelArray;
136 }
137 
138 PvaClientPtr PvaClientMultiChannel::getPvaClient()
139 {
140  return pvaClient;
141 }
142 
143 
144 
145 PvaClientMultiGetDoublePtr PvaClientMultiChannel::createGet()
146 {
147  checkConnected();
148  return PvaClientMultiGetDouble::create(shared_from_this(),pvaClientChannelArray);
149 }
150 
151 
152 PvaClientMultiPutDoublePtr PvaClientMultiChannel::createPut()
153 {
154  checkConnected();
155  return PvaClientMultiPutDouble::create(shared_from_this(),pvaClientChannelArray);
156 }
157 
158 
159 PvaClientMultiMonitorDoublePtr PvaClientMultiChannel::createMonitor()
160 {
161  checkConnected();
162  return PvaClientMultiMonitorDouble::create(shared_from_this(), pvaClientChannelArray);
163 }
164 
165 PvaClientNTMultiPutPtr PvaClientMultiChannel::createNTPut()
166 {
167  checkConnected();
168  return PvaClientNTMultiPut::create(shared_from_this(), pvaClientChannelArray);
169 }
170 
171 
172 PvaClientNTMultiGetPtr PvaClientMultiChannel::createNTGet(std::string const &request)
173 {
174  checkConnected();
175  PVStructurePtr pvRequest = createRequest->createRequest(request);
176  if(!pvRequest) {
177  string message = " PvaClientMultiChannel::createNTGet invalid pvRequest: "
178  + createRequest->getMessage();
179  throw std::runtime_error(message);
180  }
181  return PvaClientNTMultiGet::create(shared_from_this(), pvaClientChannelArray,pvRequest);
182 }
183 
184 PvaClientNTMultiMonitorPtr PvaClientMultiChannel::createNTMonitor(std::string const &request)
185 {
186  checkConnected();
187  PVStructurePtr pvRequest = createRequest->createRequest(request);
188  if(!pvRequest) {
189  string message = " PvaClientMultiChannel::createNTMonitor invalid pvRequest: "
190  + createRequest->getMessage();
191  throw std::runtime_error(message);
192  }
193  return PvaClientNTMultiMonitor::create(shared_from_this(), pvaClientChannelArray,pvRequest);
194 }
195 
196 
197 }}
std::tr1::shared_ptr< PvaClient > PvaClientPtr
Definition: pvaClient.h:46
double timeout
Definition: pvutils.cpp:25
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
PvaMultiChannel is a synchronous interface for accessing multiple channels.
std::string request
A holder for a contiguous piece of memory.
Definition: sharedVector.h:27
pvd::Status status
static CreateRequest::shared_pointer create()
static Status Ok
Definition: status.h:47
int i
Definition: scan.c:967
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
Definition: pvaClient.h:59
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
PVStructure::shared_pointer createRequest(std::string const &request)
Holds all PVA related.
Definition: pvif.h:34
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
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< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
bool isOK() const
Definition: status.h:95
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr