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

An easy to use alternative to Monitor. More...

#include "pvaClient.h"

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

Public Member Functions

 POINTER_DEFINITIONS (PvaClientMonitor)
 
 ~PvaClientMonitor ()
 Destructor. More...
 
void connect ()
 Call issueConnect and then waitConnect. More...
 
void issueConnect ()
 Issue the channelMonitor connection to the channel. More...
 
epics::pvData::Status waitConnect ()
 Wait until the channelMonitor connection to the channel is complete. More...
 
void setRequester (PvaClientMonitorRequesterPtr const &pvaClientMonitorRequester)
 Set a user callback. More...
 
void start ()
 Start monitoring. More...
 
void start (const std::string &request)
 Start or restart the monitor with a new request. More...
 
void stop ()
 Stop monitoring. More...
 
bool poll ()
 Poll for a monitor event. More...
 
bool waitEvent (double secondsToWait=0.0)
 Wait for a monitor event. More...
 
void releaseEvent ()
 Release the monitorElement returned by poll. More...
 
PvaClientChannelPtr getPvaClientChannel ()
 Get the PvaClientChannel;. More...
 
PvaClientMonitorDataPtr getData ()
 The data in which monitor events are placed. More...
 
void channelStateChange (PvaClientChannelPtr const &channel, bool isConnected)
 A channel connection state change has occurred. More...
 
void event (PvaClientMonitorPtr const &monitor)
 A monitor event has occurred. More...
 
- Public Member Functions inherited from epics::pvaClient::PvaClientChannelStateChangeRequester
 POINTER_DEFINITIONS (PvaClientChannelStateChangeRequester)
 
virtual ~PvaClientChannelStateChangeRequester ()
 
- Public Member Functions inherited from epics::pvaClient::PvaClientMonitorRequester
 POINTER_DEFINITIONS (PvaClientMonitorRequester)
 
virtual void monitorConnect (epics::pvData::Status const &status, PvaClientMonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)
 The server has returned a message that the monitor is connected. More...
 
virtual ~PvaClientMonitorRequester ()
 
virtual void unlisten ()
 The data source is no longer available. More...
 

Static Public Member Functions

static PvaClientMonitorPtr create (PvaClientPtr const &pvaClient, PvaClientChannelPtr const &pvaClientChannel, epics::pvData::PVStructurePtr const &pvRequest)
 Create a PvaClientMonitor. More...
 
static PvaClientMonitorPtr create (PvaClientPtr const &pvaClient, std::string const &channelName, std::string const &providerName, std::string const &request, PvaClientChannelStateChangeRequesterPtr const &stateChangeRequester=PvaClientChannelStateChangeRequesterPtr(), PvaClientMonitorRequesterPtr const &monitorRequester=PvaClientMonitorRequesterPtr()) EPICS_DEPRECATED
 Create a PvaClientMonitor. More...
 

Friends

class MonitorRequesterImpl
 

Detailed Description

An easy to use alternative to Monitor.

Overview of PvaClientMonitor

Definition at line 1561 of file pvaClient.h.

Constructor & Destructor Documentation

epics::pvaClient::PvaClientMonitor::~PvaClientMonitor ( )

Destructor.

Definition at line 139 of file pvaClientMonitor.cpp.

140 {
141  if(PvaClient::getDebug()) {
142  cout<< "PvaClientMonitor::~PvaClientMonitor"
143  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
144  << endl;
145  }
146  if(monitor) {
147  if(isStarted) monitor->stop();
148  }
149 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97

Member Function Documentation

void epics::pvaClient::PvaClientMonitor::channelStateChange ( PvaClientChannelPtr const &  channel,
bool  isConnected 
)
virtual

A channel connection state change has occurred.

Warning A call to a method that blocks should not be made by this method.

Parameters
channelThe channel.
isConnectedThe new connection status.

Implements epics::pvaClient::PvaClientChannelStateChangeRequester.

Definition at line 151 of file pvaClientMonitor.cpp.

152 {
153  if(PvaClient::getDebug()) {
154  cout<< "PvaClientMonitor::channelStateChange"
155  << " channelName " << channel->getChannelName()
156  << " isConnected " << (isConnected ? "true" : "false")
157  << endl;
158  }
159  if(isConnected&&!monitor)
160  {
161  connectState = connectActive;
162  monitor = pvaClientChannel->getChannel()->createMonitor(monitorRequester,pvRequest);
163  }
164  PvaClientChannelStateChangeRequesterPtr req(pvaClientChannelStateChangeRequester.lock());
165  if(req) {
166  req->channelStateChange(channel,isConnected);
167  }
168 }
std::tr1::shared_ptr< PvaClientChannelStateChangeRequester > PvaClientChannelStateChangeRequesterPtr
Definition: pvaClient.h:56
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
void epics::pvaClient::PvaClientMonitor::connect ( )

Call issueConnect and then waitConnect.

An exception is thrown if connect fails.

Definition at line 297 of file pvaClientMonitor.cpp.

298 {
299  if(PvaClient::getDebug()) cout << "PvaClientMonitor::connect\n";
300  issueConnect();
302  if(status.isOK()) return;
303  string message = string("channel ")
304  + pvaClientChannel->getChannel()->getChannelName()
305  + " PvaClientMonitor::connect "
306  + status.getMessage();
307  throw std::runtime_error(message);
308 }
pvd::Status status
void issueConnect()
Issue the channelMonitor connection to the channel.
const std::string & getMessage() const
Definition: status.h:80
epics::pvData::Status waitConnect()
Wait until the channelMonitor connection to the channel is complete.
bool isOK() const
Definition: status.h:95
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
PvaClientMonitorPtr epics::pvaClient::PvaClientMonitor::create ( PvaClientPtr const &  pvaClient,
PvaClientChannelPtr const &  pvaClientChannel,
epics::pvData::PVStructurePtr const &  pvRequest 
)
static

Create a PvaClientMonitor.

Parameters
pvaClientInterface to PvaClient
pvaClientChannelInterface to PvaClientChannel
pvRequestThe request structure.
Returns
The interface to the PvaClientMonitor.

Definition at line 79 of file pvaClientMonitor.cpp.

83 {
84  PvaClientMonitorPtr clientMonitor(new PvaClientMonitor(pvaClient,pvaClientChannel,pvRequest));
85  clientMonitor->monitorRequester = MonitorRequesterImplPtr(
86  new MonitorRequesterImpl(clientMonitor,pvaClient));
87  return clientMonitor;
88 }
std::tr1::shared_ptr< MonitorRequesterImpl > MonitorRequesterImplPtr
Definition: pvaClient.h:1553
std::tr1::shared_ptr< PvaClientMonitor > PvaClientMonitorPtr
Definition: pvaClient.h:83
PvaClientMonitorPtr epics::pvaClient::PvaClientMonitor::create ( PvaClientPtr const &  pvaClient,
std::string const &  channelName,
std::string const &  providerName,
std::string const &  request,
PvaClientChannelStateChangeRequesterPtr const &  stateChangeRequester = PvaClientChannelStateChangeRequesterPtr(),
PvaClientMonitorRequesterPtr const &  monitorRequester = PvaClientMonitorRequesterPtr() 
)
static

Create a PvaClientMonitor.

Parameters
pvaClientInterface to PvaClient
channelNamechannel name
providerNameprovider name
requestThe request.
stateChangeRequesterThe state change requester. Can be null.
monitorRequesterThe monitor requester. Can be null;
Returns
The new instance.
Deprecated:
client can create PvaClientMonitor on first channel connect.

Definition at line 90 of file pvaClientMonitor.cpp.

97 {
98  if(PvaClient::getDebug()) {
99  cout<< "PvaClientMonitor::create(pvaClient,channelName,providerName,request,stateChangeRequester,monitorRequester)\n"
100  << " channelName " << channelName
101  << " providerName " << providerName
102  << " request " << request
103  << endl;
104  }
105  CreateRequest::shared_pointer createRequest(CreateRequest::create());
106  PVStructurePtr pvRequest(createRequest->createRequest(request));
107  if(!pvRequest) throw std::runtime_error(createRequest->getMessage());
108  PvaClientChannelPtr pvaClientChannel = pvaClient->createChannel(channelName,providerName);
109  PvaClientMonitorPtr clientMonitor(new PvaClientMonitor(pvaClient,pvaClientChannel,pvRequest));
110  clientMonitor->monitorRequester = MonitorRequesterImplPtr(
111  new MonitorRequesterImpl(clientMonitor,pvaClient));
112  if(stateChangeRequester) clientMonitor->pvaClientChannelStateChangeRequester = stateChangeRequester;
113  if(monitorRequester) clientMonitor->pvaClientMonitorRequester = monitorRequester;
114  pvaClientChannel->setStateChangeRequester(clientMonitor);
115  pvaClientChannel->issueConnect();
116  return clientMonitor;
117 }
std::string request
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
Definition: pvaClient.h:59
PVStructure::shared_pointer createRequest(std::string const &request)
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< MonitorRequesterImpl > MonitorRequesterImplPtr
Definition: pvaClient.h:1553
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
std::tr1::shared_ptr< PvaClientMonitor > PvaClientMonitorPtr
Definition: pvaClient.h:83
void epics::pvaClient::PvaClientMonitor::event ( PvaClientMonitorPtr const &  monitor)
virtual

A monitor event has occurred.

Parameters
monitorThe PvaClientMonitor that received the event.

Implements epics::pvaClient::PvaClientMonitorRequester.

Definition at line 170 of file pvaClientMonitor.cpp.

171 {
172  if(PvaClient::getDebug()) {
173  cout << "PvaClientMonitor::event"
174  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
175  << endl;
176  }
177  PvaClientMonitorRequesterPtr req(pvaClientMonitorRequester.lock());
178  if(req) req->event(monitor);
179 }
std::tr1::shared_ptr< PvaClientMonitorRequester > PvaClientMonitorRequesterPtr
Definition: pvaClient.h:85
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
PvaClientMonitorDataPtr epics::pvaClient::PvaClientMonitor::getData ( )

The data in which monitor events are placed.

Returns
The interface.

Definition at line 488 of file pvaClientMonitor.cpp.

489 {
490  if(PvaClient::getDebug()) {
491  cout << "PvaClientMonitor::getData"
492  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
493  << endl;
494  }
495  checkMonitorState();
496  return pvaClientData;
497 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
PvaClientChannelPtr epics::pvaClient::PvaClientMonitor::getPvaClientChannel ( )

Get the PvaClientChannel;.

Returns
The interface.

Definition at line 483 of file pvaClientMonitor.cpp.

484 {
485  return pvaClientChannel;
486 }
void epics::pvaClient::PvaClientMonitor::issueConnect ( )

Issue the channelMonitor connection to the channel.

This can only be called once. An exception is thrown if connect fails.

Exceptions
runtime_errorif failure.

Definition at line 310 of file pvaClientMonitor.cpp.

311 {
312  if(PvaClient::getDebug()) cout << "PvaClientMonitor::issueConnect\n";
313  if(connectState!=connectIdle) {
314  string message = string("channel ")
315  + pvaClientChannel->getChannel()->getChannelName()
316  + " pvaClientMonitor already connected ";
317  throw std::runtime_error(message);
318  }
319  connectState = connectWait;
320  monitor = pvaClientChannel->getChannel()->createMonitor(monitorRequester,pvRequest);
321 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
epics::pvaClient::PvaClientMonitor::POINTER_DEFINITIONS ( PvaClientMonitor  )
bool epics::pvaClient::PvaClientMonitor::poll ( )

Poll for a monitor event.

The data will be in PvaClientData.

Returns
(false,true) means event (did not, did) occur.

Definition at line 429 of file pvaClientMonitor.cpp.

430 {
431  if(PvaClient::getDebug()) {
432  cout << "PvaClientMonitor::poll"
433  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
434  << endl;
435  }
436  checkMonitorState();
437  monitorElement = monitor->poll();
438  if(!monitorElement) return false;
439  userPoll = true;
440  pvaClientData->setData(monitorElement);
441  return true;
442 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
void epics::pvaClient::PvaClientMonitor::releaseEvent ( )

Release the monitorElement returned by poll.

Definition at line 467 of file pvaClientMonitor.cpp.

468 {
469  if(PvaClient::getDebug()) {
470  cout << "PvaClientMonitor::releaseEvent"
471  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
472  << endl;
473  }
474  if(!userPoll) {
475  string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName()
476  + " PvaClientMonitor::releaseEvent did not call poll";
477  throw std::runtime_error(message);
478  }
479  userPoll = false;
480  monitor->release(monitorElement);
481 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
void epics::pvaClient::PvaClientMonitor::setRequester ( PvaClientMonitorRequesterPtr const &  pvaClientMonitorRequester)

Set a user callback.

Parameters
pvaClientMonitorRequesterThe requester which must be implemented by the caller.

Definition at line 352 of file pvaClientMonitor.cpp.

353 {
354  if(PvaClient::getDebug()) {
355  cout << "PvaClientMonitor::setRequester"
356  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
357  << endl;
358  }
359  this->pvaClientMonitorRequester = pvaClientMonitorRequester;
360 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
void epics::pvaClient::PvaClientMonitor::start ( )

Start monitoring.

Definition at line 362 of file pvaClientMonitor.cpp.

363 {
364  if(PvaClient::getDebug()) {
365  cout << "PvaClientMonitor::start"
366  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
367  << " connectState " << connectState
368  << endl;
369  }
370  if(isStarted) {
371  return;
372  }
373  if(connectState==connectIdle) connect();
374  if(connectState!=connected) {
375  string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName()
376  + " PvaClientMonitor::start illegal state ";
377  throw std::runtime_error(message);
378  }
379  isStarted = true;
380  monitor->start();
381 }
void connect()
Call issueConnect and then waitConnect.
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
void epics::pvaClient::PvaClientMonitor::start ( const std::string &  request)

Start or restart the monitor with a new request.

Parameters
requestThe new request.
void epics::pvaClient::PvaClientMonitor::stop ( )

Stop monitoring.

Definition at line 417 of file pvaClientMonitor.cpp.

418 {
419  if(PvaClient::getDebug()) {
420  cout << "PvaClientMonitor::stop"
421  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
422  << endl;
423  }
424  if(!isStarted) return;
425  isStarted = false;
426  monitor->stop();
427 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
Status epics::pvaClient::PvaClientMonitor::waitConnect ( )

Wait until the channelMonitor connection to the channel is complete.

Returns
status;

Definition at line 323 of file pvaClientMonitor.cpp.

324 {
325  if(PvaClient::getDebug()) {
326  cout << "PvaClientMonitor::waitConnect "
327  << pvaClientChannel->getChannel()->getChannelName()
328  << endl;
329  }
330  {
331  Lock xx(mutex);
332  if(connectState==connected) {
333  if(!monitorConnectStatus.isOK()) connectState = connectIdle;
334  return monitorConnectStatus;
335  }
336  if(connectState!=connectWait) {
337  string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName()
338  + " PvaClientMonitor::waitConnect illegal connect state ";
339  throw std::runtime_error(message);
340  }
341  }
342  waitForConnect.wait();
343  connectState = monitorConnectStatus.isOK() ? connected : connectIdle;
344  if(PvaClient::getDebug()) {
345  cout << "PvaClientMonitor::waitConnect"
346  << " monitorConnectStatus " << (monitorConnectStatus.isOK() ? "connected" : "not connected")
347  << endl;
348  }
349  return monitorConnectStatus;
350 }
A lock for multithreading.
Definition: lock.h:36
bool isOK() const
Definition: status.h:95
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
bool epics::pvaClient::PvaClientMonitor::waitEvent ( double  secondsToWait = 0.0)

Wait for a monitor event.

The data will be in PvaClientData.

Parameters
secondsToWaitTime to wait for event.
Returns
(false,true) means event (did not, did) occur.

Definition at line 444 of file pvaClientMonitor.cpp.

445 {
446  if(PvaClient::getDebug()) {
447  cout << "PvaClientMonitor::waitEvent"
448  << " channelName " << pvaClientChannel->getChannel()->getChannelName()
449  << endl;
450  }
451  if(!isStarted) {
452  string message = string("channel ") + pvaClientChannel->getChannel()->getChannelName()
453  + " PvaClientMonitor::waitEvent illegal state ";
454  throw std::runtime_error(message);
455  }
456  if(poll()) return true;
457  userWait = true;
458  if(secondsToWait==0.0) {
459  waitForEvent.wait();
460  } else {
461  waitForEvent.wait(secondsToWait);
462  }
463  userWait = false;
464  return poll();
465 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97
bool poll()
Poll for a monitor event.

Friends And Related Function Documentation

friend class MonitorRequesterImpl
friend

Definition at line 1700 of file pvaClient.h.


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