This is Unofficial EPICS BASE Doxygen Site
epics::pvaClient::PvaClientNTMultiMonitor Class Reference

Provides channel monitor to multiple channels where the value field of each channel is presented as a union. More...

#include "pvaClientMultiChannel.h"

+ Inheritance diagram for epics::pvaClient::PvaClientNTMultiMonitor:
+ Collaboration diagram for epics::pvaClient::PvaClientNTMultiMonitor:

Public Member Functions

 POINTER_DEFINITIONS (PvaClientNTMultiMonitor)
 
 ~PvaClientNTMultiMonitor ()
 
void connect ()
 Connect to a channel monitor for each channel. More...
 
bool poll (bool valueOnly=true)
 Poll each channel. More...
 
bool waitEvent (double secondsToWait)
 Wait until poll returns true. More...
 
PvaClientNTMultiDataPtr getData ()
 Get the data for the last successfull poll. More...
 
PvaClientNTMultiMonitorPtr getPtrSelf ()
 

Static Public Member Functions

static PvaClientNTMultiMonitorPtr create (PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const &pvRequest)
 Create a PvaClientNTMultiMonitor. More...
 

Detailed Description

Provides channel monitor to multiple channels where the value field of each channel is presented as a union.

Definition at line 457 of file pvaClientMultiChannel.h.

Constructor & Destructor Documentation

epics::pvaClient::PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor ( )

Definition at line 60 of file pvaClientNTMultiMonitor.cpp.

61 {
62  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()\n";
63 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97

Member Function Documentation

void epics::pvaClient::PvaClientNTMultiMonitor::connect ( )

Connect to a channel monitor for each channel.

Definition at line 66 of file pvaClientNTMultiMonitor.cpp.

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 }
pvd::Status status
int i
Definition: scan.c:967
const std::string & getMessage() const
Definition: status.h:80
bool isOK() const
Definition: status.h:95
PvaClientNTMultiMonitorPtr epics::pvaClient::PvaClientNTMultiMonitor::create ( PvaClientMultiChannelPtr const &  pvaClientMultiChannel,
PvaClientChannelArray const &  pvaClientChannelArray,
epics::pvData::PVStructurePtr const &  pvRequest 
)
static

Create a PvaClientNTMultiMonitor.

Parameters
pvaClientMultiChannelThe interface to PvaClientMultiChannel.
pvaClientChannelArrayThe PvaClientChannel array.
pvRequestThe pvRequest for each channel.
Returns
The interface.

Definition at line 28 of file pvaClientNTMultiMonitor.cpp.

32 {
33  UnionConstPtr u = getFieldCreate()->createVariantUnion();
34  PvaClientNTMultiMonitorPtr pvaClientNTMultiMonitor(
35  new PvaClientNTMultiMonitor(u,pvaMultiChannel,pvaClientChannelArray,pvRequest));
36  return pvaClientNTMultiMonitor;
37 }
std::tr1::shared_ptr< const Union > UnionConstPtr
Definition: pvIntrospect.h:170
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
PvaClientNTMultiDataPtr epics::pvaClient::PvaClientNTMultiMonitor::getData ( )

Get the data for the last successfull poll.

Returns
the pvaClientNTMultiData.

Definition at line 131 of file pvaClientNTMultiMonitor.cpp.

132 {
133  return pvaClientNTMultiData;
134 }
PvaClientNTMultiMonitorPtr epics::pvaClient::PvaClientNTMultiMonitor::getPtrSelf ( )
inline

Monitor the shared pointer to self.

Returns
The shared pointer.

Definition at line 501 of file pvaClientMultiChannel.h.

502  {
503  return shared_from_this();
504  }
epics::pvaClient::PvaClientNTMultiMonitor::POINTER_DEFINITIONS ( PvaClientNTMultiMonitor  )
bool epics::pvaClient::PvaClientNTMultiMonitor::poll ( bool  valueOnly = true)

Poll each channel.

Parameters
valueOnlyuse only value for union. If any has new data it is used to update the double[].
Returns
(false,true) if (no, at least one) value was updated.

Definition at line 94 of file pvaClientNTMultiMonitor.cpp.

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 }
bool poll(bool valueOnly=true)
Poll each channel.
pvac::PutEvent result
Definition: clientSync.cpp:117
int i
Definition: scan.c:967
void connect()
Connect to a channel monitor for each channel.
PvaClientNTMultiDataPtr getData()
Get the data for the last successfull poll.
bool epics::pvaClient::PvaClientNTMultiMonitor::waitEvent ( double  secondsToWait)

Wait until poll returns true.

Parameters
secondsToWaitThe time to keep trying. A thread sleep of .1 seconds occurs between each call to poll.
Returns
(false,true) if (timeOut, poll returned true).

Definition at line 115 of file pvaClientNTMultiMonitor.cpp.

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 }
bool poll(bool valueOnly=true)
Poll each channel.
LIBCOM_API void epicsStdCall epicsThreadSleep(double seconds)
Block the calling thread for at least the specified time.
Definition: osdThread.c:790
Methods for manipulating timeStamp.
Definition: timeStamp.h:43

The documentation for this class was generated from the following files: