12 #include <pv/standardField.h> 13 #include <pv/convert.h> 14 #include <epicsMath.h> 16 #define epicsExportSharedSymbols 25 namespace epics {
namespace pvaClient {
35 PvaClientNTMultiPut::PvaClientNTMultiPut(
38 : pvaClientMultiChannel(pvaClientMultiChannel),
39 pvaClientChannelArray(pvaClientChannelArray),
40 nchannel(pvaClientChannelArray.size()),
41 unionValue(shared_vector<PVUnionPtr>(nchannel,PVUnionPtr())),
42 value(shared_vector<PVFieldPtr>(nchannel,PVFieldPtr())),
45 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiPut::PvaClientNTMultiPut()\n";
49 PvaClientNTMultiPut::~PvaClientNTMultiPut()
51 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiPut::~PvaClientNTMultiPut()\n";
54 void PvaClientNTMultiPut::connect()
56 pvaClientPut.resize(nchannel);
57 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
58 for(
size_t i=0; i<nchannel; ++i)
61 pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
62 pvaClientPut[i]->issueConnect();
65 for(
size_t i=0; i<nchannel; ++i)
68 Status status = pvaClientPut[i]->waitConnect();
69 if(status.isOK())
continue;
70 string message = string(
"channel ") +pvaClientChannelArray[i]->getChannelName()
71 +
" PvaChannelPut::waitConnect " + status.getMessage();
72 throw std::runtime_error(message);
75 for(
size_t i=0; i<nchannel; ++i)
78 pvaClientPut[i]->issueGet();
81 for(
size_t i=0; i<nchannel; ++i)
84 Status status = pvaClientPut[i]->waitGet();
85 if(status.isOK())
continue;
86 string message = string(
"channel ") +pvaClientChannelArray[i]->getChannelName()
87 +
" PvaChannelPut::waitGet " + status.getMessage();
88 throw std::runtime_error(message);
91 FieldCreatePtr fieldCreate = getFieldCreate();
92 PVDataCreatePtr pvDataCreate = getPVDataCreate();
93 for(
size_t i=0; i<nchannel; ++i)
96 value[i] = pvaClientPut[i]->getData()->getValue();
97 FieldBuilderPtr builder = fieldCreate->createFieldBuilder();
98 builder->add(
"value",value[i]->getField());
99 unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion());
102 this->isConnected =
true;
105 shared_vector<PVUnionPtr> PvaClientNTMultiPut::getValues()
107 if(!isConnected) connect();
108 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
109 for(
size_t i=0; i<nchannel; ++i)
112 if(!pvaClientPut[i]){
113 pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
114 pvaClientPut[i]->connect();
115 pvaClientPut[i]->get();
116 value[i] = pvaClientPut[i]->getData()->getValue();
117 FieldCreatePtr fieldCreate = getFieldCreate();
118 PVDataCreatePtr pvDataCreate = getPVDataCreate();
119 FieldBuilderPtr builder = fieldCreate->createFieldBuilder();
120 builder->add(
"value",value[i]->getField());
121 unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion());
128 void PvaClientNTMultiPut::put()
130 if(!isConnected) connect();
131 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
132 for(
size_t i=0; i<nchannel; ++i)
135 if(!pvaClientPut[i]){
136 pvaClientPut[i] = pvaClientChannelArray[i]->createPut();
137 pvaClientPut[i]->connect();
138 pvaClientPut[i]->get();
139 value[i] = pvaClientPut[i]->getData()->getValue();
140 FieldCreatePtr fieldCreate = getFieldCreate();
141 PVDataCreatePtr pvDataCreate = getPVDataCreate();
142 FieldBuilderPtr builder = fieldCreate->createFieldBuilder();
143 builder->add(
"value",value[i]->getField());
144 unionValue[i] = pvDataCreate->createPVUnion(builder->createUnion());
146 value[i]->copy(*unionValue[i]->
get());
147 pvaClientPut[i]->issuePut();
150 for(
size_t i=0; i<nchannel; ++i)
153 Status status = pvaClientPut[i]->waitPut();
154 if(status.isOK())
continue;
155 string message = string(
"channel ") +pvaClientChannelArray[i]->getChannelName()
156 +
" PvaChannelPut::waitPut " + status.getMessage();
157 throw std::runtime_error(message);
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
Provides channelPut to multiple channels where the value field of each channel is presented as a unio...
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr