16 #define epicsExportSharedSymbols 24 namespace epics {
namespace pvaClient {
26 static FieldCreatePtr fieldCreate = getFieldCreate();
27 static CreateRequest::shared_pointer createRequestPvt = CreateRequest::create();
31 shared_vector<const string>
const & channelNames,
32 string const & providerName,
33 size_t maxNotConnected,
34 shared_vector<const string>
const & providerNames)
38 pvaClient,channelNames,providerName,maxNotConnected,providerNames));
42 PvaClientMultiChannel::PvaClientMultiChannel(
44 shared_vector<const string>
const & channelNames,
45 string const & providerName,
46 size_t maxNotConnected,
47 shared_vector<const string>
const & providerNames)
48 : pvaClient(pvaClient),
49 channelNames(channelNames),
50 providerName(providerName),
51 maxNotConnected(maxNotConnected),
52 providerNames(providerNames),
53 numChannel(channelNames.size()),
54 numProviderNames(providerNames.size()),
58 isConnected(shared_vector<epics::pvData::boolean>(numChannel,
false)),
59 createRequest(CreateRequest::create())
61 if(PvaClient::getDebug()) cout<<
"PvaClientMultiChannel::PvaClientMultiChannel()\n";
64 PvaClientMultiChannel::~PvaClientMultiChannel()
66 if(PvaClient::getDebug()) cout<<
"PvaClientMultiChannel::~PvaClientMultiChannel()\n";
69 void PvaClientMultiChannel::checkConnected()
77 shared_vector<const string> PvaClientMultiChannel::getChannelNames()
82 Status PvaClientMultiChannel::connect(
double timeout)
84 if(!firstConnect)
return Status::Ok;
86 for(
size_t i=0; i< numChannel; ++i) {
87 if(numProviderNames<=i) {
88 pvaClientChannelArray[i] = pvaClient->createChannel(channelNames[i],providerName);
90 pvaClientChannelArray[i] = pvaClient->createChannel(channelNames[i],providerNames[i]);
92 pvaClientChannelArray[i]->issueConnect();
94 Status returnStatus = Status::Ok;
95 Status status = Status::Ok;
97 for(
size_t i=0; i< numChannel; ++i) {
99 status = pvaClientChannelArray[i]->waitConnect(timeout);
101 status = pvaClientChannelArray[i]->waitConnect(.001);
105 isConnected[i] =
true;
107 if(returnStatus.isOK()) returnStatus = status;
111 return numBad>maxNotConnected ? returnStatus : Status::Ok;
115 bool PvaClientMultiChannel::allConnected()
117 return (numConnected==numChannel) ? true :
false;
120 bool PvaClientMultiChannel::connectionChange()
122 for(
size_t i=0; i<numChannel; ++i) {
124 Channel::shared_pointer channel = pvaClientChannel->getChannel();
125 Channel::ConnectionState stateNow = channel->getConnectionState();
126 bool connectedNow = stateNow==Channel::CONNECTED ? true :
false;
127 if(connectedNow!=isConnected[i])
return true;
132 shared_vector<epics::pvData::boolean> PvaClientMultiChannel::getIsConnected()
134 for(
size_t i=0; i<numChannel; ++i) {
136 if(!pvaClientChannel) {
137 isConnected[i] =
false;
140 Channel::shared_pointer channel = pvaClientChannel->getChannel();
141 Channel::ConnectionState stateNow = channel->getConnectionState();
142 isConnected[i] = (stateNow==Channel::CONNECTED) ?
true :
false;
149 return pvaClientChannelArray;
162 return PvaClientMultiGetDouble::create(shared_from_this(),pvaClientChannelArray);
169 return PvaClientMultiPutDouble::create(shared_from_this(),pvaClientChannelArray);
176 return PvaClientMultiMonitorDouble::create(shared_from_this(), pvaClientChannelArray);
182 return PvaClientNTMultiPut::create(shared_from_this(), pvaClientChannelArray);
189 PVStructurePtr pvRequest = createRequest->createRequest(request);
191 string message =
" PvaClientMultiChannel::createNTGet invalid pvRequest: " 192 + createRequest->getMessage();
193 throw std::runtime_error(message);
195 return PvaClientNTMultiGet::create(shared_from_this(), pvaClientChannelArray,pvRequest);
201 PVStructurePtr pvRequest = createRequest->createRequest(request);
203 string message =
" PvaClientMultiChannel::createNTMonitor invalid pvRequest: " 204 + createRequest->getMessage();
205 throw std::runtime_error(message);
207 return PvaClientNTMultiMonitor::create(shared_from_this(), pvaClientChannelArray,pvRequest);
std::tr1::shared_ptr< PvaClient > PvaClientPtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
PvaMultiChannel is a synchronous interface for accessing multiple channels.
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
std::tr1::shared_ptr< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr