pvArrayPlugin now supports union scalarArray

This commit is contained in:
mrkraimer
2020-04-07 12:53:01 -04:00
parent 634153a28d
commit 2f7c82757f
3 changed files with 50 additions and 15 deletions

View File

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

View File

@ -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();

View File

@ -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());
} }