16 #define epicsExportSharedSymbols 24 namespace epics {
namespace pvaClient {
32 string const & providerName,
33 size_t maxNotConnected)
40 PvaClientMultiChannel::PvaClientMultiChannel(
43 string const & providerName,
44 size_t maxNotConnected)
45 : pvaClient(pvaClient),
46 channelName(channelName),
47 providerName(providerName),
48 maxNotConnected(maxNotConnected),
49 numChannel(channelName.
size()),
55 if(PvaClient::getDebug()) cout<<
"PvaClientMultiChannel::PvaClientMultiChannel()\n";
58 PvaClientMultiChannel::~PvaClientMultiChannel()
60 if(PvaClient::getDebug()) cout<<
"PvaClientMultiChannel::~PvaClientMultiChannel()\n";
63 void PvaClientMultiChannel::checkConnected()
65 if(numConnected==0) connect();
75 for(
size_t i=0;
i< numChannel; ++
i) {
76 pvaClientChannelArray[
i] = pvaClient->createChannel(channelName[
i],providerName);
77 pvaClientChannelArray[
i]->issueConnect();
82 for(
size_t i=0;
i< numChannel; ++
i) {
84 status = pvaClientChannelArray[
i]->waitConnect(timeout);
86 status = pvaClientChannelArray[
i]->waitConnect(.001);
90 isConnected[
i] =
true;
93 if(returnStatus.
isOK()) returnStatus = status;
95 if(numBad>maxNotConnected)
break;
97 return numBad>maxNotConnected ? returnStatus :
Status::Ok;
101 bool PvaClientMultiChannel::allConnected()
103 return (numConnected==numChannel) ?
true :
false;
106 bool PvaClientMultiChannel::connectionChange()
108 for(
size_t i=0;
i<numChannel; ++
i) {
110 Channel::shared_pointer channel = pvaClientChannel->getChannel();
112 bool connectedNow = stateNow==Channel::CONNECTED ?
true :
false;
113 if(connectedNow!=isConnected[
i])
return true;
120 for(
size_t i=0;
i<numChannel; ++
i) {
122 if(!pvaClientChannel) {
123 isConnected[
i] =
false;
126 Channel::shared_pointer channel = pvaClientChannel->getChannel();
128 isConnected[
i] = (stateNow==Channel::CONNECTED) ?
true :
false;
135 return pvaClientChannelArray;
148 return PvaClientMultiGetDouble::create(shared_from_this(),pvaClientChannelArray);
155 return PvaClientMultiPutDouble::create(shared_from_this(),pvaClientChannelArray);
162 return PvaClientMultiMonitorDouble::create(shared_from_this(), pvaClientChannelArray);
168 return PvaClientNTMultiPut::create(shared_from_this(), pvaClientChannelArray);
177 string message =
" PvaClientMultiChannel::createNTGet invalid pvRequest: " 179 throw std::runtime_error(message);
181 return PvaClientNTMultiGet::create(shared_from_this(), pvaClientChannelArray,pvRequest);
189 string message =
" PvaClientMultiChannel::createNTMonitor invalid pvRequest: " 191 throw std::runtime_error(message);
193 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.
A holder for a contiguous piece of memory.
static CreateRequest::shared_pointer create()
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
TODO only here because of the Lockable.
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
PVStructure::shared_pointer createRequest(std::string const &request)
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
size_t size() const
Number of elements visible through this vector.
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
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
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr