This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::ca::CAChannelMonitor Class Reference

#include "caChannel.h"

+ Inheritance diagram for epics::pvAccess::ca::CAChannelMonitor:
+ Collaboration diagram for epics::pvAccess::ca::CAChannelMonitor:

Public Member Functions

 POINTER_DEFINITIONS (CAChannelMonitor)
 
virtual ~CAChannelMonitor ()
 
void subscriptionEvent (struct event_handler_args &args)
 
virtual epics::pvData::Status start ()
 
virtual epics::pvData::Status stop ()
 
virtual MonitorElementPtr poll ()
 
virtual void release (MonitorElementPtr const &monitorElement)
 
virtual void cancel ()
 
virtual std::string getRequesterName ()
 
void activate ()
 
void notifyClient ()
 
- Public Member Functions inherited from epics::pvAccess::Monitor
 POINTER_DEFINITIONS (Monitor)
 
virtual ~Monitor ()
 
virtual void getStats (Stats &s) const
 
virtual void reportRemoteQueueStatus (epics::pvData::int32 freeElements)
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 

Static Public Member Functions

static CAChannelMonitor::shared_pointer create (CAChannel::shared_pointer const &channel, MonitorRequester::shared_pointer const &monitorRequester, epics::pvData::PVStructurePtr const &pvRequest)
 

Additional Inherited Members

- Public Types inherited from epics::pvAccess::Monitor
typedef MonitorRequester requester_type
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Detailed Description

Definition at line 235 of file caChannel.h.

Constructor & Destructor Documentation

epics::pvAccess::ca::CAChannelMonitor::~CAChannelMonitor ( )
virtual

Definition at line 840 of file caChannel.cpp.

841 {
842  if(DEBUG_LEVEL>0) {
843  std::cout << "CAChannelMonitor::~CAChannelMonitor() "
844  << channel->getChannelName()
845  << " isStarted " << (isStarted ? "true" : "false")
846  << endl;
847  }
848  stop();
849 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
virtual epics::pvData::Status stop()
Definition: caChannel.cpp:967

Member Function Documentation

void epics::pvAccess::ca::CAChannelMonitor::activate ( )

Definition at line 851 of file caChannel.cpp.

852 {
853  MonitorRequester::shared_pointer requester(monitorRequester.lock());
854  if(!requester) return;
855  if(DEBUG_LEVEL>0) {
856  std::cout << "CAChannelMonitor::activate " << channel->getChannelName() << endl;
857  }
858  dbdToPv = DbdToPv::create(channel,pvRequest,monitorIO);
859  dbdToPv->getChoices(channel);
860  pvStructure = dbdToPv->createPVStructure();
861  activeElement = MonitorElementPtr(new MonitorElement(pvStructure));
862  int32 queueSize = 2;
863  PVStructurePtr pvOptions = pvRequest->getSubField<PVStructure>("record._options");
864  if (pvOptions) {
865  PVStringPtr pvString = pvOptions->getSubField<PVString>("queueSize");
866  if (pvString) {
867  int size=0;
868  std::stringstream ss;
869  ss << pvString->get();
870  ss >> size;
871  if (size > 1) queueSize = size;
872  }
873  pvString = pvOptions->getSubField<PVString>("DBE");
874  if(pvString) {
875  std::string value(pvString->get());
876  eventMask = 0;
877  if(value.find("VALUE")!=std::string::npos) eventMask|=DBE_VALUE;
878  if(value.find("ARCHIVE")!=std::string::npos) eventMask|=DBE_ARCHIVE;
879  if(value.find("ALARM")!=std::string::npos) eventMask|=DBE_ALARM;
880  if(value.find("PROPERTY")!=std::string::npos) eventMask|=DBE_PROPERTY;
881  }
882  }
883  notifyMonitorRequester = NotifyMonitorRequesterPtr(new NotifyMonitorRequester());
884  notifyMonitorRequester->setChannelMonitor(shared_from_this());
885  monitorQueue = CACMonitorQueuePtr(new CACMonitorQueue(queueSize));
886  EXCEPTION_GUARD(requester->monitorConnect(Status::Ok, shared_from_this(),
887  pvStructure->getStructure()));
888 }
Definition: link.h:174
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
std::tr1::shared_ptr< CACMonitorQueue > CACMonitorQueuePtr
Definition: caChannel.h:232
static Status Ok
Definition: status.h:47
#define DBE_ALARM
Definition: caeventmask.h:41
An element for a monitorQueue.
Definition: monitor.h:54
#define DBE_ARCHIVE
Definition: caeventmask.h:39
storage_t::arg_type get() const
Definition: pvData.h:396
#define DBE_VALUE
Definition: caeventmask.h:38
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< NotifyMonitorRequester > NotifyMonitorRequesterPtr
Definition: caChannel.h:40
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
#define DBE_PROPERTY
Definition: caeventmask.h:42
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
#define EXCEPTION_GUARD(code)
Definition: caChannel.cpp:31
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
static DbdToPvPtr create(CAChannelPtr const &caChannel, epics::pvData::PVStructurePtr const &pvRequest, IOType ioType)
Definition: dbdToPv.cpp:37
int32_t int32
Definition: pvType.h:83
void epics::pvAccess::ca::CAChannelMonitor::cancel ( )
virtual

Definition at line 1010 of file caChannel.cpp.

1011 {
1012  // noop
1013 }
CAChannelMonitorPtr epics::pvAccess::ca::CAChannelMonitor::create ( CAChannel::shared_pointer const &  channel,
MonitorRequester::shared_pointer const &  monitorRequester,
epics::pvData::PVStructurePtr const &  pvRequest 
)
static

Definition at line 815 of file caChannel.cpp.

819 {
820  if(DEBUG_LEVEL>0) {
821  cout << "CAChannelMonitor::create " << channel->getChannelName() << endl;
822  }
823  return CAChannelMonitorPtr(new CAChannelMonitor(channel, monitorRequester, pvRequest));
824 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
std::tr1::shared_ptr< CAChannelMonitor > CAChannelMonitorPtr
Definition: caChannel.h:66
std::string epics::pvAccess::ca::CAChannelMonitor::getRequesterName ( )
virtual

Definition at line 890 of file caChannel.cpp.

890 { return "CAChannelMonitor";}
void epics::pvAccess::ca::CAChannelMonitor::notifyClient ( )

Definition at line 925 of file caChannel.cpp.

926 {
927  {
928  Lock lock(mutex);
929  if(!isStarted) return;
930  }
931  MonitorRequester::shared_pointer requester(monitorRequester.lock());
932  if(!requester) return;
933  requester->monitorEvent(shared_from_this());
934 }
epicsMutexId lock
Definition: osiClockTime.c:37
A lock for multithreading.
Definition: lock.h:36
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
epics::pvAccess::ca::CAChannelMonitor::POINTER_DEFINITIONS ( CAChannelMonitor  )
MonitorElementPtr epics::pvAccess::ca::CAChannelMonitor::poll ( )
virtual

If monitor has occurred return data.

Returns
monitorElement for modified data. Must call get to determine if data is available.

May recursively call MonitorRequester::unlisten()

Implements epics::pvAccess::Monitor.

Definition at line 987 of file caChannel.cpp.

988 {
989  if(DEBUG_LEVEL>1) {
990  std::cout << "CAChannelMonitor::poll " << channel->getChannelName() << endl;
991  }
992  {
993  Lock lock(mutex);
994  if(!isStarted) return MonitorElementPtr();
995  }
996  return monitorQueue->poll();
997 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
epicsMutexId lock
Definition: osiClockTime.c:37
A lock for multithreading.
Definition: lock.h:36
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
void epics::pvAccess::ca::CAChannelMonitor::release ( MonitorElementPtr const &  monitorElement)
virtual

Release a MonitorElement that was returned by poll. A poll() must be called after the release() to check the presence of any modified data.

Parameters
monitorElement

Implements epics::pvAccess::Monitor.

Definition at line 1000 of file caChannel.cpp.

1001 {
1002  if(DEBUG_LEVEL>1) {
1003  std::cout << "CAChannelMonitor::release " << channel->getChannelName() << endl;
1004  }
1005  monitorQueue->release(monitorElement);
1006 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
Status epics::pvAccess::ca::CAChannelMonitor::start ( )
virtual

Start monitoring.

Returns
completion status.

Implements epics::pvAccess::Monitor.

Definition at line 936 of file caChannel.cpp.

937 {
938  if(DEBUG_LEVEL>0) {
939  std::cout << "CAChannelMonitor::start " << channel->getChannelName() << endl;
940  }
942  {
943  Lock lock(mutex);
944  if(isStarted) {
945  status = Status(Status::STATUSTYPE_WARNING,"already started");
946  return status;
947  }
948  isStarted = true;
949  monitorQueue->start();
950  }
951  channel->attachContext();
952  int result = ca_create_subscription(dbdToPv->getRequestType(),
953  0,
954  channel->getChannelID(), eventMask,
955  ca_subscription_handler, this,
956  &pevid);
957  if (result == ECA_NORMAL)
958  {
959  result = ca_flush_io();
960  }
961  if (result == ECA_NORMAL) return status;
962  isStarted = false;
963  string message(ca_message(result));
964  return Status(Status::STATUSTYPE_ERROR,message);
965 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
pvac::PutEvent result
Definition: clientSync.cpp:117
epicsMutexId lock
Definition: osiClockTime.c:37
pvd::Status status
static Status Ok
Definition: status.h:47
A lock for multithreading.
Definition: lock.h:36
#define ECA_NORMAL
Definition: caerr.h:77
int epicsStdCall ca_flush_io()
Definition: access.cpp:509
const char *epicsStdCall ca_message(long ca_status)
Definition: access.cpp:561
LIBCA_API int epicsStdCall ca_create_subscription(chtype type, unsigned long count, chid chanId, long mask, caEventCallBackFunc *pFunc, void *pArg, evid *pEventID)
Status epics::pvAccess::ca::CAChannelMonitor::stop ( )
virtual

Stop Monitoring.

Returns
completion status.

Implements epics::pvAccess::Monitor.

Definition at line 967 of file caChannel.cpp.

968 {
969  if(DEBUG_LEVEL>0) {
970  std::cout << "CAChannelMonitor::stop "
971  << channel->getChannelName()
972  << " isStarted " << (isStarted ? "true" : "false")
973  << endl;
974  }
975  {
976  Lock lock(mutex);
977  if(!isStarted) return Status(Status::STATUSTYPE_WARNING,"already stopped");
978  isStarted = false;
979  }
980  monitorQueue->stop();
981  int result = ca_clear_subscription(pevid);
982  if(result==ECA_NORMAL) return Status::Ok;
983  return Status(Status::STATUSTYPE_ERROR,string(ca_message(result)));
984 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
pvac::PutEvent result
Definition: clientSync.cpp:117
epicsMutexId lock
Definition: osiClockTime.c:37
static Status Ok
Definition: status.h:47
A lock for multithreading.
Definition: lock.h:36
#define ECA_NORMAL
Definition: caerr.h:77
LIBCA_API int epicsStdCall ca_clear_subscription(evid pMon)
const char *epicsStdCall ca_message(long ca_status)
Definition: access.cpp:561
void epics::pvAccess::ca::CAChannelMonitor::subscriptionEvent ( struct event_handler_args args)

Definition at line 892 of file caChannel.cpp.

893 {
894  if(DEBUG_LEVEL>1) {
895  std::cout << "CAChannelMonitor::subscriptionEvent "
896  << channel->getChannelName() << endl;
897  }
898  {
899  Lock lock(mutex);
900  if(!isStarted) return;
901  }
902  MonitorRequester::shared_pointer requester(monitorRequester.lock());
903  if(!requester) return;
904  Status status = dbdToPv->getFromDBD(pvStructure,activeElement->changedBitSet,args);
905  if(status.isOK())
906  {
907  if(monitorQueue->event(pvStructure,activeElement)) {
908  activeElement->changedBitSet->clear();
909  activeElement->overrunBitSet->clear();
910  } else {
911  *(activeElement->overrunBitSet) |= *(activeElement->changedBitSet);
912  }
913  monitorEventThread->event(notifyMonitorRequester);
914  }
915  else
916  {
917  string mess("CAChannelMonitor::subscriptionEvent ");
918  mess += channel->getChannelName();
919  mess += ca_message(args.status);
920  throw std::runtime_error(mess);
921  }
922 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
epicsMutexId lock
Definition: osiClockTime.c:37
pvd::Status status
A lock for multithreading.
Definition: lock.h:36
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
const char *epicsStdCall ca_message(long ca_status)
Definition: access.cpp:561
bool isOK() const
Definition: status.h:95

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