This is Unofficial EPICS BASE Doxygen Site
pvaClient.h
Go to the documentation of this file.
1 
10 #ifndef PVACLIENT_H
11 #define PVACLIENT_H
12 
13 #ifdef epicsExportSharedSymbols
14 # define pvaClientEpicsExportSharedSymbols
15 # undef epicsExportSharedSymbols
16 #endif
17 
18 #include <list>
19 #include <iostream>
20 #include <ostream>
21 #include <sstream>
22 #include <pv/requester.h>
23 #include <pv/status.h>
24 #include <pv/event.h>
25 #include <pv/lock.h>
26 #include <pv/pvData.h>
27 #include <pv/pvTimeStamp.h>
28 #include <pv/timeStamp.h>
29 #include <pv/pvAlarm.h>
30 #include <pv/alarm.h>
31 #include <pv/pvAccess.h>
32 #include <pv/standardField.h>
33 #include <pv/standardPVField.h>
34 #include <pv/createRequest.h>
35 #include <pv/nt.h>
36 
37 #ifdef pvaClientEpicsExportSharedSymbols
38 # define epicsExportSharedSymbols
39 # undef pvaClientEpicsExportSharedSymbols
40 #endif
41 
42 #include <shareLib.h>
43 
44 namespace epics { namespace pvaClient {
45 
46 class PvaClient;
47 typedef std::tr1::shared_ptr<PvaClient> PvaClientPtr;
49 typedef std::tr1::shared_ptr<PvaClientData> PvaClientDataPtr;
51 typedef std::tr1::shared_ptr<PvaClientGetData> PvaClientGetDataPtr;
53 typedef std::tr1::shared_ptr<PvaClientPutData> PvaClientPutDataPtr;
55 typedef std::tr1::shared_ptr<PvaClientMonitorData> PvaClientMonitorDataPtr;
57 typedef std::tr1::shared_ptr<PvaClientChannelStateChangeRequester> PvaClientChannelStateChangeRequesterPtr;
58 typedef std::tr1::weak_ptr<PvaClientChannelStateChangeRequester> PvaClientChannelStateChangeRequesterWPtr;
60 typedef std::tr1::shared_ptr<PvaClientChannel> PvaClientChannelPtr;
61 class PvaClientField;
62 typedef std::tr1::shared_ptr<PvaClientField> PvaClientFieldPtr;
64 typedef std::tr1::shared_ptr<PvaClientProcessRequester> PvaClientProcessRequesterPtr;
65 typedef std::tr1::weak_ptr<PvaClientProcessRequester> PvaClientProcessRequesterWPtr;
67 typedef std::tr1::shared_ptr<PvaClientProcess> PvaClientProcessPtr;
69 typedef std::tr1::shared_ptr<PvaClientGetRequester> PvaClientGetRequesterPtr;
70 typedef std::tr1::weak_ptr<PvaClientGetRequester> PvaClientGetRequesterWPtr;
72 typedef std::tr1::shared_ptr<PvaClientGet> PvaClientGetPtr;
74 typedef std::tr1::shared_ptr<PvaClientPutRequester> PvaClientPutRequesterPtr;
75 typedef std::tr1::weak_ptr<PvaClientPutRequester> PvaClientPutRequesterWPtr;
77 typedef std::tr1::shared_ptr<PvaClientPut> PvaClientPutPtr;
79 typedef std::tr1::shared_ptr<PvaClientPutGetRequester> PvaClientPutGetRequesterPtr;
80 typedef std::tr1::weak_ptr<PvaClientPutGetRequester> PvaClientPutGetRequesterWPtr;
82 typedef std::tr1::shared_ptr<PvaClientPutGet> PvaClientPutGetPtr;
84 typedef std::tr1::shared_ptr<PvaClientMonitor> PvaClientMonitorPtr;
86 typedef std::tr1::shared_ptr<PvaClientMonitorRequester> PvaClientMonitorRequesterPtr;
87 typedef std::tr1::weak_ptr<PvaClientMonitorRequester> PvaClientMonitorRequesterWPtr;
88 class PvaClientArray;
89 typedef std::tr1::shared_ptr<PvaClientArray> PvaClientArrayPtr;
91 typedef std::tr1::shared_ptr<PvaClientRPC> PvaClientRPCPtr;
93 typedef std::tr1::shared_ptr<PvaClientRPCRequester> PvaClientRPCRequesterPtr;
94 typedef std::tr1::weak_ptr<PvaClientRPCRequester> PvaClientRPCRequesterWPtr;
95 
96 // following are private to pvaClient
98 typedef std::tr1::shared_ptr<PvaClientChannelCache> PvaClientChannelCachePtr;
99 
100 
107  public epics::pvData::Requester,
108  public std::tr1::enable_shared_from_this<PvaClient>
109 {
110 public:
115  ~PvaClient();
121  static PvaClientPtr get(std::string const & providerNames = "pva ca");
129  static PvaClientPtr create() EPICS_DEPRECATED;
130 
131  std::string getRequesterName();
139  void message(
140  std::string const & message,
141  epics::pvData::MessageType messageType);
150  PvaClientChannelPtr channel(
151  std::string const & channelName,
152  std::string const &providerName = "pva",
153  double timeOut = 5.0);
161  PvaClientChannelPtr createChannel(
162  std::string const & channelName,
163  std::string const & providerName = "pva");
164 
170  void setRequester(epics::pvData::RequesterPtr const & requester);
173  void clearRequester();
176  void showCache();
179  size_t cacheSize();
184  static void setDebug(bool value);
189  static bool getDebug();
190 private:
191  PvaClient(std::string const & providerNames);
192  PvaClientChannelCachePtr pvaClientChannelCache;
193  epics::pvData::Requester::weak_pointer requester;
194  bool pvaStarted;
195  bool caStarted;
197  epics::pvAccess::ChannelProviderRegistry::shared_pointer channelRegistry;
198 };
199 
200 // folowing private to PvaClientChannel
202 typedef std::tr1::shared_ptr<PvaClientGetCache> PvaClientGetCachePtr;
204 typedef std::tr1::shared_ptr<PvaClientPutCache> PvaClientPutCachePtr;
205 
206 
214 {
215 public:
228  virtual void channelStateChange(PvaClientChannelPtr const & channel, bool isConnected) = 0;
229 };
230 
239  public std::tr1::enable_shared_from_this<PvaClientChannel>
240 {
241 public:
246  ~PvaClientChannel();
251  void setStateChangeRequester(PvaClientChannelStateChangeRequesterPtr const &stateChangeRequester);
256  std::string getChannelName();
261  epics::pvAccess::Channel::shared_pointer getChannel();
268  void connect(double timeout=5.0);
272  void issueConnect();
278  epics::pvData::Status waitConnect(double timeout = 5.0);
285  PvaClientFieldPtr createField(std::string const & subField = "");
292  PvaClientProcessPtr createProcess(std::string const & request = "");
299  PvaClientProcessPtr createProcess(epics::pvData::PVStructurePtr const & pvRequest);
306  PvaClientGetPtr get(std::string const & request = "field(value,alarm,timeStamp)");
314  PvaClientGetPtr createGet(std::string const & request = "field(value,alarm,timeStamp)");
322  PvaClientGetPtr createGet(epics::pvData::PVStructurePtr const & pvRequest);
329  double getDouble(std::string const & request = "field(value)");
336  std::string getString(std::string const & request = "field(value)");
344  std::string const & request = "field(value)");
352  std::string const & request = "field(value)");
361  PvaClientPutPtr put(std::string const & request = "field(value)");
369  PvaClientPutPtr createPut(std::string const & request = "field(value)");
375  PvaClientPutPtr createPut(epics::pvData::PVStructurePtr const & pvRequest);
382  void putDouble(double value,std::string const & request = "field(value)");
389  void putString(std::string const & value,std::string const & request = "field(value)");
396  void putDoubleArray(
398  std::string const & request = "field(value)");
405  void putStringArray(
407  std::string const & request = "field(value)");
413  void putStringArray(std::vector<std::string> const & value,std::string const & request = "field(value)");
421  PvaClientPutGetPtr createPutGet(
422  std::string const & request = "putField(argument)getField(result)");
428  PvaClientPutGetPtr createPutGet(epics::pvData::PVStructurePtr const & pvRequest);
436  PvaClientArrayPtr createArray(std::string const & request = "field(value)");
442  PvaClientArrayPtr createArray(epics::pvData::PVStructurePtr const & pvRequest);
452  PvaClientMonitorPtr monitor(std::string const & request = "field(value,alarm,timeStamp)");
459  PvaClientMonitorPtr monitor(PvaClientMonitorRequesterPtr const & pvaClientMonitorRequester);
469  PvaClientMonitorPtr monitor(
470  std::string const & request,
471  PvaClientMonitorRequesterPtr const & pvaClientMonitorRequester);
479  PvaClientMonitorPtr createMonitor(
480  std::string const & request = "field(value,alarm,timeStamp)");
487  PvaClientMonitorPtr createMonitor(epics::pvData::PVStructurePtr const & pvRequest);
496  epics::pvData::PVStructurePtr const & pvRequest,
497  epics::pvData::PVStructurePtr const & pvArgument);
505  epics::pvData::PVStructurePtr const & pvArgument);
511  PvaClientRPCPtr createRPC();
519  PvaClientRPCPtr createRPC(epics::pvData::PVStructurePtr const & pvRequest);
522  void showCache();
525  size_t cacheSize();
526 private:
527  static PvaClientChannelPtr create(
528  PvaClientPtr const &pvaClient,
529  std::string const & channelName,
530  std::string const & providerName);
532  PvaClientPtr const &pvaClient,
533  std::string const & channelName,
534  std::string const & providerName);
535 
536  enum ConnectState {connectIdle,connectActive,notConnected,connected};
537 
538  PvaClient::weak_pointer pvaClient;
539  std::string channelName;
540  std::string providerName;
541  ConnectState connectState;
542 
543  epics::pvData::CreateRequest::shared_pointer createRequest;
544  PvaClientGetCachePtr pvaClientGetCache;
545  PvaClientPutCachePtr pvaClientPutCache;
546 
548  epics::pvData::Event waitForConnect;
549  epics::pvAccess::Channel::shared_pointer channel;
550  epics::pvAccess::ChannelProvider::shared_pointer channelProvider;
551  PvaClientChannelStateChangeRequesterWPtr stateChangeRequester;
552 public:
553  virtual std::string getRequesterName();
554  virtual void message(std::string const & message, epics::pvData::MessageType messageType);
555  virtual void channelCreated(
557  epics::pvAccess::Channel::shared_pointer const & channel);
558  virtual void channelStateChange(
559  epics::pvAccess::Channel::shared_pointer const & channel,
561  friend class PvaClient;
562 };
563 
570 {
571 public:
582  void setMessagePrefix(std::string const & value);
588  epics::pvData::StructureConstPtr getStructure();
594  epics::pvData::PVStructurePtr getPVStructure();
601  epics::pvData::BitSetPtr getChangedBitSet();
607  std::ostream & showChanged(std::ostream & out);
614  void setData(
615  epics::pvData::PVStructurePtr const & pvStructureFrom,
616  epics::pvData::BitSetPtr const & bitSetFrom);
617 
621  bool hasValue();
625  bool isValueScalar();
629  bool isValueScalarArray();
634  epics::pvData::PVFieldPtr getValue();
640  epics::pvData::PVScalarPtr getScalarValue();
645  std::tr1::shared_ptr<epics::pvData::PVArray> getArrayValue();
650  std::tr1::shared_ptr<epics::pvData::PVScalarArray> getScalarArrayValue();
655  double getDouble();
660  std::string getString();
677  epics::pvData::Alarm getAlarm();
683  epics::pvData::TimeStamp getTimeStamp();
691  void parse(const std::vector<std::string> &args);
700  void streamJSON(
701  std::ostream& strm,
702  bool ignoreUnprintable = true,
703  bool multiLine = false);
706  void zeroArrayLength();
713  static PvaClientDataPtr create(epics::pvData::StructureConstPtr const & structure);
714 protected:
716  epics::pvData::PVFieldPtr getSinglePVField();
717  void checkValue();
718  std::string messagePrefix;
719 private:
720  void parse(
721  const std::string &arg,
722  const epics::pvData::PVFieldPtr &dest,
723  epics::pvData::BitSetPtr &bitSet);
724  void parse(
725  const std::string &arg,
726  const epics::pvData::PVUnionPtr &dest);
727  void zeroArrayLength(const epics::pvData::PVStructurePtr &pvStructure);
728 
730  epics::pvData::PVStructurePtr pvStructure;
732 
734  epics::pvData::PVAlarm pvAlarm;
735  epics::pvData::PVTimeStamp pvTimeStamp;
736  friend class PvaClientGet;
737  friend class PvaClientPutGet;
738 };
739 
746 {
747 public:
759  static PvaClientGetDataPtr create(epics::pvData::StructureConstPtr const & structure);
760 private:
762  friend class PvaClientGet;
763  friend class PvaClientPutGet;
764 };
765 
766 class PvaClientPostHandlerPvt; // private to PvaClientPutData
773 {
774 public:
785  void putDouble(double value);
790  void putString(std::string const & value);
795  void putDoubleArray(epics::pvData::shared_vector<const double> const & value);
800  void putStringArray(epics::pvData::shared_vector<const std::string> const & value);
805  void putStringArray(std::vector<std::string> const & value);
810  static PvaClientPutDataPtr create(epics::pvData::StructureConstPtr const & structure);
811 private:
813  void postPut(size_t fieldNumber);
814  std::vector<epics::pvData::PostHandlerPtr> postHandler;
816  friend class PvaClientPut;
817  friend class PvaClientPutGet;
818 };
819 
826 {
827 public:
838  epics::pvData::BitSetPtr getOverrunBitSet();
843  std::ostream & showOverrun(std::ostream & out);
848  void setData(epics::pvData::MonitorElementPtr const & monitorElement);
853  static PvaClientMonitorDataPtr create(epics::pvData::StructureConstPtr const & structure);
854 private:
856  epics::pvData::BitSetPtr overrunBitSet;
857 
858  friend class PvaClientMonitor;
859 };
860 
867 {
868 public:
876  virtual void channelProcessConnect(
878  PvaClientProcessPtr const & clientProcess)
879  {
880  }
886  virtual void processDone(
888  PvaClientProcessPtr const & clientProcess) = 0;
889 };
890 
891 // NOTE: must use separate class that implements ChannelProcessRequester,
892 // because pvAccess holds a shared_ptr to ChannelProcessRequester instead of weak_pointer
894 typedef std::tr1::shared_ptr<ChannelProcessRequesterImpl> ChannelProcessRequesterImplPtr;
895 
902  public std::tr1::enable_shared_from_this<PvaClientProcess>
903 {
904 public:
912  static PvaClientProcessPtr create(
913  PvaClientPtr const &pvaClient,
914  PvaClientChannelPtr const & pvaClientChannel,
915  epics::pvData::PVStructurePtr const &pvRequest
916  );
917 
920  ~PvaClientProcess();
924  void setRequester(PvaClientProcessRequesterPtr const & pvaClientProcessRequester);
930  void connect();
935  void issueConnect();
939  epics::pvData::Status waitConnect();
944  void process();
947  void issueProcess();
951  epics::pvData::Status waitProcess();
956  PvaClientChannelPtr getPvaClientChannel();
957 private:
958  std::string getRequesterName();
959  void message(std::string const & message,epics::pvData::MessageType messageType);
960  void channelProcessConnect(
962  epics::pvAccess::ChannelProcess::shared_pointer const & channelProcess);
963  void processDone(
964  const epics::pvData::Status& status,
965  epics::pvAccess::ChannelProcess::shared_pointer const & channelProcess);
966 
968  PvaClientPtr const &pvaClient,
969  PvaClientChannelPtr const & pvaClientChannel,
970  epics::pvData::PVStructurePtr const &pvRequest);
971 
972  void checkProcessState();
973  enum ProcessConnectState {connectIdle,connectActive,connected};
974 
975  PvaClient::weak_pointer pvaClient;
976  PvaClientChannelPtr pvaClientChannel;
979  epics::pvData::Event waitForConnect;
980  epics::pvData::Event waitForProcess;
981 
982  epics::pvData::Status channelProcessConnectStatus;
983  epics::pvData::Status channelProcessStatus;
984  epics::pvAccess::ChannelProcess::shared_pointer channelProcess;
985 
986  ProcessConnectState connectState;
987 
988  PvaClientProcessRequesterWPtr pvaClientProcessRequester;
989  enum ProcessState {processIdle,processActive,processComplete};
990  ProcessState processState;
991  ChannelProcessRequesterImplPtr channelProcessRequester;
992 public:
994 };
995 
996 // NOTE: must use separate class that implements ChannelGetRequester,
997 // because pvAccess holds a shared_ptr to ChannelGetRequester instead of weak_pointer
999 typedef std::tr1::shared_ptr<ChannelGetRequesterImpl> ChannelGetRequesterImplPtr;
1000 
1007 {
1008 public:
1016  virtual void channelGetConnect(
1018  PvaClientGetPtr const & clientGet)
1019  {
1020  }
1026  virtual void getDone(
1028  PvaClientGetPtr const & clientGet) = 0;
1029 };
1036  public std::tr1::enable_shared_from_this<PvaClientGet>
1037 {
1038 public:
1046  static PvaClientGetPtr create(
1047  PvaClientPtr const &pvaClient,
1048  PvaClientChannelPtr const & pvaClientChannel,
1049  epics::pvData::PVStructurePtr const &pvRequest
1050  );
1051 
1054  ~PvaClientGet();
1058  void setRequester(PvaClientGetRequesterPtr const & pvaClientGetRequester);
1064  void connect();
1070  void issueConnect();
1074  epics::pvData::Status waitConnect();
1078  void get();
1081  void issueGet();
1085  epics::pvData::Status waitGet();
1090  PvaClientGetDataPtr getData();
1095  PvaClientChannelPtr getPvaClientChannel();
1096 private:
1097  std::string getRequesterName();
1098  void message(std::string const & message,epics::pvData::MessageType messageType);
1099  void channelGetConnect(
1101  epics::pvAccess::ChannelGet::shared_pointer const & channelGet,
1103  void getDone(
1104  const epics::pvData::Status& status,
1105  epics::pvAccess::ChannelGet::shared_pointer const & channelGet,
1106  epics::pvData::PVStructurePtr const & pvStructure,
1107  epics::pvData::BitSetPtr const & bitSet);
1108 
1109  PvaClientGet(
1110  PvaClientPtr const &pvaClient,
1111  PvaClientChannelPtr const & pvaClientChannel,
1112  epics::pvData::PVStructurePtr const &pvRequest);
1113 
1114  void checkConnectState();
1115  enum GetConnectState {connectIdle,connectActive,connected};
1116 
1117  PvaClient::weak_pointer pvaClient;
1118  PvaClientChannelPtr pvaClientChannel;
1121  epics::pvData::Event waitForConnect;
1122  epics::pvData::Event waitForGet;
1123  PvaClientGetDataPtr pvaClientData;
1124 
1125  epics::pvData::Status channelGetConnectStatus;
1126  epics::pvData::Status channelGetStatus;
1127  epics::pvAccess::ChannelGet::shared_pointer channelGet;
1128 
1129  GetConnectState connectState;
1130 
1131  PvaClientGetRequesterWPtr pvaClientGetRequester;
1132 
1133  enum GetState {getIdle,getActive,getComplete};
1134  GetState getState;
1135  ChannelGetRequesterImplPtr channelGetRequester;
1136 public:
1138 };
1139 
1140 
1141 // NOTE: must use separate class that implements ChannelPutRequester,
1142 // because pvAccess holds a shared_ptr to ChannelPutRequester instead of weak_pointer
1144 typedef std::tr1::shared_ptr<ChannelPutRequesterImpl> ChannelPutRequesterImplPtr;
1145 
1152 {
1153 public:
1161  virtual void channelPutConnect(
1163  PvaClientPutPtr const & clientPut)
1164  {
1165  }
1171  virtual void getDone(
1173  PvaClientPutPtr const & clientPut)
1174  {
1175  }
1181  virtual void putDone(
1183  PvaClientPutPtr const & clientPut) = 0;
1184 };
1185 
1192  public std::tr1::enable_shared_from_this<PvaClientPut>
1193 {
1194 public:
1202  static PvaClientPutPtr create(
1203  PvaClientPtr const &pvaClient,
1204  PvaClientChannelPtr const & pvaClientChannel,
1205  epics::pvData::PVStructurePtr const &pvRequest
1206  );
1209  ~PvaClientPut();
1213  void setRequester(PvaClientPutRequesterPtr const & pvaClientPutRequester);
1219  void connect();
1224  void issueConnect();
1228  epics::pvData::Status waitConnect();
1234  void get();
1237  void issueGet();
1241  epics::pvData::Status waitGet();
1245  void put();
1248  void issuePut();
1252  epics::pvData::Status waitPut();
1257  PvaClientPutDataPtr getData();
1262  PvaClientChannelPtr getPvaClientChannel();
1263 private :
1264  std::string getRequesterName();
1265  void message(std::string const & message,epics::pvData::MessageType messageType);
1266  void channelPutConnect(
1268  epics::pvAccess::ChannelPut::shared_pointer const & channelPut,
1270  void getDone(
1271  const epics::pvData::Status& status,
1272  epics::pvAccess::ChannelPut::shared_pointer const & channelPut,
1273  epics::pvData::PVStructurePtr const & pvStructure,
1274  epics::pvData::BitSetPtr const & bitSet);
1275  void putDone(
1276  const epics::pvData::Status& status,
1277  epics::pvAccess::ChannelPut::shared_pointer const & channelPut);
1278  PvaClientPut(
1279  PvaClientPtr const &pvaClient,
1280  PvaClientChannelPtr const & pvaClientChannel,
1281  epics::pvData::PVStructurePtr const &pvRequest);
1282 
1283  void checkConnectState();
1284  enum PutConnectState {connectIdle,connectActive,connected};
1285 
1286  PvaClient::weak_pointer pvaClient;
1287  PvaClientChannelPtr pvaClientChannel;
1290  epics::pvData::Event waitForConnect;
1291  epics::pvData::Event waitForGetPut;
1292  PvaClientPutDataPtr pvaClientData;
1293 
1294  epics::pvData::Status channelPutConnectStatus;
1295  epics::pvData::Status channelGetPutStatus;
1296  epics::pvAccess::ChannelPut::shared_pointer channelPut;
1297  PutConnectState connectState;
1298 
1299  enum PutState {putIdle,getActive,putActive,putComplete};
1300  PutState putState;
1301  ChannelPutRequesterImplPtr channelPutRequester;
1302  PvaClientPutRequesterWPtr pvaClientPutRequester;
1303 public:
1305 };
1306 
1307 // NOTE: must use separate class that implements ChannelPutGetRequester,
1308 // because pvAccess holds a shared_ptr to ChannelPutGetRequester instead of weak_pointer
1310 typedef std::tr1::shared_ptr<ChannelPutGetRequesterImpl> ChannelPutGetRequesterImplPtr;
1311 
1318 {
1319 public:
1327  virtual void channelPutGetConnect(
1329  PvaClientPutGetPtr const & clientPutGet)
1330  {
1331  }
1337  virtual void putGetDone(
1339  PvaClientPutGetPtr const & clientPutGet) = 0;
1345  virtual void getPutDone(
1346  const epics::pvData::Status& status,
1347  PvaClientPutGetPtr const & clientPutGet)
1348  {
1349  }
1355  virtual void getGetDone(
1356  const epics::pvData::Status& status,
1357  PvaClientPutGetPtr const & clientPutGet)
1358  {
1359  }
1360 
1361 };
1362 
1363 
1370  public std::tr1::enable_shared_from_this<PvaClientPutGet>
1371 {
1372 public:
1380  static PvaClientPutGetPtr create(
1381  PvaClientPtr const &pvaClient,
1382  PvaClientChannelPtr const & pvaClientChannel,
1383  epics::pvData::PVStructurePtr const &pvRequest
1384  );
1387  ~PvaClientPutGet();
1391  void setRequester(PvaClientPutGetRequesterPtr const & pvaClientPutGetRequester);
1392 
1398  void connect();
1404  void issueConnect();
1408  epics::pvData::Status waitConnect();
1413  void putGet();
1416  void issuePutGet();
1422  epics::pvData::Status waitPutGet();
1426  void getGet();
1429  void issueGetGet();
1435  epics::pvData::Status waitGetGet();
1440  void getPut();
1443  void issueGetPut();
1447  epics::pvData::Status waitGetPut();
1451  PvaClientPutDataPtr getPutData();
1455  PvaClientGetDataPtr getGetData();
1460  PvaClientChannelPtr getPvaClientChannel();
1461 private :
1462  std::string getRequesterName();
1463  void message(std::string const & message,epics::pvData::MessageType messageType);
1464  void channelPutGetConnect(
1466  epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
1467  epics::pvData::StructureConstPtr const & putStructure,
1468  epics::pvData::StructureConstPtr const & getStructure);
1469  void putGetDone(
1470  const epics::pvData::Status& status,
1471  epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
1472  epics::pvData::PVStructurePtr const & getPVStructure,
1473  epics::pvData::BitSetPtr const & getBitSet);
1474  void getPutDone(
1475  const epics::pvData::Status& status,
1476  epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
1477  epics::pvData::PVStructurePtr const & putPVStructure,
1478  epics::pvData::BitSet::shared_pointer const & putBitSet);
1479  void getGetDone(
1480  const epics::pvData::Status& status,
1481  epics::pvAccess::ChannelPutGet::shared_pointer const & channelPutGet,
1482  epics::pvData::PVStructurePtr const & getPVStructure,
1483  epics::pvData::BitSet::shared_pointer const & getBitSet);
1484 
1486  PvaClientPtr const &pvaClient,
1487  PvaClientChannelPtr const & pvaClientChannel,
1488  epics::pvData::PVStructurePtr const &pvRequest);
1489  void checkPutGetState();
1490  enum PutGetConnectState {connectIdle,connectActive,connected};
1491 
1492  PvaClient::weak_pointer pvaClient;
1493  PvaClientChannelPtr pvaClientChannel;
1496  epics::pvData::Event waitForConnect;
1497  epics::pvData::Event waitForPutGet;
1498  PvaClientGetDataPtr pvaClientGetData;
1499  PvaClientPutDataPtr pvaClientPutData;
1500 
1501  epics::pvData::Status channelPutGetConnectStatus;
1502  epics::pvData::Status channelPutGetStatus;
1503  epics::pvAccess::ChannelPutGet::shared_pointer channelPutGet;
1504  PutGetConnectState connectState;
1505 
1506  enum PutGetState {putGetIdle,putGetActive,putGetComplete};
1507  PutGetState putGetState;
1508  ChannelPutGetRequesterImplPtr channelPutGetRequester;
1509  PvaClientPutGetRequesterWPtr pvaClientPutGetRequester;
1510 public:
1512 };
1513 
1514 //class ChannelMonitorRequester; // private to PvaClientMonitor
1521 {
1522 public:
1531  PvaClientMonitorPtr const & monitor, epics::pvData::StructureConstPtr const & structure)
1532  {
1533  }
1538  virtual void event(PvaClientMonitorPtr const & monitor) = 0;
1543  virtual void unlisten()
1544  {
1545  std::cerr << "PvaClientMonitorRequester::unlisten called"
1546  << " but no PvaClientMonitorRequester::unlisten\n";
1547  }
1548 };
1549 
1550 
1551 // NOTE: must use separate class that implements MonitorRequester,
1552 // because pvAccess holds a shared_ptr to MonitorRequester instead of weak_pointer
1554 typedef std::tr1::shared_ptr<MonitorRequesterImpl> MonitorRequesterImplPtr;
1555 
1562  public PvaClientChannelStateChangeRequester, // remove when deprecated create removed
1564  public std::tr1::enable_shared_from_this<PvaClientMonitor>
1565 {
1566 public:
1574  static PvaClientMonitorPtr create(
1575  PvaClientPtr const &pvaClient,
1576  PvaClientChannelPtr const & pvaClientChannel,
1577  epics::pvData::PVStructurePtr const &pvRequest
1578  );
1589  static PvaClientMonitorPtr create(
1590  PvaClientPtr const &pvaClient,
1591  std::string const & channelName,
1592  std::string const & providerName,
1593  std::string const & request,
1594  PvaClientChannelStateChangeRequesterPtr const & stateChangeRequester
1596  PvaClientMonitorRequesterPtr const & monitorRequester
1598  ) EPICS_DEPRECATED;
1601  ~PvaClientMonitor();
1606  void connect();
1613  void issueConnect();
1617  epics::pvData::Status waitConnect();
1621  void setRequester(PvaClientMonitorRequesterPtr const & pvaClientMonitorRequester);
1624  void start();
1630  void start(const std::string & request);
1633  void stop();
1639  bool poll();
1646  bool waitEvent(double secondsToWait = 0.0);
1649  void releaseEvent();
1654  PvaClientChannelPtr getPvaClientChannel();
1659  PvaClientMonitorDataPtr getData();
1660 private:
1661  std::string getRequesterName();
1662  void message(std::string const & message,epics::pvData::MessageType messageType);
1663  void monitorConnect(
1665  epics::pvData::MonitorPtr const & monitor,
1667  void unlisten(epics::pvData::MonitorPtr const & monitor);
1668  void monitorEvent(epics::pvData::MonitorPtr const & monitor);
1669 
1671  PvaClientPtr const &pvaClient,
1672  PvaClientChannelPtr const & pvaClientChannel,
1673  epics::pvData::PVStructurePtr const &pvRequest);
1674 
1675  void checkMonitorState();
1676  enum MonitorConnectState {connectIdle,connectWait,connectActive,connected};
1677 
1678  PvaClient::weak_pointer pvaClient;
1679  PvaClientChannelPtr pvaClientChannel;
1682  epics::pvData::Event waitForConnect;
1683  epics::pvData::Event waitForEvent;
1684  PvaClientMonitorDataPtr pvaClientData;
1685 
1686  bool isStarted;
1687  epics::pvData::Status monitorConnectStatus;
1688  epics::pvData::MonitorPtr monitor;
1689  epics::pvData::MonitorElementPtr monitorElement;
1690 
1691  PvaClientMonitorRequesterWPtr pvaClientMonitorRequester;
1692  MonitorConnectState connectState;
1693  bool userPoll;
1694  bool userWait;
1695  MonitorRequesterImplPtr monitorRequester;
1696  PvaClientChannelStateChangeRequesterWPtr pvaClientChannelStateChangeRequester; //deprecate
1697 public:
1698  void channelStateChange(PvaClientChannelPtr const & channel, bool isConnected); //deprecate
1699  void event(PvaClientMonitorPtr const & monitor);
1700  friend class MonitorRequesterImpl;
1701 };
1702 
1703 
1704 
1711 {
1712 public:
1721  virtual void requestDone(
1723  PvaClientRPCPtr const & pvaClientRPC,
1724  epics::pvData::PVStructure::shared_pointer const & pvResponse) = 0;
1725 };
1726 // NOTE: must use separate class that implements RPCRequester,
1727 // because pvAccess holds a shared_ptr to RPCRequester instead of weak_pointer
1729 typedef std::tr1::shared_ptr<RPCRequesterImpl> RPCRequesterImplPtr;
1730 
1737  public std::tr1::enable_shared_from_this<PvaClientRPC>
1738 {
1739 public:
1746  static PvaClientRPCPtr create(
1747  PvaClientPtr const &pvaClient,
1748  epics::pvAccess::Channel::shared_pointer const & channel);
1755  static PvaClientRPCPtr create(
1756  PvaClientPtr const &pvaClient,
1757  epics::pvAccess::Channel::shared_pointer const & channel,
1758  epics::pvData::PVStructurePtr const &pvRequest
1759  );
1762  ~PvaClientRPC();
1767  void setResponseTimeout(double responseTimeout)
1768  {
1769  this->responseTimeout = responseTimeout;
1770  }
1776  {
1777  return responseTimeout;
1778  }
1783  void connect();
1790  void issueConnect();
1794  epics::pvData::Status waitConnect();
1803  epics::pvData::PVStructure::shared_pointer request(
1804  epics::pvData::PVStructure::shared_pointer const & pvArgument);
1810  void request(
1811  epics::pvData::PVStructure::shared_pointer const & pvArgument,
1812  PvaClientRPCRequesterPtr const & pvaClientRPCRequester);
1813 private:
1814  PvaClientRPC(
1815  PvaClientPtr const &pvaClient,
1816  epics::pvAccess::Channel::shared_pointer const & channel,
1817  epics::pvData::PVStructurePtr const &pvRequest);
1818  std::string getRequesterName();
1819  void message(std::string const & message,epics::pvData::MessageType messageType);
1820  void rpcConnect(
1822  epics::pvAccess::ChannelRPC::shared_pointer const & channelRPC);
1823  void requestDone(
1824  const epics::pvData::Status& status,
1825  epics::pvAccess::ChannelRPC::shared_pointer const & channelRPC,
1826  epics::pvData::PVStructure::shared_pointer const & pvResponse);
1827 
1828  void checkRPCState();
1829 
1830  enum RPCConnectState {connectIdle,connectActive,connected};
1831  epics::pvData::Status connectStatus;
1832  RPCConnectState connectState;
1833 
1834  PvaClient::weak_pointer pvaClient;
1835  epics::pvAccess::Channel::weak_pointer channel;
1837 
1839  epics::pvData::Event waitForConnect;
1840  epics::pvData::Event waitForDone;
1841 
1842  PvaClientRPCRequesterWPtr pvaClientRPCRequester;
1843  RPCRequesterImplPtr rpcRequester;
1844  epics::pvAccess::ChannelRPC::shared_pointer channelRPC;
1845  epics::pvData::PVStructurePtr pvResponse;
1846 
1847  enum RPCState {rpcIdle,rpcActive,rpcComplete};
1848  RPCState rpcState;
1849  epics::pvData::Status requestStatus;
1850  double responseTimeout;
1851  friend class RPCRequesterImpl;
1852 };
1853 
1854 }}
1855 
1856 #endif /* PVACLIENT_H */
1857 
std::tr1::shared_ptr< PvaClient > PvaClientPtr
Definition: pvaClient.h:46
double timeout
Definition: pvutils.cpp:25
Definition: link.h:174
C++ wrapper for epicsEvent from EPICS base.
Definition: event.h:31
std::string request
Methods for manipulating alarm.
Definition: alarm.h:105
std::tr1::shared_ptr< detail::SharedPut > put
std::tr1::shared_ptr< PvaClientProcessRequester > PvaClientProcessRequesterPtr
Definition: pvaClient.h:63
An easy to use alternative to ChannelProcess.
Definition: pvaClient.h:901
A holder for a contiguous piece of memory.
Definition: sharedVector.h:27
pvd::Status status
std::tr1::shared_ptr< ChannelProcessRequesterImpl > ChannelProcessRequesterImplPtr
Definition: pvaClient.h:893
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
Definition: pvaClient.h:50
virtual void channelProcessConnect(const epics::pvData::Status &status, PvaClientProcessPtr const &clientProcess)
A channelProcess has connected.
Definition: pvaClient.h:876
std::tr1::weak_ptr< PvaClientRPCRequester > PvaClientRPCRequesterWPtr
Definition: pvaClient.h:94
A class that holds data given to by PvaClientPut or PvaClientPutGet.
Definition: pvaClient.h:772
std::tr1::shared_ptr< PvaClientMonitorData > PvaClientMonitorDataPtr
Definition: pvaClient.h:54
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
Definition: pvaClient.h:59
std::tr1::shared_ptr< Requester > RequesterPtr
Definition: requester.h:31
virtual void getGetDone(const epics::pvData::Status &status, PvaClientPutGetPtr const &clientPutGet)
A getGet request is complete.
Definition: pvaClient.h:1355
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
std::tr1::weak_ptr< PvaClientGetRequester > PvaClientGetRequesterWPtr
Definition: pvaClient.h:70
std::tr1::weak_ptr< PvaClientPutGetRequester > PvaClientPutGetRequesterWPtr
Definition: pvaClient.h:80
std::tr1::shared_ptr< ChannelGetRequesterImpl > ChannelGetRequesterImplPtr
Definition: pvaClient.h:998
Mark external symbols and entry points for shared libraries.
virtual void channelPutConnect(const epics::pvData::Status &status, PvaClientPutPtr const &clientPut)
A channelPut has connected.
Definition: pvaClient.h:1161
An easy to use alternative to RPC.
Definition: pvaClient.h:1736
A class that holds data returned by PvaClientGet or PvaClientPutGet.
Definition: pvaClient.h:745
PVStructure::shared_pointer createRequest(std::string const &request)
std::tr1::shared_ptr< PvaClientPut > PvaClientPutPtr
Definition: pvaClient.h:76
std::tr1::weak_ptr< PvaClientChannelStateChangeRequester > PvaClientChannelStateChangeRequesterWPtr
Definition: pvaClient.h:58
Optional client callback.
Definition: pvaClient.h:1151
virtual void channelPutGetConnect(const epics::pvData::Status &status, PvaClientPutGetPtr const &clientPutGet)
A channelPutGet has connected.
Definition: pvaClient.h:1327
std::tr1::shared_ptr< PVUnion > PVUnionPtr
Definition: pvData.h:107
std::tr1::shared_ptr< PvaClientPutRequester > PvaClientPutRequesterPtr
Definition: pvaClient.h:73
#define POINTER_DEFINITIONS(clazz)
Definition: sharedPtr.h:198
A base class for PvaClientGetData, PvaClientPutData, and PvaClientMonitorData.
Definition: pvaClient.h:569
std::tr1::shared_ptr< PvaClientMonitorRequester > PvaClientMonitorRequesterPtr
Definition: pvaClient.h:85
epicsMutex mutex
Definition: pvAccess.cpp:71
std::tr1::shared_ptr< PvaClientArray > PvaClientArrayPtr
Definition: pvaClient.h:88
std::tr1::weak_ptr< PvaClientPutRequester > PvaClientPutRequesterWPtr
Definition: pvaClient.h:75
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
Methods for accessing a timeStamp structure.
Definition: pvTimeStamp.h:38
#define epicsShareClass
Definition: shareLib.h:206
std::tr1::shared_ptr< PVScalar > PVScalarPtr
Definition: pvData.h:77
std::tr1::shared_ptr< PvaClientPutGetRequester > PvaClientPutGetRequesterPtr
Definition: pvaClient.h:78
std::tr1::weak_ptr< PvaClientMonitorRequester > PvaClientMonitorRequesterWPtr
Definition: pvaClient.h:87
Methods for accessing an alarm structure.
Definition: pvAlarm.h:37
void setResponseTimeout(double responseTimeout)
Set a timeout for a request.
Definition: pvaClient.h:1767
std::tr1::shared_ptr< PvaClientField > PvaClientFieldPtr
Definition: pvaClient.h:61
virtual void unlisten()
The data source is no longer available.
Definition: pvaClient.h:1543
pvaClient is a synchronous wrapper for the pvAccess API, which is a callback based API...
Definition: pvaClient.h:106
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
Definition: pvaClient.h:71
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< MonitorRequesterImpl > MonitorRequesterImplPtr
Definition: pvaClient.h:1553
std::tr1::shared_ptr< RPCRequesterImpl > RPCRequesterImplPtr
Definition: pvaClient.h:1728
Optional client callback.
Definition: pvaClient.h:1710
A class that holds data returned by PvaClientMonitor.
Definition: pvaClient.h:825
std::tr1::shared_ptr< PvaClientRPC > PvaClientRPCPtr
Definition: pvaClient.h:90
An easy to use alternative to ChannelGet.
Definition: pvaClient.h:1035
std::tr1::shared_ptr< PvaClientChannelStateChangeRequester > PvaClientChannelStateChangeRequesterPtr
Definition: pvaClient.h:56
Optional client callback.
Definition: pvaClient.h:1006
An easy to use alternative to ChannelPut.
Definition: pvaClient.h:1191
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::shared_ptr< PvaClientPutCache > PvaClientPutCachePtr
Definition: pvaClient.h:203
An easy to use alternative to directly calling the Channel methods of pvAccess.
Definition: pvaClient.h:237
virtual void getDone(const epics::pvData::Status &status, PvaClientPutPtr const &clientPut)
A get request is complete.
Definition: pvaClient.h:1171
struct rset rset EPICS_DEPRECATED
Definition: recSup.h:88
std::tr1::shared_ptr< PvaClientProcess > PvaClientProcessPtr
Definition: pvaClient.h:66
std::tr1::shared_ptr< PvaClientPutGet > PvaClientPutGetPtr
Definition: pvaClient.h:81
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
std::tr1::shared_ptr< BitSet > BitSetPtr
Definition: bitSet.h:26
std::tr1::shared_ptr< PvaClientGetCache > PvaClientGetCachePtr
Definition: pvaClient.h:201
std::tr1::shared_ptr< PvaClientRPCRequester > PvaClientRPCRequesterPtr
Definition: pvaClient.h:92
std::tr1::shared_ptr< ChannelPutGetRequesterImpl > ChannelPutGetRequesterImplPtr
Definition: pvaClient.h:1309
std::tr1::shared_ptr< PvaClientChannelCache > PvaClientChannelCachePtr
Definition: pvaClient.h:97
virtual void channelGetConnect(const epics::pvData::Status &status, PvaClientGetPtr const &clientGet)
A channelGet has connected.
Definition: pvaClient.h:1016
An easy to use alternative to ChannelPutGet.
Definition: pvaClient.h:1369
A callback for change in connection status.
Definition: pvaClient.h:213
epicsMutex Mutex
Definition: lock.h:28
std::tr1::shared_ptr< ChannelPutRequesterImpl > ChannelPutRequesterImplPtr
Definition: pvaClient.h:1143
An easy to use alternative to Monitor.
Definition: pvaClient.h:1561
std::tr1::shared_ptr< PvaClientMonitor > PvaClientMonitorPtr
Definition: pvaClient.h:83
virtual void monitorConnect(epics::pvData::Status const &status, PvaClientMonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)
The server has returned a message that the monitor is connected.
Definition: pvaClient.h:1530
virtual void getPutDone(const epics::pvData::Status &status, PvaClientPutGetPtr const &clientPutGet)
A getPut request is complete.
Definition: pvaClient.h:1345
std::tr1::shared_ptr< PvaClientPutData > PvaClientPutDataPtr
Definition: pvaClient.h:52
double getResponseTimeout()
Get the responseTimeout.
Definition: pvaClient.h:1775
std::tr1::shared_ptr< Monitor > MonitorPtr
Definition: monitor.h:44
Methods for manipulating timeStamp.
Definition: timeStamp.h:43
std::tr1::shared_ptr< PvaClientData > PvaClientDataPtr
Definition: pvaClient.h:48
std::tr1::weak_ptr< PvaClientProcessRequester > PvaClientProcessRequesterWPtr
Definition: pvaClient.h:65
std::tr1::shared_ptr< PvaClientGetRequester > PvaClientGetRequesterPtr
Definition: pvaClient.h:68