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

#include "caChannel.h"

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

Public Member Functions

 POINTER_DEFINITIONS (CAChannelPut)
 
virtual ~CAChannelPut ()
 
void putDone (struct event_handler_args &args)
 
void getDone (struct event_handler_args &args)
 
virtual void put (epics::pvData::PVStructure::shared_pointer const &pvPutStructure, epics::pvData::BitSet::shared_pointer const &putBitSet)
 
virtual void get ()
 
virtual Channel::shared_pointer getChannel ()
 
virtual void cancel ()
 
virtual void lastRequest ()
 
virtual std::string getRequesterName ()
 
void activate ()
 
void notifyClient ()
 
- Public Member Functions inherited from epics::pvAccess::ChannelPut
 POINTER_DEFINITIONS (ChannelPut)
 
virtual ~ChannelPut ()
 
- Public Member Functions inherited from epics::pvAccess::ChannelRequest
 POINTER_DEFINITIONS (ChannelRequest)
 
 ChannelRequest ()
 
virtual ~ChannelRequest ()
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 
virtual void lock ()
 
virtual void unlock ()
 

Static Public Member Functions

static CAChannelPut::shared_pointer create (CAChannel::shared_pointer const &channel, ChannelPutRequester::shared_pointer const &channelPutRequester, epics::pvData::PVStructurePtr const &pvRequest)
 

Additional Inherited Members

- Public Types inherited from epics::pvAccess::ChannelPut
typedef ChannelPutRequester requester_type
 
- Static Public Attributes inherited from epics::pvAccess::ChannelRequest
static size_t num_instances
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Detailed Description

Definition at line 187 of file caChannel.h.

Constructor & Destructor Documentation

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

Definition at line 582 of file caChannel.cpp.

583 {
584  if(DEBUG_LEVEL>0) {
585  std::cout << "CAChannelPut::~CAChannelPut() " << channel->getChannelName() << endl;
586  }
587 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25

Member Function Documentation

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

Definition at line 590 of file caChannel.cpp.

591 {
592  ChannelPutRequester::shared_pointer putRequester(channelPutRequester.lock());
593  if(!putRequester) return;
594  if(DEBUG_LEVEL>0) {
595  cout << "CAChannelPut::activate " << channel->getChannelName() << endl;
596  }
597  dbdToPv = DbdToPv::create(channel,pvRequest,putIO);
598  dbdToPv->getChoices(channel);
599  pvStructure = dbdToPv->createPVStructure();
600  bitSet = BitSetPtr(new BitSet(pvStructure->getStructure()->getNumberFields()));
601  PVStringPtr pvString = pvRequest->getSubField<PVString>("record._options.block");
602  if(pvString) {
603  std::string val = pvString->get();
604  if(val.compare("true")==0) block = true;
605  }
606  notifyPutRequester = NotifyPutRequesterPtr(new NotifyPutRequester());
607  notifyPutRequester->setChannelPut(shared_from_this());
608  EXCEPTION_GUARD(putRequester->channelPutConnect(Status::Ok, shared_from_this(),
609  pvStructure->getStructure()));
610 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
static Status Ok
Definition: status.h:47
A vector of bits.
Definition: bitSet.h:56
storage_t::arg_type get() const
Definition: pvData.h:396
PVString is special case, since it implements SerializableArray.
Definition: pvData.h:521
std::tr1::shared_ptr< PVString > PVStringPtr
Definition: pvData.h:540
std::tr1::shared_ptr< NotifyPutRequester > NotifyPutRequesterPtr
Definition: caChannel.h:51
#define EXCEPTION_GUARD(code)
Definition: caChannel.cpp:31
std::tr1::shared_ptr< BitSet > BitSetPtr
Definition: bitSet.h:26
static DbdToPvPtr create(CAChannelPtr const &caChannel, epics::pvData::PVStructurePtr const &pvRequest, IOType ioType)
Definition: dbdToPv.cpp:37
void epics::pvAccess::ca::CAChannelPut::cancel ( )
virtual

Cancel any pending request. Completion will be reported via request's response callback:

  • if cancel() request is issued after the request was already complete, request success/failure completion will be reported and cancel() request ignored.
  • if the request was actually canceled, cancellation completion is reported.

Implements epics::pvAccess::ChannelRequest.

Definition at line 729 of file caChannel.cpp.

730 {
731 }
CAChannelPutPtr epics::pvAccess::ca::CAChannelPut::create ( CAChannel::shared_pointer const &  channel,
ChannelPutRequester::shared_pointer const &  channelPutRequester,
epics::pvData::PVStructurePtr const &  pvRequest 
)
static

Definition at line 557 of file caChannel.cpp.

561 {
562  if(DEBUG_LEVEL>0) {
563  cout << "CAChannelPut::create " << channel->getChannelName() << endl;
564  }
565  return CAChannelPutPtr(new CAChannelPut(channel, channelPutRequester, pvRequest));
566 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
std::tr1::shared_ptr< CAChannelPut > CAChannelPutPtr
Definition: caChannel.h:60
void epics::pvAccess::ca::CAChannelPut::get ( )
virtual

Get the current data.

Ownership transfer as with ChannelGet::get()

Implements epics::pvAccess::ChannelPut.

Definition at line 693 of file caChannel.cpp.

694 {
695  if(DEBUG_LEVEL>1) {
696  std::cout << "CAChannelPut::get " << channel->getChannelName() << endl;
697  }
698  ChannelPutRequester::shared_pointer putRequester(channelPutRequester.lock());
699  if(!putRequester) return;
700  {
701  Lock lock(mutex);
702  isPut = false;
703  }
704 
705  channel->attachContext();
706  bitSet->clear();
707  int result = ca_array_get_callback(dbdToPv->getRequestType(),
708  0,
709  channel->getChannelID(), ca_put_get_handler, this);
710  if (result == ECA_NORMAL)
711  {
712  result = ca_flush_io();
713  }
714  if (result != ECA_NORMAL)
715  {
716  string mess("CAChannelPut::get ");
717  mess += channel->getChannelName() + " message " +ca_message(result);
719  EXCEPTION_GUARD(putRequester->getDone(status, shared_from_this(), pvStructure, bitSet));
720  }
721 }
LIBCA_API int epicsStdCall ca_array_get_callback(chtype type, unsigned long count, chid chanId, caEventCallBackFunc *pFunc, void *pArg)
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
pvac::PutEvent result
Definition: clientSync.cpp:117
pvd::Status status
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
virtual void lock()
Definition: pvAccess.h:97
#define EXCEPTION_GUARD(code)
Definition: caChannel.cpp:31
Channel::shared_pointer epics::pvAccess::ca::CAChannelPut::getChannel ( )
virtual

Get a channel instance this request belongs to.

Returns
the channel instance.

Implements epics::pvAccess::ChannelRequest.

Definition at line 724 of file caChannel.cpp.

725 {
726  return channel;
727 }
void epics::pvAccess::ca::CAChannelPut::getDone ( struct event_handler_args args)

Definition at line 669 of file caChannel.cpp.

670 {
671  if(DEBUG_LEVEL>1) {
672  cout << "CAChannelPut::getDone " << channel->getChannelName() << endl;
673  }
674 
675  ChannelPutRequester::shared_pointer putRequester(channelPutRequester.lock());
676  if(!putRequester) return;
677  getStatus = dbdToPv->getFromDBD(pvStructure,bitSet,args);
678  putDoneThread->putDone(notifyPutRequester);
679 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
std::string epics::pvAccess::ca::CAChannelPut::getRequesterName ( )
virtual

Definition at line 612 of file caChannel.cpp.

612 { return "CAChannelPut";}
void epics::pvAccess::ca::CAChannelPut::lastRequest ( )
virtual

Announce next request as last request. When last request will be completed (regardless of completion status) the remote and local instance will be destroyed.

Implements epics::pvAccess::ChannelRequest.

Definition at line 733 of file caChannel.cpp.

734 {
735 }
void epics::pvAccess::ca::CAChannelPut::notifyClient ( )

Definition at line 681 of file caChannel.cpp.

682 {
683  ChannelPutRequester::shared_pointer putRequester(channelPutRequester.lock());
684  if(!putRequester) return;
685  if(isPut) {
686  EXCEPTION_GUARD(putRequester->putDone(putStatus, shared_from_this()));
687  } else {
688  EXCEPTION_GUARD(putRequester->getDone(getStatus, shared_from_this(), pvStructure, bitSet));
689  }
690 }
#define EXCEPTION_GUARD(code)
Definition: caChannel.cpp:31
epics::pvAccess::ca::CAChannelPut::POINTER_DEFINITIONS ( CAChannelPut  )
void epics::pvAccess::ca::CAChannelPut::put ( epics::pvData::PVStructure::shared_pointer const &  pvPutStructure,
epics::pvData::BitSet::shared_pointer const &  putBitSet 
)
virtual

Put data to a channel.

Completion status is reported by calling ChannelPutRequester::putDone()

Ownership of the PVStructure is transfered to the ChannelPut until ChannelPutRequester::putDone() or ChannelPutRequester::channelDisconnect() is called.

Parameters
pvPutStructureThe PVStructure that holds the putData.
putBitSetputPVStructure bit-set (selects what fields to put).

Implements epics::pvAccess::ChannelPut.

Definition at line 634 of file caChannel.cpp.

636 {
637  if(DEBUG_LEVEL>1) {
638  cout << "CAChannelPut::put " << channel->getChannelName() << endl;
639  }
640  ChannelPutRequester::shared_pointer putRequester(channelPutRequester.lock());
641  if(!putRequester) return;
642  {
643  Lock lock(mutex);
644  isPut = true;
645  }
646  putStatus = dbdToPv->putToDBD(channel,pvPutStructure,block,&ca_put_handler,this);
647  if(!block || !putStatus.isOK()) {
648  EXCEPTION_GUARD(putRequester->putDone(putStatus, shared_from_this()));
649  }
650 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
A lock for multithreading.
Definition: lock.h:36
virtual void lock()
Definition: pvAccess.h:97
#define EXCEPTION_GUARD(code)
Definition: caChannel.cpp:31
bool isOK() const
Definition: status.h:95
void epics::pvAccess::ca::CAChannelPut::putDone ( struct event_handler_args args)

Definition at line 653 of file caChannel.cpp.

654 {
655  if(DEBUG_LEVEL>1) {
656  cout << "CAChannelPut::putDone " << channel->getChannelName() << endl;
657  }
658  ChannelPutRequester::shared_pointer putRequester(channelPutRequester.lock());
659  if(!putRequester) return;
660  if(args.status!=ECA_NORMAL)
661  {
662  putStatus = Status(Status::STATUSTYPE_ERROR, string(ca_message(args.status)));
663  } else {
664  putStatus = Status::Ok;
665  }
666  putDoneThread->putDone(notifyPutRequester);
667 }
#define DEBUG_LEVEL
Definition: caProviderPvt.h:25
static Status Ok
Definition: status.h:47
#define ECA_NORMAL
Definition: caerr.h:77
const char *epicsStdCall ca_message(long ca_status)
Definition: access.cpp:561

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