pvArrayPlugin now supports union scalarArray
This commit is contained in:
@ -76,9 +76,19 @@ static vector<string> split(string const & colonSeparatedList) {
|
|||||||
|
|
||||||
PVArrayFilterPtr PVArrayFilter::create(
|
PVArrayFilterPtr PVArrayFilter::create(
|
||||||
const std::string & requestValue,
|
const std::string & requestValue,
|
||||||
const PVFieldPtr & master)
|
const PVFieldPtr & masterField)
|
||||||
{
|
{
|
||||||
Type type = master->getField()->getType();
|
bool masterIsUnion = false;
|
||||||
|
PVUnionPtr pvUnion;
|
||||||
|
Type type = masterField->getField()->getType();
|
||||||
|
if(type==epics::pvData::union_) {
|
||||||
|
pvUnion = std::tr1::static_pointer_cast<PVUnion>(masterField);
|
||||||
|
PVFieldPtr pvField = pvUnion->get();
|
||||||
|
if(pvField) {
|
||||||
|
masterIsUnion = true;
|
||||||
|
type = pvField->getField()->getType();
|
||||||
|
}
|
||||||
|
}
|
||||||
if(type!=scalarArray) {
|
if(type!=scalarArray) {
|
||||||
PVArrayFilterPtr filter = PVArrayFilterPtr();
|
PVArrayFilterPtr filter = PVArrayFilterPtr();
|
||||||
return filter;
|
return filter;
|
||||||
@ -112,25 +122,45 @@ PVArrayFilterPtr PVArrayFilter::create(
|
|||||||
PVArrayFilterPtr filter = PVArrayFilterPtr();
|
PVArrayFilterPtr filter = PVArrayFilterPtr();
|
||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
PVScalarArrayPtr masterArray;
|
||||||
|
if(masterIsUnion) {
|
||||||
|
masterArray = static_pointer_cast<PVScalarArray>(pvUnion->get());
|
||||||
|
} else {
|
||||||
|
masterArray = static_pointer_cast<PVScalarArray>(masterField);
|
||||||
|
}
|
||||||
PVArrayFilterPtr filter =
|
PVArrayFilterPtr filter =
|
||||||
PVArrayFilterPtr(
|
PVArrayFilterPtr(
|
||||||
new PVArrayFilter(
|
new PVArrayFilter(start,increment,end,masterField,masterArray));
|
||||||
start,increment,end,static_pointer_cast<PVScalarArray>(master)));
|
|
||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
PVArrayFilter::PVArrayFilter(long start,long increment,long end,const PVScalarArrayPtr & masterArray)
|
PVArrayFilter::PVArrayFilter(
|
||||||
|
long start,long increment,long end,
|
||||||
|
const PVFieldPtr & masterField,
|
||||||
|
const epics::pvData::PVScalarArrayPtr masterArray)
|
||||||
: start(start),
|
: start(start),
|
||||||
increment(increment),
|
increment(increment),
|
||||||
end(end),
|
end(end),
|
||||||
|
masterField(masterField),
|
||||||
masterArray(masterArray)
|
masterArray(masterArray)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PVArrayFilter::filter(const PVFieldPtr & pvCopy,const BitSetPtr & bitSet,bool toCopy)
|
bool PVArrayFilter::filter(const PVFieldPtr & pvField,const BitSetPtr & bitSet,bool toCopy)
|
||||||
{
|
{
|
||||||
PVScalarArrayPtr copyArray = static_pointer_cast<PVScalarArray>(pvCopy);
|
PVFieldPtr pvCopy = pvField;
|
||||||
|
PVScalarArrayPtr copyArray;
|
||||||
|
Type type = masterField->getField()->getType();
|
||||||
|
if(type==epics::pvData::union_) {
|
||||||
|
PVUnionPtr pvMasterUnion = std::tr1::static_pointer_cast<PVUnion>(masterField);
|
||||||
|
PVUnionPtr pvCopyUnion = std::tr1::static_pointer_cast<PVUnion>(pvCopy);
|
||||||
|
if(toCopy) pvCopyUnion->copy(*pvMasterUnion);
|
||||||
|
PVFieldPtr pvField = pvCopyUnion->get();
|
||||||
|
copyArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||||
|
} else {
|
||||||
|
copyArray = static_pointer_cast<PVScalarArray>(pvCopy);
|
||||||
|
}
|
||||||
long len = 0;
|
long len = 0;
|
||||||
long start = this->start;
|
long start = this->start;
|
||||||
long end = this->end;
|
long end = this->end;
|
||||||
@ -164,7 +194,7 @@ bool PVArrayFilter::filter(const PVFieldPtr & pvCopy,const BitSetPtr & bitSet,bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
copyArray->setLength(len);
|
copyArray->setLength(len);
|
||||||
bitSet->set(pvCopy->getFieldOffset());
|
bitSet->set(masterField->getFieldOffset());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (end - start >= 0) len = 1 + (end - start) / increment;
|
if (end - start >= 0) len = 1 + (end - start) / increment;
|
||||||
@ -181,6 +211,7 @@ bool PVArrayFilter::filter(const PVFieldPtr & pvCopy,const BitSetPtr & bitSet,bo
|
|||||||
indto += increment;
|
indto += increment;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
masterField->postPut();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,9 +63,13 @@ private:
|
|||||||
long start;
|
long start;
|
||||||
long increment;
|
long increment;
|
||||||
long end;
|
long end;
|
||||||
|
epics::pvData::PVFieldPtr masterField;
|
||||||
epics::pvData::PVScalarArrayPtr masterArray;
|
epics::pvData::PVScalarArrayPtr masterArray;
|
||||||
|
|
||||||
PVArrayFilter(long start,long increment,long end,const epics::pvData::PVScalarArrayPtr & masterArray);
|
PVArrayFilter(
|
||||||
|
long start,long increment,long end,
|
||||||
|
const epics::pvData::PVFieldPtr & masterField,
|
||||||
|
const epics::pvData::PVScalarArrayPtr masterArray);
|
||||||
public:
|
public:
|
||||||
POINTER_DEFINITIONS(PVArrayFilter);
|
POINTER_DEFINITIONS(PVArrayFilter);
|
||||||
virtual ~PVArrayFilter();
|
virtual ~PVArrayFilter();
|
||||||
|
@ -291,7 +291,7 @@ void MonitorLocal::dataPut(PVRecordFieldPtr const & pvRecordField)
|
|||||||
{
|
{
|
||||||
if(pvRecord->getTraceLevel()>1)
|
if(pvRecord->getTraceLevel()>1)
|
||||||
{
|
{
|
||||||
cout << "PVCopyMonitor::dataPut(pvRecordField)" << endl;
|
cout << "MonitorLocal::dataPut(pvRecordField)" << endl;
|
||||||
}
|
}
|
||||||
if(state!=active) return;
|
if(state!=active) return;
|
||||||
{
|
{
|
||||||
@ -316,7 +316,7 @@ void MonitorLocal::dataPut(
|
|||||||
{
|
{
|
||||||
if(pvRecord->getTraceLevel()>1)
|
if(pvRecord->getTraceLevel()>1)
|
||||||
{
|
{
|
||||||
cout << "PVCopyMonitor::dataPut(requested,pvRecordField)" << endl;
|
cout << "MonitorLocal::dataPut(requested,pvRecordField)" << endl;
|
||||||
}
|
}
|
||||||
if(state!=active) return;
|
if(state!=active) return;
|
||||||
{
|
{
|
||||||
@ -343,7 +343,7 @@ void MonitorLocal::beginGroupPut(PVRecordPtr const & pvRecord)
|
|||||||
{
|
{
|
||||||
if(pvRecord->getTraceLevel()>1)
|
if(pvRecord->getTraceLevel()>1)
|
||||||
{
|
{
|
||||||
cout << "PVCopyMonitor::beginGroupPut()" << endl;
|
cout << "MonitorLocal::beginGroupPut()" << endl;
|
||||||
}
|
}
|
||||||
if(state!=active) return;
|
if(state!=active) return;
|
||||||
{
|
{
|
||||||
@ -357,7 +357,7 @@ void MonitorLocal::endGroupPut(PVRecordPtr const & pvRecord)
|
|||||||
{
|
{
|
||||||
if(pvRecord->getTraceLevel()>1)
|
if(pvRecord->getTraceLevel()>1)
|
||||||
{
|
{
|
||||||
cout << "PVCopyMonitor::endGroupPut dataChanged " << dataChanged << endl;
|
cout << "MonitorLocal::endGroupPut dataChanged " << dataChanged << endl;
|
||||||
}
|
}
|
||||||
if(state!=active) return;
|
if(state!=active) return;
|
||||||
{
|
{
|
||||||
@ -374,7 +374,7 @@ void MonitorLocal::unlisten(PVRecordPtr const & pvRecord)
|
|||||||
{
|
{
|
||||||
if(pvRecord->getTraceLevel()>1)
|
if(pvRecord->getTraceLevel()>1)
|
||||||
{
|
{
|
||||||
cout << "PVCopyMonitor::unlisten\n";
|
cout << "MonitorLocal::unlisten\n";
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Lock xx(mutex);
|
Lock xx(mutex);
|
||||||
@ -384,7 +384,7 @@ void MonitorLocal::unlisten(PVRecordPtr const & pvRecord)
|
|||||||
if(requester) {
|
if(requester) {
|
||||||
if(pvRecord->getTraceLevel()>1)
|
if(pvRecord->getTraceLevel()>1)
|
||||||
{
|
{
|
||||||
cout << "PVCopyMonitor::unlisten calling requester->unlisten\n";
|
cout << "MonitorLocal::unlisten calling requester->unlisten\n";
|
||||||
}
|
}
|
||||||
requester->unlisten(getPtrSelf());
|
requester->unlisten(getPtrSelf());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user