getStringArray and putStringArray support all numeric array types
This commit is contained in:
@@ -290,19 +290,16 @@ shared_vector<const double> PvaClientData::getDoubleArray()
|
||||
shared_vector<const string> PvaClientData::getStringArray()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getStringArray\n";
|
||||
PVStringArrayPtr pvStringArray;
|
||||
PVScalarArrayPtr pvScalarArray;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
if(pvScalarArray->getScalarArray()->getElementType()==pvString) {
|
||||
pvStringArray = static_pointer_cast<PVStringArray>(pvValue);
|
||||
}
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
}
|
||||
}
|
||||
if(!pvStringArray) {
|
||||
if(!pvScalarArray) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
@@ -314,7 +311,7 @@ shared_vector<const string> PvaClientData::getStringArray()
|
||||
if(type==scalarArray) {
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
if(pvScalarArray->getScalarArray()->getElementType()==pvString) {
|
||||
pvStringArray = static_pointer_cast<PVStringArray>(pvField);
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -322,14 +319,15 @@ shared_vector<const string> PvaClientData::getStringArray()
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvStringArray) {
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getStringArray() did not find a scalarArray field");
|
||||
}
|
||||
return pvStringArray->view();
|
||||
shared_vector<const string> retValue;
|
||||
pvScalarArray->getAs<const string>(retValue);
|
||||
return retValue;
|
||||
}
|
||||
|
||||
|
||||
Alarm PvaClientData::getAlarm()
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientData::getAlarm\n";
|
||||
|
||||
@@ -194,31 +194,28 @@ void PvaClientPutData::putDoubleArray(shared_vector<const double> const & value)
|
||||
void PvaClientPutData::putStringArray(shared_vector<const std::string> const & value)
|
||||
{
|
||||
if(PvaClient::getDebug()) cout << "PvaClientPutData::putStringArray\n";
|
||||
PVStringArrayPtr pvStringArray;
|
||||
PVScalarArrayPtr pvScalarArray;
|
||||
PVStructurePtr pvStructure = getPVStructure();
|
||||
PVFieldPtr pvValue = pvStructure->getSubField("value");
|
||||
if(pvValue) {
|
||||
Type type = pvValue->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
if(pvScalarArray->getScalarArray()->getElementType()==pvString) {
|
||||
pvStringArray = static_pointer_cast<PVStringArray>(pvValue);
|
||||
}
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvValue);
|
||||
}
|
||||
}
|
||||
if(!pvStringArray) {
|
||||
if(!pvScalarArray) {
|
||||
while(true) {
|
||||
const PVFieldPtrArray fieldPtrArray(pvStructure->getPVFields());
|
||||
if(fieldPtrArray.size()!=1) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getStringArray() pvRequest for multiple fields");
|
||||
"PvaClientData::putStringArray() pvRequest for multiple fields");
|
||||
}
|
||||
PVFieldPtr pvField(fieldPtrArray[0]);
|
||||
Type type = pvField->getField()->getType();
|
||||
if(type==scalarArray) {
|
||||
PVScalarArrayPtr pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
if(pvScalarArray->getScalarArray()->getElementType()==pvString) {
|
||||
pvStringArray = static_pointer_cast<PVStringArray>(pvField);
|
||||
pvScalarArray = static_pointer_cast<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -226,45 +223,21 @@ void PvaClientPutData::putStringArray(shared_vector<const std::string> const & v
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvStringArray) {
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getStringArray() did not find a scalarArray field");
|
||||
"PvaClientData::putStringArray() did not find a scalarArray field");
|
||||
}
|
||||
pvStringArray->replace(value);
|
||||
pvScalarArray->putFrom<const string>(value);
|
||||
return;
|
||||
}
|
||||
|
||||
void PvaClientPutData::putStringArray(std::vector<std::string> const & value)
|
||||
void PvaClientPutData::putStringArray(std::vector<string> 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<PVScalarArray>(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<PVScalarArray>(pvField);
|
||||
break;
|
||||
}
|
||||
if(pvField->getField()->getType()!=epics::pvData::structure) break;
|
||||
pvStructure = static_pointer_cast<PVStructure>(pvField);
|
||||
}
|
||||
}
|
||||
if(!pvScalarArray) {
|
||||
throw std::logic_error(
|
||||
"PvaClientData::getStringArray() did not find a scalarArray field");
|
||||
}
|
||||
convert->fromStringArray(pvScalarArray,0,value.size(),value,0);
|
||||
size_t length = value.size();
|
||||
shared_vector<string> val(length);
|
||||
for(size_t i=0; i < length; ++i) val[i] = value[i];
|
||||
putStringArray(freeze(val));
|
||||
return;
|
||||
}
|
||||
|
||||
void PvaClientPutData::postPut(size_t fieldNumber)
|
||||
|
||||
Reference in New Issue
Block a user