redo monotorQueue

This commit is contained in:
Marty Kraimer
2012-07-02 16:17:58 -04:00
parent 12d13bc2c0
commit 9775fd4707
7 changed files with 141 additions and 107 deletions

View File

@@ -13,6 +13,7 @@
namespace epics { namespace pvData {
class Requester;
typedef std::tr1::shared_ptr<Requester> RequesterPtr;
enum MessageType {
infoMessage,warningMessage,errorMessage,fatalErrorMessage

View File

@@ -17,7 +17,7 @@ namespace epics { namespace pvData {
class MonitorElement;
typedef std::tr1::shared_ptr<MonitorElement> MonitorElementPtr;
typedef std::vector<MonitorElementPtr> MonitorElementArray;
typedef std::vector<MonitorElementPtr> MonitorElementPtrArray;
class Monitor;
typedef std::tr1::shared_ptr<Monitor> 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(){}

View File

@@ -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 <pv/bitSet.h>
#include <pv/monitorQueue.h>
namespace epics { namespace pvData {
MonitorElementArray MonitorQueue::createMonitorElements(
StructureConstPtr & elementStructure,int number)
{
PVDataCreatePtr pvDataCreate = getPVDataCreate();
MonitorElementArray elementArray(number);
for(int i=0; i<number; i++) {
PVStructurePtr pvStructurePtr
= pvDataCreate->createPVStructure(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<MonitorElementImpl *>(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<MonitorElementImpl *>(element.get());
queue->releaseUsed(impl->getQueueElement());
}
}}

View File

@@ -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<MonitorElementPtr> queue;
MonitorElementPtrArray elementArray;
Queue<MonitorElement> 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; i<number; i++) {
PVStructurePtr pvStructurePtr
= pvDataCreate->createPVStructure(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<MonitorElementPtr>(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);
}
}}

View File

@@ -3,5 +3,6 @@ include $(TOP)/configure/CONFIG
DIRS += misc
DIRS += pv
DIRS += property
DIRS += monitor
include $(TOP)/configure/RULES_DIRS

13
testApp/monitor/Makefile Normal file
View File

@@ -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

View File

@@ -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 <cstddef>
#include <cstdlib>
#include <cstddef>
#include <string>
#include <cstring>
#include <cstdio>
#include <epicsAssert.h>
#include <epicsExit.h>
#include <pv/requester.h>
#include <pv/pvIntrospect.h>
#include <pv/pvData.h>
#include <pv/monitor.h>
#include <pv/monitorQueue.h>
#include <pv/standardField.h>
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);
}