/* pvaClientNTMultiData.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 #define epicsExportSharedSymbols #include using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::nt; using namespace std; namespace epics { namespace pvaClient { PvaClientNTMultiDataPtr PvaClientNTMultiData::create( UnionConstPtr const & u, PvaClientMultiChannelPtr const &pvaMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, PVStructurePtr const & pvRequest) { return PvaClientNTMultiDataPtr( new PvaClientNTMultiData(u,pvaMultiChannel,pvaClientChannelArray,pvRequest)); } PvaClientNTMultiData::PvaClientNTMultiData( UnionConstPtr const & u, PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, PVStructurePtr const & pvRequest) : pvaClientMultiChannel(pvaClientMultiChannel), pvaClientChannelArray(pvaClientChannelArray), nchannel(pvaClientChannelArray.size()), gotAlarm(false), gotTimeStamp(false) { if(PvaClient::getDebug()) cout<< "PvaClientNTMultiData::PvaClientNTMultiData()\n"; changeFlags = shared_vector(nchannel); topPVStructure.resize(nchannel); unionValue.resize(nchannel); PVDataCreatePtr pvDataCreate = getPVDataCreate(); for(size_t i=0; i< nchannel; ++i) { topPVStructure[i] = PVStructurePtr(); unionValue[i] = pvDataCreate->createPVUnion(u); } NTMultiChannelBuilderPtr builder = NTMultiChannel::createBuilder(); builder->value(u)->addIsConnected(); if(pvRequest->getSubField("field.alarm")) { gotAlarm = true; builder->addAlarm(); builder->addSeverity(); builder->addStatus(); builder->addMessage(); severity.resize(nchannel); status.resize(nchannel); message.resize(nchannel); } if(pvRequest->getSubField("field.timeStamp")) { gotTimeStamp = true; builder->addTimeStamp(); builder->addSecondsPastEpoch(); builder->addNanoseconds(); builder->addUserTag(); secondsPastEpoch.resize(nchannel); nanoseconds.resize(nchannel); userTag.resize(nchannel); } ntMultiChannelStructure = builder->createStructure(); } PvaClientNTMultiData::~PvaClientNTMultiData() { if(PvaClient::getDebug()) cout<< "PvaClientNTMultiData::~PvaClientNTMultiData()\n"; } void PvaClientNTMultiData::setPVStructure( PVStructurePtr const &pvStructure,size_t index) { topPVStructure[index] = pvStructure; } shared_vector PvaClientNTMultiData::getChannelChangeFlags() { return changeFlags; } size_t PvaClientNTMultiData::getNumber() { return nchannel; } void PvaClientNTMultiData::startDeltaTime() { for(size_t i=0; igetSubField("value"); if(pvValue) { unionValue[i]->set(pvst->getSubField("value")); } } else { unionValue[i]->set(pvst); } if(gotAlarm) { PVIntPtr pvSeverity = pvst->getSubField("alarm.severity"); PVIntPtr pvStatus = pvst->getSubField("alarm.status"); PVStringPtr pvMessage = pvst->getSubField("alarm.message"); if(pvSeverity&&pvStatus&&pvMessage) { severity[i] = pvSeverity->get(); status[i] = pvStatus->get(); message[i] = pvMessage->get(); } else { severity[i] = undefinedAlarm; status[i] = undefinedStatus; message[i] = "no alarm field"; } } if(gotTimeStamp) { PVLongPtr pvEpoch = pvst->getSubField("timeStamp.secondsPastEpoch"); PVIntPtr pvNano = pvst->getSubField("timeStamp.nanoseconds"); PVIntPtr pvTag = pvst->getSubField("timeStamp.userTag"); if(pvEpoch&&pvNano&&pvTag) { secondsPastEpoch[i] = pvEpoch->get(); nanoseconds[i] = pvNano->get(); userTag[i] = pvTag->get(); } } } } } TimeStamp PvaClientNTMultiData::getTimeStamp() { pvTimeStamp.get(timeStamp); return timeStamp; } NTMultiChannelPtr PvaClientNTMultiData::getNTMultiChannel() { PVStructurePtr pvStructure = getPVDataCreate()->createPVStructure(ntMultiChannelStructure); NTMultiChannelPtr ntMultiChannel = NTMultiChannel::wrap(pvStructure); ntMultiChannel->getChannelName()->replace(pvaClientMultiChannel->getChannelNames()); shared_vector val(nchannel); for(size_t i=0; igetValue()->replace(freeze(val)); shared_vector connected = pvaClientMultiChannel->getIsConnected(); shared_vector isConnected(nchannel); for(size_t i=0; igetIsConnected()->replace(freeze(isConnected)); if(gotAlarm) { shared_vector sev(nchannel); for(size_t i=0; igetSeverity()->replace(freeze(sev)); shared_vector sta(nchannel); for(size_t i=0; igetStatus()->replace(freeze(sta)); shared_vector mes(nchannel); for(size_t i=0; igetMessage()->replace(freeze(mes)); } if(gotTimeStamp) { shared_vector sec(nchannel); for(size_t i=0; igetSecondsPastEpoch()->replace(freeze(sec)); shared_vector nano(nchannel); for(size_t i=0; igetNanoseconds()->replace(freeze(nano)); shared_vector tag(nchannel); for(size_t i=0; igetUserTag()->replace(freeze(tag)); } return ntMultiChannel; } }}