diff --git a/pvDataApp/misc/requester.h b/pvDataApp/misc/requester.h index 75ff385..064db95 100644 --- a/pvDataApp/misc/requester.h +++ b/pvDataApp/misc/requester.h @@ -13,6 +13,7 @@ namespace epics { namespace pvData { class Requester; +typedef std::tr1::shared_ptr RequesterPtr; enum MessageType { infoMessage,warningMessage,errorMessage,fatalErrorMessage diff --git a/pvDataApp/monitor/monitor.h b/pvDataApp/monitor/monitor.h index 2bc3d1c..14b6b20 100644 --- a/pvDataApp/monitor/monitor.h +++ b/pvDataApp/monitor/monitor.h @@ -17,7 +17,7 @@ namespace epics { namespace pvData { class MonitorElement; typedef std::tr1::shared_ptr MonitorElementPtr; -typedef std::vector MonitorElementArray; +typedef std::vector MonitorElementPtrArray; class Monitor; typedef std::tr1::shared_ptr MonitorPtr; @@ -31,9 +31,10 @@ class MonitorElement { public: POINTER_DEFINITIONS(MonitorElement); MonitorElement(){} - MonitorElement(PVStructurePtr &pvStructurePtr): pvStructurePtr(pvStructurePtr), - changedBitSet(BitSet::create(pvStructurePtr->getNumberFields())), - overrunBitSet(BitSet::create(pvStructurePtr->getNumberFields())) + MonitorElement(PVStructurePtr &pvStructurePtr) + : pvStructurePtr(pvStructurePtr), + changedBitSet(BitSet::create(pvStructurePtr->getNumberFields())), + overrunBitSet(BitSet::create(pvStructurePtr->getNumberFields())) {} PVStructurePtr pvStructurePtr; BitSet::shared_pointer changedBitSet; @@ -44,7 +45,7 @@ class MonitorElement { * Interface for Monitor. * @author mrk */ -class Monitor : public Destroyable, private NoDefaultMethods { +class Monitor : public Destroyable{ public: POINTER_DEFINITIONS(Monitor); virtual ~Monitor(){} diff --git a/pvDataApp/monitor/monitorQueue.cpp b/pvDataApp/monitor/monitorQueue.cpp deleted file mode 100644 index 4189a13..0000000 --- a/pvDataApp/monitor/monitorQueue.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* monitorQueue.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvDataCPP is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/* Marty Kraimer 2011.03 */ -#include - -#include - - -namespace epics { namespace pvData { - -MonitorElementArray MonitorQueue::createMonitorElements( - StructureConstPtr & elementStructure,int number) -{ - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - MonitorElementArray elementArray(number); - for(int i=0; icreatePVStructure(elementStructure); - MonitorElementPtr monitorElement(new MonitorElement(pvStructurePtr)); - elementArray[i] = monitorElement; - } - return elementArray; -} - -MonitorQueue::MonitorQueue(MonitorElementArray monitorElementArray) -: elementArray(monitorElementArray), - queue(elementArray)//, - //number(monitorElementArray.size()) -{ - number = monitorElementArray.size(); - if(number<2) { - throw std::logic_error(String("queueSize must be >=2")); - } -} - -MonitorQueue::~MonitorQueue() -{ -} - -void MonitorQueue::clear() -{ - queue->clear(); -} - -int MonitorQueue::getNumberFree() -{ - return queue->getNumberFree(); -} - -int MonitorQueue::capacity() -{ - return number; -} - -MonitorElementPtr & MonitorQueue::getFree() -{ - MonitorElementPtr * queueElement = queue->getFree(); - if(queueElement==0) return nullElement; - return *queueElement; -} - -void MonitorQueue::setUsed(MonitorElement::shared_pointer const & element) -{ - MonitorElementImpl *impl = static_cast(element.get()); - queue->setUsed(impl->getQueueElement()); -} - -MonitorElement::shared_pointer const & MonitorQueue::getUsed() -{ - MonitorQueueElement *queueElement = queue->getUsed(); - if(queueElement==0) return nullElement; - return *queueElement->getObject(); -} - -void MonitorQueue::releaseUsed(MonitorElement::shared_pointer const & element) -{ - MonitorElementImpl *impl = static_cast(element.get()); - queue->releaseUsed(impl->getQueueElement()); -} - -}} - diff --git a/pvDataApp/monitor/monitorQueue.h b/pvDataApp/monitor/monitorQueue.h index f07f1c2..25d4f42 100644 --- a/pvDataApp/monitor/monitorQueue.h +++ b/pvDataApp/monitor/monitorQueue.h @@ -26,8 +26,8 @@ class MonitorQueue { public: static MonitorQueuePtr create( StructureConstPtr & elementStructure,int number); - MonitorQueue(MonitorElementArray &monitorElementArray); - ~MonitorQueue(); + MonitorQueue(MonitorElementPtrArray &monitorElementArray); + ~MonitorQueue(){} void clear(); int getNumberFree(); int capacity(); @@ -37,37 +37,38 @@ public: void releaseUsed(MonitorElementPtr & element); private: MonitorElementPtr nullElement; - MonitorElementArray elementArray; - Queue queue; + MonitorElementPtrArray elementArray; + Queue queue; }; -MonitorQueuePtr MonitorQueue::create(i +MonitorQueuePtr MonitorQueue::create( StructureConstPtr & elementStructure,int number) { PVDataCreatePtr pvDataCreate = getPVDataCreate(); - MonitorElementArray elementArray; + MonitorElementPtrArray elementArray; elementArray.reserve(number); for(int i=0; icreatePVStructure(elementStructure); MonitorElementPtr monitorElement(new MonitorElement(pvStructurePtr)); - elementArray.push_back(new MonitorElement(pvStructurePtr)); + elementArray.push_back(monitorElement); } return MonitorQueuePtr(new MonitorQueue(elementArray)); } -MonitorQueue::MonitorQueue(MonitorElementArray &monitorElementArray) -: queue(new Queue(monitorElementArray.swap())) - {} +MonitorQueue::MonitorQueue(MonitorElementPtrArray &monitorElementArray) +: queue(monitorElementArray) +{ +} void MonitorQueue::clear() { - queue->clear(); + queue.clear(); } int MonitorQueue::getNumberFree() { - return queue->getNumberFree(); + return queue.getNumberFree(); } int MonitorQueue::capacity() @@ -77,26 +78,26 @@ int MonitorQueue::capacity() MonitorElementPtr & MonitorQueue::getFree() { - MonitorElementPtr queueElement = queue->getFree(); + MonitorElementPtr &queueElement = queue.getFree(); if(queueElement.get()==0) return nullElement; return queueElement; } void MonitorQueue::setUsed(MonitorElementPtr & element) { - queue->setUsed(element); + queue.setUsed(element); } MonitorElementPtr & MonitorQueue::getUsed() { - MonitorElementPtr queueElement = queue->getUsed(); + MonitorElementPtr &queueElement = queue.getUsed(); if(queueElement.get()==0) return nullElement; return queueElement; } void MonitorQueue::releaseUsed(MonitorElementPtr & element) { - queue->releaseUsed(element); + queue.releaseUsed(element); } }} diff --git a/testApp/Makefile b/testApp/Makefile index a2771b3..b59c2a7 100644 --- a/testApp/Makefile +++ b/testApp/Makefile @@ -3,5 +3,6 @@ include $(TOP)/configure/CONFIG DIRS += misc DIRS += pv DIRS += property +DIRS += monitor include $(TOP)/configure/RULES_DIRS diff --git a/testApp/monitor/Makefile b/testApp/monitor/Makefile new file mode 100644 index 0000000..a7e946f --- /dev/null +++ b/testApp/monitor/Makefile @@ -0,0 +1,13 @@ +TOP=../.. + +include $(TOP)/configure/CONFIG + +PROD_HOST += testMonitor +testMonitor_SRCS += testMonitor.cpp +testMonitor_LIBS += pvData Com + + +include $(TOP)/configure/RULES +#---------------------------------------- +# ADD RULES AFTER THIS LINE + diff --git a/testApp/monitor/testMonitor.cpp b/testApp/monitor/testMonitor.cpp new file mode 100644 index 0000000..52463fd --- /dev/null +++ b/testApp/monitor/testMonitor.cpp @@ -0,0 +1,103 @@ +/* testPVdata.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvDataCPP is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/* Author: Marty Kraimer Date: 2010.11 */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + + +using namespace epics::pvData; + +static String allProperties("alarm,timeStamp,display,control,valueAlarm"); +static StandardFieldPtr standardField = getStandardField(); + +class MonitorImpl : public Monitor +{ +public: + POINTER_DEFINITIONS(MonitorImpl); + MonitorImpl() {} + virtual ~MonitorImpl() {} + virtual void destroy() {} + virtual Status start() + { + printf("start called\n"); + return status; + } + virtual Status stop() + { + printf("stop called\n"); + return status; + } + virtual MonitorElementPtr poll() + { + printf("poll called\n"); + return emptyElement; + } + virtual void release(MonitorElementPtr & monitorElement) + { + printf("release called\n"); + } +private: + Status status; + MonitorElementPtr emptyElement; +}; + +static void testMonitor() +{ + MonitorPtr monitor(new MonitorImpl()); + monitor->start(); + MonitorElementPtr monitorElement = monitor->poll(); + monitor->release(monitorElement); + monitor->stop(); +} + +static void testMonitorQueue() +{ + int queueSize = 3; + StructureConstPtr structure = standardField->scalar(pvDouble,allProperties); + MonitorQueuePtr monitorQueue = MonitorQueue::create(structure,queueSize); + int numberFree = monitorQueue->getNumberFree(); + printf("start numberFree %d\n",numberFree); + MonitorElementPtr element = monitorQueue->getFree(); + numberFree = monitorQueue->getNumberFree(); + printf("after getFree numberFree %d\n",numberFree); + PVStructurePtr pvStructure = element->pvStructurePtr; + String buffer; + buffer.clear(); + pvStructure->toString(&buffer); +//printf("pvStructure\n%s\n",buffer.c_str()); + monitorQueue->setUsed(element); + element = monitorQueue->getUsed(); + assert(element.get()!=NULL); + numberFree = monitorQueue->getNumberFree(); + printf("after getUsed numberFree %d\n",numberFree); + monitorQueue->releaseUsed(element); + numberFree = monitorQueue->getNumberFree(); + printf("after releaseUsed numberFree %d\n",numberFree); +} + +int main(int argc,char *argv[]) +{ + testMonitorQueue(); + testMonitor(); + return(0); +} +