14#define epicsExportSharedSymbols
18using namespace epics::pvData;
19using namespace epics::pvAccess;
22namespace epics {
namespace pvaClient {
24class ChannelGetRequesterImpl :
public ChannelGetRequester
26 PvaClientGet::weak_pointer pvaClientGet;
27 PvaClient::weak_pointer pvaClient;
29 ChannelGetRequesterImpl(
32 : pvaClientGet(pvaClientGet),
35 virtual ~ChannelGetRequesterImpl() {
39 virtual std::string getRequesterName() {
41 if(!clientGet)
return string(
"clientGet is null");
42 return clientGet->getRequesterName();
45 virtual void message(std::string
const & message, MessageType messageType) {
47 if(!clientGet)
return;
48 clientGet->message(message,messageType);
51 virtual void channelGetConnect(
53 ChannelGet::shared_pointer
const & channelGet,
54 Structure::const_shared_pointer
const & structure)
57 if(!clientGet)
return;
58 clientGet->channelGetConnect(status,channelGet,structure);
63 ChannelGet::shared_pointer
const & channelGet,
64 PVStructurePtr
const & pvStructure,
65 BitSet::shared_pointer
const & bitSet)
68 if(!clientGet)
return;
69 clientGet->getDone(status,channelGet,pvStructure,bitSet);
76 PVStructurePtr
const &pvRequest)
79 cout<<
"PvaClientGet::create(pvaClient,channelName,pvRequest)\n"
80 <<
" channelName " << pvaClientChannel->getChannel()->getChannelName()
81 <<
" pvRequest " << pvRequest
90PvaClientGet::PvaClientGet(
93 PVStructurePtr
const &pvRequest)
94: pvaClient(pvaClient),
95 pvaClientChannel(pvaClientChannel),
97 connectState(connectIdle),
101 cout <<
"PvaClientGet::PvaClientGet channelName "
102 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
109 cout<<
"PvaClientGet::~PvaClientGet channelName "
110 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
115void PvaClientGet::checkConnectState()
118 cout <<
"PvaClientGet::checkConnectState channelName "
119 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
121 if(!pvaClientChannel->getChannel()->isConnected()) {
122 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
123 +
" PvaClientGet::checkConnectState channel not connected ";
124 throw std::runtime_error(message);
126 if(connectState==connectIdle) {
129 if(connectState==connectActive){
130 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
132 + channelGetConnectStatus.getMessage();
133 throw std::runtime_error(message);
137string PvaClientGet::getRequesterName()
139 return pvaClientChannel->getRequesterName();
142void PvaClientGet::message(
string const & message,MessageType messageType)
144 pvaClientChannel->message(message,messageType);
147void PvaClientGet::channelGetConnect(
148 const Status& status,
149 ChannelGet::shared_pointer
const & channelGet,
150 StructureConstPtr
const & structure)
153 cout <<
"PvaClientGet::channelGetConnect channelName "
154 << pvaClientChannel->getChannel()->getChannelName()
155 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
160 channelGetConnectStatus = status;
162 this->channelGet = channelGet;
163 connectState = connected;
165 pvaClientData->setMessagePrefix(channelGet->getChannel()->getChannelName());
167 waitForConnect.signal();
171 req->channelGetConnect(status,shared_from_this());
175void PvaClientGet::getDone(
176 const Status& status,
177 ChannelGet::shared_pointer
const & channelGet,
178 PVStructurePtr
const & pvStructure,
179 BitSetPtr
const & bitSet)
182 cout <<
"PvaClientGet::getDone channelName "
183 << pvaClientChannel->getChannel()->getChannelName()
184 <<
" status.isOK " << (status.isOK() ?
"true" :
"false")
189 channelGetStatus = status;
191 pvaClientData->setData(pvStructure,bitSet);
193 getState = getComplete;
198 req->getDone(status,shared_from_this());
205 cout <<
"PvaClientGet::connect channelName "
206 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
210 if(status.isOK())
return;
211 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
212 +
" PvaClientGet::connect " + status.getMessage();
213 throw std::runtime_error(message);
219 cout <<
"PvaClientGet::issueConnect channelName "
220 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
222 if(connectState!=connectIdle) {
223 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
224 +
" pvaClientGet already connected ";
225 throw std::runtime_error(message);
227 connectState = connectActive;
228 channelGetConnectStatus = Status(Status::STATUSTYPE_ERROR,
"connect active");
229 channelGet = pvaClientChannel->getChannel()->createChannelGet(channelGetRequester,pvRequest);
235 cout <<
"PvaClientGet::waitConnect channelName "
236 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
238 waitForConnect.wait();
239 return channelGetConnectStatus;
245 cout <<
"PvaClientGet::get channelName "
246 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
250 if(status.isOK())
return;
251 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
252 +
" PvaClientGet::get " + status.getMessage();
253 throw std::runtime_error(message);
259 cout <<
"PvaClientGet::issueGet channelName "
260 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
262 if(connectState==connectIdle)
connect();
263 if(getState==getActive) {
264 string message = string(
"channel ") + pvaClientChannel->getChannel()->getChannelName()
265 +
" PvaClientGet::issueGet get aleady active ";
266 throw std::runtime_error(message);
268 getState = getActive;
275 cout <<
"PvaClientGet::waitGet channelName "
276 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
279 return channelGetStatus;
284 cout<<
"PvaClientGet::getData channelName "
285 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
288 if(getState==getIdle)
get();
289 return pvaClientData;
295 cout <<
"PvaClientGet::setRequester channelName "
296 << pvaClientChannel->getChannel()->getChannelName() <<
"\n";
298 this->pvaClientGetRequester = pvaClientGetRequester;
303 return pvaClientChannel;
static PvaClientGetDataPtr create(epics::pvData::StructureConstPtr const &structure)
Factory method for creating an instance of PvaClientGetData.
An easy to use alternative to ChannelGet.
PvaClientGetDataPtr getData()
Get the data/.
static PvaClientGetPtr create(PvaClientPtr const &pvaClient, PvaClientChannelPtr const &pvaClientChannel, epics::pvData::PVStructurePtr const &pvRequest)
Create a PvaClientGet.
friend class ChannelGetRequesterImpl
epics::pvData::Status waitConnect()
Wait until the channelGet connection to the channel is complete.
~PvaClientGet()
Destructor.
PvaClientChannelPtr getPvaClientChannel()
Get the PvaClientChannel;.
void get()
Call issueGet and then waitGet. An exception is thrown if get fails.
void issueConnect()
create the channelGet connection to the channel.
epics::pvData::Status waitGet()
Wait until get completes.
void issueGet()
Issue a get and return immediately.
void connect()
Call issueConnect and then waitConnect.
void setRequester(PvaClientGetRequesterPtr const &pvaClientGetRequester)
Set a user callback.
static bool getDebug()
Is debug set?
std::tr1::shared_ptr< PvaClientChannel > PvaClientChannelPtr
std::tr1::shared_ptr< PvaClientGet > PvaClientGetPtr
std::tr1::shared_ptr< PvaClientGetRequester > PvaClientGetRequesterPtr
std::tr1::shared_ptr< ChannelGetRequesterImpl > ChannelGetRequesterImplPtr
std::tr1::shared_ptr< PvaClientGetData > PvaClientGetDataPtr
std::tr1::shared_ptr< PvaClient > PvaClientPtr