This is Unofficial EPICS BASE Doxygen Site
pvaClientMultiGetDouble.cpp
Go to the documentation of this file.
1 /* pvaClientMultiGetDouble.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 PvaClientMultiGetDoublePtr PvaClientMultiGetDouble::create(
28  PvaClientMultiChannelPtr const &pvaMultiChannel,
29  PvaClientChannelArray const &pvaClientChannelArray)
30 {
31  PvaClientMultiGetDoublePtr pvaClientMultiGetDouble(
32  new PvaClientMultiGetDouble(pvaMultiChannel,pvaClientChannelArray));
33  return pvaClientMultiGetDouble;
34 }
35 
36 PvaClientMultiGetDouble::PvaClientMultiGetDouble(
37  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
38  PvaClientChannelArray const &pvaClientChannelArray)
39 : pvaClientMultiChannel(pvaClientMultiChannel),
40  pvaClientChannelArray(pvaClientChannelArray),
41  nchannel(pvaClientChannelArray.size()),
42  doubleValue(shared_vector<double>(nchannel)),
43  pvaClientGet(std::vector<PvaClientGetPtr>(nchannel,PvaClientGetPtr())),
44  isGetConnected(false)
45 {
46  if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::PvaClientMultiGetDouble()\n";
47 }
48 
49 PvaClientMultiGetDouble::~PvaClientMultiGetDouble()
50 {
51  if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::~PvaClientMultiGetDouble()\n";
52 }
53 
54 void PvaClientMultiGetDouble::connect()
55 {
56  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
57  string request = "value";
58  for(size_t i=0; i<nchannel; ++i)
59  {
60  if(isConnected[i]) {
61  pvaClientGet[i] = pvaClientChannelArray[i]->createGet(request);
62  pvaClientGet[i]->issueConnect();
63  }
64  }
65  for(size_t i=0; i<nchannel; ++i)
66  {
67  if(isConnected[i]) {
68  Status status = pvaClientGet[i]->waitConnect();
69  if(status.isOK()) continue;
70  string message = string("channel ") + pvaClientChannelArray[i]->getChannelName()
71  + " PvaChannelGet::waitConnect " + status.getMessage();
72  throw std::runtime_error(message);
73  }
74  }
75  isGetConnected = true;
76 }
77 
79 {
80  if(!isGetConnected) connect();
81  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
82 
83  for(size_t i=0; i<nchannel; ++i)
84  {
85  if(isConnected[i]) {
86  pvaClientGet[i]->issueGet();
87  }
88  }
89  for(size_t i=0; i<nchannel; ++i)
90  {
91  if(isConnected[i]) {
92  Status status = pvaClientGet[i]->waitGet();
93  if(status.isOK()) continue;
94  string message = string("channel ") + pvaClientChannelArray[i]->getChannelName()
95  + " PvaChannelGet::waitGet " + status.getMessage();
96  throw std::runtime_error(message);
97  }
98  }
99 
100  for(size_t i=0; i<nchannel; ++i)
101  {
102  if(isConnected[i])
103  {
104  PVStructurePtr pvStructure = pvaClientGet[i]->getData()->getPVStructure();
105  doubleValue[i] = getConvert()->toDouble(pvStructure->getSubField<PVScalar>("value"));
106  } else {
107  doubleValue[i] = epicsNAN;
108  }
109  }
110  return doubleValue;
111 }
112 
113 }}
PVScalar is the base class for each scalar field.
Definition: pvData.h:272
std::string request
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 channelGet to multiple channels where each channel has a numeric scalar value field...
const std::string & getMessage() const
Definition: status.h:80
Holds all PVA related.
Definition: pvif.h:34
pvData
Definition: monitor.h:428
float epicsNAN
Definition: epicsMath.cpp:35
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
Definition: pvaClient.h:71
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
Definition: caget.c:48
bool isOK() const
Definition: status.h:95