This is Unofficial EPICS BASE Doxygen Site
caChannel.h
Go to the documentation of this file.
1 
12 #ifndef CACHANNEL_H
13 #define CACHANNEL_H
14 
15 #include <queue>
16 #include <vector>
17 
18 #include <pv/pvAccess.h>
19 #include <pv/event.h>
20 
21 /* for CA */
22 #include <cadef.h>
23 
24 #include "caProviderPvt.h"
25 #include "dbdToPv.h"
26 
27 namespace epics {
28 namespace pvAccess {
29 namespace ca {
30 
31 class CAChannel;
32 typedef std::tr1::shared_ptr<CAChannel> CAChannelPtr;
33 typedef std::tr1::weak_ptr<CAChannel> CAChannelWPtr;
35 typedef std::tr1::shared_ptr<ChannelConnectThread> ChannelConnectThreadPtr;
36 
38 typedef std::tr1::shared_ptr<NotifyChannelRequester> NotifyChannelRequesterPtr;
39 
41 typedef std::tr1::shared_ptr<NotifyMonitorRequester> NotifyMonitorRequesterPtr;
43 typedef std::tr1::shared_ptr<MonitorEventThread> MonitorEventThreadPtr;
44 
46 typedef std::tr1::shared_ptr<NotifyGetRequester> NotifyGetRequesterPtr;
47 typedef std::tr1::weak_ptr<NotifyGetRequester> NotifyGetRequesterWPtr;
49 typedef std::tr1::shared_ptr<GetDoneThread> GetDoneThreadPtr;
50 
52 typedef std::tr1::shared_ptr<NotifyPutRequester> NotifyPutRequesterPtr;
53 typedef std::tr1::weak_ptr<NotifyPutRequester> NotifyPutRequesterWPtr;
55 typedef std::tr1::shared_ptr<PutDoneThread> PutDoneThreadPtr;
56 
58 typedef std::tr1::shared_ptr<CAChannelGetField> CAChannelGetFieldPtr;
59 typedef std::tr1::weak_ptr<CAChannelGetField> CAChannelGetFieldWPtr;
61 typedef std::tr1::shared_ptr<CAChannelPut> CAChannelPutPtr;
62 typedef std::tr1::weak_ptr<CAChannelPut> CAChannelPutWPtr;
64 typedef std::tr1::shared_ptr<CAChannelGet> CAChannelGetPtr;
65 typedef std::tr1::weak_ptr<CAChannelGet> CAChannelGetWPtr;
67 typedef std::tr1::shared_ptr<CAChannelMonitor> CAChannelMonitorPtr;
68 typedef std::tr1::weak_ptr<CAChannelMonitor> CAChannelMonitorWPtr;
69 
71  public std::tr1::enable_shared_from_this<CAChannelGetField>
72 {
73 public:
76  CAChannelPtr const &channel,
77  GetFieldRequester::shared_pointer const & requester,
78  std::string const & subField);
80  void callRequester(CAChannelPtr const & caChannel);
81  void activate();
82 private:
83  CAChannelWPtr channel;
84  GetFieldRequester::weak_pointer getFieldRequester;
85  std::string subField;
86 };
87 
88 class CAChannel :
89  public Channel,
90  public std::tr1::enable_shared_from_this<CAChannel>
91 {
92 public:
94  static CAChannelPtr create(
95  CAChannelProvider::shared_pointer const & channelProvider,
96  std::string const & channelName,
97  short priority,
98  ChannelRequester::shared_pointer const & channelRequester);
99  virtual ~CAChannel();
100  chid getChannelID();
101 
102  virtual std::tr1::shared_ptr<ChannelProvider> getProvider();
103  virtual std::string getRemoteAddress();
104  virtual ConnectionState getConnectionState();
105  virtual std::string getChannelName();
106  virtual std::tr1::shared_ptr<ChannelRequester> getChannelRequester();
107  virtual void getField(GetFieldRequester::shared_pointer const & requester,std::string const & subField);
108  virtual AccessRights getAccessRights(epics::pvData::PVField::shared_pointer const & pvField);
109  virtual ChannelGet::shared_pointer createChannelGet(
110  ChannelGetRequester::shared_pointer const & channelGetRequester,
111  epics::pvData::PVStructurePtr const & pvRequest);
112  virtual ChannelPut::shared_pointer createChannelPut(
113  ChannelPutRequester::shared_pointer const & channelPutRequester,
114  epics::pvData::PVStructurePtr const & pvRequest);
115  virtual Monitor::shared_pointer createMonitor(
116  MonitorRequester::shared_pointer const & monitorRequester,
117  epics::pvData::PVStructurePtr const & pvRequest);
118  virtual void printInfo(std::ostream& out);
119 
120  void attachContext();
121  void disconnectChannel();
122  void connect(bool isConnected);
123  void notifyClient();
124 private:
125  virtual void destroy() {}
126  CAChannel(std::string const & channelName,
127  CAChannelProvider::shared_pointer const & channelProvider,
128  ChannelRequester::shared_pointer const & channelRequester);
129  void activate(short priority);
130  void addMonitor(CAChannelMonitorPtr const & monitor);
131 
132  std::string channelName;
133  CAChannelProviderWPtr channelProvider;
134  ChannelRequester::weak_pointer channelRequester;
135  chid channelID;
136  bool channelCreated;
137  bool channelConnected;
138  ChannelConnectThreadPtr channelConnectThread;
139  NotifyChannelRequesterPtr notifyChannelRequester;
140 
141  epics::pvData::Mutex requestsMutex;
142  std::queue<CAChannelGetFieldPtr> getFieldQueue;
143  std::queue<CAChannelPutPtr> putQueue;
144  std::queue<CAChannelGetPtr> getQueue;
145  std::queue<CAChannelMonitorPtr> monitorQueue;
146  std::vector<CAChannelMonitorWPtr> monitorlist;
147 };
148 
149 
151  public ChannelGet,
152  public std::tr1::enable_shared_from_this<CAChannelGet>
153 {
154 public:
156  static CAChannelGet::shared_pointer create(CAChannel::shared_pointer const & channel,
157  ChannelGetRequester::shared_pointer const & channelGetRequester,
158  epics::pvData::PVStructurePtr const & pvRequest);
159  virtual ~CAChannelGet();
160  void getDone(struct event_handler_args &args);
161  virtual void get();
162  virtual Channel::shared_pointer getChannel();
163  virtual void cancel();
164  virtual void lastRequest();
165  virtual std::string getRequesterName();
166 
167  void activate();
168  void notifyClient();
169 private:
170  virtual void destroy() {}
171  CAChannelGet(CAChannel::shared_pointer const & _channel,
172  ChannelGetRequester::shared_pointer const & _channelGetRequester,
173  epics::pvData::PVStructurePtr const & pvRequest);
174 
175  CAChannelPtr channel;
176  ChannelGetRequester::weak_pointer channelGetRequester;
177  const epics::pvData::PVStructure::shared_pointer pvRequest;
178  epics::pvData::Status getStatus;
179  GetDoneThreadPtr getDoneThread;
180  NotifyGetRequesterPtr notifyGetRequester;
181  DbdToPvPtr dbdToPv;
183  epics::pvData::PVStructure::shared_pointer pvStructure;
184  epics::pvData::BitSet::shared_pointer bitSet;
185 };
186 
188  public ChannelPut,
189  public std::tr1::enable_shared_from_this<CAChannelPut>
190 {
191 
192 public:
194  static CAChannelPut::shared_pointer create(CAChannel::shared_pointer const & channel,
195  ChannelPutRequester::shared_pointer const & channelPutRequester,
196  epics::pvData::PVStructurePtr const & pvRequest);
197  virtual ~CAChannelPut();
198  void putDone(struct event_handler_args &args);
199  void getDone(struct event_handler_args &args);
200  virtual void put(
201  epics::pvData::PVStructure::shared_pointer const & pvPutStructure,
202  epics::pvData::BitSet::shared_pointer const & putBitSet
203  );
204  virtual void get();
205  virtual Channel::shared_pointer getChannel();
206  virtual void cancel();
207  virtual void lastRequest();
208 
209  virtual std::string getRequesterName();
210  void activate();
211  void notifyClient();
212 private:
213  virtual void destroy() {}
214  CAChannelPut(CAChannel::shared_pointer const & _channel,
215  ChannelPutRequester::shared_pointer const & _channelPutRequester,
216  epics::pvData::PVStructurePtr const & pvRequest);
217  CAChannelPtr channel;
218  ChannelPutRequester::weak_pointer channelPutRequester;
219  const epics::pvData::PVStructure::shared_pointer pvRequest;
220  bool block;
221  bool isPut;
222  epics::pvData::Status getStatus;
223  epics::pvData::Status putStatus;
224  PutDoneThreadPtr putDoneThread;
225  NotifyPutRequesterPtr notifyPutRequester;
226  DbdToPvPtr dbdToPv;
228  epics::pvData::PVStructure::shared_pointer pvStructure;
229  epics::pvData::BitSet::shared_pointer bitSet;
230 };
231 
233 typedef std::tr1::shared_ptr<CACMonitorQueue> CACMonitorQueuePtr;
234 
236  public Monitor,
237  public std::tr1::enable_shared_from_this<CAChannelMonitor>
238 {
239 
240 public:
242  static CAChannelMonitor::shared_pointer create(CAChannel::shared_pointer const & channel,
243  MonitorRequester::shared_pointer const & monitorRequester,
244  epics::pvData::PVStructurePtr const & pvRequest);
245  virtual ~CAChannelMonitor();
246  void subscriptionEvent(struct event_handler_args &args);
247 
248  virtual epics::pvData::Status start();
249  virtual epics::pvData::Status stop();
250  virtual MonitorElementPtr poll();
251  virtual void release(MonitorElementPtr const & monitorElement);
252  virtual void cancel();
253  virtual std::string getRequesterName();
254  void activate();
255  void notifyClient();
256 private:
257  virtual void destroy() {}
258  CAChannelMonitor(CAChannel::shared_pointer const & _channel,
259  MonitorRequester::shared_pointer const & _monitorRequester,
260  epics::pvData::PVStructurePtr const & pvRequest);
261  CAChannelPtr channel;
262  MonitorRequester::weak_pointer monitorRequester;
263  const epics::pvData::PVStructure::shared_pointer pvRequest;
264  bool isStarted;
265  MonitorEventThreadPtr monitorEventThread;
266  evid pevid;
267  unsigned long eventMask;
268  NotifyMonitorRequesterPtr notifyMonitorRequester;
269 
270  DbdToPvPtr dbdToPv;
272  epics::pvData::PVStructure::shared_pointer pvStructure;
273  epics::pvData::MonitorElementPtr activeElement;
274 
275  CACMonitorQueuePtr monitorQueue;
276 };
277 
278 }}}
279 
280 #endif /* CACHANNEL_H */
std::tr1::shared_ptr< detail::SharedPut > put
std::tr1::shared_ptr< CACMonitorQueue > CACMonitorQueuePtr
Definition: caChannel.h:232
std::tr1::shared_ptr< MonitorEventThread > MonitorEventThreadPtr
Definition: caChannel.h:42
CAChannelGetField(CAChannelPtr const &channel, GetFieldRequester::shared_pointer const &requester, std::string const &subField)
Definition: caChannel.cpp:371
std::tr1::weak_ptr< CAChannelGetField > CAChannelGetFieldWPtr
Definition: caChannel.h:59
std::tr1::shared_ptr< NotifyChannelRequester > NotifyChannelRequesterPtr
Definition: caChannel.h:37
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
std::tr1::weak_ptr< NotifyGetRequester > NotifyGetRequesterWPtr
Definition: caChannel.h:47
std::tr1::shared_ptr< CAChannel > CAChannelPtr
Definition: caChannel.h:31
std::tr1::shared_ptr< PutDoneThread > PutDoneThreadPtr
Definition: caChannel.h:54
std::tr1::weak_ptr< CAChannelGet > CAChannelGetWPtr
Definition: caChannel.h:65
std::tr1::shared_ptr< CAChannelGetField > CAChannelGetFieldPtr
Definition: caChannel.h:57
std::tr1::shared_ptr< NotifyGetRequester > NotifyGetRequesterPtr
Definition: caChannel.h:45
epicsMutex mutex
Definition: pvAccess.cpp:71
std::tr1::shared_ptr< NotifyMonitorRequester > NotifyMonitorRequesterPtr
Definition: caChannel.h:40
std::tr1::weak_ptr< CAChannelPut > CAChannelPutWPtr
Definition: caChannel.h:62
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< CAChannelPut > CAChannelPutPtr
Definition: caChannel.h:60
std::tr1::weak_ptr< CAChannelMonitor > CAChannelMonitorWPtr
Definition: caChannel.h:68
std::tr1::shared_ptr< CAChannelMonitor > CAChannelMonitorPtr
Definition: caChannel.h:66
std::tr1::weak_ptr< NotifyPutRequester > NotifyPutRequesterWPtr
Definition: caChannel.h:53
std::tr1::weak_ptr< CAChannelProvider > CAChannelProviderWPtr
Definition: caProviderPvt.h:45
std::tr1::weak_ptr< CAChannel > CAChannelWPtr
Definition: caChannel.h:33
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::tr1::shared_ptr< NotifyPutRequester > NotifyPutRequesterPtr
Definition: caChannel.h:51
std::tr1::shared_ptr< DbdToPv > DbdToPvPtr
Definition: dbdToPv.h:73
std::tr1::shared_ptr< CAChannelGet > CAChannelGetPtr
Definition: caChannel.h:63
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
epicsMutex Mutex
Definition: lock.h:28
void callRequester(CAChannelPtr const &caChannel)
Definition: caChannel.cpp:396
std::tr1::shared_ptr< GetDoneThread > GetDoneThreadPtr
Definition: caChannel.h:48
std::tr1::shared_ptr< ChannelConnectThread > ChannelConnectThreadPtr
Definition: caChannel.h:34