ca provider skeleton

This commit is contained in:
Matej Sekoranja
2013-05-23 15:05:58 +02:00
parent ac9a3da1df
commit adf1a0a1d3
4 changed files with 175 additions and 0 deletions

View File

@@ -85,6 +85,10 @@ SRC_DIRS += $(PVACCESS)/rpcClient
INC += rpcClient.h
LIBSRCS += rpcClient.cpp
SRC_DIRS += $(PVACCESS)/ca
INC += caProvider.h
LIBSRCS += caProvider.cpp
SRC_DIRS += $(PVACCESS)/mb
INC += pvAccessMB.h
LIBSRCS += pvAccessMB.cpp
@@ -92,5 +96,6 @@ LIBSRCS += pvAccessMB.cpp
LIBRARY = pvAccess
pvAccess_LIBS += Com
pvAccess_LIBS += pvData
pvAccess_LIBS += ca
include $(TOP)/configure/RULES

View File

@@ -0,0 +1,111 @@
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* pvAccessCPP is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <pv/logger.h>
#include <pv/caProvider.h>
#include <cadef.h>
using namespace epics::pvData;
using namespace epics::pvAccess;
#define EXCEPTION_GUARD(code) try { code; } \
catch (std::exception &e) { LOG(logLevelError, "Unhandled exception caught from client code at %s:%d: %s", __FILE__, __LINE__, e.what()); } \
catch (...) { LOG(logLevelError, "Unhandled exception caught from client code at %s:%d.", __FILE__, __LINE__); }
CAChannelProvider::CAChannelProvider()
{
initialize();
}
CAChannelProvider::~CAChannelProvider()
{
}
epics::pvData::String CAChannelProvider::getProviderName()
{
return "ca";
}
void CAChannelProvider::destroy()
{
/* Shut down Channel Access */
ca_context_destroy();
}
ChannelFind::shared_pointer CAChannelProvider::channelFind(
epics::pvData::String const & channelName,
ChannelFindRequester::shared_pointer const & channelFindRequester)
{
if (channelName.empty())
throw std::invalid_argument("empty channel name");
if (!channelFindRequester)
throw std::invalid_argument("null requester");
Status errorStatus(Status::STATUSTYPE_ERROR, "not implemented");
ChannelFind::shared_pointer nullChannelFind;
EXCEPTION_GUARD(channelFindRequester->channelFindResult(errorStatus, nullChannelFind, false));
return nullChannelFind;
}
Channel::shared_pointer CAChannelProvider::createChannel(
epics::pvData::String const & channelName,
ChannelRequester::shared_pointer const & channelRequester,
short priority)
{
static String emptyString;
return createChannel(channelName, channelRequester, priority, emptyString);
}
Channel::shared_pointer CAChannelProvider::createChannel(
epics::pvData::String const & channelName,
ChannelRequester::shared_pointer const & channelRequester,
short priority,
epics::pvData::String const & address)
{
if (!address.empty())
throw std::invalid_argument("CA does not support 'address' parameter");
// TODO
Status errorStatus(Status::STATUSTYPE_ERROR, "not implemented");
Channel::shared_pointer nullChannel;
EXCEPTION_GUARD(channelRequester->channelCreated(errorStatus, nullChannel));
return nullChannel;
// NOTE it's up to internal code to respond w/ error to requester and return 0 in case of errors
}
void CAChannelProvider::configure(epics::pvData::PVStructure::shared_pointer /*configuration*/)
{
}
void CAChannelProvider::flush()
{
}
void CAChannelProvider::poll()
{
}
void CAChannelProvider::initialize()
{
/* Create Channel Access */
int result = ca_context_create(ca_disable_preemptive_callback);
if (result != ECA_NORMAL) {
throw std::runtime_error(std::string("CA error %s occurred while trying "
"to start channel access:") + ca_message(result));
}
// TODO create a ca_poll thread
}
ChannelProvider::shared_pointer createCAChannelProvider()
{
ChannelProvider::shared_pointer ptr(new CAChannelProvider());
return ptr;
}

View File

@@ -0,0 +1,57 @@
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* pvAccessCPP is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef CAPROVIDER_H
#define CAPROVIDER_H
#include <pv/pvAccess.h>
namespace epics {
namespace pvAccess {
class CAChannelProvider :
public ChannelProvider
{
public:
CAChannelProvider();
virtual ~CAChannelProvider();
virtual epics::pvData::String getProviderName();
virtual void destroy();
virtual ChannelFind::shared_pointer channelFind(
epics::pvData::String const & channelName,
ChannelFindRequester::shared_pointer const & channelFindRequester);
virtual Channel::shared_pointer createChannel(
epics::pvData::String const & channelName,
ChannelRequester::shared_pointer const & channelRequester,
short priority);
virtual Channel::shared_pointer createChannel(
epics::pvData::String const & channelName,
ChannelRequester::shared_pointer const & channelRequester,
short priority,
epics::pvData::String const & address);
virtual void configure(epics::pvData::PVStructure::shared_pointer configuration);
virtual void flush();
virtual void poll();
private:
void initialize();
};
extern ChannelProvider::shared_pointer createCAChannelProvider();
}}
#endif /* CAPROVIDER_H */

View File

@@ -187,3 +187,5 @@ README
runTestServer
TODO
testApp/remote/pvinfo.cpp
pvAccessApp/ca/caProvider.h
pvAccessApp/ca/caProvider.cpp