12 #include <pv/convert.h> 13 #include <epicsMath.h> 15 #define epicsExportSharedSymbols 24 namespace epics {
namespace pvaClient {
33 return pvaClientMultiPutDouble;
36 PvaClientMultiPutDouble::PvaClientMultiPutDouble(
39 : pvaClientMultiChannel(pvaClientMultiChannel),
40 pvaClientChannelArray(pvaClientChannelArray),
41 nchannel(pvaClientChannelArray.size()),
45 if(PvaClient::getDebug()) cout<<
"PvaClientMultiPutDouble::PvaClientMultiPutDouble()\n";
50 PvaClientMultiPutDouble::~PvaClientMultiPutDouble()
52 if(PvaClient::getDebug()) cout<<
"PvaClientMultiPutDouble::~PvaClientMultiPutDouble()\n";
56 void PvaClientMultiPutDouble::connect()
58 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
59 for(
size_t i=0; i<nchannel; ++i)
62 pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
63 pvaClientPut[i]->issueConnect();
66 for(
size_t i=0; i<nchannel; ++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);
76 isPutConnected =
true;
79 void PvaClientMultiPutDouble::put(shared_vector<double>
const &data)
81 if(!isPutConnected) connect();
82 if(data.size()!=nchannel) {
83 throw std::runtime_error(
"data has wrong size");
85 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
86 for(
size_t i=0; i<nchannel; ++i)
89 if(!pvaClientPut[i]) pvaClientPut[i]=pvaClientChannelArray[i]->createPut(
"value");
90 PVStructurePtr pvTop = pvaClientPut[i]->getData()->getPVStructure();
91 PVScalarPtr pvScalar= pvTop->getSubField<PVScalar>(
"value");
92 if(pvScalar && ScalarTypeFunc::isNumeric(pvScalar->getScalar()->getScalarType())) {
93 getConvert()->fromDouble(pvScalar,data[i]);
94 pvaClientPut[i]->issuePut();
96 string message = string(
"channel ")
97 + pvaClientChannelArray[i]->getChannelName()
98 +
" is not a numeric scalar";
99 throw std::runtime_error(message);
103 Status status = pvaClientPut[i]->waitPut();
104 if(status.isOK())
continue;
105 string message = string(
"channel ") + pvaClientChannelArray[i]->getChannelName()
106 +
" PvaChannelPut::waitPut " + status.getMessage();
107 throw std::runtime_error(message);
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
Provides channelPut to multiple channels where each channel has a numeric scalar value field...
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr