pvDatabaseCPP  4.7.1-dev
dataDistributorPlugin.h
Go to the documentation of this file.
1 // Copyright information and license terms for this software can be
2 // found in the file LICENSE that is included with the distribution
3 
4 #ifndef DATA_DISTRIBUTOR_PLUGIN_H
5 #define DATA_DISTRIBUTOR_PLUGIN_H
6 
7 // The data distributor plugin enables distribution of channel data between
8 // multiple client applications.
9 
10 #include <string>
11 #include <map>
12 #include <list>
13 #include <pv/lock.h>
14 #include <pv/pvData.h>
15 #include <pv/pvPlugin.h>
16 
17 #include <shareLib.h>
18 
19 namespace epics { namespace pvCopy {
20 
21 class DataDistributorPlugin;
22 class DataDistributorFilter;
24 
25 typedef std::tr1::shared_ptr<DataDistributorPlugin> DataDistributorPluginPtr;
26 typedef std::tr1::shared_ptr<DataDistributorFilter> DataDistributorFilterPtr;
27 typedef std::tr1::shared_ptr<DataDistributor> DataDistributorPtr;
28 
29 struct ClientSet;
30 typedef std::tr1::shared_ptr<ClientSet> ClientSetPtr;
31 typedef std::tr1::shared_ptr<const ClientSet> ClientSetConstPtr;
32 
33 struct ClientSet
34 {
36 
37  ClientSet(const std::string& setId_, const std::string triggerField_, int nUpdatesPerClient_, int updateMode_)
38  : setId(setId_)
39  , triggerField(triggerField_)
40  , nUpdatesPerClient(nUpdatesPerClient_)
41  , updateMode(updateMode_)
42  , clientIdList()
43  , lastUpdateValue()
44  , updateCounter(0)
46  {}
48  std::string setId;
49  std::string triggerField;
52  std::list<int> clientIdList;
53  std::string lastUpdateValue;
55  std::list<int>::iterator currentClientIdIter;
56 };
57 
59 {
60 public:
62  DD_UPDATE_ONE_PER_GROUP = 0, // Update goes to one client per set
63  DD_UPDATE_ALL_IN_GROUP = 1, // Update goes to all clients in set
64  DD_N_UPDATE_MODES = 2 // Number of valid update modes
65  };
66 
67  static DataDistributorPtr getInstance(const std::string& groupId);
68  static void removeUnusedInstance(DataDistributorPtr dataDistributorPtr);
69 
70  virtual ~DataDistributor();
71  std::string getGroupId() const { return groupId; }
72  std::string addClient(int clientId, const std::string& setId, const std::string& triggerField, int nUpdatesPerClient, int updateMode);
73  void removeClient(int clientId, const std::string& setId);
74  bool updateClient(int clientId, const std::string& setId, const std::string& triggerFieldValue);
75 
76 private:
77  DataDistributor(const std::string& id);
78  DataDistributor(const DataDistributor& distributor);
79  DataDistributor& operator=(const DataDistributor& distributor);
80 
81  static std::map<std::string, DataDistributorPtr> dataDistributorMap;
82  static epics::pvData::Mutex dataDistributorMapMutex;
83 
84  std::string groupId;
85  epics::pvData::Mutex mutex;
86  std::map<std::string, ClientSetPtr> clientSetMap;
87  std::list<std::string> clientSetIdList;
88  std::list<std::string>::iterator currentSetIdIter;
89  std::string lastUpdateValue;
90 };
91 
92 class epicsShareClass DataDistributorPlugin : public PVPlugin
93 {
94 private:
96 public:
98  virtual ~DataDistributorPlugin();
102  static void create();
111  virtual PVFilterPtr create(
112  const std::string& requestValue,
113  const PVCopyPtr& pvCopy,
114  const epics::pvData::PVFieldPtr& master);
115 private:
116  static bool initialize();
117  static bool initialized;
118 };
119 
123 class epicsShareClass DataDistributorFilter : public PVFilter
124 {
125 private:
126  DataDistributorPtr dataDistributorPtr;
127  int clientId;
128  std::string setId;
129  std::string triggerField;
130  epics::pvData::PVFieldPtr masterFieldPtr;
131  epics::pvData::PVFieldPtr triggerFieldPtr;
132  bool firstUpdate;
133 
134  DataDistributorFilter(const std::string& groupId, int clientId, const std::string& setId, const std::string& triggerField, int nUpdatesPerClient, int updateMode, const epics::pvCopy::PVCopyPtr& copyPtr, const epics::pvData::PVFieldPtr& masterFieldPtr);
135 
136 public:
138  virtual ~DataDistributorFilter();
146  static DataDistributorFilterPtr create(
147  const std::string& requestValue,
148  const PVCopyPtr& pvCopy,
149  const epics::pvData::PVFieldPtr & master);
158  bool filter(const epics::pvData::PVFieldPtr & pvCopy,const epics::pvData::BitSetPtr & bitSet,bool toCopy);
163  std::string getName();
164 };
165 
166 }}
167 #endif
std::tr1::shared_ptr< PVFilter > PVFilterPtr
Definition: pvPlugin.h:29
std::tr1::shared_ptr< PVCopy > PVCopyPtr
Definition: pvPlugin.h:25
std::tr1::shared_ptr< ClientSet > ClientSetPtr
A filter plugin that attaches to a field of a PVStrcture.
Definition: pvPlugin.h:44
POINTER_DEFINITIONS(ClientSet)
ClientSet(const std::string &setId_, const std::string triggerField_, int nUpdatesPerClient_, int updateMode_)
A Plugin for a filter that gets a sub array from a PVScalarDeadband.
std::tr1::shared_ptr< DataDistributorFilter > DataDistributorFilterPtr
std::list< int >::iterator currentClientIdIter
std::tr1::shared_ptr< DataDistributor > DataDistributorPtr
A Filter that is called when a copy PVStructure is being updated.
Definition: pvPlugin.h:68
std::tr1::shared_ptr< DataDistributorPlugin > DataDistributorPluginPtr
std::tr1::shared_ptr< const ClientSet > ClientSetConstPtr