12#include <epicsThread.h>
13#include <pv/standardField.h>
14#include <pv/convert.h>
17#define epicsExportSharedSymbols
21using namespace epics::pvData;
22using namespace epics::pvAccess;
23using namespace epics::nt;
26namespace epics {
namespace pvaClient {
31 PVStructurePtr
const & pvRequest)
33 UnionConstPtr u = getFieldCreate()->createVariantUnion();
36 return pvaClientNTMultiMonitor;
39PvaClientNTMultiMonitor::PvaClientNTMultiMonitor(
40 UnionConstPtr
const & u,
43 PVStructurePtr
const & pvRequest)
44: pvaClientMultiChannel(pvaClientMultiChannel),
45 pvaClientChannelArray(pvaClientChannelArray),
47 nchannel(pvaClientChannelArray.size()),
51 pvaClientMultiChannel,
52 pvaClientChannelArray,
68 pvaClientMonitor.resize(nchannel);
69 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
70 for(
size_t i=0; i<nchannel; ++i)
73 pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor(pvRequest);
74 pvaClientMonitor[i]->issueConnect();
77 for(
size_t i=0; i<nchannel; ++i)
80 Status status = pvaClientMonitor[i]->waitConnect();
81 if(status.isOK())
continue;
82 string message = string(
"channel ") +pvaClientChannelArray[i]->getChannelName()
83 +
" PvaChannelMonitor::waitConnect " + status.getMessage();
84 throw std::runtime_error(message);
87 for(
size_t i=0; i<nchannel; ++i)
89 if(isConnected[i]) pvaClientMonitor[i]->start();
91 this->isConnected =
true;
98 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
99 pvaClientNTMultiData->startDeltaTime();
100 for(
size_t i=0; i<nchannel; ++i)
103 if(!pvaClientMonitor[i]){
104 pvaClientMonitor[i]=pvaClientChannelArray[i]->createMonitor(pvRequest);
105 pvaClientMonitor[i]->connect();
106 pvaClientMonitor[i]->start();
108 if(pvaClientMonitor[i]->
poll()) {
109 pvaClientNTMultiData->setPVStructure(
110 pvaClientMonitor[i]->
getData()->getPVStructure(),i);
111 pvaClientMonitor[i]->releaseEvent();
116 if(result) pvaClientNTMultiData->endDeltaTime(valueOnly);
122 if(
poll())
return true;
127 epicsThreadSleep(.1);
128 if(
poll())
return true;
130 double diff = TimeStamp::diff(now,start);
131 if(diff>=waitForEvent)
break;
138 return pvaClientNTMultiData;
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
Provides channel monitor to multiple channels where the value field of each channel is presented as a...
static PvaClientNTMultiMonitorPtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const &pvRequest)
bool waitEvent(double secondsToWait)
Wait until poll returns true.
void connect()
Connect to a channel monitor for each channel.
PvaClientNTMultiDataPtr getData()
Get the data for the last successfull poll.
~PvaClientNTMultiMonitor()
Destructor.
bool poll(bool valueOnly=true)
Poll each channel.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr