redo monotorQueue
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
namespace epics { namespace pvData {
|
||||
|
||||
class Requester;
|
||||
typedef std::tr1::shared_ptr<Requester> RequesterPtr;
|
||||
|
||||
enum MessageType {
|
||||
infoMessage,warningMessage,errorMessage,fatalErrorMessage
|
||||
|
||||
@@ -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(){}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
@@ -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
13
testApp/monitor/Makefile
Normal 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
|
||||
|
||||
103
testApp/monitor/testMonitor.cpp
Normal file
103
testApp/monitor/testMonitor.cpp
Normal 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user