38struct ScalarAccessor {
39 epics::pvData::PVScalar::shared_pointer field;
41 ScalarAccessor(
const epics::pvData::PVStructurePtr& s,
const char *name)
42 :field(s->getSubFieldT<epics::pvData::PVScalar>(name))
44 operator value_type() {
45 return field->getAs<T>();
47 ScalarAccessor& operator=(T v) {
51 ScalarAccessor& operator+=(T v) {
52 field->putFrom<T>(field->getAs<T>()+v);
57struct TestChannelRequester :
public epics::pvAccess::ChannelRequester
59 POINTER_DEFINITIONS(TestChannelRequester);
60 DUMBREQUESTER(TestChannelRequester)
64 epics::pvAccess::Channel::shared_pointer chan;
65 epics::pvData::Status status;
66 epics::pvAccess::Channel::ConnectionState laststate;
67 TestChannelRequester();
68 virtual ~TestChannelRequester();
69 virtual void channelCreated(
const epics::pvData::Status& status,
70 epics::pvAccess::Channel::shared_pointer
const & channel) OVERRIDE FINAL;
71 virtual void channelStateChange(epics::pvAccess::Channel::shared_pointer
const & channel,
72 epics::pvAccess::Channel::ConnectionState connectionState) OVERRIDE FINAL;
74 bool waitForConnect();
77struct TestChannelFieldRequester :
public epics::pvAccess::GetFieldRequester
79 POINTER_DEFINITIONS(TestChannelFieldRequester);
80 DUMBREQUESTER(TestChannelFieldRequester)
83 epics::pvData::Status status;
84 epics::pvData::FieldConstPtr fielddesc;
86 TestChannelFieldRequester() :done(
false) {}
87 virtual ~TestChannelFieldRequester() {}
90 const epics::pvData::Status& status,
91 epics::pvData::FieldConstPtr
const & field) OVERRIDE FINAL
93 this->status = status;
99struct TestChannelGetRequester :
public epics::pvAccess::ChannelGetRequester
101 POINTER_DEFINITIONS(TestChannelGetRequester);
102 DUMBREQUESTER(TestChannelGetRequester)
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;
111 TestChannelGetRequester();
112 virtual ~TestChannelGetRequester();
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)
120 virtual void getDone(
121 const epics::pvData::Status& status,
122 epics::pvAccess::ChannelGet::shared_pointer
const & channelGet,
123 epics::pvData::PVStructure::shared_pointer
const & pvStructure,
124 epics::pvData::BitSet::shared_pointer
const & bitSet)
128struct TestChannelPutRequester :
public epics::pvAccess::ChannelPutRequester
130 POINTER_DEFINITIONS(TestChannelPutRequester);
131 DUMBREQUESTER(TestChannelPutRequester)
133 bool connected, doneGet, donePut;
134 epics::pvData::Status statusConnect, statusPut, statusGet;
135 epics::pvAccess::ChannelPut::shared_pointer put;
136 epics::pvData::Structure::const_shared_pointer fielddesc;
137 epics::pvData::PVStructure::shared_pointer value;
138 epics::pvData::BitSet::shared_pointer changed;
140 TestChannelPutRequester();
141 virtual ~TestChannelPutRequester();
143 virtual void channelPutConnect(
144 const epics::pvData::Status& status,
145 epics::pvAccess::ChannelPut::shared_pointer
const & channelPut,
146 epics::pvData::Structure::const_shared_pointer
const & structure)
149 virtual void putDone(
150 const epics::pvData::Status& status,
151 epics::pvAccess::ChannelPut::shared_pointer
const & channelPut)
154 virtual void getDone(
155 const epics::pvData::Status& status,
156 epics::pvAccess::ChannelPut::shared_pointer
const & channelPut,
157 epics::pvData::PVStructure::shared_pointer
const & pvStructure,
158 epics::pvData::BitSet::shared_pointer
const & bitSet)
162struct TestChannelMonitorRequester :
public epics::pvData::MonitorRequester
164 POINTER_DEFINITIONS(TestChannelMonitorRequester);
165 DUMBREQUESTER(TestChannelMonitorRequester)
172 epics::pvData::Status connectStatus;
173 epics::pvData::MonitorPtr mon;
174 epics::pvData::StructureConstPtr dtype;
176 TestChannelMonitorRequester();
177 virtual ~TestChannelMonitorRequester();
179 virtual void monitorConnect(epics::pvData::Status
const & status,
180 epics::pvData::MonitorPtr
const & monitor,
181 epics::pvData::StructureConstPtr
const & structure)
183 virtual void monitorEvent(epics::pvData::MonitorPtr
const & monitor) OVERRIDE FINAL;
184 virtual void unlisten(epics::pvData::MonitorPtr
const & monitor) OVERRIDE FINAL;
186 bool waitForConnect();
190struct TestPVChannel :
public BaseChannel
192 POINTER_DEFINITIONS(TestPVChannel);
193 DUMBREQUESTER(TestPVChannel)
194 std::tr1::weak_ptr<TestPVChannel> weakself;
196 const std::tr1::shared_ptr<TestPV> pv;
197 ConnectionState state;
202 TestPVChannel(
const std::tr1::shared_ptr<TestPV>& pv,
203 const std::tr1::shared_ptr<epics::pvAccess::ChannelRequester>& req);
204 virtual ~TestPVChannel();
206 virtual std::string getRemoteAddress() OVERRIDE FINAL
207 {
return "localhost:1234"; }
208 virtual ConnectionState getConnectionState() OVERRIDE FINAL;
210 virtual void getField(
211 epics::pvAccess::GetFieldRequester::shared_pointer
const & requester,
212 std::string
const & subField) OVERRIDE FINAL;
214 virtual epics::pvData::Monitor::shared_pointer createMonitor(
215 epics::pvData::MonitorRequester::shared_pointer
const & monitorRequester,
216 epics::pvData::PVStructure::shared_pointer
const & pvRequest)
220struct TestPVMonitor :
public epics::pvData::Monitor
222 POINTER_DEFINITIONS(TestPVMonitor);
223 std::tr1::weak_ptr<TestPVMonitor> weakself;
225 const TestPVChannel::shared_pointer channel;
226 const epics::pvData::MonitorRequester::weak_pointer requester;
233 TestPVMonitor(
const TestPVChannel::shared_pointer& ch,
234 const epics::pvData::MonitorRequester::shared_pointer& req,
236 virtual ~TestPVMonitor();
238 virtual void destroy();
240 virtual epics::pvData::Status start();
241 virtual epics::pvData::Status stop();
242 virtual epics::pvData::MonitorElementPtr poll();
243 virtual void release(epics::pvData::MonitorElementPtr
const & monitorElement);
245 std::deque<epics::pvData::MonitorElementPtr> buffer, free;
246 epics::pvData::MonitorElementPtr overflow;
251 POINTER_DEFINITIONS(TestPV);
252 std::tr1::weak_ptr<TestPV> weakself;
254 const std::string name;
255 std::tr1::weak_ptr<TestProvider>
const provider;
257 epics::pvData::PVDataCreatePtr factory;
259 const epics::pvData::StructureConstPtr dtype;
260 epics::pvData::PVStructurePtr value;
262 TestPV(
const std::string& name,
263 const std::tr1::shared_ptr<TestProvider>& provider,
264 const epics::pvData::StructureConstPtr& dtype);
267 void post(
bool notify =
true);
268 void post(
const epics::pvData::BitSet& changed,
bool notify =
true);
272 mutable epicsMutex lock;
276 friend struct TestProvider;
279struct TestProvider :
public epics::pvAccess::ChannelProvider, std::tr1::enable_shared_from_this<TestProvider>
281 POINTER_DEFINITIONS(TestProvider);
283 virtual std::string getProviderName() {
return "TestProvider"; }
285 virtual void destroy();
287 virtual epics::pvAccess::ChannelFind::shared_pointer channelFind(std::string
const & channelName,
288 epics::pvAccess::ChannelFindRequester::shared_pointer
const & channelFindRequester);
289 virtual epics::pvAccess::ChannelFind::shared_pointer channelList(epics::pvAccess::ChannelListRequester::shared_pointer
const & channelListRequester);
290 virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string
const & channelName,epics::pvAccess::ChannelRequester::shared_pointer
const & channelRequester,
291 short priority = PRIORITY_DEFAULT);
292 virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string
const & channelName, epics::pvAccess::ChannelRequester::shared_pointer
const & channelRequester,
293 short priority, std::string
const & address);
296 virtual ~TestProvider();
298 TestPV::shared_pointer addPV(
const std::string& name,
const epics::pvData::StructureConstPtr& tdef);
302 mutable epicsMutex lock;
306 static void testCounts();