16#define epicsExportSharedSymbols
20using namespace epics::pvData;
21using namespace epics::pvAccess;
24namespace epics {
namespace pvaClient {
26static FieldCreatePtr fieldCreate = getFieldCreate();
27static 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));
42PvaClientMultiChannel::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())
69void PvaClientMultiChannel::checkConnected()
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;
117 return (numConnected==numChannel) ? true :
false;
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;
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;
189 PVStructurePtr pvRequest = createRequest->createRequest(request);
191 string message =
" PvaClientMultiChannel::createNTGet invalid pvRequest: "
192 + createRequest->getMessage();
193 throw std::runtime_error(message);
201 PVStructurePtr pvRequest = createRequest->createRequest(request);
203 string message =
" PvaClientMultiChannel::createNTMonitor invalid pvRequest: "
204 + createRequest->getMessage();
205 throw std::runtime_error(message);
PvaMultiChannel is a synchronous interface for accessing multiple channels.
PvaClientChannelArray getPvaClientChannelArray()
Get the pvaClientChannelArray.
PvaClientNTMultiPutPtr createNTPut()
Create a pvaClientNTMultiPut.
epics::pvData::shared_vector< epics::pvData::boolean > getIsConnected()
Get the connection state of each channel.
PvaClientNTMultiMonitorPtr createNTMonitor(std::string const &request="field(value,alarm,timeStamp)")
Create a pvaClientNTMultiPut.
epics::pvData::shared_vector< const std::string > getChannelNames()
Get the channelNames.
epics::pvData::Status connect(double timeout=5)
Connect to the channels.
PvaClientNTMultiGetPtr createNTGet(std::string const &request="field(value,alarm,timeStamp)")
Create a pvaClientNTMultiGet;.
PvaClientMultiGetDoublePtr createGet()
create a pvaClientMultiGetDouble
PvaClientMultiPutDoublePtr createPut()
Create a pvaClientMultiPutDouble.
PvaClientMultiMonitorDoublePtr createMonitor()
Create a pvaClientMultiMonitorDouble.
PvaClientPtr getPvaClient()
Get pvaClient.
static PvaClientMultiChannelPtr create(PvaClientPtr const &pvaClient, epics::pvData::shared_vector< const std::string > const &channelNames, std::string const &providerName="pva", size_t maxNotConnected=0, epics::pvData::shared_vector< const std::string > const &providerNames=epics::pvData::shared_vector< const std::string >())
Create a PvaClientMultiChannel.
bool connectionChange()
Has a connection state change occured?
~PvaClientMultiChannel()
Destructor.
bool allConnected()
Are all channels connected?
static PvaClientMultiGetDoublePtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
static PvaClientMultiMonitorDoublePtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
static PvaClientMultiPutDoublePtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
static PvaClientNTMultiGetPtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const &pvRequest)
static PvaClientNTMultiMonitorPtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const &pvRequest)
static PvaClientNTMultiPutPtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClient > PvaClientPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr