This is Unofficial EPICS BASE Doxygen Site
pvaClientNTMultiPut.cpp
Go to the documentation of this file.
1 /* PvaClientNTMultiPut.cpp */
12 #include <pv/standardField.h>
13 #include <pv/convert.h>
14 #include <epicsMath.h>
15 
16 #define epicsExportSharedSymbols
17 
19 
20 using namespace epics::pvData;
21 using namespace epics::pvAccess;
22 using namespace epics::nt;
23 using namespace std;
24 
25 namespace epics { namespace pvaClient {
26 
27 PvaClientNTMultiPutPtr PvaClientNTMultiPut::create(
28  PvaClientMultiChannelPtr const &pvaMultiChannel,
29  PvaClientChannelArray const &pvaClientChannelArray)
30 {
32  new PvaClientNTMultiPut(pvaMultiChannel,pvaClientChannelArray));
33 }
34 
35 PvaClientNTMultiPut::PvaClientNTMultiPut(
36  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
37  PvaClientChannelArray const &pvaClientChannelArray)
38 : pvaClientMultiChannel(pvaClientMultiChannel),
39  pvaClientChannelArray(pvaClientChannelArray),
40  nchannel(pvaClientChannelArray.size()),
43  isConnected(false)
44 {
45  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiPut::PvaClientNTMultiPut()\n";
46 }
47 
48 
49 PvaClientNTMultiPut::~PvaClientNTMultiPut()
50 {
51  if(PvaClient::getDebug()) cout<< "PvaClientNTMultiPut::~PvaClientNTMultiPut()\n";
52 }
53 
54 void PvaClientNTMultiPut::connect()
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 }
104 
105 shared_vector<epics::pvData::PVUnionPtr> PvaClientNTMultiPut::getValues()
106 {
107  if(!isConnected) connect();
108  return unionValue;
109 }
110 
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 }
130 
131 
132 }}
Definition: link.h:174
std::tr1::shared_ptr< detail::SharedPut > put
pvd::Status status
int i
Definition: scan.c:967
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
Provides channelPut to multiple channels where the value field of each channel is presented as a unio...
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
Holds all PVA related.
Definition: pvif.h:34
std::tr1::shared_ptr< PVUnion > PVUnionPtr
Definition: pvData.h:107
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
bool isOK() const
Definition: status.h:95
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648