pvaClientCPP 4.8.1
pvaClientNTMultiMonitor.cpp
Go to the documentation of this file.
1/* pvaClientNTMultiMonitor.cpp */
12#include <epicsThread.h>
13#include <pv/standardField.h>
14#include <pv/convert.h>
15#include <epicsMath.h>
16
17#define epicsExportSharedSymbols
18
20
21using namespace epics::pvData;
22using namespace epics::pvAccess;
23using namespace epics::nt;
24using namespace std;
25
26namespace epics { namespace pvaClient {
27
29 PvaClientMultiChannelPtr const &pvaMultiChannel,
30 PvaClientChannelArray const &pvaClientChannelArray,
31 PVStructurePtr const & pvRequest)
32{
33 UnionConstPtr u = getFieldCreate()->createVariantUnion();
34 PvaClientNTMultiMonitorPtr pvaClientNTMultiMonitor(
35 new PvaClientNTMultiMonitor(u,pvaMultiChannel,pvaClientChannelArray,pvRequest));
36 return pvaClientNTMultiMonitor;
37}
38
39PvaClientNTMultiMonitor::PvaClientNTMultiMonitor(
40 UnionConstPtr const & u,
41 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
42 PvaClientChannelArray const &pvaClientChannelArray,
43 PVStructurePtr const & pvRequest)
44: pvaClientMultiChannel(pvaClientMultiChannel),
45 pvaClientChannelArray(pvaClientChannelArray),
46 pvRequest(pvRequest),
47 nchannel(pvaClientChannelArray.size()),
48 pvaClientNTMultiData(
50 u,
51 pvaClientMultiChannel,
52 pvaClientChannelArray,
53 pvRequest)),
54 isConnected(false)
55{
56 if(PvaClient::getDebug()) cout<< "PvaClientNTMultiMonitor::PvaClientNTMultiMonitor()\n";
57}
58
59
61{
62 if(PvaClient::getDebug()) cout<< "PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()\n";
63}
64
65
67{
68 pvaClientMonitor.resize(nchannel);
69 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
70 for(size_t i=0; i<nchannel; ++i)
71 {
72 if(isConnected[i]) {
73 pvaClientMonitor[i] = pvaClientChannelArray[i]->createMonitor(pvRequest);
74 pvaClientMonitor[i]->issueConnect();
75 }
76 }
77 for(size_t i=0; i<nchannel; ++i)
78 {
79 if(isConnected[i]) {
80 Status status = pvaClientMonitor[i]->waitConnect();
81 if(status.isOK()) continue;
82 string message = string("channel ") +pvaClientChannelArray[i]->getChannelName()
83 + " PvaChannelMonitor::waitConnect " + status.getMessage();
84 throw std::runtime_error(message);
85 }
86 }
87 for(size_t i=0; i<nchannel; ++i)
88 {
89 if(isConnected[i]) pvaClientMonitor[i]->start();
90 }
91 this->isConnected = true;
92}
93
95{
96 if(!isConnected) connect();
97 bool result = false;
98 shared_vector<epics::pvData::boolean> isConnected = pvaClientMultiChannel->getIsConnected();
99 pvaClientNTMultiData->startDeltaTime();
100 for(size_t i=0; i<nchannel; ++i)
101 {
102 if(isConnected[i]) {
103 if(!pvaClientMonitor[i]){
104 pvaClientMonitor[i]=pvaClientChannelArray[i]->createMonitor(pvRequest);
105 pvaClientMonitor[i]->connect();
106 pvaClientMonitor[i]->start();
107 }
108 if(pvaClientMonitor[i]->poll()) {
109 pvaClientNTMultiData->setPVStructure(
110 pvaClientMonitor[i]->getData()->getPVStructure(),i);
111 pvaClientMonitor[i]->releaseEvent();
112 result = true;
113 }
114 }
115 }
116 if(result) pvaClientNTMultiData->endDeltaTime(valueOnly);
117 return result;
118}
119
120bool PvaClientNTMultiMonitor::waitEvent(double waitForEvent)
121{
122 if(poll()) return true;
123 TimeStamp start;
124 start.getCurrent();
125 TimeStamp now;
126 while(true) {
127 epicsThreadSleep(.1);
128 if(poll()) return true;
129 now.getCurrent();
130 double diff = TimeStamp::diff(now,start);
131 if(diff>=waitForEvent) break;
132 }
133 return false;
134}
135
137{
138 return pvaClientNTMultiData;
139}
140
141}}
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
Provides channel monitor to multiple channels where the value field of each channel is presented as a...
static PvaClientNTMultiMonitorPtr create(PvaClientMultiChannelPtr const &pvaClientMultiChannel, PvaClientChannelArray const &pvaClientChannelArray, epics::pvData::PVStructurePtr const &pvRequest)
bool waitEvent(double secondsToWait)
Wait until poll returns true.
void connect()
Connect to a channel monitor for each channel.
PvaClientNTMultiDataPtr getData()
Get the data for the last successfull poll.
bool poll(bool valueOnly=true)
Poll each channel.
static bool getDebug()
Is debug set?
Definition pvaClient.cpp:97
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr