15 #include <epicsMath.h> 17 #define epicsExportSharedSymbols 26 namespace epics {
namespace pvaClient {
36 return pvaClientNTMultiMonitor;
39 PvaClientNTMultiMonitor::PvaClientNTMultiMonitor(
44 : pvaClientMultiChannel(pvaClientMultiChannel),
45 pvaClientChannelArray(pvaClientChannelArray),
47 nchannel(pvaClientChannelArray.
size()),
49 PvaClientNTMultiData::create(
51 pvaClientMultiChannel,
52 pvaClientChannelArray,
56 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiMonitor::PvaClientNTMultiMonitor()\n";
60 PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()
62 if(PvaClient::getDebug()) cout<<
"PvaClientNTMultiMonitor::~PvaClientNTMultiMonitor()\n";
66 void PvaClientNTMultiMonitor::connect()
68 pvaClientMonitor.
resize(nchannel);
70 for(
size_t i=0;
i<nchannel; ++
i)
73 pvaClientMonitor[
i] = pvaClientChannelArray[
i]->createMonitor(pvRequest);
74 pvaClientMonitor[
i]->issueConnect();
77 for(
size_t i=0;
i<nchannel; ++
i)
81 if(status.
isOK())
continue;
82 string message = string(
"channel ") +pvaClientChannelArray[
i]->getChannelName()
83 +
" PvaChannelMonitor::waitConnect " + status.
getMessage();
84 throw std::runtime_error(message);
87 for(
size_t i=0;
i<nchannel; ++
i)
89 if(isConnected[
i]) pvaClientMonitor[
i]->start();
91 this->isConnected =
true;
94 bool PvaClientNTMultiMonitor::poll(
bool valueOnly)
96 if(!isConnected) connect();
99 pvaClientNTMultiData->startDeltaTime();
100 for(
size_t i=0;
i<nchannel; ++
i)
103 if(pvaClientMonitor[i]->poll()) {
104 pvaClientNTMultiData->setPVStructure(
105 pvaClientMonitor[i]->getData()->getPVStructure(),i);
106 pvaClientMonitor[
i]->releaseEvent();
111 if(result) pvaClientNTMultiData->endDeltaTime(valueOnly);
115 bool PvaClientNTMultiMonitor::waitEvent(
double waitForEvent)
117 if(poll())
return true;
123 if(poll())
return true;
126 if(diff>=waitForEvent)
break;
133 return pvaClientNTMultiData;
void resize(size_t i)
Grow or shrink array.
TODO only here because of the Lockable.
Provides channel monitor to multiple channels where the value field of each channel is presented as a...
const std::string & getMessage() const
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
std::tr1::shared_ptr< const Union > UnionConstPtr
size_t size() const
Number of elements visible through this vector.
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
static double diff(TimeStamp const &a, TimeStamp const &b)
LIBCOM_API void epicsStdCall epicsThreadSleep(double seconds)
Block the calling thread for at least the specified time.
C++ and C descriptions for a thread.
Methods for manipulating timeStamp.