12 #include <pv/convert.h> 13 #include <epicsMath.h> 15 #define epicsExportSharedSymbols 24 namespace epics {
namespace pvaClient {
33 return pvaClientMultiGetDouble;
36 PvaClientMultiGetDouble::PvaClientMultiGetDouble(
39 : pvaClientMultiChannel(pvaClientMultiChannel),
40 pvaClientChannelArray(pvaClientChannelArray),
41 nchannel(pvaClientChannelArray.size()),
42 doubleValue( shared_vector<double>(nchannel)),
46 if(PvaClient::getDebug()) cout<<
"PvaClientMultiGetDouble::PvaClientMultiGetDouble()\n";
49 PvaClientMultiGetDouble::~PvaClientMultiGetDouble()
51 if(PvaClient::getDebug()) cout<<
"PvaClientMultiGetDouble::~PvaClientMultiGetDouble()\n";
54 void PvaClientMultiGetDouble::connect()
56 shared_vector<epics::pvData::boolean>isConnected = pvaClientMultiChannel->getIsConnected();
57 string request =
"value";
58 for(
size_t i=0; i<nchannel; ++i)
61 pvaClientGet[i] = pvaClientChannelArray[i]->createGet(request);
62 pvaClientGet[i]->issueConnect();
65 for(
size_t i=0; i<nchannel; ++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);
75 isGetConnected =
true;
78 shared_vector<double> PvaClientMultiGetDouble::get()
80 if(!isGetConnected) connect();
81 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
82 for(
size_t i=0; i<nchannel; ++i)
85 if(!pvaClientGet[i]) pvaClientGet[i]=pvaClientChannelArray[i]->createGet(
"value");
86 pvaClientGet[i]->issueGet();
89 for(
size_t i=0; i<nchannel; ++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);
99 for(
size_t i=0; i<nchannel; ++i)
103 PVStructurePtr pvStructure = pvaClientGet[i]->getData()->getPVStructure();
104 PVScalarPtr pvScalar(pvStructure->getSubField<PVScalar>(
"value"));
106 ScalarType scalarType = pvScalar->getScalar()->getScalarType();
107 if(ScalarTypeFunc::isNumeric(scalarType)) {
108 doubleValue[i] = getConvert()->toDouble(pvScalar);
110 doubleValue[i] = epicsNAN;
113 doubleValue[i] = epicsNAN;
116 doubleValue[i] = epicsNAN;
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
Provides channelGet to multiple channels where each channel has a numeric scalar value field...
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr