Esempio n. 1
0
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());
}
Esempio n. 2
0
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());
}
Esempio n. 3
0
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
}