pvaClientCPP 4.8.1
pvaClientMultiChannel.h
Go to the documentation of this file.
1/* pvaClientMultiChannel.h */
11#ifndef PVACLIENTMULTICHANNEL_H
12#define PVACLIENTMULTICHANNEL_H
13
14#ifdef epicsExportSharedSymbols
15# define pvaClientMultiChannelEpicsExportSharedSymbols
16# undef epicsExportSharedSymbols
17#endif
18
19#include <pv/ntmultiChannel.h>
20#include <pv/createRequest.h>
21
22#ifdef pvaClientMultiChannelEpicsExportSharedSymbols
23# define epicsExportSharedSymbols
24# undef pvaClientMultiChannelEpicsExportSharedSymbols
25#endif
26
27
28#include <pv/pvaClient.h>
29
30
31namespace epics { namespace pvaClient {
32
33
34class PvaClientMultiChannel;
35typedef std::tr1::shared_ptr<PvaClientMultiChannel> PvaClientMultiChannelPtr;
37typedef std::tr1::shared_ptr<PvaClientMultiGetDouble> PvaClientMultiGetDoublePtr;
39typedef std::tr1::shared_ptr<PvaClientMultiPutDouble> PvaClientMultiPutDoublePtr;
41typedef std::tr1::shared_ptr<PvaClientMultiMonitorDouble> PvaClientMultiMonitorDoublePtr;
42
44typedef std::tr1::shared_ptr<PvaClientNTMultiGet> PvaClientNTMultiGetPtr;
46typedef std::tr1::shared_ptr<PvaClientNTMultiPut> PvaClientNTMultiPutPtr;
48typedef std::tr1::shared_ptr<PvaClientNTMultiMonitor> PvaClientNTMultiMonitorPtr;
50typedef std::tr1::shared_ptr<PvaClientNTMultiData> PvaClientNTMultiDataPtr;
51
52
53typedef epics::pvData::shared_vector<PvaClientChannelPtr> PvaClientChannelArray;
54
60class epicsShareClass PvaClientMultiChannel :
61 public std::tr1::enable_shared_from_this<PvaClientMultiChannel>
62{
63public:
75 static PvaClientMultiChannelPtr create(
76 PvaClientPtr const &pvaClient,
77 epics::pvData::shared_vector<const std::string> const & channelNames,
78 std::string const & providerName = "pva",
79 size_t maxNotConnected=0,
80 epics::pvData::shared_vector<const std::string> const & providerNames
81 = epics::pvData::shared_vector<const std::string>()
82 );
90 epics::pvData::shared_vector<const std::string> getChannelNames();
98 epics::pvData::Status connect(double timeout=5);
102 bool allConnected();
106 bool connectionChange();
110 epics::pvData::shared_vector<epics::pvData::boolean> getIsConnected();
114 PvaClientChannelArray getPvaClientChannelArray();
118 PvaClientPtr getPvaClient();
123 PvaClientMultiGetDoublePtr createGet();
128 PvaClientMultiPutDoublePtr createPut();
133 PvaClientMultiMonitorDoublePtr createMonitor();
138 PvaClientNTMultiPutPtr createNTPut();
144 PvaClientNTMultiGetPtr createNTGet(
145 std::string const &request = "field(value,alarm,timeStamp)");
151 PvaClientNTMultiMonitorPtr createNTMonitor(
152 std::string const &request= "field(value,alarm,timeStamp)");
153private:
155 PvaClientPtr const &pvaClient,
156 epics::pvData::shared_vector<const std::string> const & channelNames,
157 std::string const & providerName,
158 size_t maxNotConnected,
159 epics::pvData::shared_vector<const std::string> const & providerNames);
160 void checkConnected();
161
162 PvaClientPtr pvaClient;
163 epics::pvData::shared_vector<const std::string> channelNames;
164 std::string providerName;
165 size_t maxNotConnected;
166 epics::pvData::shared_vector<const std::string> const & providerNames;
167
168 size_t numChannel;
169 size_t numProviderNames;
170 epics::pvData::Mutex mutex;
171
172 size_t numConnected;
173 bool firstConnect;
174 PvaClientChannelArray pvaClientChannelArray;
175 epics::pvData::shared_vector<epics::pvData::boolean> isConnected;
176 epics::pvData::CreateRequest::shared_pointer createRequest;
177};
178
182class epicsShareClass PvaClientMultiGetDouble :
183 public std::tr1::enable_shared_from_this<PvaClientMultiGetDouble>
184{
185
186public:
188protected:
189 static PvaClientMultiGetDoublePtr create(
190 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
191 PvaClientChannelArray const &pvaClientChannelArray);
193public:
201 void connect();
206 epics::pvData::shared_vector<double> get();
207private:
209 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
210 PvaClientChannelArray const &pvaClientChannelArray);
211
212 PvaClientMultiChannelPtr pvaClientMultiChannel;
213 PvaClientChannelArray pvaClientChannelArray;
214 size_t nchannel;
215 epics::pvData::Mutex mutex;
216
217 epics::pvData::shared_vector<double> doubleValue;
218 std::vector<PvaClientGetPtr> pvaClientGet;
219 bool isGetConnected;
220};
221
225class epicsShareClass PvaClientMultiPutDouble :
226 public std::tr1::enable_shared_from_this<PvaClientMultiPutDouble>
227{
228
229public:
231protected:
232 static PvaClientMultiPutDoublePtr create(
233 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
234 PvaClientChannelArray const &pvaClientChannelArray);
236public:
244 void connect();
248 void put(epics::pvData::shared_vector<double> const &data);
249
250private:
252 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
253 PvaClientChannelArray const &pvaClientChannelArray);
254
255 PvaClientMultiChannelPtr pvaClientMultiChannel;
256 PvaClientChannelArray pvaClientChannelArray;
257 size_t nchannel;
258 epics::pvData::Mutex mutex;
259
260 std::vector<PvaClientPutPtr> pvaClientPut;
261 bool isPutConnected;
262};
263
267class epicsShareClass PvaClientMultiMonitorDouble :
268 public std::tr1::enable_shared_from_this<PvaClientMultiMonitorDouble>
269{
270
271public:
273protected:
274 static PvaClientMultiMonitorDoublePtr create(
275 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
276 PvaClientChannelArray const &pvaClientChannelArray);
278public:
286 void connect();
293 bool poll();
300 bool waitEvent(double secondsToWait);
305 epics::pvData::shared_vector<double> get();
306
307private:
309 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
310 PvaClientChannelArray const &pvaClientChannelArray);
311
312 PvaClientMultiChannelPtr pvaClientMultiChannel;
313 PvaClientChannelArray pvaClientChannelArray;
314 size_t nchannel;
315 epics::pvData::Mutex mutex;
316
317 epics::pvData::shared_vector<double> doubleValue;
318 std::vector<PvaClientMonitorPtr> pvaClientMonitor;
319 bool isMonitorConnected;
320};
321
325class epicsShareClass PvaClientNTMultiGet :
326 public std::tr1::enable_shared_from_this<PvaClientNTMultiGet>
327{
328
329public:
331protected:
332 static PvaClientNTMultiGetPtr create(
333 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
334 PvaClientChannelArray const &pvaClientChannelArray,
335 epics::pvData::PVStructurePtr const & pvRequest);
337public:
345 void connect();
351 void get(bool valueOnly = true);
356 PvaClientNTMultiDataPtr getData();
357
358private:
360 epics::pvData::UnionConstPtr const & u,
361 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
362 PvaClientChannelArray const &pvaClientChannelArray,
363 epics::pvData::PVStructurePtr const & pvRequest);
364
365 PvaClientMultiChannelPtr pvaClientMultiChannel;
366 PvaClientChannelArray pvaClientChannelArray;
367 epics::pvData::PVStructurePtr pvRequest;
368 size_t nchannel;
369 epics::pvData::Mutex mutex;
370
371 PvaClientNTMultiDataPtr pvaClientNTMultiData;
372 std::vector<PvaClientGetPtr> pvaClientGet;
373 bool isConnected;
374};
375
379class epicsShareClass PvaClientNTMultiPut :
380 public std::tr1::enable_shared_from_this<PvaClientNTMultiPut>
381{
382
383public:
385protected:
386 static PvaClientNTMultiPutPtr create(
387 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
388 PvaClientChannelArray const &pvaClientChannelArray);
390public:
398 void connect();
403 epics::pvData::shared_vector<epics::pvData::PVUnionPtr> getValues();
407 void put();
408
409private:
411 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
412 PvaClientChannelArray const &pvaClientChannelArray);
413
414 PvaClientMultiChannelPtr pvaClientMultiChannel;
415 PvaClientChannelArray pvaClientChannelArray;
416 size_t nchannel;
417 epics::pvData::Mutex mutex;
418
419 epics::pvData::shared_vector<epics::pvData::PVUnionPtr> unionValue;
420 epics::pvData::shared_vector<epics::pvData::PVFieldPtr> value;
421 std::vector<PvaClientPutPtr> pvaClientPut;
422 bool isConnected;
423};
424
428class epicsShareClass PvaClientNTMultiMonitor :
429 public std::tr1::enable_shared_from_this<PvaClientNTMultiMonitor>
430{
431
432public:
434protected:
435 static PvaClientNTMultiMonitorPtr create(
436 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
437 PvaClientChannelArray const &pvaClientChannelArray,
438 epics::pvData::PVStructurePtr const & pvRequest);
440public:
448 void connect();
456 bool poll(bool valueOnly = true);
463 bool waitEvent(double secondsToWait);
468 PvaClientNTMultiDataPtr getData();
469
470private:
472 epics::pvData::UnionConstPtr const & u,
473 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
474 PvaClientChannelArray const &pvaClientChannelArray,
475 epics::pvData::PVStructurePtr const & pvRequest);
476
477 PvaClientMultiChannelPtr pvaClientMultiChannel;
478 PvaClientChannelArray pvaClientChannelArray;
479 epics::pvData::PVStructurePtr pvRequest;
480 size_t nchannel;
481 epics::pvData::Mutex mutex;
482 PvaClientNTMultiDataPtr pvaClientNTMultiData;
483 std::vector<PvaClientMonitorPtr> pvaClientMonitor;
484 bool isConnected;
485};
486
490class epicsShareClass PvaClientNTMultiData :
491 public std::tr1::enable_shared_from_this<PvaClientNTMultiData>
492{
493
494public:
501 size_t getNumber();
506 epics::pvData::TimeStamp getTimeStamp();
511 epics::nt::NTMultiChannelPtr getNTMultiChannel();
516 epics::pvData::shared_vector<epics::pvData::boolean> getChannelChangeFlags();
517protected:
518 static PvaClientNTMultiDataPtr create(
519 epics::pvData::UnionConstPtr const & u,
520 PvaClientMultiChannelPtr const &pvaClientMultiChannel,
521 PvaClientChannelArray const &pvaClientChannelArray,
522 epics::pvData::PVStructurePtr const & pvRequest);
523 void startDeltaTime();
524 void endDeltaTime(bool valueOnly = true);
527private:
529 epics::pvData::UnionConstPtr const & u,
530 PvaClientMultiChannelPtr const &pvaNTMultiChannel,
531 PvaClientChannelArray const &pvaClientChannelArray,
532 epics::pvData::PVStructurePtr const & pvRequest);
533 void setPVStructure(
534 epics::pvData::PVStructurePtr const &pvStructure,size_t index);
535
536 PvaClientMultiChannelPtr pvaClientMultiChannel;
537 PvaClientChannelArray pvaClientChannelArray;
538 size_t nchannel;
539 epics::pvData::Mutex mutex;
540
541 std::vector<epics::pvData::PVStructurePtr> topPVStructure;
542 bool gotAlarm;
543 bool gotTimeStamp;
544
545 epics::pvData::shared_vector<epics::pvData::boolean> changeFlags;
546 epics::pvData::StructureConstPtr ntMultiChannelStructure;
547 epics::pvData::shared_vector<epics::pvData::PVUnionPtr> unionValue;
548 epics::pvData::shared_vector<epics::pvData::int32> severity;
549 epics::pvData::shared_vector<epics::pvData::int32> status;
550 epics::pvData::shared_vector<std::string> message;
551 epics::pvData::shared_vector<epics::pvData::int64> secondsPastEpoch;
552 epics::pvData::shared_vector<epics::pvData::int32> nanoseconds;
553 epics::pvData::shared_vector<epics::pvData::int32> userTag;
554 epics::pvData::Alarm alarm;
555 epics::pvData::TimeStamp timeStamp;;
556 epics::pvData::PVTimeStamp pvTimeStamp;
557};
558
559
560}}
561
562#endif /* PVACLIENTMULTICHANNEL_H */
PvaMultiChannel is a synchronous interface for accessing multiple channels.
POINTER_DEFINITIONS(PvaClientMultiChannel)
Provides channelGet to multiple channels where each channel has a numeric scalar value field.
POINTER_DEFINITIONS(PvaClientMultiGetDouble)
Provides a monitor to multiple channels where each channel has a numeric scalar value field.
POINTER_DEFINITIONS(PvaClientMultiMonitorDouble)
Provides channelPut to multiple channels where each channel has a numeric scalar value field.
POINTER_DEFINITIONS(PvaClientMultiPutDouble)
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
POINTER_DEFINITIONS(PvaClientNTMultiData)
Provides channelGet to multiple channels where the value field of each channel is presented as a unio...
POINTER_DEFINITIONS(PvaClientNTMultiGet)
Provides channel monitor to multiple channels where the value field of each channel is presented as a...
POINTER_DEFINITIONS(PvaClientNTMultiMonitor)
Provides channelPut to multiple channels where the value field of each channel is presented as a unio...
POINTER_DEFINITIONS(PvaClientNTMultiPut)
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
std::tr1::shared_ptr< PvaClient > PvaClientPtr
Definition pvaClient.h:47
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr