void Channel::put(const std::vector<std::string>& values, const std::string& requestDescriptor) { epics::pvData::PVStructure::shared_pointer pvRequest = epics::pvData::CreateRequest::create()->createRequest(requestDescriptor); std::tr1::shared_ptr<ChannelRequesterImpl> channelRequesterImpl = std::tr1::dynamic_pointer_cast<ChannelRequesterImpl>(channel->getChannelRequester()); if (channel->getConnectionState() != epics::pvAccess::Channel::CONNECTED) { if (!channelRequesterImpl->waitUntilConnected(timeout)) { throw ChannelTimeout("Channel %s timed out", channel->getChannelName().c_str()); } } std::tr1::shared_ptr<ChannelPutRequesterImpl> putRequesterImpl(new ChannelPutRequesterImpl(channel->getChannelName())); epics::pvAccess::ChannelPut::shared_pointer channelPut = channel->createChannelPut(putRequesterImpl, pvRequest); if (putRequesterImpl->waitUntilDone(timeout)) { epics::pvData::PVStructurePtr pvStructurePtr = putRequesterImpl->getStructure(); PvUtility::fromString(pvStructurePtr, values); putRequesterImpl->resetEvent(); channelPut->put(pvStructurePtr, putRequesterImpl->getBitSet()); if (putRequesterImpl->waitUntilDone(timeout)) { return; } } throw ChannelTimeout("Channel %s put request timed out", channel->getChannelName().c_str()); }
PvObject* Channel::get(const std::string& requestDescriptor) { epics::pvData::PVStructure::shared_pointer pvRequest = epics::pvData::CreateRequest::create()->createRequest(requestDescriptor); std::tr1::shared_ptr<ChannelRequesterImpl> channelRequesterImpl = std::tr1::dynamic_pointer_cast<ChannelRequesterImpl>(channel->getChannelRequester()); if (channel->getConnectionState() != epics::pvAccess::Channel::CONNECTED) { if (!channelRequesterImpl->waitUntilConnected(timeout)) { throw ChannelTimeout("Channel %s timed out", channel->getChannelName().c_str()); } } std::tr1::shared_ptr<GetFieldRequesterImpl> getFieldRequesterImpl; getFieldRequesterImpl.reset(new GetFieldRequesterImpl(channel)); channel->getField(getFieldRequesterImpl, ""); if (!getFieldRequesterImpl->waitUntilFieldGet(timeout)) { throw ChannelTimeout("Channel %s field get timed out", channel->getChannelName().c_str()); } if (!getFieldRequesterImpl.get()) { throw PvaException("Failed to get introspection data for channel %s", channel->getChannelName().c_str()); } epics::pvData::Structure::const_shared_pointer structure = std::tr1::dynamic_pointer_cast<const epics::pvData::Structure>(getFieldRequesterImpl->getField()); if (structure.get() == 0 || structure->getField("value").get() == 0) { // fallback to structure pvRequest = epics::pvData::CreateRequest::create()->createRequest("field()"); } std::tr1::shared_ptr<ChannelGetRequesterImpl> getRequesterImpl(new ChannelGetRequesterImpl(channel->getChannelName())); epics::pvAccess::ChannelGet::shared_pointer channelGet = channel->createChannelGet(getRequesterImpl, pvRequest); if (getRequesterImpl->waitUntilGet(timeout)) { return new PvObject(getRequesterImpl->getPVStructure()); } throw ChannelTimeout("Channel %s get request timed out", channel->getChannelName().c_str()); }
epics::pvAccess::RPCClient::shared_pointer RpcClient::createRpcClient(const std::string& channelName, const epics::pvData::PVStructurePtr& pvRequest, double timeout) { #if defined PVA_RPC_API_VERSION && PVA_RPC_API_VERSION == 430 return epics::pvAccess::RPCClientFactory::create(channelName); #endif // if defined PVA_RPC_API_VERSION && PVA_RPC_API_VERSION == 430 #if defined PVA_RPC_API_VERSION && PVA_RPC_API_VERSION == 435 epics::pvAccess::RPCClient::shared_pointer rpcClient = epics::pvAccess::RPCClient::create(channelName, pvRequest); if (!rpcClient->connect(timeout)) { throw ChannelTimeout("Channel %s timed out.", channelName.c_str()); } return rpcClient; #endif // if defined PVA_RPC_API_VERSION && PVA_RPC_API_VERSION == 435 #if defined PVA_RPC_API_VERSION && PVA_RPC_API_VERSION == 440 return epics::pvAccess::RPCClient::create(channelName); #endif // if defined PVA_RPC_API_VERSION && PVA_RPC_API_VERSION == 440 }