/* 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 #include #define epicsExportSharedSymbols #include using std::tr1::static_pointer_cast; using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::nt; using namespace std; namespace epics { namespace pvaClient { static ConvertPtr convert = getConvert(); static FieldCreatePtr fieldCreate = getFieldCreate(); static PVDataCreatePtr pvDataCreate = getPVDataCreate(); static StandardFieldPtr standardField = getStandardField(); 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), isDestroyed(false) { if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::PvaClientMultiGetDouble()\n"; } PvaClientMultiGetDouble::~PvaClientMultiGetDouble() { if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::~PvaClientMultiGetDouble()\n"; { Lock xx(mutex); if(isDestroyed) { cerr<< "Why was PvaClientMultiGetDouble::~PvaClientMultiGetDouble() called more then once????\n"; return; } isDestroyed = true; } pvaClientChannelArray.clear(); } void PvaClientMultiGetDouble::connect() { shared_vector isConnected = 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; } epics::pvData::shared_vector PvaClientMultiGetDouble::get() { if(!isGetConnected) connect(); shared_vector isConnected = pvaClientMultiChannel->getIsConnected(); for(size_t i=0; iissueGet(); } } 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(); doubleValue[i] = convert->toDouble(pvStructure->getSubField("value")); } else { doubleValue[i] = epicsNAN; } } return doubleValue; } }}