/** * 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 CACHANNEL_H #define CACHANNEL_H #include #include #include /* for CA */ #include #include "caProviderPvt.h" namespace epics { namespace pvAccess { namespace ca { class CAChannel; typedef std::tr1::shared_ptr CAChannelPtr; class CAChannelGetField; typedef std::tr1::shared_ptr CAChannelGetFieldPtr; typedef std::tr1::weak_ptr CAChannelGetFieldWPtr; class CAChannelPut; typedef std::tr1::shared_ptr CAChannelPutPtr; typedef std::tr1::weak_ptr CAChannelPutWPtr; class CAChannelGet; typedef std::tr1::shared_ptr CAChannelGetPtr; typedef std::tr1::weak_ptr CAChannelGetWPtr; class CAChannelMonitor; typedef std::tr1::shared_ptr CAChannelMonitorPtr; typedef std::tr1::weak_ptr CAChannelMonitorWPtr; class CAChannelGetField : public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(CAChannelGetField); CAChannelGetField(GetFieldRequester::shared_pointer const & requester,std::string const & subField); ~CAChannelGetField(); void callRequester(CAChannelPtr const & caChannel); private: GetFieldRequester::weak_pointer getFieldRequester; std::string subField; }; class CAChannel : public Channel, public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(CAChannel); static size_t num_instances; static shared_pointer create(CAChannelProvider::shared_pointer const & channelProvider, std::string const & channelName, short priority, ChannelRequester::shared_pointer const & channelRequester); virtual ~CAChannel(); void connected(); void disconnected(); chid getChannelID(); chtype getNativeType(); unsigned getElementCount(); epics::pvData::Structure::const_shared_pointer getStructure(); /* --------------- epics::pvAccess::Channel --------------- */ virtual std::tr1::shared_ptr getProvider(); virtual std::string getRemoteAddress(); virtual ConnectionState getConnectionState(); virtual std::string getChannelName(); virtual std::tr1::shared_ptr getChannelRequester(); virtual void getField(GetFieldRequester::shared_pointer const & requester,std::string const & subField); virtual AccessRights getAccessRights(epics::pvData::PVField::shared_pointer const & pvField); virtual ChannelGet::shared_pointer createChannelGet( ChannelGetRequester::shared_pointer const & channelGetRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); virtual ChannelPut::shared_pointer createChannelPut( ChannelPutRequester::shared_pointer const & channelPutRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); virtual Monitor::shared_pointer createMonitor( MonitorRequester::shared_pointer const & monitorRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); virtual void printInfo(std::ostream& out); /* --------------- Destroyable --------------- */ virtual void destroy() EPICS_DEPRECATED {}; /* ---------------------------------------------------------------- */ void threadAttach(); void addChannelGet(const CAChannelGetPtr & get); void addChannelPut(const CAChannelPutPtr & get); void addChannelMonitor(const CAChannelMonitorPtr & get); private: CAChannel(std::string const & channelName, CAChannelProvider::shared_pointer const & channelProvider, ChannelRequester::shared_pointer const & channelRequester); void activate(short priority); std::string channelName; CAChannelProviderWPtr channelProvider; ChannelRequester::weak_pointer channelRequester; chid channelID; chtype channelType; unsigned elementCount; bool firstConnect; epics::pvData::Structure::const_shared_pointer structure; epics::pvData::Mutex requestsMutex; std::queue getFieldQueue; std::queue putQueue; std::queue getQueue; std::queue monitorQueue; std::vector getList; std::vector putList; std::vector monitorList; }; class CAChannelGet : public ChannelGet, public ChannelRequester, public ChannelBaseRequester, public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(CAChannelGet); static size_t num_instances; static CAChannelGet::shared_pointer create(CAChannel::shared_pointer const & channel, ChannelGetRequester::shared_pointer const & channelGetRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); virtual ~CAChannelGet(); void getDone(struct event_handler_args &args); /* --------------- epics::pvAccess::ChannelGet --------------- */ virtual void get(); /* --------------- epics::pvData::ChannelRequest --------------- */ virtual Channel::shared_pointer getChannel(); virtual void cancel(); virtual void lastRequest(); /* --------------- ChannelRequester --------------- */ virtual void channelCreated( const epics::pvData::Status& status, Channel::shared_pointer const & channel); virtual void channelStateChange( Channel::shared_pointer const & channel, Channel::ConnectionState connectionState); virtual std::string getRequesterName() { return "CAChannelGet";} /* --------------- ChannelBaseRequester --------------- */ virtual void channelDisconnect(bool destroy); /* --------------- Destroyable --------------- */ virtual void destroy() EPICS_DEPRECATED {}; void activate(); private: CAChannelGet(CAChannel::shared_pointer const & _channel, ChannelGetRequester::shared_pointer const & _channelGetRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); CAChannelPtr channel; ChannelGetRequester::weak_pointer channelGetRequester; epics::pvData::PVStructure::weak_pointer pvRequestWeak; chtype getType; epics::pvData::PVStructure::shared_pointer pvStructure; epics::pvData::BitSet::shared_pointer bitSet; }; class CAChannelPut : public ChannelPut, public ChannelRequester, public ChannelBaseRequester, public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(CAChannelPut); static size_t num_instances; static CAChannelPut::shared_pointer create(CAChannel::shared_pointer const & channel, ChannelPutRequester::shared_pointer const & channelPutRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); virtual ~CAChannelPut(); void putDone(struct event_handler_args &args); void getDone(struct event_handler_args &args); /* --------------- epics::pvAccess::ChannelPut --------------- */ virtual void put( epics::pvData::PVStructure::shared_pointer const & pvPutStructure, epics::pvData::BitSet::shared_pointer const & putBitSet ); virtual void get(); /* --------------- epics::pvData::ChannelRequest --------------- */ virtual Channel::shared_pointer getChannel(); virtual void cancel(); virtual void lastRequest(); /* --------------- ChannelRequester --------------- */ virtual void channelCreated( const epics::pvData::Status& status, Channel::shared_pointer const & channel); virtual void channelStateChange( Channel::shared_pointer const & channel, Channel::ConnectionState connectionState); virtual std::string getRequesterName() { return "CAChannelPut";} /* --------------- ChannelBaseRequester --------------- */ virtual void channelDisconnect(bool destroy); /* --------------- Destroyable --------------- */ virtual void destroy() EPICS_DEPRECATED {}; void activate(); private: CAChannelPut(CAChannel::shared_pointer const & _channel, ChannelPutRequester::shared_pointer const & _channelPutRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); CAChannelPtr channel; ChannelPutRequester::weak_pointer channelPutRequester; epics::pvData::PVStructure::weak_pointer pvRequestWeak; bool block; chtype getType; epics::pvData::PVStructure::shared_pointer pvStructure; epics::pvData::BitSet::shared_pointer bitSet; }; class CACMonitorQueue; typedef std::tr1::shared_ptr CACMonitorQueuePtr; class CAChannelMonitor : public Monitor, public ChannelRequester, public ChannelBaseRequester, public std::tr1::enable_shared_from_this { public: POINTER_DEFINITIONS(CAChannelMonitor); static size_t num_instances; static CAChannelMonitor::shared_pointer create(CAChannel::shared_pointer const & channel, MonitorRequester::shared_pointer const & monitorRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); virtual ~CAChannelMonitor(); void subscriptionEvent(struct event_handler_args &args); /* --------------- Monitor --------------- */ virtual epics::pvData::Status start(); virtual epics::pvData::Status stop(); virtual MonitorElementPtr poll(); virtual void release(MonitorElementPtr const & monitorElement); /* --------------- epics::pvData::ChannelRequest --------------- */ virtual void cancel(); /* --------------- ChannelRequester --------------- */ virtual void channelCreated( const epics::pvData::Status& status, Channel::shared_pointer const & channel); virtual void channelStateChange( Channel::shared_pointer const & channel, Channel::ConnectionState connectionState); virtual std::string getRequesterName() { return "CAChannelMonitor";} /* --------------- ChannelBaseRequester --------------- */ virtual void channelDisconnect(bool destroy); /* --------------- Destroyable --------------- */ virtual void destroy() EPICS_DEPRECATED {}; void activate(); private: CAChannelMonitor(CAChannel::shared_pointer const & _channel, MonitorRequester::shared_pointer const & _monitorRequester, epics::pvData::PVStructure::shared_pointer const & pvRequest); CAChannelPtr channel; MonitorRequester::weak_pointer monitorRequester; epics::pvData::PVStructure::weak_pointer pvRequestWeak; bool isStarted; chtype getType; epics::pvData::PVStructure::shared_pointer pvStructure; evid eventID; CACMonitorQueuePtr monitorQueue; }; } } } #endif /* CACHANNEL_H */