From cd87ecd23a84437383cfb5d6beffdfc0e9752de8 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Wed, 12 Feb 2014 23:58:40 +0100 Subject: [PATCH] added v3ioc from pvDatabaseCPP --- pvAccessApp/Makefile | 7 ++ pvAccessApp/v3ioc/PVAClientRegister.cpp | 72 +++++++++++++ pvAccessApp/v3ioc/PVAClientRegister.dbd | 2 + pvAccessApp/v3ioc/PVAServerRegister.cpp | 129 ++++++++++++++++++++++++ pvAccessApp/v3ioc/PVAServerRegister.dbd | 2 + pvAccessApp/v3ioc/syncChannelFind.h | 56 ++++++++++ 6 files changed, 268 insertions(+) create mode 100644 pvAccessApp/v3ioc/PVAClientRegister.cpp create mode 100644 pvAccessApp/v3ioc/PVAClientRegister.dbd create mode 100644 pvAccessApp/v3ioc/PVAServerRegister.cpp create mode 100644 pvAccessApp/v3ioc/PVAServerRegister.dbd create mode 100644 pvAccessApp/v3ioc/syncChannelFind.h diff --git a/pvAccessApp/Makefile b/pvAccessApp/Makefile index 41fbdc5..1884a1b 100644 --- a/pvAccessApp/Makefile +++ b/pvAccessApp/Makefile @@ -96,6 +96,13 @@ SRC_DIRS += $(PVACCESS)/mb INC += pvAccessMB.h LIBSRCS += pvAccessMB.cpp +SRC_DIRS += $(PVACCESS)/v3ioc +INC += syncChannelFind.h +DBD += PVAServerRegister.dbd +DBD += PVAClientRegister.dbd +LIBSRCS += PVAServerRegister.cpp +LIBSRCS += PVAClientRegister.cpp + LIBRARY = pvAccess pvAccess_LIBS += Com pvAccess_LIBS += pvData diff --git a/pvAccessApp/v3ioc/PVAClientRegister.cpp b/pvAccessApp/v3ioc/PVAClientRegister.cpp new file mode 100644 index 0000000..ccef6c4 --- /dev/null +++ b/pvAccessApp/v3ioc/PVAClientRegister.cpp @@ -0,0 +1,72 @@ +/*PVAClientRegister.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2013.08.05 + */ + +/* Author: Marty Kraimer */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +using std::cout; +using std::endl; +using namespace epics::pvData; +using namespace epics::pvAccess; + + +static const iocshFuncDef startPVAClientFuncDef = { + "startPVAClient", 0, 0 +}; +extern "C" void startPVAClient(const iocshArgBuf *args) +{ + ClientFactory::start(); +} + +static const iocshFuncDef stopPVAClientFuncDef = { + "stopPVAClient", 0, 0 +}; +extern "C" void stopPVAClient(const iocshArgBuf *args) +{ + ClientFactory::stop(); +} + + +static void startPVAClientRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&startPVAClientFuncDef, startPVAClient); + } +} + +static void stopPVAClientRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&stopPVAClientFuncDef, stopPVAClient); + } +} + + +epicsExportRegistrar(startPVAClientRegister); +epicsExportRegistrar(stopPVAClientRegister); diff --git a/pvAccessApp/v3ioc/PVAClientRegister.dbd b/pvAccessApp/v3ioc/PVAClientRegister.dbd new file mode 100644 index 0000000..361863b --- /dev/null +++ b/pvAccessApp/v3ioc/PVAClientRegister.dbd @@ -0,0 +1,2 @@ +registrar("startPVAClientRegister") +registrar("stopPVAClientRegister") diff --git a/pvAccessApp/v3ioc/PVAServerRegister.cpp b/pvAccessApp/v3ioc/PVAServerRegister.cpp new file mode 100644 index 0000000..837f5b4 --- /dev/null +++ b/pvAccessApp/v3ioc/PVAServerRegister.cpp @@ -0,0 +1,129 @@ +/*PVAServerRegister.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2013.07.24 + */ + +/* Author: Marty Kraimer */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +using std::cout; +using std::endl; +using namespace epics::pvData; +using namespace epics::pvAccess; + +class PVAServerCTX; +typedef std::tr1::shared_ptr PVAServerCTXPtr; + +class PVAServerCTX : + public std::tr1::enable_shared_from_this +{ +public: + POINTER_DEFINITIONS(PVAServerCTX); + static PVAServerCTXPtr getPVAServerCTX(); + void start(); + void stop(); + virtual ~PVAServerCTX() {} +private: + PVAServerCTX() {} + shared_pointer getPtrSelf() + { + return shared_from_this(); + } + ServerContext::shared_pointer ctx; +}; + +void PVAServerCTX::start() +{ + if(ctx!=NULL) { + cout<< "PVAServer already started" << endl; + return; + } + ctx = startPVAServer(PVACCESS_ALL_PROVIDERS,0,true,true); +} + +void PVAServerCTX::stop() +{ + if(ctx==NULL) { + cout<< "PVAServer already stopped" << endl; + return; + } + ctx->destroy(); + ctx.reset(); + epicsThreadSleep(1.0); +} + +PVAServerCTXPtr PVAServerCTX::getPVAServerCTX() +{ + static PVAServerCTXPtr pvPVAServerCTX; + static Mutex mutex; + Lock xx(mutex); + + if(pvPVAServerCTX==NULL) { + pvPVAServerCTX = PVAServerCTXPtr(new PVAServerCTX()); + } + return pvPVAServerCTX; +} + + +static const iocshFuncDef startPVAServerFuncDef = { + "startPVAServer", 0, 0 +}; +extern "C" void startPVAServer(const iocshArgBuf *args) +{ + PVAServerCTX::getPVAServerCTX()->start(); +} + +static const iocshFuncDef stopPVAServerFuncDef = { + "stopPVAServer", 0, 0 +}; +extern "C" void stopPVAServer(const iocshArgBuf *args) +{ + PVAServerCTX::getPVAServerCTX()->stop(); +} + + +static void startPVAServerRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&startPVAServerFuncDef, startPVAServer); + } +} + +static void stopPVAServerRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&stopPVAServerFuncDef, stopPVAServer); + } +} + +epicsExportRegistrar(startPVAServerRegister); +epicsExportRegistrar(stopPVAServerRegister); diff --git a/pvAccessApp/v3ioc/PVAServerRegister.dbd b/pvAccessApp/v3ioc/PVAServerRegister.dbd new file mode 100644 index 0000000..53aad59 --- /dev/null +++ b/pvAccessApp/v3ioc/PVAServerRegister.dbd @@ -0,0 +1,2 @@ +registrar("startPVAServerRegister") +registrar("stopPVAServerRegister") diff --git a/pvAccessApp/v3ioc/syncChannelFind.h b/pvAccessApp/v3ioc/syncChannelFind.h new file mode 100644 index 0000000..75bd48a --- /dev/null +++ b/pvAccessApp/v3ioc/syncChannelFind.h @@ -0,0 +1,56 @@ +/* syncChannelFind.h */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author Marty Kraimer + * @date 2014.02 + */ +/** + * This is an implementation of ChannelFind that is appropriate for all channel + * providers that can synchronously determine if the provider has the channel. + */ +#ifndef SYNCCHANNElFIND_H +#define SYNCCHANNElFIND_H +#include +#include +#include +#include + +#include +#include + + +namespace epics { namespace pvAccess { + +class SyncChannelFind : public ChannelFind +{ +public: + typedef std::tr1::shared_ptr shared_pointer; + + SyncChannelFind(ChannelProvider::shared_pointer &provider) : m_provider(provider) + { + } + + virtual ~SyncChannelFind() {} + + virtual void destroy(){} + + virtual ChannelProvider::shared_pointer getChannelProvider() + { + return m_provider.lock(); + }; + + virtual void cancelChannelFind() {} + +private: + ChannelProvider::weak_pointer m_provider; +}; + + + + +}} +#endif /* SYNCCHANNElFIND_H */