pvaClientCPP  4.8.1-dev
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 
78 shared_vector<double> PvaClientMultiGetDouble::get()
79 {
80  if(!isGetConnected) connect();
81  shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
82  for(size_t i=0; i<nchannel; ++i)
83  {
84  if(isConnected[i]) {
85  if(!pvaClientGet[i]) pvaClientGet[i]=pvaClientChannelArray[i]->createGet("value");
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  for(size_t i=0; i<nchannel; ++i)
100  {
101  if(isConnected[i])
102  {
103  PVStructurePtr pvStructure = pvaClientGet[i]->getData()->getPVStructure();
104  PVScalarPtr pvScalar(pvStructure->getSubField<PVScalar>("value"));
105  if(pvScalar) {
106  ScalarType scalarType = pvScalar->getScalar()->getScalarType();
107  if(ScalarTypeFunc::isNumeric(scalarType)) {
108  doubleValue[i] = getConvert()->toDouble(pvScalar);
109  } else {
110  doubleValue[i] = epicsNAN;
111  }
112  } else {
113  doubleValue[i] = epicsNAN;
114  }
115  } else {
116  doubleValue[i] = epicsNAN;
117  }
118  }
119  return doubleValue;
120 }
121 
122 }}
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
STL namespace.
Provides channelGet to multiple channels where each channel has a numeric scalar value field...
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
Definition: pvaClient.h:69
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr