/* pvaMultiDouble.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 pva { PvaMultiDoublePtr PvaMultiDouble::create( PvaPtr const & pva, PVStringArrayPtr const & channelName, double timeout, std::string const & providerName) { PvaMultiChannelPtr pvaMultiChannel( PvaMultiChannel::create(pva,channelName,providerName)); Status status = pvaMultiChannel->connect(timeout,0); if(!status.isOK()) throw std::runtime_error(status.getMessage()); return PvaMultiDoublePtr(new PvaMultiDouble(pvaMultiChannel)); } PvaMultiDouble::PvaMultiDouble(PvaMultiChannelPtr const &pvaMultiChannel) : pvaMultiChannel(pvaMultiChannel) {} PvaMultiDouble::~PvaMultiDouble() { } void PvaMultiDouble::createGet() { PvaChannelArrayPtr pvaChannelArray = pvaMultiChannel->getPvaChannelArray().lock(); if(!pvaChannelArray) throw std::runtime_error("pvaChannelArray is gone"); shared_vector pvaChannels = *pvaChannelArray; size_t numChannel = pvaChannels.size(); pvaGet = std::vector(numChannel,PvaGetPtr()); bool allOK = true; string message; for(size_t i=0; icreateGet("value"); pvaGet[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 PvaMultiDouble::createPut() { PvaChannelArrayPtr pvaChannelArray = pvaMultiChannel->getPvaChannelArray().lock(); if(!pvaChannelArray) throw std::runtime_error("pvaChannelArray is gone"); shared_vector pvaChannels = *pvaChannelArray; size_t numChannel = pvaChannels.size(); pvaPut = std::vector(numChannel,PvaPutPtr()); bool allOK = true; string message; for(size_t i=0; icreatePut("value"); pvaPut[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 PvaMultiDouble::get() { if(pvaGet.empty()) createGet(); shared_vector channelNames = pvaMultiChannel->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] = pvaGet[i]->getData()->getDouble(); } return data; } void PvaMultiDouble::put(shared_vector const &value) { if(pvaPut.empty()) createPut(); shared_vector channelNames = pvaMultiChannel->getChannelNames()->view(); size_t numChannel = channelNames.size(); for(size_t i=0; igetData()->putDouble(value[i]); pvaPut[i]->issuePut(); } for(size_t i=0; iwaitPut(); if(!status.isOK()) { string message = channelNames[i] + " " + status.getMessage(); throw std::runtime_error(message); } } } }}