From aaacadb42da53a3ab7ad811a751c4188a67e8394 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Mon, 2 Dec 2019 10:32:48 -0500 Subject: [PATCH] fix issue 63; add PvaClientData::getSinglePVField; simplify getDouble, putDouble, etc --- src/pv/pvaClient.h | 1 + src/pvaClientData.cpp | 156 +++++++++++---------------------------- src/pvaClientPutData.cpp | 132 +++++---------------------------- 3 files changed, 65 insertions(+), 224 deletions(-) diff --git a/src/pv/pvaClient.h b/src/pv/pvaClient.h index aba39cd..cd61b8f 100644 --- a/src/pv/pvaClient.h +++ b/src/pv/pvaClient.h @@ -713,6 +713,7 @@ public: static PvaClientDataPtr create(epics::pvData::StructureConstPtr const & structure); protected: PvaClientData(epics::pvData::StructureConstPtr const & structure); + epics::pvData::PVFieldPtr getSinglePVField(); void checkValue(); std::string messagePrefix; private: diff --git a/src/pvaClientData.cpp b/src/pvaClientData.cpp index 56b3e7a..60de4eb 100644 --- a/src/pvaClientData.cpp +++ b/src/pvaClientData.cpp @@ -57,6 +57,30 @@ PvaClientData::PvaClientData(StructureConstPtr const & structure) { } +PVFieldPtr PvaClientData::getSinglePVField() +{ + if(PvaClient::getDebug()) cout << "PvaClientData::getSinglePVField\n"; + PVStructurePtr pvStructure = getPVStructure(); + while(true) { + const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); + if(fieldPtrArray.size()==0) { + throw std::logic_error("PvaClientData::getSinglePVField() pvRequest for empty structure"); + } + if(fieldPtrArray.size()!=1) { + PVFieldPtr pvValue = pvStructure->getSubField("value"); + if(pvValue) { + Type type = pvValue->getField()->getType(); + if(type!=epics::pvData::structure) return pvValue; + } + throw std::logic_error("PvaClientData::getSinglePVField() pvRequest for multiple fields"); + } + PVFieldPtr pvField(fieldPtrArray[0]); + Type type = pvField->getField()->getType(); + if(type!=epics::pvData::structure) return pvField; + pvStructure = static_pointer_cast(pvField); + } +} + void PvaClientData::checkValue() { if(PvaClient::getDebug()) cout << "PvaClientData::checkValue\n"; @@ -180,34 +204,12 @@ PVScalarArrayPtr PvaClientData::getScalarArrayValue() double PvaClientData::getDouble() { if(PvaClient::getDebug()) cout << "PvaClientData::getDouble\n"; - PVScalarPtr pvScalar; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalar) pvScalar = static_pointer_cast(pvValue); - } - if(!pvScalar) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::getDouble() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalar) { - pvScalar = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalar) { - throw std::logic_error( - "PvaClientData::getDouble() did not find a scalar field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalar) { + throw std::logic_error("PvaClientData::getDouble() did not find a scalar field"); } + PVScalarPtr pvScalar = static_pointer_cast(pvField); ScalarType scalarType = pvScalar->getScalar()->getScalarType(); if(scalarType==pvDouble) { PVDoublePtr pvDouble = static_pointer_cast(pvScalar); @@ -223,70 +225,24 @@ double PvaClientData::getDouble() string PvaClientData::getString() { if(PvaClient::getDebug()) cout << "PvaClientData::getString\n"; - PVScalarPtr pvScalar; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalar) pvScalar = static_pointer_cast(pvValue); - } - if(!pvScalar) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::getString() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalar) { - pvScalar = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalar) { - throw std::logic_error( - "PvaClientData::getString() did not find a scalar field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalar) { + throw std::logic_error("PvaClientData::getString() did not find a scalar field"); } + PVScalarPtr pvScalar = static_pointer_cast(pvField); return convert->toString(pvScalar); } shared_vector PvaClientData::getDoubleArray() { if(PvaClient::getDebug()) cout << "PvaClientData::getDoubleArray\n"; - PVScalarArrayPtr pvScalarArray; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvValue); - } - } - if(!pvScalarArray) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::getDoubleArray() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalarArray) { - throw std::logic_error( - "PvaClientData::getDoubleArray() did not find a scalarArray field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalarArray) { + throw std::logic_error("PvaClientData::getDoubleArray() did not find a scalarArray field"); } + PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType(); if(!ScalarTypeFunc::isNumeric(scalarType)) { throw std::logic_error( @@ -300,36 +256,12 @@ shared_vector PvaClientData::getDoubleArray() shared_vector PvaClientData::getStringArray() { if(PvaClient::getDebug()) cout << "PvaClientData::getStringArray\n"; - PVScalarArrayPtr pvScalarArray; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvValue); - } - } - if(!pvScalarArray) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::getStringArray() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalarArray) { - throw std::logic_error( - "PvaClientData::getStringArray() did not find a scalarArray field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalarArray) { + throw std::logic_error("PvaClientData::getStringArray() did not find a scalarArray field"); } + PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); shared_vector retValue; pvScalarArray->getAs(retValue); return retValue; diff --git a/src/pvaClientPutData.cpp b/src/pvaClientPutData.cpp index e1cf019..d2d0439 100644 --- a/src/pvaClientPutData.cpp +++ b/src/pvaClientPutData.cpp @@ -74,34 +74,12 @@ PvaClientPutData::PvaClientPutData(StructureConstPtr const & structure) void PvaClientPutData::putDouble(double value) { if(PvaClient::getDebug()) cout << "PvaClientPutData::putDouble\n"; - PVScalarPtr pvScalar; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalar) pvScalar = static_pointer_cast(pvValue); - } - if(!pvScalar) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::putDouble() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalar) { - pvScalar = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalar) { - throw std::logic_error( - "PvaClientData::putDouble() did not find a scalar field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalar) { + throw std::logic_error("PvaClientData::putDouble() did not find a scalar field"); } + PVScalarPtr pvScalar = static_pointer_cast(pvField); ScalarType scalarType = pvScalar->getScalar()->getScalarType(); if(scalarType==pvDouble) { PVDoublePtr pvDouble = static_pointer_cast(pvScalar); @@ -118,70 +96,24 @@ void PvaClientPutData::putDouble(double value) void PvaClientPutData::putString(std::string const & value) { if(PvaClient::getDebug()) cout << "PvaClientPutData::putString\n"; - PVScalarPtr pvScalar; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalar) pvScalar = static_pointer_cast(pvValue); - } - if(!pvScalar) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::putString() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalar) { - pvScalar = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalar) { - throw std::logic_error( - "PvaClientData::putString() did not find a scalar field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalar) { + throw std::logic_error("PvaClientData::putString() did not find a scalar field"); } + PVScalarPtr pvScalar = static_pointer_cast(pvField); convert->fromString(pvScalar,value); } void PvaClientPutData::putDoubleArray(shared_vector const & value) { if(PvaClient::getDebug()) cout << "PvaClientPutData::putDoubleArray\n"; - PVScalarArrayPtr pvScalarArray; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvValue); - } - } - if(!pvScalarArray) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::putDoubleArray() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalarArray) { - PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalarArray) { - throw std::logic_error( - "PvaClientData::putDoubleArray() did not find a scalarArray field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalarArray) { + throw std::logic_error("PvaClientData::putDoubleArray() did not find a scalarArray field"); } + PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); ScalarType scalarType = pvScalarArray->getScalarArray()->getElementType(); if(!ScalarTypeFunc::isNumeric(scalarType)) { throw std::logic_error( @@ -193,36 +125,12 @@ void PvaClientPutData::putDoubleArray(shared_vector const & value) void PvaClientPutData::putStringArray(shared_vector const & value) { if(PvaClient::getDebug()) cout << "PvaClientPutData::putStringArray\n"; - PVScalarArrayPtr pvScalarArray; - PVStructurePtr pvStructure = getPVStructure(); - PVFieldPtr pvValue = pvStructure->getSubField("value"); - if(pvValue) { - Type type = pvValue->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvValue); - } - } - if(!pvScalarArray) { - while(true) { - const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields()); - if(fieldPtrArray.size()!=1) { - throw std::logic_error( - "PvaClientData::putStringArray() pvRequest for multiple fields"); - } - PVFieldPtr pvField(fieldPtrArray[0]); - Type type = pvField->getField()->getType(); - if(type==scalarArray) { - pvScalarArray = static_pointer_cast(pvField); - break; - } - if(pvField->getField()->getType()!=epics::pvData::structure) break; - pvStructure = static_pointer_cast(pvField); - } - } - if(!pvScalarArray) { - throw std::logic_error( - "PvaClientData::putStringArray() did not find a scalarArray field"); + PVFieldPtr pvField = getSinglePVField(); + Type type = pvField->getField()->getType(); + if(type!=scalarArray) { + throw std::logic_error("PvaClientData::putStringArray() did not find a scalarArray field"); } + PVScalarArrayPtr pvScalarArray = static_pointer_cast(pvField); pvScalarArray->putFrom(value); return; }