diff --git a/src/client/pv/monitor.h b/src/client/pv/monitor.h new file mode 100644 index 0000000..54ac1d1 --- /dev/null +++ b/src/client/pv/monitor.h @@ -0,0 +1,128 @@ +/* monitor.h */ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ +/** + * @author mrk + */ +#ifndef MONITOR_H +#define MONITOR_H + +#include +#include +#include +#include +#include +#include + +#include + +namespace epics { namespace pvData { + +class MonitorElement; +typedef std::tr1::shared_ptr MonitorElementPtr; +typedef std::vector MonitorElementPtrArray; + +class Monitor; +typedef std::tr1::shared_ptr MonitorPtr; + + +/** + * @brief An element for a monitorQueue. + * + * Class instance representing monitor element. + * @author mrk + */ +class epicsShareClass MonitorElement { + public: + POINTER_DEFINITIONS(MonitorElement); + MonitorElement(){} + MonitorElement(PVStructurePtr const & pvStructurePtr) + : pvStructurePtr(pvStructurePtr), + changedBitSet(BitSet::create(static_cast(pvStructurePtr->getNumberFields()))), + overrunBitSet(BitSet::create(static_cast(pvStructurePtr->getNumberFields()))) + {} + PVStructurePtr pvStructurePtr; + BitSet::shared_pointer changedBitSet; + BitSet::shared_pointer overrunBitSet; +}; + +/** + * @brief Monitor changes to fields of a pvStructure. + * + * This is used by pvAccess to implement monitors. + * @author mrk + */ +class epicsShareClass Monitor : public Destroyable{ + public: + POINTER_DEFINITIONS(Monitor); + virtual ~Monitor(){} + /** + * Start monitoring. + * @return completion status. + */ + virtual Status start() = 0; + /** + * Stop Monitoring. + * @return completion status. + */ + virtual Status stop() = 0; + /** + * If monitor has occurred return data. + * @return monitorElement for modified data. + * Must call get to determine if data is available. + */ + virtual MonitorElementPtr poll() = 0; + /** + * Release a MonitorElement that was returned by poll. + * A poll() must be called after the release() to check the presence of any modified data. + * @param monitorElement + */ + virtual void release(MonitorElementPtr const & monitorElement) = 0; + + struct Stats { + size_t nfilled; //!< # of elements ready to be poll()d + size_t noutstanding; //!< # of elements poll()d but not released()d + size_t nempty; //!< # of elements available for new remote data + }; + + virtual void getStats(Stats& s) const { + s.nfilled = s.noutstanding = s.nempty = 0; + } +}; + + +/** + * @brief Callback implemented by monitor clients. + * + * Requester for ChannelMonitor. + * @author mrk + */ +class epicsShareClass MonitorRequester : public virtual Requester { + public: + POINTER_DEFINITIONS(MonitorRequester); + virtual ~MonitorRequester(){} + /** + * The client and server have both completed the createMonitor request. + * @param status Completion status. + * @param monitor The monitor + * @param structure The structure defining the data. + */ + virtual void monitorConnect(Status const & status, + MonitorPtr const & monitor, StructureConstPtr const & structure) = 0; + /** + * A monitor event has occurred. + * The requester must call Monitor.poll to get data. + * @param monitor The monitor. + */ + virtual void monitorEvent(MonitorPtr const & monitor) = 0; + /** + * The data source is no longer available. + * @param monitor The monitor. + */ + virtual void unlisten(MonitorPtr const & monitor) = 0; +}; + +}} +#endif /* MONITOR_H */