12#include <epicsThread.h>
15#define epicsExportSharedSymbols
19using namespace epics::pvData;
20using namespace epics::pvAccess;
21using namespace epics::nt;
24namespace epics {
namespace pvaClient {
33 return pvaClientMultiMonitorDouble;
36PvaClientMultiMonitorDouble::PvaClientMultiMonitorDouble(
39: pvaClientMultiChannel(pvaClientMultiChannel),
40 pvaClientChannelArray(pvaClientChannelArray),
41 nchannel(pvaClientChannelArray.size()),
42 doubleValue(shared_vector<double>(nchannel,epicsNAN)),
44 isMonitorConnected(false)
46 if(
PvaClient::getDebug()) cout<<
"PvaClientMultiMonitorDouble::PvaClientMultiMonitorDouble()\n";
51 if(
PvaClient::getDebug()) cout<<
"PvaClientMultiMonitorDouble::~PvaClientMultiMonitorDouble()\n";
56 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
57 string request =
"value";
58 for(
size_t i=0; i<nchannel; ++i)
61 pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor(request);
62 pvaClientMonitor[i]->issueConnect();
65 for(
size_t i=0; i<nchannel; ++i)
68 Status status = pvaClientMonitor[i]->waitConnect();
69 if(status.isOK())
continue;
70 string message = string(
"channel ") + pvaClientChannelArray[i]->getChannelName()
71 +
" PvaChannelMonitor::waitConnect " + status.getMessage();
72 throw std::runtime_error(message);
75 for(
size_t i=0; i<nchannel; ++i)
77 if(isConnected[i]) pvaClientMonitor[i]->start();
79 isMonitorConnected =
true;
84 if(!isMonitorConnected){
89 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
90 for(
size_t i=0; i<nchannel; ++i)
93 if(!pvaClientMonitor[i]){
94 pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor(
"value");
95 pvaClientMonitor[i]->issueConnect();
96 Status status = pvaClientMonitor[i]->waitConnect();
98 string message = string(
"channel ") + pvaClientChannelArray[i]->getChannelName()
99 +
" PvaChannelMonitor::waitConnect " + status.getMessage();
100 throw std::runtime_error(message);
102 pvaClientMonitor[i]->start();
104 if(pvaClientMonitor[i]->
poll()) {
105 doubleValue[i] = pvaClientMonitor[i]->getData()->getDouble();
106 pvaClientMonitor[i]->releaseEvent();
116 if(
poll())
return true;
121 epicsThreadSleep(.1);
122 if(
poll())
return true;
124 double diff = TimeStamp::diff(now,start);
125 if(diff>=waitForEvent)
break;
Provides a monitor to multiple channels where each channel has a numeric scalar value field.
~PvaClientMultiMonitorDouble()
Destructor.
static PvaClientMultiMonitorDoublePtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
bool poll()
Poll each channel.
epics::pvData::shared_vector< double > get()
void connect()
Connect a channel monitor for each channel.
bool waitEvent(double secondsToWait)
Wait until poll returns true.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< PvaClientMonitor > PvaClientMonitorPtr