This is Unofficial EPICS BASE Doxygen Site
pvaClientMultiPutDouble.cpp
Go to the documentation of this file.
1 /* pvaClientMultiPutDouble.cpp */
12 #include <pv/convert.h>
13 #include <epicsMath.h>
14 
15 #define epicsExportSharedSymbols
16 
18 
19 using namespace epics::pvData;
20 using namespace epics::pvAccess;
21 using namespace epics::nt;
22 using namespace std;
23 
24 namespace epics { namespace pvaClient {
25 
26 
27 PvaClientMultiPutDoublePtr PvaClientMultiPutDouble::create(
28  PvaClientMultiChannelPtr const &pvaMultiChannel,
29  PvaClientChannelArray const &pvaClientChannelArray)
30 {
31  PvaClientMultiPutDoublePtr pvaClientMultiPutDouble(
32  new PvaClientMultiPutDouble(pvaMultiChannel,pvaClientChannelArray));
33  return pvaClientMultiPutDouble;
34 }
35 
36 PvaClientMultiPutDouble::PvaClientMultiPutDouble(
37  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
38  PvaClientChannelArray const &pvaClientChannelArray)
39 : pvaClientMultiChannel(pvaClientMultiChannel),
40  pvaClientChannelArray(pvaClientChannelArray),
41  nchannel(pvaClientChannelArray.size()),
42  pvaClientPut(std::vector<PvaClientPutPtr>(nchannel,PvaClientPutPtr())),
43  isPutConnected(false)
44 {
45  if(PvaClient::getDebug()) cout<< "PvaClientMultiPutDouble::PvaClientMultiPutDouble()\n";
46 }
47 
48 
49 
50 PvaClientMultiPutDouble::~PvaClientMultiPutDouble()
51 {
52  if(PvaClient::getDebug()) cout<< "PvaClientMultiPutDouble::~PvaClientMultiPutDouble()\n";
53 }
54 
55 
56 void PvaClientMultiPutDouble::connect()
57 {
58  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
59  for(size_t i=0; i<nchannel; ++i)
60  {
61  if(isConnected[i]) {
62  pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
63  pvaClientPut[i]->issueConnect();
64  }
65  }
66  for(size_t i=0; i<nchannel; ++i)
67  {
68  if(isConnected[i]) {
69  Status status = pvaClientPut[i]->waitConnect();
70  if(status.isOK()) continue;
71  string message = string("channel ") + pvaClientChannelArray[i]->getChannelName()
72  + " PvaChannelPut::waitConnect " + status.getMessage();
73  throw std::runtime_error(message);
74  }
75  }
76  isPutConnected = true;
77 }
78 
80 {
81  if(!isPutConnected) connect();
82  if(data.size()!=nchannel) {
83  throw std::runtime_error("data has wrong size");
84  }
85  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
86  for(size_t i=0; i<nchannel; ++i)
87  {
88  if(isConnected[i]) {
89  PVStructurePtr pvTop = pvaClientPut[i]->getData()->getPVStructure();
90  PVScalarPtr pvValue = pvTop->getSubField<PVScalar>("value");
91  getConvert()->fromDouble(pvValue,data[i]);
92  pvaClientPut[i]->issuePut();
93  }
94  if(isConnected[i]) {
95  Status status = pvaClientPut[i]->waitPut();
96  if(status.isOK()) continue;
97  string message = string("channel ") + pvaClientChannelArray[i]->getChannelName()
98  + " PvaChannelPut::waitPut " + status.getMessage();
99  throw std::runtime_error(message);
100  }
101  }
102 }
103 
104 }}
PVScalar is the base class for each scalar field.
Definition: pvData.h:272
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 each channel has a numeric scalar value field...
const std::string & getMessage() const
Definition: status.h:80
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr
Definition: pvaClient.h:76
Holds all PVA related.
Definition: pvif.h:34
pvData
Definition: monitor.h:428
std::tr1::shared_ptr< PVScalar > PVScalarPtr
Definition: pvData.h:77
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
bool isOK() const
Definition: status.h:95
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr