From 08be03169605e02d107aa578fff04a6853ae2e9d Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 19 Jun 2017 10:56:56 +0200 Subject: [PATCH] add getme example --- Makefile | 3 ++ examples/Makefile | 12 +++++ examples/getme.cpp | 129 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 examples/Makefile create mode 100644 examples/getme.cpp diff --git a/Makefile b/Makefile index e8b3912..52eebb8 100644 --- a/Makefile +++ b/Makefile @@ -17,4 +17,7 @@ pvtoolsSrc_DEPEND_DIRS = src DIRS += testApp testApp_DEPEND_DIRS = src +DIRS += examples +examples_DEPEND_DIRS += src + include $(TOP)/configure/RULES_TOP diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..19d67ff --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,12 @@ +TOP=.. + +include $(TOP)/configure/CONFIG + +PROD_LIBS += pvAccess pvData ca Com + +TESTPROD_HOST += getme + +include $(TOP)/configure/RULES +#---------------------------------------- +# ADD RULES AFTER THIS LINE + diff --git a/examples/getme.cpp b/examples/getme.cpp new file mode 100644 index 0000000..dbabaf9 --- /dev/null +++ b/examples/getme.cpp @@ -0,0 +1,129 @@ + +#include +#include + +#include + +#include +#include +#include + +namespace pvd = epics::pvData; +namespace pva = epics::pvAccess; + +namespace { + +epicsEvent done; + +struct ChanReq : public pva::ChannelRequester +{ + virtual ~ChanReq() {} + + virtual std::string getRequesterName() { return "ChanReq"; } + + virtual void channelCreated(const epics::pvData::Status& status, + pva::Channel::shared_pointer const & channel) { + if(!status.isSuccess()) { + std::cout<<"Oops Connect: "<getChannelName()<<"\n"; + } + } + + virtual void channelStateChange(pva::Channel::shared_pointer const & channel, + pva::Channel::ConnectionState connectionState) { + switch(connectionState) { + case pva::Channel::NEVER_CONNECTED: + case pva::Channel::CONNECTED: + case pva::Channel::DISCONNECTED: + case pva::Channel::DESTROYED: + std::cout<getChannelName()<<" "<getChannel()->getChannelName()<<"\n"; + channelGet->get(); + } else { + std::cout<<"Oops GetConnect: "<getChannel()->getChannelName()<<" "<getSubField("value")); + if(!valfld) + valfld = pvStructure; + std::cout<getChannel()->getChannelName()<<" : "<<*valfld<<"\n"; + } else { + std::cout<<"Oops Get: "<createPVStructure( + pvd::getFieldCreate()->createFieldBuilder()->createStructure() + )); + pva::Configuration::shared_pointer conf(pva::ConfigurationBuilder() + .push_env() + .build()); + + pva::ClientFactory::start(); + + pva::ChannelProvider::shared_pointer provider(pva::getChannelProviderRegistry()->createProvider("pva", conf)); + if(!provider) + throw std::logic_error("pva provider not registered"); + + typedef std::set gets_t; + gets_t gets; + + pva::ChannelRequester::shared_pointer chanreq(new ChanReq); + pva::ChannelGetRequester::shared_pointer getreq(new GetReq); + + for(int i=1; icreateChannel(argv[i], chanreq)); + // if !chan then channelCreated() called with error status + if(!chan) continue; + + pva::ChannelGet::shared_pointer op(chan->createChannelGet(getreq, pvReq)); + if(!op) continue; + + gets.insert(op); + // drop our explicit Channel reference, ChannelGet holds an additional reference + } + + done.wait(); + + return 0; + } catch(std::exception& e){ + std::cerr<<"Error: "<