/* pvaClientNTMultiGet.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(); PvaClientNTMultiGetPtr PvaClientNTMultiGet::create( PvaClientMultiChannelPtr const &pvaMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, PVStructurePtr const & pvRequest) { UnionConstPtr u = fieldCreate->createVariantUnion(); PvaClientNTMultiGetPtr pvaClientNTMultiGet( new PvaClientNTMultiGet(u,pvaMultiChannel,pvaClientChannelArray,pvRequest)); return pvaClientNTMultiGet; } PvaClientNTMultiGet::PvaClientNTMultiGet( UnionConstPtr const & u, PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const & pvRequest) : pvaClientMultiChannel(pvaClientMultiChannel), pvaClientChannelArray(pvaClientChannelArray), pvRequest(pvRequest), nchannel(pvaClientChannelArray.size()), pvaClientNTMultiData( PvaClientNTMultiData::create( u, pvaClientMultiChannel, pvaClientChannelArray, pvRequest)), isConnected(false), isDestroyed(false) { } PvaClientNTMultiGet::~PvaClientNTMultiGet() { destroy(); } void PvaClientNTMultiGet::destroy() { { Lock xx(mutex); if(isDestroyed) return; isDestroyed = true; } pvaClientChannelArray.clear(); } void PvaClientNTMultiGet::connect() { pvaClientGet.resize(nchannel); shared_vector isConnected = pvaClientMultiChannel->getIsConnected(); string request = "value"; if(pvRequest->getSubField("field.alarm")) request += ",alarm"; if(pvRequest->getSubField("field.timeStamp")) request += ",timeStamp"; 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); } } this->isConnected = true; } void PvaClientNTMultiGet::get() { if(!isConnected) 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); } } pvaClientNTMultiData->startDeltaTime(); for(size_t i=0; isetPVStructure(pvaClientGet[i]->getData()->getPVStructure(),i); } } pvaClientNTMultiData->endDeltaTime(); } PvaClientNTMultiDataPtr PvaClientNTMultiGet::getData() { return pvaClientNTMultiData; } }}