make compatible with pvDataCPP-md; channelArray implemented; can be part of v3IOC.
This commit is contained in:
@@ -15,11 +15,13 @@
|
||||
|
||||
#include <pv/channelProviderLocal.h>
|
||||
#include <pv/convert.h>
|
||||
#include <pv/pvSubArrayCopy.h>
|
||||
|
||||
namespace epics { namespace pvDatabase {
|
||||
using namespace epics::pvData;
|
||||
using namespace epics::pvAccess;
|
||||
using std::tr1::static_pointer_cast;
|
||||
using std::tr1::dynamic_pointer_cast;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
@@ -759,6 +761,8 @@ void ChannelPutGetLocal::getGet()
|
||||
}
|
||||
}
|
||||
|
||||
typedef std::tr1::shared_ptr<PVArray> PVArrayPtr;
|
||||
|
||||
class ChannelArrayLocal :
|
||||
public ChannelArray,
|
||||
public std::tr1::enable_shared_from_this<ChannelArrayLocal>
|
||||
@@ -791,8 +795,8 @@ private:
|
||||
ChannelArrayLocal(
|
||||
ChannelLocalPtr const &channelLocal,
|
||||
ChannelArrayRequester::shared_pointer const & channelArrayRequester,
|
||||
PVScalarArrayPtr const &pvArray,
|
||||
PVScalarArrayPtr const &pvCopy,
|
||||
PVArrayPtr const &pvArray,
|
||||
PVArrayPtr const &pvCopy,
|
||||
PVRecordPtr const &pvRecord)
|
||||
:
|
||||
isDestroyed(false),
|
||||
@@ -810,13 +814,14 @@ private:
|
||||
bool callProcess;
|
||||
ChannelLocalPtr channelLocal;
|
||||
ChannelArrayRequester::shared_pointer channelArrayRequester,;
|
||||
PVScalarArrayPtr pvArray;
|
||||
PVScalarArrayPtr pvCopy;
|
||||
PVArrayPtr pvArray;
|
||||
PVArrayPtr pvCopy;
|
||||
PVRecordPtr pvRecord;
|
||||
Mutex mutex;
|
||||
Lock thelock;
|
||||
};
|
||||
|
||||
|
||||
ChannelArrayLocalPtr ChannelArrayLocal::create(
|
||||
ChannelLocalPtr const &channelLocal,
|
||||
ChannelArrayRequester::shared_pointer const & channelArrayRequester,
|
||||
@@ -852,18 +857,26 @@ ChannelArrayLocalPtr ChannelArrayLocal::create(
|
||||
channelArrayRequester->channelArrayConnect(status,channelArray,pvArray);
|
||||
return channelArray;
|
||||
}
|
||||
if(pvField->getField()->getType()!=scalarArray)
|
||||
if(pvField->getField()->getType()!=scalarArray && pvField->getField()->getType()!=structureArray)
|
||||
{
|
||||
Status status(
|
||||
Status::Status::STATUSTYPE_ERROR,fieldName +" not scalarArray");
|
||||
Status::Status::STATUSTYPE_ERROR,fieldName +" not array");
|
||||
ChannelArrayLocalPtr channelArray;
|
||||
PVScalarArrayPtr pvArray;
|
||||
PVArrayPtr pvArray;
|
||||
channelArrayRequester->channelArrayConnect(status,channelArray,pvArray);
|
||||
return channelArray;
|
||||
}
|
||||
PVScalarArrayPtr pvArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
PVScalarArrayPtr pvCopy = getPVDataCreate()->createPVScalarArray(
|
||||
pvArray->getScalarArray()->getElementType());
|
||||
PVArrayPtr pvArray = static_pointer_cast<PVArray>(pvField);
|
||||
PVArrayPtr pvCopy;
|
||||
if(pvField->getField()->getType()==scalarArray) {
|
||||
PVScalarArrayPtr xxx = static_pointer_cast<PVScalarArray>(pvField);
|
||||
pvCopy = getPVDataCreate()->createPVScalarArray(
|
||||
xxx->getScalarArray()->getElementType());
|
||||
} else {
|
||||
PVStructureArrayPtr xxx = static_pointer_cast<PVStructureArray>(pvField);
|
||||
pvCopy = getPVDataCreate()->createPVStructureArray(
|
||||
xxx->getStructureArray());
|
||||
}
|
||||
|
||||
ChannelArrayLocalPtr array(new ChannelArrayLocal(
|
||||
channelLocal,
|
||||
@@ -913,8 +926,13 @@ void ChannelArrayLocal::getArray(bool lastRequest,int offset, int count)
|
||||
}
|
||||
pvRecord->lock();
|
||||
try {
|
||||
size_t len = getConvert()->copyScalarArray(pvArray,offset,pvCopy,0,count);
|
||||
if(!pvCopy->isImmutable()) pvCopy->setLength(len);
|
||||
if(count<0) count = pvArray->getLength();
|
||||
size_t capacity = pvArray->getCapacity();
|
||||
if(capacity!=0) {
|
||||
pvCopy->setCapacity(capacity);
|
||||
pvCopy->setLength(count);
|
||||
copy(*pvArray.get(),offset,*pvCopy.get(),0,count);
|
||||
}
|
||||
} catch(...) {
|
||||
pvRecord->unlock();
|
||||
throw;
|
||||
@@ -937,10 +955,12 @@ void ChannelArrayLocal::putArray(bool lastRequest,int offset, int count)
|
||||
{
|
||||
cout << "ChannelArrayLocal::putArray" << endl;
|
||||
}
|
||||
if(count<=0) count = pvCopy->getLength();
|
||||
pvRecord->lock();
|
||||
try {
|
||||
getConvert()->copyScalarArray(pvCopy,0,pvArray,offset,count);
|
||||
if(count<=0) count = pvCopy->getLength();
|
||||
if(pvArray->getCapacity()<count) pvArray->setCapacity(count);
|
||||
if(pvArray->getLength()<count) pvArray->setLength(count);
|
||||
copy(*pvCopy.get(),0,*pvArray.get(),offset,count);
|
||||
} catch(...) {
|
||||
pvRecord->unlock();
|
||||
throw;
|
||||
@@ -964,21 +984,22 @@ void ChannelArrayLocal::setLength(bool lastRequest,int length, int capacity)
|
||||
{
|
||||
cout << "ChannelArrayLocal::setLength" << endl;
|
||||
}
|
||||
if(capacity>=0 && !pvArray->isCapacityMutable()) {
|
||||
Status status(
|
||||
Status::Status::STATUSTYPE_ERROR,
|
||||
"capacityImnutable");
|
||||
channelArrayRequester->setLengthDone(status);
|
||||
return;
|
||||
}
|
||||
pvRecord->lock();
|
||||
try {
|
||||
if(length>0) {
|
||||
if(pvArray->getLength()!=length) pvArray->setLength(length);
|
||||
if(capacity>=0 && !pvArray->isCapacityMutable()) {
|
||||
Status status(
|
||||
Status::Status::STATUSTYPE_ERROR,
|
||||
"capacityImnutable");
|
||||
channelArrayRequester->setLengthDone(status);
|
||||
pvRecord->unlock();
|
||||
return;
|
||||
}
|
||||
if(capacity>0) {
|
||||
if(pvArray->getCapacity()!=capacity) pvArray->setCapacity(capacity);
|
||||
}
|
||||
if(length>0) {
|
||||
if(pvArray->getLength()!=length) pvArray->setLength(length);
|
||||
}
|
||||
} catch(...) {
|
||||
pvRecord->unlock();
|
||||
throw;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
/**
|
||||
* @author Marty Kraimer
|
||||
* @data 2013.04
|
||||
* @date 2013.04
|
||||
*/
|
||||
#ifndef CHANNELPROVIDERLOCAL_H
|
||||
#define CHANNELPROVIDERLOCAL_H
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
/**
|
||||
* @author Marty Kraimer
|
||||
* @data 2013.04
|
||||
* @date 2013.04
|
||||
*/
|
||||
#ifndef MONITORALGORITHM_H
|
||||
#define MONITORALGORITHM_H
|
||||
|
||||
+4
-45
@@ -20,6 +20,7 @@ namespace epics { namespace pvDatabase {
|
||||
|
||||
using namespace epics::pvData;
|
||||
using std::tr1::static_pointer_cast;
|
||||
using std::tr1::dynamic_pointer_cast;
|
||||
using std::size_t;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
@@ -35,13 +36,11 @@ struct CopyNode {
|
||||
CopyNode()
|
||||
: isStructure(false),
|
||||
structureOffset(0),
|
||||
nfields(0),
|
||||
shareData(false)
|
||||
nfields(0)
|
||||
{}
|
||||
bool isStructure;
|
||||
size_t structureOffset; // In the copy
|
||||
size_t nfields;
|
||||
bool shareData;
|
||||
PVStructurePtr options;
|
||||
};
|
||||
|
||||
@@ -734,23 +733,7 @@ void PVCopy::referenceImmutable(
|
||||
CopyRecordNodePtr recordNode =
|
||||
static_pointer_cast<CopyRecordNode>(node);
|
||||
PVRecordFieldPtr recordPVField = recordNode->recordPVField;
|
||||
bool shareData = false;
|
||||
if(node->options.get()!=NULL) {
|
||||
PVFieldPtr pv = node->options->getSubField("_options");
|
||||
if(pv.get()!=NULL) {
|
||||
PVStructurePtr xxx = static_pointer_cast<PVStructure>(pv);
|
||||
pv = xxx->getSubField("shareData");
|
||||
if(pv.get()!=NULL) {
|
||||
PVStringPtr yyy = xxx->getStringField("shareData");
|
||||
shareData = (yyy->get().compare("true")==0) ? true : false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(shareData) {
|
||||
makeShared(pvField,recordNode->recordPVField);
|
||||
} else {
|
||||
referenceImmutable(pvField,recordPVField);
|
||||
}
|
||||
referenceImmutable(pvField,recordPVField);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -780,13 +763,6 @@ void PVCopy::referenceImmutable(
|
||||
}
|
||||
}
|
||||
|
||||
void PVCopy::makeShared(
|
||||
PVFieldPtr const ©PVField,
|
||||
PVRecordFieldPtr const &recordPVField)
|
||||
{
|
||||
throw std::logic_error(String("Not Implemented"));
|
||||
}
|
||||
|
||||
void PVCopy::updateStructureNodeSetBitSet(
|
||||
PVStructurePtr const &pvCopy,
|
||||
CopyStructureNodePtr const &structureNode,
|
||||
@@ -803,24 +779,7 @@ void PVCopy::updateStructureNodeSetBitSet(
|
||||
} else {
|
||||
CopyRecordNodePtr recordNode =
|
||||
static_pointer_cast<CopyRecordNode>(node);
|
||||
bool shareData = false;
|
||||
if(node->options.get()!=NULL) {
|
||||
PVFieldPtr pv = node->options->getSubField("_options");
|
||||
if(pv.get()!=NULL) {
|
||||
PVStructurePtr xxx =
|
||||
static_pointer_cast<PVStructure>(pv);
|
||||
pv = xxx->getSubField("shareData");
|
||||
if(pv.get()!=NULL) {
|
||||
PVStringPtr yyy = xxx->getStringField("shareData");
|
||||
shareData = (yyy->get().compare("true")==0) ? true : false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(shareData) {
|
||||
bitSet->set(pvField->getFieldOffset());
|
||||
} else {
|
||||
updateSubFieldSetBitSet(pvField,recordNode->recordPVField,bitSet);
|
||||
}
|
||||
updateSubFieldSetBitSet(pvField,recordNode->recordPVField,bitSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,10 +25,6 @@ class PVCopyMonitor;
|
||||
typedef std::tr1::shared_ptr<PVCopyMonitor> PVCopyMonitorPtr;
|
||||
class PVCopyMonitorRequester;
|
||||
typedef std::tr1::shared_ptr<PVCopyMonitorRequester> PVCopyMonitorRequesterPtr;
|
||||
class SharePVScalarArray;
|
||||
typedef std::tr1::shared_ptr<SharePVScalarArray> SharePVScalarArrayPtr;
|
||||
class SharePVStructureArray;
|
||||
typedef std::tr1::shared_ptr<SharePVStructureArray> SharePVStructureArrayPtr;
|
||||
|
||||
struct CopyNode;
|
||||
typedef std::tr1::shared_ptr<CopyNode> CopyNodePtr;
|
||||
@@ -125,9 +121,6 @@ private:
|
||||
void referenceImmutable(
|
||||
epics::pvData::PVFieldPtr const ©PVField,
|
||||
PVRecordFieldPtr const &recordPVField);
|
||||
void makeShared(
|
||||
epics::pvData::PVFieldPtr const ©PVField,
|
||||
PVRecordFieldPtr const &recordPVField);
|
||||
void updateStructureNodeSetBitSet(
|
||||
epics::pvData::PVStructurePtr const &pvCopy,
|
||||
CopyStructureNodePtr const &structureNode,
|
||||
@@ -217,113 +210,6 @@ public:
|
||||
virtual void unlisten() = 0;
|
||||
};
|
||||
|
||||
|
||||
#ifdef MUSTIMPLEMENT
|
||||
template<typename T>
|
||||
class SharePVScalarArray :
|
||||
public epics::pvData::PVScalarArray
|
||||
{
|
||||
public:
|
||||
POINTER_DEFINITIONS(SharePVScalarArray)
|
||||
typedef T value_type;
|
||||
typedef T* pointer;
|
||||
typedef const T* const_pointer;
|
||||
typedef epics::pvData::PVArrayData<T> ArrayDataType;
|
||||
|
||||
SharePVScalarArray(
|
||||
PVRecordFieldPtr const &pvRecordField,
|
||||
epics::pvData::PVStructurePtr const &parent,
|
||||
epics::pvData::PVScalarArrayPtr const &pvShare);
|
||||
virtual ~SharePVScalarArray();
|
||||
void lockShare() const;
|
||||
void unlockShare() const;
|
||||
virtual void message(
|
||||
epics::pvData::String const & message,
|
||||
epics::pvData::MessageType messageType);
|
||||
virtual void setImmutable();
|
||||
bool isImmutable();
|
||||
virtual void setCapacity(std::size_t capacity);
|
||||
void setLength(std::size_t length);
|
||||
std::size_t getCapacity() const;
|
||||
std::size_t getLength() const;
|
||||
bool isCapacityMutable();
|
||||
void setCapacityMutable(bool isMutable);
|
||||
virtual std::size_t get(std::size_t offset, std::size_t length, ArrayDataType &data) = 0;
|
||||
virtual std::size_t put(std::size_t offset,std::size_t length, pointer from, std::size_t fromOffset) = 0;
|
||||
virtual void shareData(pointer value,std::size_t capacity,std::size_t length) = 0;
|
||||
virtual bool equals(epics::pvData::PVFieldPtr const &pv);
|
||||
virtual void serialize(
|
||||
epics::pvData::ByteBufferPtr *pbuffer,
|
||||
epics::pvData::SerializableControl *pflusher) const;
|
||||
virtual void deserialize(
|
||||
epics::pvData::ByteBuffer *pbuffer,
|
||||
epics::pvData::DeserializableControl *pflusher);
|
||||
virtual void serialize(
|
||||
epics::pvData::ByteBuffer *pbuffer,
|
||||
epics::pvData::SerializableControl *pflusher, std::size_t offset, std::size_t count) const;
|
||||
private:
|
||||
PVRecordField &pvRecordField;
|
||||
};
|
||||
|
||||
typedef SharePVScalarArray<bool> SharePVBooleanArray;
|
||||
typedef SharePVScalarArray<epics::pvData::int8> SharePVByteArray;
|
||||
typedef SharePVScalarArray<epics::pvData::int16> SharePVShortArray;
|
||||
typedef SharePVScalarArray<epics::pvData::int32> SharePVIntArray;
|
||||
typedef SharePVScalarArray<epics::pvData::int64> SharePVLongArray;
|
||||
typedef SharePVScalarArray<float> SharePVFloatArray;
|
||||
typedef SharePVScalarArray<double> SharePVDoubleArray;
|
||||
typedef SharePVScalarArray<epics::pvData::String> SharePVStringArray;
|
||||
|
||||
|
||||
class SharePVStructureArray :
|
||||
public epics::pvData::PVStructureArray
|
||||
{
|
||||
public:
|
||||
POINTER_DEFINITIONS(SharePVStructureArray)
|
||||
SharePVStructureArray(
|
||||
PVRecordFieldPtr const &pvRecordField,
|
||||
epics::pvData::PVStructurePtr const &parent,
|
||||
epics::pvData::PVStructureArrayPtr const &pvShare);
|
||||
virtual ~SharePVStructureArray();
|
||||
virtual epics::pvData::StructureArrayConstPtr getStructureArray();
|
||||
void lockShare() const;
|
||||
void unlockShare() const;
|
||||
virtual void message(
|
||||
epics::pvData::String const &message,
|
||||
epics::pvData::MessageType messageType);
|
||||
virtual void setImmutable();
|
||||
bool isImmutable();
|
||||
virtual void setCapacity(std::size_t capacity);
|
||||
void setLength(std::size_t length);
|
||||
std::size_t getCapacity() const;
|
||||
std::size_t getLength() const;
|
||||
bool isCapacityMutable();
|
||||
void setCapacityMutable(bool isMutable);
|
||||
virtual void shareData(
|
||||
epics::pvData::PVStructurePtrArrayPtr const & value,
|
||||
std::size_t capacity,std::size_t length);
|
||||
virtual std::size_t get(std::size_t offset, std::size_t length,
|
||||
epics::pvData::StructureArrayData &data);
|
||||
virtual std::size_t put(std::size_t offset,std::size_t length,
|
||||
epics::pvData::PVStructurePtrArrayPtr const & from,
|
||||
std::size_t fromOffset);
|
||||
virtual bool equals(epics::pvData::PVField & &pv);
|
||||
virtual void serialize(
|
||||
epics::pvData::ByteBuffer *pbuffer,
|
||||
epics::pvData::SerializableControl *pflusher) const;
|
||||
virtual void deserialize(
|
||||
epics::pvData::ByteBuffer *pbuffer,
|
||||
epics::pvData::DeserializableControl *pflusher);
|
||||
virtual void serialize(
|
||||
epics::pvData::ByteBuffer *pbuffer,
|
||||
epics::pvData::SerializableControl *pflusher,
|
||||
std::size_t offset, std::size_t count) const;
|
||||
private:
|
||||
PVRecordField &pvRecordField;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
}}
|
||||
|
||||
#endif /* PVCOPY_H */
|
||||
|
||||
Reference in New Issue
Block a user