This is Unofficial EPICS BASE Doxygen Site
pvaClientMultiMonitorDouble.cpp
Go to the documentation of this file.
1 /* pvaClientMultiMonitorDouble.cpp */
12 #include <epicsThread.h>
13 #include <epicsMath.h>
14 
15 #define epicsExportSharedSymbols
16 
18 
19 using namespace epics::pvData;
20 using namespace epics::pvAccess;
21 using namespace epics::nt;
22 using namespace std;
23 
24 namespace epics { namespace pvaClient {
25 
26 
27 PvaClientMultiMonitorDoublePtr PvaClientMultiMonitorDouble::create(
28  PvaClientMultiChannelPtr const &pvaMultiChannel,
29  PvaClientChannelArray const &pvaClientChannelArray)
30 {
31  PvaClientMultiMonitorDoublePtr pvaClientMultiMonitorDouble(
32  new PvaClientMultiMonitorDouble(pvaMultiChannel,pvaClientChannelArray));
33  return pvaClientMultiMonitorDouble;
34 }
35 
36 PvaClientMultiMonitorDouble::PvaClientMultiMonitorDouble(
37  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
38  PvaClientChannelArray const &pvaClientChannelArray)
39 : pvaClientMultiChannel(pvaClientMultiChannel),
40  pvaClientChannelArray(pvaClientChannelArray),
41  nchannel(pvaClientChannelArray.size()),
42  doubleValue(shared_vector<double>(nchannel,epicsNAN)),
43  pvaClientMonitor(std::vector<PvaClientMonitorPtr>(nchannel,PvaClientMonitorPtr())),
44  isMonitorConnected(false)
45 {
46  if(PvaClient::getDebug()) cout<< "PvaClientMultiMonitorDouble::PvaClientMultiMonitorDouble()\n";
47 }
48 
49 PvaClientMultiMonitorDouble::~PvaClientMultiMonitorDouble()
50 {
51  if(PvaClient::getDebug()) cout<< "PvaClientMultiMonitorDouble::~PvaClientMultiMonitorDouble()\n";
52 }
53 
54 void PvaClientMultiMonitorDouble::connect()
55 {
56  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
57  string request = "value";
58  for(size_t i=0; i<nchannel; ++i)
59  {
60  if(isConnected[i]) {
61  pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor(request);
62  pvaClientMonitor[i]->issueConnect();
63  }
64  }
65  for(size_t i=0; i<nchannel; ++i)
66  {
67  if(isConnected[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);
73  }
74  }
75  for(size_t i=0; i<nchannel; ++i)
76  {
77  if(isConnected[i]) pvaClientMonitor[i]->start();
78  }
79  isMonitorConnected = true;
80 }
81 
82 bool PvaClientMultiMonitorDouble::poll()
83 {
84  if(!isMonitorConnected){
85  connect();
86  epicsThreadSleep(.1);
87  }
88  bool result = false;
89  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
90  for(size_t i=0; i<nchannel; ++i)
91  {
92  if(isConnected[i]) {
93  if(pvaClientMonitor[i]->poll()) {
94  doubleValue[i] = pvaClientMonitor[i]->getData()->getDouble();
95  pvaClientMonitor[i]->releaseEvent();
96  result = true;
97  }
98  }
99  }
100  return result;
101 }
102 
103 bool PvaClientMultiMonitorDouble::waitEvent(double waitForEvent)
104 {
105  if(poll()) return true;
106  TimeStamp start;
107  start.getCurrent();
108  TimeStamp now;
109  while(true) {
110  epicsThreadSleep(.1);
111  if(poll()) return true;
112  now.getCurrent();
113  double diff = TimeStamp::diff(now,start);
114  if(diff>=waitForEvent) break;
115  }
116  return false;
117 }
118 
120 {
121  return doubleValue;
122 }
123 
124 
125 }}
pvac::PutEvent result
Definition: clientSync.cpp:117
std::string request
pvd::Status status
int i
Definition: scan.c:967
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
const std::string & getMessage() const
Definition: status.h:80
Holds all PVA related.
Definition: pvif.h:34
pvData
Definition: monitor.h:428
float epicsNAN
Definition: epicsMath.cpp:35
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
std::tr1::shared_ptr< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
Provides a monitor to multiple channels where each channel has a numeric scalar value field...
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
static double diff(TimeStamp const &a, TimeStamp const &b)
Definition: timeStamp.cpp:141
LIBCOM_API void epicsStdCall epicsThreadSleep(double seconds)
Block the calling thread for at least the specified time.
Definition: osdThread.c:790
Definition: caget.c:48
bool isOK() const
Definition: status.h:95
C++ and C descriptions for a thread.
std::tr1::shared_ptr< PvaClientMonitor > PvaClientMonitorPtr
Definition: pvaClient.h:83
Methods for manipulating timeStamp.
Definition: timeStamp.h:43