pvaClientCPP 4.8.1
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
19using namespace epics::pvData;
20using namespace epics::pvAccess;
21using namespace epics::nt;
22using namespace std;
23
24namespace epics { namespace pvaClient {
25
26
28 PvaClientMultiChannelPtr const &pvaMultiChannel,
29 PvaClientChannelArray const &pvaClientChannelArray)
30{
31 PvaClientMultiGetDoublePtr pvaClientMultiGetDouble(
32 new PvaClientMultiGetDouble(pvaMultiChannel,pvaClientChannelArray));
33 return pvaClientMultiGetDouble;
34}
35
36PvaClientMultiGetDouble::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
50{
51 if(PvaClient::getDebug()) cout<< "PvaClientMultiGetDouble::~PvaClientMultiGetDouble()\n";
52}
53
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
78shared_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}}
Provides channelGet to multiple channels where each channel has a numeric scalar value field.
void connect()
Create a channelGet for each channel.
static PvaClientMultiGetDoublePtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
epics::pvData::shared_vector< double > get()
Get the data.
static bool getDebug()
Is debug set?
Definition pvaClient.cpp:97
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
Definition pvaClient.h:70
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr