/* pvaClientMultiDouble.cpp */ /** * Copyright - See the COPYRIGHT that is included with this distribution. * EPICS pvData is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. */ /** * @author mrk * @date 2015.03 */ #define epicsExportSharedSymbols #include using std::tr1::static_pointer_cast; using namespace epics::pvData; using namespace epics::pvAccess; using namespace std; namespace epics { namespace pvaClient { PvaClientMultiDoublePtr PvaClientMultiDouble::create( PvaClientPtr const & pvaClient, PVStringArrayPtr const & channelName, double timeout, std::string const & providerName) { PvaClientMultiChannelPtr pvaClientMultiChannel( PvaClientMultiChannel::create(pvaClient,channelName,providerName)); Status status = pvaClientMultiChannel->connect(timeout,0); if(!status.isOK()) throw std::runtime_error(status.getMessage()); return PvaClientMultiDoublePtr(new PvaClientMultiDouble(pvaClientMultiChannel)); } PvaClientMultiDouble::PvaClientMultiDouble(PvaClientMultiChannelPtr const &pvaClientMultiChannel) : pvaClientMultiChannel(pvaClientMultiChannel) {} PvaClientMultiDouble::~PvaClientMultiDouble() { } void PvaClientMultiDouble::createGet() { PvaClientChannelArrayPtr pvaClientChannelArray = pvaClientMultiChannel->getPvaClientChannelArray().lock(); if(!pvaClientChannelArray) throw std::runtime_error("pvaClientChannelArray is gone"); shared_vector pvaClientChannels = *pvaClientChannelArray; size_t numChannel = pvaClientChannels.size(); pvaClientGet = std::vector(numChannel,PvaClientGetPtr()); bool allOK = true; string message; for(size_t i=0; icreateGet("value"); pvaClientGet[i]->issueConnect(); } for(size_t i=0; iwaitConnect(); if(!status.isOK()) { message = "connect status " + status.getMessage(); allOK = false; break; } } if(!allOK) throw std::runtime_error(message); } void PvaClientMultiDouble::createPut() { PvaClientChannelArrayPtr pvaClientChannelArray = pvaClientMultiChannel->getPvaClientChannelArray().lock(); if(!pvaClientChannelArray) throw std::runtime_error("pvaClientChannelArray is gone"); shared_vector pvaClientChannels = *pvaClientChannelArray; size_t numChannel = pvaClientChannels.size(); pvaClientPut = std::vector(numChannel,PvaClientPutPtr()); bool allOK = true; string message; for(size_t i=0; icreatePut("value"); pvaClientPut[i]->issueConnect(); } for(size_t i=0; iwaitConnect(); if(!status.isOK()) { message = "connect status " + status.getMessage(); allOK = false; break; } } if(!allOK) throw std::runtime_error(message); } epics::pvData::shared_vector PvaClientMultiDouble::get() { if(pvaClientGet.empty()) createGet(); shared_vector channelNames = pvaClientMultiChannel->getChannelNames()->view(); size_t numChannel = channelNames.size(); epics::pvData::shared_vector data(channelNames.size()); for(size_t i=0; iissueGet(); } for(size_t i=0; iwaitGet(); if(!status.isOK()) { string message = channelNames[i] + " " + status.getMessage(); throw std::runtime_error(message); } data[i] = pvaClientGet[i]->getData()->getDouble(); } return data; } void PvaClientMultiDouble::put(shared_vector const &value) { if(pvaClientPut.empty()) createPut(); shared_vector channelNames = pvaClientMultiChannel->getChannelNames()->view(); size_t numChannel = channelNames.size(); for(size_t i=0; igetData()->putDouble(value[i]); pvaClientPut[i]->issuePut(); } for(size_t i=0; iwaitPut(); if(!status.isOK()) { string message = channelNames[i] + " " + status.getMessage(); throw std::runtime_error(message); } } } }}