pvaClientCPP  4.8.1-dev
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 
31 namespace epics { namespace pvaClient {
32 
33 
35 typedef std::tr1::shared_ptr<PvaClientMultiChannel> PvaClientMultiChannelPtr;
37 typedef std::tr1::shared_ptr<PvaClientMultiGetDouble> PvaClientMultiGetDoublePtr;
39 typedef std::tr1::shared_ptr<PvaClientMultiPutDouble> PvaClientMultiPutDoublePtr;
41 typedef std::tr1::shared_ptr<PvaClientMultiMonitorDouble> PvaClientMultiMonitorDoublePtr;
42 
44 typedef std::tr1::shared_ptr<PvaClientNTMultiGet> PvaClientNTMultiGetPtr;
46 typedef std::tr1::shared_ptr<PvaClientNTMultiPut> PvaClientNTMultiPutPtr;
48 typedef std::tr1::shared_ptr<PvaClientNTMultiMonitor> PvaClientNTMultiMonitorPtr;
50 typedef std::tr1::shared_ptr<PvaClientNTMultiData> PvaClientNTMultiDataPtr;
51 
52 
53 typedef epics::pvData::shared_vector<PvaClientChannelPtr> PvaClientChannelArray;
54 
60 class epicsShareClass PvaClientMultiChannel :
61  public std::tr1::enable_shared_from_this<PvaClientMultiChannel>
62 {
63 public:
64  POINTER_DEFINITIONS(PvaClientMultiChannel);
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)");
153 private:
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 
182 class epicsShareClass PvaClientMultiGetDouble :
183  public std::tr1::enable_shared_from_this<PvaClientMultiGetDouble>
184 {
185 
186 public:
187  POINTER_DEFINITIONS(PvaClientMultiGetDouble);
188 protected:
189  static PvaClientMultiGetDoublePtr create(
190  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
191  PvaClientChannelArray const &pvaClientChannelArray);
192  friend class PvaClientMultiChannel;
193 public:
201  void connect();
206  epics::pvData::shared_vector<double> get();
207 private:
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 
225 class epicsShareClass PvaClientMultiPutDouble :
226  public std::tr1::enable_shared_from_this<PvaClientMultiPutDouble>
227 {
228 
229 public:
230  POINTER_DEFINITIONS(PvaClientMultiPutDouble);
231 protected:
232  static PvaClientMultiPutDoublePtr create(
233  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
234  PvaClientChannelArray const &pvaClientChannelArray);
235  friend class PvaClientMultiChannel;
236 public:
244  void connect();
248  void put(epics::pvData::shared_vector<double> const &data);
249 
250 private:
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 
267 class epicsShareClass PvaClientMultiMonitorDouble :
268  public std::tr1::enable_shared_from_this<PvaClientMultiMonitorDouble>
269 {
270 
271 public:
272  POINTER_DEFINITIONS(PvaClientMultiMonitorDouble);
273 protected:
274  static PvaClientMultiMonitorDoublePtr create(
275  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
276  PvaClientChannelArray const &pvaClientChannelArray);
277  friend class PvaClientMultiChannel;
278 public:
286  void connect();
293  bool poll();
300  bool waitEvent(double secondsToWait);
305  epics::pvData::shared_vector<double> get();
306 
307 private:
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 
325 class epicsShareClass PvaClientNTMultiGet :
326  public std::tr1::enable_shared_from_this<PvaClientNTMultiGet>
327 {
328 
329 public:
330  POINTER_DEFINITIONS(PvaClientNTMultiGet);
331 protected:
332  static PvaClientNTMultiGetPtr create(
333  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
334  PvaClientChannelArray const &pvaClientChannelArray,
335  epics::pvData::PVStructurePtr const & pvRequest);
336  friend class PvaClientMultiChannel;
337 public:
345  void connect();
351  void get(bool valueOnly = true);
356  PvaClientNTMultiDataPtr getData();
357 
358 private:
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 
379 class epicsShareClass PvaClientNTMultiPut :
380  public std::tr1::enable_shared_from_this<PvaClientNTMultiPut>
381 {
382 
383 public:
384  POINTER_DEFINITIONS(PvaClientNTMultiPut);
385 protected:
386  static PvaClientNTMultiPutPtr create(
387  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
388  PvaClientChannelArray const &pvaClientChannelArray);
389  friend class PvaClientMultiChannel;
390 public:
398  void connect();
403  epics::pvData::shared_vector<epics::pvData::PVUnionPtr> getValues();
407  void put();
408 
409 private:
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 
428 class epicsShareClass PvaClientNTMultiMonitor :
429  public std::tr1::enable_shared_from_this<PvaClientNTMultiMonitor>
430 {
431 
432 public:
433  POINTER_DEFINITIONS(PvaClientNTMultiMonitor);
434 protected:
435  static PvaClientNTMultiMonitorPtr create(
436  PvaClientMultiChannelPtr const &pvaClientMultiChannel,
437  PvaClientChannelArray const &pvaClientChannelArray,
438  epics::pvData::PVStructurePtr const & pvRequest);
439  friend class PvaClientMultiChannel;
440 public:
448  void connect();
456  bool poll(bool valueOnly = true);
463  bool waitEvent(double secondsToWait);
468  PvaClientNTMultiDataPtr getData();
469 
470 private:
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 
490 class epicsShareClass PvaClientNTMultiData :
491  public std::tr1::enable_shared_from_this<PvaClientNTMultiData>
492 {
493 
494 public:
495  POINTER_DEFINITIONS(PvaClientNTMultiData);
501  size_t getNumber();
506  epics::pvData::TimeStamp getTimeStamp();
511  epics::nt::NTMultiChannelPtr getNTMultiChannel();
516  epics::pvData::shared_vector<epics::pvData::boolean> getChannelChangeFlags();
517 protected:
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);
525  friend class PvaClientNTMultiGet;
527 private:
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 */
std::tr1::shared_ptr< PvaClient > PvaClientPtr
Definition: pvaClient.h:46
epics::pvData::shared_vector< PvaClientChannelPtr > PvaClientChannelArray
PvaMultiChannel is a synchronous interface for accessing multiple channels.
Provides channelGet to multiple channels where each channel has a numeric scalar value field...
Provides channelPut to multiple channels where each channel has a numeric scalar value field...
std::tr1::shared_ptr< PvaClientNTMultiGet > PvaClientNTMultiGetPtr
Provides channelPut to multiple channels where the value field of each channel is presented as a unio...
Provides channel monitor to multiple channels where the value field of each channel is presented as a...
Provides channelGet to multiple channels where the value field of each channel is presented as a unio...
std::tr1::shared_ptr< PvaClientNTMultiData > PvaClientNTMultiDataPtr
std::tr1::shared_ptr< PvaClientNTMultiPut > PvaClientNTMultiPutPtr
std::tr1::shared_ptr< PvaClientMultiMonitorDouble > PvaClientMultiMonitorDoublePtr
std::tr1::shared_ptr< PvaClientNTMultiMonitor > PvaClientNTMultiMonitorPtr
std::tr1::shared_ptr< PvaClientMultiGetDouble > PvaClientMultiGetDoublePtr
Provides a monitor to multiple channels where each channel has a numeric scalar value field...
std::tr1::shared_ptr< PvaClientMultiChannel > PvaClientMultiChannelPtr
Provides NTMultiChannel data for both PvaClientNTMultiGet and PvaClientNTMultiMonitor.
std::tr1::shared_ptr< PvaClientMultiPutDouble > PvaClientMultiPutDoublePtr