This is Unofficial EPICS BASE Doxygen Site
pvaClientNTMultiMonitor.cpp
Go to the documentation of this file.
1 /* pvaClientNTMultiMonitor.cpp */
12 #include <epicsThread.h>
13 #include <pv/standardField.h>
14 #include <pv/convert.h>
15 #include <epicsMath.h>
16 
17 #define epicsExportSharedSymbols
18 
20 
21 using namespace epics::pvData;
22 using namespace epics::pvAccess;
23 using namespace epics::nt;
24 using namespace std;
25 
26 namespace epics { namespace pvaClient {
27 
28 PvaClientNTMultiMonitorPtr PvaClientNTMultiMonitor::create(
29  PvaClientMultiChannelPtr const &pvaMultiChannel,
30  PvaClientChannelArray const &pvaClientChannelArray,
31  epics::pvData::PVStructurePtr const & pvRequest)
32 {
33  UnionConstPtr u = getFieldCreate()->createVariantUnion();
34  PvaClientNTMultiMonitorPtr pvaClientNTMultiMonitor(
35  new PvaClientNTMultiMonitor(u,pvaMultiChannel,pvaClientChannelArray,pvRequest));
36  return pvaClientNTMultiMonitor;
37 }
38 
39 PvaClientNTMultiMonitor::PvaClientNTMultiMonitor(
40  UnionConstPtr const & u,
41  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
42  PvaClientChannelArray const &pvaClientChannelArray,
43  PVStructurePtr const & pvRequest)
44 : pvaClientMultiChannel(pvaClientMultiChannel),
45  pvaClientChannelArray(pvaClientChannelArray),
46  pvRequest(pvRequest),
47  nchannel(pvaClientChannelArray.size()),
48  pvaClientNTMultiData(
49  PvaClientNTMultiData::create(
50  u,
51  pvaClientMultiChannel,
52  pvaClientChannelArray,
53  pvRequest)),
54  isConnected(false)
55 {
56  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiMonitor::PvaClientNTMultiMonitor()\n";
57 }
58 
59 
60 PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()
61 {
62  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()\n";
63 }
64 
65 
66 void PvaClientNTMultiMonitor::connect()
67 {
68  pvaClientMonitor.resize(nchannel);
69  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
70  for(size_t i=0; i<nchannel; ++i)
71  {
72  if(isConnected[i]) {
73  pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor(pvRequest);
74  pvaClientMonitor[i]->issueConnect();
75  }
76  }
77  for(size_t i=0; i<nchannel; ++i)
78  {
79  if(isConnected[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);
85  }
86  }
87  for(size_t i=0; i<nchannel; ++i)
88  {
89  if(isConnected[i]) pvaClientMonitor[i]->start();
90  }
91  this->isConnected = true;
92 }
93 
94 bool PvaClientNTMultiMonitor::poll(bool valueOnly)
95 {
96  if(!isConnected) connect();
97  bool result = false;
98  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
99  pvaClientNTMultiData->startDeltaTime();
100  for(size_t i=0; i<nchannel; ++i)
101  {
102  if(isConnected[i]) {
103  if(pvaClientMonitor[i]->poll()) {
104  pvaClientNTMultiData->setPVStructure(
105  pvaClientMonitor[i]->getData()->getPVStructure(),i);
106  pvaClientMonitor[i]->releaseEvent();
107  result = true;
108  }
109  }
110  }
111  if(result) pvaClientNTMultiData->endDeltaTime(valueOnly);
112  return result;
113 }
114 
115 bool PvaClientNTMultiMonitor::waitEvent(double waitForEvent)
116 {
117  if(poll()) return true;
118  TimeStamp start;
119  start.getCurrent();
120  TimeStamp now;
121  while(true) {
122  epicsThreadSleep(.1);
123  if(poll()) return true;
124  now.getCurrent();
125  double diff = TimeStamp::diff(now,start);
126  if(diff>=waitForEvent) break;
127  }
128  return false;
129 }
130 
131 PvaClientNTMultiDataPtr PvaClientNTMultiMonitor::getData()
132 {
133  return pvaClientNTMultiData;
134 }
135 
136 }}
void resize(size_t i)
Grow or shrink array.
Definition: sharedVector.h:457
pvac::PutEvent result
Definition: clientSync.cpp:117
pvd::Status status
int i
Definition: scan.c:967
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
Provides channel monitor to multiple channels where the value field of each channel is presented as a...
const std::string & getMessage() const
Definition: status.h:80
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
Holds all PVA related.
Definition: pvif.h:34
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< const Union > UnionConstPtr
Definition: pvIntrospect.h:170
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
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
bool isOK() const
Definition: status.h:95
C++ and C descriptions for a thread.
Methods for manipulating timeStamp.
Definition: timeStamp.h:43