/* PvaClientNTMultiPut.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(); PvaClientNTMultiPutPtr PvaClientNTMultiPut::create( PvaClientMultiChannelPtr const &pvaMultiChannel, PvaClientChannelArray const &pvaClientChannelArray) { return PvaClientNTMultiPutPtr( new PvaClientNTMultiPut(pvaMultiChannel,pvaClientChannelArray)); } PvaClientNTMultiPut::PvaClientNTMultiPut( PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray) : pvaClientMultiChannel(pvaClientMultiChannel), pvaClientChannelArray(pvaClientChannelArray), nchannel(pvaClientChannelArray.size()), unionValue(shared_vector(nchannel,PVUnionPtr())), value(shared_vector(nchannel,PVFieldPtr())), isConnected(false), isDestroyed(false) { if(PvaClient::getDebug()) cout<< "PvaClientNTMultiPut::PvaClientNTMultiPut()\n"; } PvaClientNTMultiPut::~PvaClientNTMultiPut() { if(PvaClient::getDebug()) cout<< "PvaClientNTMultiPut::~PvaClientNTMultiPut()\n"; { Lock xx(mutex); if(isDestroyed) { cerr<< "Why was PvaClientNTMultiPut::~PvaClientNTMultiPut() called more then once????\n"; return; } isDestroyed = true; } pvaClientChannelArray.clear(); } void PvaClientNTMultiPut::connect() { pvaClientPut.resize(nchannel); shared_vector isConnected = pvaClientMultiChannel->getIsConnected(); for(size_t i=0; icreatePut(); pvaClientPut[i]->issueConnect(); } } for(size_t i=0; iwaitConnect(); if(status.isOK()) continue; string message = string("channel ") +pvaClientChannelArray[i]->getChannelName() + " PvaChannelPut::waitConnect " + status.getMessage(); throw std::runtime_error(message); } } for(size_t i=0; iissueGet(); } } for(size_t i=0; iwaitGet(); if(status.isOK()) continue; string message = string("channel ") +pvaClientChannelArray[i]->getChannelName() + " PvaChannelPut::waitGet " + status.getMessage(); throw std::runtime_error(message); } } for(size_t i=0; igetData()->getValue(); FieldBuilderPtr builder = fieldCreate->createFieldBuilder(); builder->add("value",value[i]->getField()); unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion()); } } this->isConnected = true; } shared_vector PvaClientNTMultiPut::getValues() { if(!isConnected) connect(); return unionValue; } void PvaClientNTMultiPut::put() { if(!isConnected) connect(); shared_vector isConnected = pvaClientMultiChannel->getIsConnected(); for(size_t i=0; icopy(*unionValue[i]->get()); pvaClientPut[i]->issuePut(); } if(isConnected[i]) { Status status = pvaClientPut[i]->waitPut(); if(status.isOK()) continue; string message = string("channel ") +pvaClientChannelArray[i]->getChannelName() + " PvaChannelPut::waitPut " + status.getMessage(); throw std::runtime_error(message); } } } }}