PVScalarArrayPtr PVStructure::getScalarArrayField( String const &fieldName,ScalarType elementType) { PVFieldPtr pvField = findSubField(fieldName,this); if(pvField.get()==NULL) { String message("fieldName "); message += fieldName + " does not exist"; this->message(message, errorMessage); return nullPVScalarArray; } FieldConstPtr field = pvField->getField(); Type type = field->getType(); if(type!=scalarArray) { String message("fieldName "); message += fieldName + " does not have type array "; this->message(message, errorMessage); return nullPVScalarArray; } ScalarArrayConstPtr pscalarArray = static_pointer_cast<const ScalarArray>(pvField->getField()); if(pscalarArray->getElementType()!=elementType) { String message("fieldName "); message += fieldName + " is array but does not have elementType "; ScalarTypeFunc::toString(&message,elementType); this->message(message, errorMessage); return nullPVScalarArray; } return std::tr1::static_pointer_cast<PVScalarArray>(pvField); }
bool NTNameValue::isCompatible(StructureConstPtr const & structure) { if (structure.get() == 0) return false; ScalarArrayConstPtr nameField = structure->getField<ScalarArray>("name"); if (nameField.get() == 0 || nameField->getElementType() != pvString) return false; ScalarArrayConstPtr valueField = structure->getField<ScalarArray>("value"); if (valueField.get() == 0) return false; FieldConstPtr field = structure->getField("descriptor"); if (field.get()) { ScalarConstPtr descriptorField = structure->getField<Scalar>("descriptor"); if (!descriptorField || descriptorField->getScalarType() != pvString) return false; } NTFieldPtr ntField = NTField::get(); field = structure->getField("alarm"); if (field && !ntField->isAlarm(field)) return false; field = structure->getField("timeStamp"); if (field && !ntField->isTimeStamp(field)) return false; return true; }
static void setValue(PVUnionPtr const &pvUnion, double value) { UnionConstPtr u = pvUnion->getUnion(); FieldConstPtr field = u->getField(0); Type type = field->getType(); if(type==scalar) { ScalarConstPtr scalar = static_pointer_cast<const Scalar>(field); ScalarType scalarType = scalar->getScalarType(); if(scalarType==pvDouble) { PVDoublePtr pvValue = static_pointer_cast<PVDouble>( pvDataCreate->createPVScalar(pvDouble)); pvValue->put(value); pvUnion->set(0,pvValue); return; } if(scalarType==pvString) { PVStringPtr pvValue = static_pointer_cast<PVString>( pvDataCreate->createPVScalar(pvString)); stringstream ss; ss << "value" << value; pvValue->put(ss.str()); pvUnion->set(0,pvValue); return; } throw std::runtime_error("only pvDouble and pvString are supported"); } if(type==scalarArray) { ScalarArrayConstPtr scalarArray = static_pointer_cast<const ScalarArray>(field); ScalarType scalarType = scalarArray->getElementType(); if(scalarType==pvDouble) { size_t num = 5; PVDoubleArrayPtr pvValue = static_pointer_cast<PVDoubleArray>( pvDataCreate->createPVScalarArray(pvDouble)); shared_vector<double> data(num); for(size_t i=0; i<num; ++i) data[i] = value +i; pvValue->replace(freeze(data)); pvUnion->set(0,pvValue); return; } if(scalarType==pvString) { size_t num = 5; PVStringArrayPtr pvValue = static_pointer_cast<PVStringArray>( pvDataCreate->createPVScalarArray(pvString)); shared_vector<string> data(num); for(size_t i=0; i<num; ++i) { stringstream ss; ss << "value" << value << i; data[i] = ss.str(); } pvValue->replace(freeze(data)); pvUnion->set(0,pvValue); return; } throw std::runtime_error("only pvDouble and pvString are supported"); } throw std::runtime_error("only scalar and scalarArray fields are supported"); }
PVScalarArrayPtr PVDataCreate::createPVScalarArray( ScalarArrayConstPtr const & scalarArray) { switch(scalarArray->getElementType()) { case pvBoolean: return PVScalarArrayPtr(new DefaultPVBooleanArray(scalarArray)); case pvByte: return PVScalarArrayPtr(new BasePVByteArray(scalarArray)); case pvShort: return PVScalarArrayPtr(new BasePVShortArray(scalarArray)); case pvInt: return PVScalarArrayPtr(new BasePVIntArray(scalarArray)); case pvLong: return PVScalarArrayPtr(new BasePVLongArray(scalarArray)); case pvUByte: return PVScalarArrayPtr(new BasePVUByteArray(scalarArray)); case pvUShort: return PVScalarArrayPtr(new BasePVUShortArray(scalarArray)); case pvUInt: return PVScalarArrayPtr(new BasePVUIntArray(scalarArray)); case pvULong: return PVScalarArrayPtr(new BasePVULongArray(scalarArray)); case pvFloat: return PVScalarArrayPtr(new BasePVFloatArray(scalarArray)); case pvDouble: return PVScalarArrayPtr(new BasePVDoubleArray(scalarArray)); case pvString: return PVScalarArrayPtr(new BasePVStringArray(scalarArray)); } throw std::logic_error("PVDataCreate::createPVScalarArray should never get here"); }
void test_builder() { testDiag("test_builder"); NTNDArrayAttributeBuilderPtr builder = NTNDArrayAttribute::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> addTags()-> addAlarm()-> addTimeStamp()-> add("extra",fieldCreate->createScalar(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTNDArrayAttribute::is_a(structure)); testOk1(structure->getID() == NTNDArrayAttribute::URI); testOk1(structure->getNumberFields() == 9); testOk1(structure->getField("name").get() != 0); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("tags").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); testOk1(structure->getField("sourceType").get() != 0); testOk1(structure->getField("source").get() != 0); ScalarConstPtr nameField = structure->getField<Scalar>("name"); testOk(nameField.get() != 0 && nameField->getScalarType() == pvString, "name is string"); UnionConstPtr valueField = structure->getField<Union>("value"); testOk(valueField.get() != 0, "value is enum"); ScalarArrayConstPtr tagsField = structure->getField<ScalarArray>("tags"); testOk(tagsField.get() != 0 && tagsField->getElementType() == pvString, "tags is string[]"); std::cout << *structure << std::endl; }
static bool isCompatible(UnionConstPtr const &u) { if(!u.get()) return false; if (u->getID() != Union::defaultId()) return false; if (u->isVariant()) return false; for (int i = pvBoolean; i != pvString; ++i) { ScalarType scalarType = static_cast<ScalarType>(i); std::string name(ScalarTypeFunc::name(scalarType)); name += "Value"; ScalarArrayConstPtr scalarField = u->getField<ScalarArray>(name); if (scalarField.get() == 0 || scalarField->getElementType() != scalarType) return false; } return true; }
bool NTHistogram::isCompatible(StructureConstPtr const &structure) { if(!structure.get()) return false; ScalarArrayConstPtr rangesField = structure->getField<ScalarArray>("ranges"); if(!rangesField.get() || rangesField->getElementType() != pvDouble) return false; ScalarArrayConstPtr valueField = structure->getField<ScalarArray>("value"); if(!valueField.get()) return false; ScalarType scalarType = valueField->getElementType(); if (scalarType != pvShort && scalarType != pvInt && scalarType != pvLong) return false; FieldConstPtr field = structure->getField("descriptor"); if(field) { ScalarConstPtr descriptorField = structure->getField<Scalar>("descriptor"); if (!descriptorField.get() || descriptorField->getScalarType() != pvString) return false; } field = structure->getField("alarm"); if (field.get() && !ntField->isAlarm(field)) return false; field = structure->getField("timeStamp"); if (field.get() && !ntField->isTimeStamp(field)) return false; return true; }
void testSerializeFull() { buffer->clear(); ScalarConstPtr scalarIn = getScalar("field1"); IntrospectionRegistry::serializeFull(static_pointer_cast<const Field>(scalarIn),buffer,flusher); buffer->flip(); ScalarConstPtr scalarOut = static_pointer_cast<const Scalar>(IntrospectionRegistry::deserializeFull(buffer,control)); PVField *pvField = pvDataCreate->createPVField(0,scalarOut); pvFieldArray.push_back(pvField); assert(scalarIn->getFieldName() == scalarOut->getFieldName()); assert(scalarIn->getType() == scalarOut->getType()); buffer->clear(); ScalarArrayConstPtr scalarArrayIn = getScalarArray("fieldArray1"); IntrospectionRegistry::serializeFull(static_pointer_cast<const Field>(scalarArrayIn),buffer,flusher); buffer->flip(); ScalarArrayConstPtr scalarArrayOut = static_pointer_cast<const ScalarArray>(IntrospectionRegistry::deserializeFull(buffer,control)); pvField = pvDataCreate->createPVField(0,scalarArrayOut); pvFieldArray.push_back(pvField); assert(scalarArrayIn->getFieldName() == scalarArrayOut->getFieldName()); assert(scalarArrayIn->getType() == scalarArrayOut->getType()); buffer->clear(); StructureConstPtr structureIn = getStructure("struct1"); IntrospectionRegistry::serializeFull(static_pointer_cast<const Field>(structureIn),buffer,flusher); buffer->flip(); StructureConstPtr structureOut = static_pointer_cast<const Structure>(IntrospectionRegistry::deserializeFull(buffer,control)); pvField = pvDataCreate->createPVField(0,structureOut); pvFieldArray.push_back(pvField); assert(structureIn->getFieldName() == structureOut->getFieldName()); assert(structureIn->getType() == structureOut->getType()); buffer->clear(); StructureArrayConstPtr structureArrayIn = getStructureArray("struct1","structArray1"); IntrospectionRegistry::serializeFull(static_pointer_cast<const Field>(structureArrayIn),buffer,flusher); buffer->flip(); StructureArrayConstPtr structureArrayOut = static_pointer_cast<const StructureArray>(IntrospectionRegistry::deserializeFull(buffer,control)); pvField = pvDataCreate->createPVField(0,structureArrayOut); pvFieldArray.push_back(pvField); assert(structureArrayIn->getFieldName() == structureArrayOut->getFieldName()); assert(structureArrayIn->getType() == structureArrayOut->getType()); }
bool NTMatrix::isCompatible(StructureConstPtr const & structure) { if (structure.get() == 0) return false; ScalarArrayConstPtr valueField = structure->getField<ScalarArray>("value"); if (valueField.get() == 0 || valueField->getElementType() != pvDouble) return false; FieldConstPtr field = structure->getField("dim"); if (field.get()) { ScalarArrayConstPtr dimField = structure->getField<ScalarArray>("dim"); if (dimField.get() == 0 || dimField->getElementType() != pvInt) return false; } field = structure->getField("descriptor"); if (field.get()) { ScalarConstPtr descriptorField = structure->getField<Scalar>("descriptor"); if (!descriptorField.get() || descriptorField->getScalarType() != pvString) return false; } NTFieldPtr ntField = NTField::get(); field = structure->getField("alarm"); if (field.get() && !ntField->isAlarm(field)) return false; field = structure->getField("timeStamp"); if (field.get() && !ntField->isTimeStamp(field)) return false; field = structure->getField("display"); if (field.get() && !ntField->isDisplay(field)) return false; return true; }
StructureConstPtr StandardField::createProperties(String id,FieldConstPtr field,String properties) { bool gotAlarm = false; bool gotTimeStamp = false; bool gotDisplay = false; bool gotControl = false; bool gotValueAlarm = false; int numProp = 0; if(properties.find("alarm")!=String::npos) { gotAlarm = true; numProp++; } if(properties.find("timeStamp")!=String::npos) { gotTimeStamp = true; numProp++; } if(properties.find("display")!=String::npos) { gotDisplay = true; numProp++; } if(properties.find("control")!=String::npos) { gotControl = true; numProp++; } if(properties.find("valueAlarm")!=String::npos) { gotValueAlarm = true; numProp++; } StructureConstPtr valueAlarm; Type type= field->getType(); while(gotValueAlarm) { if(type==epics::pvData::scalar || type==epics::pvData::scalarArray) { ScalarType scalarType = (type==epics::pvData::scalar) ? static_pointer_cast<const Scalar>(field)->getScalarType() : static_pointer_cast<const ScalarArray>(field)->getElementType(); switch(scalarType) { case pvBoolean: valueAlarm = booleanAlarmField; break; case pvByte: valueAlarm = byteAlarmField; break; case pvShort: valueAlarm = shortAlarmField; break; case pvInt: valueAlarm = intAlarmField; break; case pvLong: valueAlarm = longAlarmField; break; case pvUByte: valueAlarm = ubyteAlarmField; break; case pvUShort: valueAlarm = ushortAlarmField; break; case pvUInt: valueAlarm = uintAlarmField; break; case pvULong: valueAlarm = ulongAlarmField; break; case pvFloat: valueAlarm = floatAlarmField; break; case pvDouble: valueAlarm = doubleAlarmField; break; case pvString: throw std::logic_error(String("valueAlarm property not supported for pvString")); } break; } if(type==structure) { StructureConstPtr structurePtr = static_pointer_cast<const Structure>(field); StringArray names = structurePtr->getFieldNames(); if(names.size()==2) { FieldConstPtrArray fields = structurePtr->getFields(); FieldConstPtr first = fields[0]; FieldConstPtr second = fields[1]; String nameFirst = names[0]; String nameSecond = names[1]; int compareFirst = nameFirst.compare("index"); int compareSecond = nameSecond.compare("choices"); if(compareFirst==0 && compareSecond==0) { if(first->getType()==epics::pvData::scalar && second->getType()==epics::pvData::scalarArray) { ScalarConstPtr scalarFirst = static_pointer_cast<const Scalar>(first); ScalarArrayConstPtr scalarArraySecond = static_pointer_cast<const ScalarArray>(second); if(scalarFirst->getScalarType()==pvInt && scalarArraySecond->getElementType()==pvString) { valueAlarm = enumeratedAlarmField; break; } } } } } throw std::logic_error(String("valueAlarm property for illegal type")); } size_t numFields = numProp+1; FieldConstPtrArray fields(numFields); StringArray names(numFields); int next = 0; names[0] = "value"; fields[next++] = field; if(gotAlarm) { names[next] = "alarm"; fields[next++] = alarmField; } if(gotTimeStamp) { names[next] = "timeStamp"; fields[next++] = timeStampField; } if(gotDisplay) { names[next] = "display"; fields[next++] = displayField; } if(gotControl) { names[next] = "control"; fields[next++] = controlField; } if(gotValueAlarm) { names[next] = "valueAlarm"; fields[next++] = valueAlarm; } return fieldCreate->createStructure(id,names,fields); }