pvaClientCPP 4.8.1
pvaClientNTMultiGet.cpp
Go to the documentation of this file.
1/* pvaClientNTMultiGet.cpp */
12#include <epicsMath.h>
13
14#define epicsExportSharedSymbols
15
17
18using namespace epics::pvData;
19using namespace epics::pvAccess;
20using namespace epics::nt;
21using namespace std;
22
23namespace epics { namespace pvaClient {
24
25
27 PvaClientMultiChannelPtr const &pvaMultiChannel,
28 PvaClientChannelArray const &pvaClientChannelArray,
29 PVStructurePtr const & pvRequest)
30{
31 UnionConstPtr u = getFieldCreate()->createVariantUnion();
32 PvaClientNTMultiGetPtr pvaClientNTMultiGet(
33 new PvaClientNTMultiGet(u,pvaMultiChannel,pvaClientChannelArray,pvRequest));
34 return pvaClientNTMultiGet;
35}
36
37PvaClientNTMultiGet::PvaClientNTMultiGet(
38 UnionConstPtr const & u,
39 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
40 PvaClientChannelArray const &pvaClientChannelArray,
41 PVStructurePtr const & pvRequest)
42: pvaClientMultiChannel(pvaClientMultiChannel),
43 pvaClientChannelArray(pvaClientChannelArray),
44 pvRequest(pvRequest),
45 nchannel(pvaClientChannelArray.size()),
46 pvaClientNTMultiData(
48 u,
49 pvaClientMultiChannel,
50 pvaClientChannelArray,
51 pvRequest)),
52 isConnected(false)
53{
54 if(PvaClient::getDebug()) cout<< "PvaClientNTMultiGet::PvaClientNTMultiGet()\n";
55}
56
58{
59 if(PvaClient::getDebug()) cout<< "PvaClientNTMultiGet::~PvaClientNTMultiGet()\n";
60}
61
63{
64 pvaClientGet.resize(nchannel);
65 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
66 for(size_t i=0; i<nchannel; ++i)
67 {
68 if(isConnected[i]) {
69 pvaClientGet[i] = pvaClientChannelArray[i]->createGet(pvRequest);
70 pvaClientGet[i]->issueConnect();
71 }
72 }
73 for(size_t i=0; i<nchannel; ++i)
74 {
75 if(isConnected[i]) {
76 Status status = pvaClientGet[i]->waitConnect();
77 if(status.isOK()) continue;
78 string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
79 + " PvaChannelGet::waitConnect " + status.getMessage();
80 throw std::runtime_error(message);
81 }
82 }
83 this->isConnected = true;
84}
85
86void PvaClientNTMultiGet::get(bool valueOnly)
87{
88 if(!isConnected) connect();
89 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
90
91 for(size_t i=0; i<nchannel; ++i)
92 {
93 if(isConnected[i]) {
94 if(!pvaClientGet[i]){
95 pvaClientGet[i]=pvaClientChannelArray[i]->createGet(pvRequest);
96 pvaClientGet[i]->connect();
97 }
98 pvaClientGet[i]->issueGet();
99 }
100 }
101 for(size_t i=0; i<nchannel; ++i)
102 {
103 if(isConnected[i]) {
104 Status status = pvaClientGet[i]->waitGet();
105 if(status.isOK()) continue;
106 string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
107 + " PvaChannelGet::waitGet " + status.getMessage();
108 throw std::runtime_error(message);
109 }
110 }
111 pvaClientNTMultiData->startDeltaTime();
112 for(size_t i=0; i<nchannel; ++i)
113 {
114 if(isConnected[i]) {
115 pvaClientNTMultiData->setPVStructure(pvaClientGet[i]->getData()->getPVStructure(),i);
116 }
117 }
118 pvaClientNTMultiData->endDeltaTime(valueOnly);
119}
120
122{
123 return pvaClientNTMultiData;
124}
125
126}}
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
Provides channelGet to multiple channels where the value field of each channel is presented as a unio...
void get(bool valueOnly=true)
Get each channel.
void connect()
Connect a channelGet for each channel.
PvaClientNTMultiDataPtr getData()
Get the data from the last get.
static PvaClientNTMultiGetPtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const &pvRequest)
static bool getDebug()
Is debug set?
Definition pvaClient.cpp:97
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr