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

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

#include "pvaClientMultiChannel.h"

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

Public Member Functions

 POINTER_DEFINITIONS (PvaClientNTMultiPut)
 
 ~PvaClientNTMultiPut ()
 
void connect ()
 Connect a channelPut for each channel. More...
 
epics::pvData::shared_vector< epics::pvData::PVUnionPtrgetValues ()
 Get the value field of each channel as a union. More...
 
void put ()
 Issue a put for each channel. '. More...
 
PvaClientNTMultiPutPtr getPtrSelf ()
 Get the shared pointer to self. More...
 

Static Public Member Functions

static PvaClientNTMultiPutPtr create (PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
 Create a PvaClientNTMultiPut. More...
 

Detailed Description

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

Definition at line 401 of file pvaClientMultiChannel.h.

Constructor & Destructor Documentation

epics::pvaClient::PvaClientNTMultiPut::~PvaClientNTMultiPut ( )

Definition at line 49 of file pvaClientNTMultiPut.cpp.

50 {
51  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiPut::~PvaClientNTMultiPut()\n";
52 }
static bool getDebug()
Is debug set?
Definition: pvaClient.cpp:97

Member Function Documentation

void epics::pvaClient::PvaClientNTMultiPut::connect ( )

Connect a channelPut for each channel.

Definition at line 54 of file pvaClientNTMultiPut.cpp.

55 {
56  pvaClientPut.resize(nchannel);
57  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
58  for(size_t i=0; i<nchannel; ++i)
59  {
60  if(isConnected[i]) {
61  pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
62  pvaClientPut[i]->issueConnect();
63  }
64  }
65  for(size_t i=0; i<nchannel; ++i)
66  {
67  if(isConnected[i]) {
68  Status status = pvaClientPut[i]->waitConnect();
69  if(status.isOK()) continue;
70  string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
71  + " PvaChannelPut::waitConnect " + status.getMessage();
72  throw std::runtime_error(message);
73  }
74  }
75  for(size_t i=0; i<nchannel; ++i)
76  {
77  if(isConnected[i]) {
78  pvaClientPut[i]->issueGet();
79  }
80  }
81  for(size_t i=0; i<nchannel; ++i)
82  {
83  if(isConnected[i]) {
84  Status status = pvaClientPut[i]->waitGet();
85  if(status.isOK()) continue;
86  string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
87  + " PvaChannelPut::waitGet " + status.getMessage();
88  throw std::runtime_error(message);
89  }
90  }
91  FieldCreatePtr fieldCreate = getFieldCreate();
92  PVDataCreatePtr pvDataCreate = getPVDataCreate();
93  for(size_t i=0; i<nchannel; ++i)
94  {
95  if(isConnected[i]) {
96  value[i] = pvaClientPut[i]->getData()->getValue();
97  FieldBuilderPtr builder = fieldCreate->createFieldBuilder();
98  builder->add("value",value[i]->getField());
99  unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion());
100  }
101  }
102  this->isConnected = true;
103 }
Definition: link.h:174
pvd::Status status
int i
Definition: scan.c:967
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
const std::string & getMessage() const
Definition: status.h:80
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
bool isOK() const
Definition: status.h:95
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
PvaClientNTMultiPutPtr epics::pvaClient::PvaClientNTMultiPut::create ( PvaClientMultiChannelPtr const &  pvaClientMultiChannel,
PvaClientChannelArray const &  pvaClientChannelArray 
)
static

Create a PvaClientNTMultiPut.

Parameters
pvaClientMultiChannelThe interface to PvaClientMultiChannel.
pvaClientChannelArrayThe PvaClientChannel array.
Returns
The interface.

Definition at line 27 of file pvaClientNTMultiPut.cpp.

30 {
32  new PvaClientNTMultiPut(pvaMultiChannel,pvaClientChannelArray));
33 }
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
PvaClientNTMultiPutPtr epics::pvaClient::PvaClientNTMultiPut::getPtrSelf ( )
inline

Get the shared pointer to self.

Returns
The shared pointer.

Definition at line 434 of file pvaClientMultiChannel.h.

435  {
436  return shared_from_this();
437  }
shared_vector< epics::pvData::PVUnionPtr > epics::pvaClient::PvaClientNTMultiPut::getValues ( )

Get the value field of each channel as a union.

Returns
A shared vector of union.

Definition at line 105 of file pvaClientNTMultiPut.cpp.

106 {
107  if(!isConnected) connect();
108  return unionValue;
109 }
void connect()
Connect a channelPut for each channel.
epics::pvaClient::PvaClientNTMultiPut::POINTER_DEFINITIONS ( PvaClientNTMultiPut  )
void epics::pvaClient::PvaClientNTMultiPut::put ( )

Issue a put for each channel. '.

Definition at line 111 of file pvaClientNTMultiPut.cpp.

112 {
113  if(!isConnected) connect();
114  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
115  for(size_t i=0; i<nchannel; ++i)
116  {
117  if(isConnected[i]) {
118  value[i]->copy(*unionValue[i]->get());
119  pvaClientPut[i]->issuePut();
120  }
121  if(isConnected[i]) {
122  Status status = pvaClientPut[i]->waitPut();
123  if(status.isOK()) continue;
124  string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
125  + " PvaChannelPut::waitPut " + status.getMessage();
126  throw std::runtime_error(message);
127  }
128  }
129 }
Definition: link.h:174
pvd::Status status
int i
Definition: scan.c:967
const std::string & getMessage() const
Definition: status.h:80
void connect()
Connect a channelPut for each channel.
bool isOK() const
Definition: status.h:95

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