This is Unofficial EPICS BASE Doxygen Site
utilities.h
Go to the documentation of this file.
1 #ifndef UTILITIES_H
2 #define UTILITIES_H
3 
4 #include <deque>
5 #include <sstream>
6 
7 #include <errlog.h>
8 #include <epicsEvent.h>
9 #include <epicsUnitTest.h>
10 #include <dbUnitTest.h>
11 
12 #include <pv/pvUnitTest.h>
13 #include <pv/pvAccess.h>
14 
15 #include "pvahelper.h"
16 #include "weakmap.h"
17 #include "weakset.h"
18 
19 #include <shareLib.h>
20 
21 struct TestPV;
22 struct TestPVChannel;
23 struct TestPVMonitor;
24 struct TestProvider;
25 
26 // minimally useful boilerplate which must appear *everywhere*
27 #define DUMBREQUESTER(NAME) \
28  virtual std::string getRequesterName() OVERRIDE { return #NAME; }
29 
30 template<typename T>
31 inline std::string toString(const T& tbs)
32 {
33  std::ostringstream oss;
34  oss << tbs;
35  return oss.str();
36 }
37 
38 // Boilerplate reduction for accessing a scalar field
39 template<typename T>
41  epics::pvData::PVScalar::shared_pointer field;
42  typedef T value_type;
43  ScalarAccessor(const epics::pvData::PVStructurePtr& s, const char *name)
44  :field(s->getSubFieldT<epics::pvData::PVScalar>(name))
45  {}
46  operator value_type() {
47  return field->getAs<T>();
48  }
50  field->putFrom<T>(v);
51  return *this;
52  }
54  field->putFrom<T>(field->getAs<T>()+v);
55  return *this;
56  }
57 };
58 
60 {
63 
65  epicsEvent wait;
66  epics::pvAccess::Channel::shared_pointer chan;
67  epics::pvData::Status status;
68  epics::pvAccess::Channel::ConnectionState laststate;
70  virtual ~TestChannelRequester();
71  virtual void channelCreated(const epics::pvData::Status& status, epics::pvAccess::Channel::shared_pointer const & channel);
72  virtual void channelStateChange(epics::pvAccess::Channel::shared_pointer const & channel, epics::pvAccess::Channel::ConnectionState connectionState);
73 
74  bool waitForConnect();
75 };
76 
77 struct TestChannelFieldRequester : public epics::pvAccess::GetFieldRequester
78 {
81 
82  bool done;
83  epics::pvData::Status status;
84  epics::pvData::FieldConstPtr fielddesc;
85 
88 
89  virtual void getDone(
92  {
93  this->status = status;
94  fielddesc = field;
95  done = true;
96  }
97 };
98 
100 {
103 
104  bool connected, done;
105  epics::pvData::Status statusConnect, statusDone;
106  epics::pvAccess::ChannelGet::shared_pointer channelGet;
107  epics::pvData::Structure::const_shared_pointer fielddesc;
108  epics::pvData::PVStructure::shared_pointer value;
109  epics::pvData::BitSet::shared_pointer changed;
110 
112  virtual ~TestChannelGetRequester();
113 
114  virtual void channelGetConnect(
115  const epics::pvData::Status& status,
116  epics::pvAccess::ChannelGet::shared_pointer const & channelGet,
117  epics::pvData::Structure::const_shared_pointer const & structure);
118 
119  virtual void getDone(
120  const epics::pvData::Status& status,
121  epics::pvAccess::ChannelGet::shared_pointer const & channelGet,
122  epics::pvData::PVStructure::shared_pointer const & pvStructure,
123  epics::pvData::BitSet::shared_pointer const & bitSet);
124 };
125 
126 struct TestChannelPutRequester : public epics::pvAccess::ChannelPutRequester
127 {
130 
131  bool connected, doneGet, donePut;
132  epics::pvData::Status statusConnect, statusPut, statusGet;
133  epics::pvAccess::ChannelPut::shared_pointer put;
134  epics::pvData::Structure::const_shared_pointer fielddesc;
135  epics::pvData::PVStructure::shared_pointer value;
136  epics::pvData::BitSet::shared_pointer changed;
137 
139  virtual ~TestChannelPutRequester();
140 
141  virtual void channelPutConnect(
142  const epics::pvData::Status& status,
143  epics::pvAccess::ChannelPut::shared_pointer const & channelPut,
144  epics::pvData::Structure::const_shared_pointer const & structure);
145 
146  virtual void putDone(
147  const epics::pvData::Status& status,
148  epics::pvAccess::ChannelPut::shared_pointer const & channelPut);
149 
150  virtual void getDone(
151  const epics::pvData::Status& status,
152  epics::pvAccess::ChannelPut::shared_pointer const & channelPut,
153  epics::pvData::PVStructure::shared_pointer const & pvStructure,
154  epics::pvData::BitSet::shared_pointer const & bitSet);
155 };
156 
157 struct TestChannelMonitorRequester : public epics::pvData::MonitorRequester
158 {
161 
164  bool connected;
165  bool unlistend;
166  size_t eventCnt;
167  epics::pvData::Status connectStatus;
168  epics::pvData::MonitorPtr mon;
169  epics::pvData::StructureConstPtr dtype;
170 
172  virtual ~TestChannelMonitorRequester();
173 
174  virtual void monitorConnect(epics::pvData::Status const & status,
175  epics::pvData::MonitorPtr const & monitor,
176  epics::pvData::StructureConstPtr const & structure);
177  virtual void monitorEvent(epics::pvData::MonitorPtr const & monitor);
178  virtual void unlisten(epics::pvData::MonitorPtr const & monitor);
179 
180  bool waitForConnect();
181  bool waitForEvent();
182 };
183 
184 struct TestPVChannel : public BaseChannel
185 {
188  std::tr1::weak_ptr<TestPVChannel> weakself;
189 
190  const std::tr1::shared_ptr<TestPV> pv;
191  ConnectionState state;
192 
194  monitors_t monitors;
195 
196  TestPVChannel(const std::tr1::shared_ptr<TestPV>& pv,
197  const std::tr1::shared_ptr<epics::pvAccess::ChannelRequester>& req);
198  virtual ~TestPVChannel();
199 
200  virtual std::string getRemoteAddress() { return "localhost:1234"; }
201  virtual ConnectionState getConnectionState();
202 
203  virtual void getField(epics::pvAccess::GetFieldRequester::shared_pointer const & requester,std::string const & subField);
204 
205  virtual epics::pvData::Monitor::shared_pointer createMonitor(
206  epics::pvData::MonitorRequester::shared_pointer const & monitorRequester,
207  epics::pvData::PVStructure::shared_pointer const & pvRequest);
208 };
209 
211 {
213  std::tr1::weak_ptr<TestPVMonitor> weakself;
214 
215  const TestPVChannel::shared_pointer channel;
216  const epics::pvData::MonitorRequester::weak_pointer requester;
217 
218  bool running;
219  bool finalize;
222 
223  TestPVMonitor(const TestPVChannel::shared_pointer& ch,
224  const epics::pvData::MonitorRequester::shared_pointer& req,
225  size_t bsize);
226  virtual ~TestPVMonitor();
227 
228  virtual void destroy();
229 
230  virtual epics::pvData::Status start();
231  virtual epics::pvData::Status stop();
232  virtual epics::pvData::MonitorElementPtr poll();
233  virtual void release(epics::pvData::MonitorElementPtr const & monitorElement);
234 
235  std::deque<epics::pvData::MonitorElementPtr> buffer, free;
237 };
238 
239 struct TestPV
240 {
242  std::tr1::weak_ptr<TestPV> weakself;
243 
244  const std::string name;
245  std::tr1::weak_ptr<TestProvider> const provider;
246 
248 
251 
252  TestPV(const std::string& name,
253  const std::tr1::shared_ptr<TestProvider>& provider,
254  const epics::pvData::StructureConstPtr& dtype);
255  ~TestPV();
256 
257  void post(bool notify = true);
258  void post(const epics::pvData::BitSet& changed, bool notify = true);
259 
260  void disconnect();
261 
262  mutable epicsMutex lock;
263 
265  channels_t channels;
266  friend struct TestProvider;
267 };
268 
269 struct TestProvider : public epics::pvAccess::ChannelProvider, std::tr1::enable_shared_from_this<TestProvider>
270 {
272 
273  virtual std::string getProviderName() { return "TestProvider"; }
274 
275  virtual void destroy();
276 
277  virtual epics::pvAccess::ChannelFind::shared_pointer channelFind(std::string const & channelName,
278  epics::pvAccess::ChannelFindRequester::shared_pointer const & channelFindRequester);
279  virtual epics::pvAccess::ChannelFind::shared_pointer channelList(epics::pvAccess::ChannelListRequester::shared_pointer const & channelListRequester);
280  virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string const & channelName,epics::pvAccess::ChannelRequester::shared_pointer const & channelRequester,
281  short priority = PRIORITY_DEFAULT);
282  virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string const & channelName, epics::pvAccess::ChannelRequester::shared_pointer const & channelRequester,
283  short priority, std::string const & address);
284 
285  TestProvider();
286  virtual ~TestProvider();
287 
288  TestPV::shared_pointer addPV(const std::string& name, const epics::pvData::StructureConstPtr& tdef);
289 
290  void dispatch();
291 
292  mutable epicsMutex lock;
294  pvs_t pvs;
295 
296  static void testCounts();
297 };
298 
299 struct TestIOC {
300  bool hasInit;
301  TestIOC() : hasInit(false) {
302  testdbPrepare();
303  }
305  this->shutdown();
306  testdbCleanup();
307  }
308  void init() {
309  if(!hasInit) {
310  eltc(0);
311  testIocInitOk();
312  eltc(1);
313  hasInit = true;
314  }
315  }
316  void shutdown() {
317  if(hasInit) {
318  testIocShutdownOk();
319  hasInit = false;
320  }
321  }
322 };
323 
324 #endif // UTILITIES_H
Definition: link.h:174
epics::pvData::PVStructurePtr value
Definition: utilities.h:250
~TestIOC()
Definition: utilities.h:304
std::tr1::shared_ptr< detail::SharedPut > put
epicsMutexId lock
Definition: osiClockTime.c:37
std::tr1::weak_ptr< TestProvider > const provider
Definition: utilities.h:245
pvd::Status status
virtual std::string getProviderName()
Definition: utilities.h:273
const epics::pvData::MonitorRequester::weak_pointer requester
Definition: utilities.h:216
Definition: tool_lib.h:67
epics::pvData::MonitorElementPtr overflow
Definition: utilities.h:236
bool hasInit
Definition: utilities.h:300
Definition: memory.hpp:41
weak_set< TestPVChannel > channels_t
Definition: utilities.h:264
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
TestIOC()
Definition: utilities.h:301
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
epicsMutex lock
Definition: utilities.h:292
A vector of bits.
Definition: bitSet.h:56
Mark external symbols and entry points for shared libraries.
epics::pvData::PVScalar::shared_pointer field
Definition: utilities.h:41
channels_t channels
Definition: utilities.h:265
epicsMutex lock
Definition: utilities.h:262
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
Definition: pvData.h:124
const TestPVChannel::shared_pointer channel
Definition: utilities.h:215
a std::set-ish container where entries are removed when ref. counts fall to zero
Definition: weakset.h:57
std::tr1::weak_ptr< TestPV > weakself
Definition: utilities.h:242
#define POINTER_DEFINITIONS(clazz)
Definition: sharedPtr.h:198
epics::pvData::PVDataCreatePtr factory
Definition: utilities.h:247
bool needWakeup
Definition: utilities.h:221
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
const std::string name
Definition: utilities.h:244
int eltc(int yesno)
Definition: errlog.c:368
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
std::deque< epics::pvData::MonitorElementPtr > free
Definition: utilities.h:235
APIs for the epicsEvent binary semaphore.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
const epics::pvData::StructureConstPtr dtype
Definition: utilities.h:249
Unit test routines.
void shutdown()
Definition: utilities.h:316
void init()
Definition: utilities.h:308
void done(int k)
Definition: antelope.c:77
bool inoverflow
Definition: utilities.h:220
ScalarAccessor & operator+=(T v)
Definition: utilities.h:53
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
std::string toString(const T &tbs)
Definition: utilities.h:31
virtual void getDone(const epics::pvData::Status &status, epics::pvData::FieldConstPtr const &field)
Definition: utilities.h:89
std::tr1::weak_ptr< TestPVMonitor > weakself
Definition: utilities.h:213
ScalarAccessor(const epics::pvData::PVStructurePtr &s, const char *name)
Definition: utilities.h:43
#define false
Definition: flexdef.h:85
ScalarAccessor & operator=(T v)
Definition: utilities.h:49
std::tr1::shared_ptr< Monitor > MonitorPtr
Definition: monitor.h:44
virtual ~TestChannelFieldRequester()
Definition: utilities.h:87
weak_value_map< std::string, TestPV > pvs_t
Definition: utilities.h:293
#define DUMBREQUESTER(NAME)
Definition: utilities.h:27