/* pvaClientMultiGetDouble.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 */ #include #include #define epicsExportSharedSymbols #include using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::nt; using namespace std; namespace epics { namespace pvaClient { PvaClientMultiGetDoublePtr PvaClientMultiGetDouble::create( PvaClientMultiChannelPtr const &pvaMultiChannel, PvaClientChannelArray const &pvaClientChannelArray) { PvaClientMultiGetDoublePtr pvaClientMultiGetDouble( new PvaClientMultiGetDouble(pvaMultiChannel,pvaClientChannelArray)); return pvaClientMultiGetDouble; } PvaClientMultiGetDouble::PvaClientMultiGetDouble( PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray) : pvaClientMultiChannel(pvaClientMultiChannel), pvaClientChannelArray(pvaClientChannelArray), nchannel(pvaClientChannelArray.size()), doubleValue( shared_vector(nchannel)), pvaClientGet(std::vector(nchannel,PvaClientGetPtr())), isGetConnected(false) { if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::PvaClientMultiGetDouble()\n"; } PvaClientMultiGetDouble::~PvaClientMultiGetDouble() { if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::~PvaClientMultiGetDouble()\n"; } void PvaClientMultiGetDouble::connect() { shared_vectorisConnected = pvaClientMultiChannel->getIsConnected(); string request = "value"; for(size_t i=0; icreateGet(request); pvaClientGet[i]->issueConnect(); } } for(size_t i=0; iwaitConnect(); if(status.isOK()) continue; string message = string("channel ") + pvaClientChannelArray[i]->getChannelName() + " PvaChannelGet::waitConnect " + status.getMessage(); throw std::runtime_error(message); } } isGetConnected = true; } shared_vector PvaClientMultiGetDouble::get() { if(!isGetConnected) connect(); shared_vector isConnected = pvaClientMultiChannel->getIsConnected(); for(size_t i=0; icreateGet("value"); pvaClientGet[i]->issueGet(); } } for(size_t i=0; iwaitGet(); if(status.isOK()) continue; string message = string("channel ") + pvaClientChannelArray[i]->getChannelName() + " PvaChannelGet::waitGet " + status.getMessage(); throw std::runtime_error(message); } } for(size_t i=0; igetData()->getPVStructure(); PVScalarPtr pvScalar(pvStructure->getSubField("value")); if(pvScalar) { ScalarType scalarType = pvScalar->getScalar()->getScalarType(); if(ScalarTypeFunc::isNumeric(scalarType)) { doubleValue[i] = getConvert()->toDouble(pvScalar); } else { doubleValue[i] = epicsNAN; } } else { doubleValue[i] = epicsNAN; } } else { doubleValue[i] = epicsNAN; } } return doubleValue; } }}