pvaClientCPP 4.8.1
pvaClientMultiPutDouble.cpp
Go to the documentation of this file.
1/* pvaClientMultiPutDouble.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 PvaClientMultiPutDoublePtr pvaClientMultiPutDouble(
32 new PvaClientMultiPutDouble(pvaMultiChannel,pvaClientChannelArray));
33 return pvaClientMultiPutDouble;
34}
35
36PvaClientMultiPutDouble::PvaClientMultiPutDouble(
37 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
38 PvaClientChannelArray const &pvaClientChannelArray)
39: pvaClientMultiChannel(pvaClientMultiChannel),
40 pvaClientChannelArray(pvaClientChannelArray),
41 nchannel(pvaClientChannelArray.size()),
42 pvaClientPut(std::vector<PvaClientPutPtr>(nchannel,PvaClientPutPtr())),
43 isPutConnected(false)
44{
45 if(PvaClient::getDebug()) cout<< "PvaClientMultiPutDouble::PvaClientMultiPutDouble()\n";
46}
47
48
49
51{
52 if(PvaClient::getDebug()) cout<< "PvaClientMultiPutDouble::~PvaClientMultiPutDouble()\n";
53}
54
55
57{
58 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
59 for(size_t i=0; i<nchannel; ++i)
60 {
61 if(isConnected[i]) {
62 pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
63 pvaClientPut[i]->issueConnect();
64 }
65 }
66 for(size_t i=0; i<nchannel; ++i)
67 {
68 if(isConnected[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);
74 }
75 }
76 isPutConnected = true;
77}
78
79void PvaClientMultiPutDouble::put(shared_vector<double> const &data)
80{
81 if(!isPutConnected) connect();
82 if(data.size()!=nchannel) {
83 throw std::runtime_error("data has wrong size");
84 }
85 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
86 for(size_t i=0; i<nchannel; ++i)
87 {
88 if(isConnected[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();
95 } else {
96 string message = string("channel ")
97 + pvaClientChannelArray[i]->getChannelName()
98 + " is not a numeric scalar";
99 throw std::runtime_error(message);
100 }
101 }
102 if(isConnected[i]) {
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);
108 }
109 }
110}
111
112}}
Provides channelPut to multiple channels where each channel has a numeric scalar value field.
void put(epics::pvData::shared_vector< double > const &data)
put data to each channel as a double
void connect()
Create a channelPut for each channel.
static PvaClientMultiPutDoublePtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray)
static bool getDebug()
Is debug set?
Definition pvaClient.cpp:97
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr
Definition pvaClient.h:75
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr