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; }
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; }
bool NTMultiChannel::isCompatible(PVStructurePtr const &pvStructure) { if(!pvStructure) return false; PVUnionArrayPtr pvValue = pvStructure->getSubField<PVUnionArray>("value"); if(!pvValue) return false; PVFieldPtr pvField = pvStructure->getSubField("descriptor"); if(pvField && !pvStructure->getSubField<PVString>("descriptor")) return false; pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; pvField = pvStructure->getSubField("severity"); if(pvField && !pvStructure->getSubField<PVIntArray>("severity")) return false; pvField = pvStructure->getSubField("status"); if(pvField && !pvStructure->getSubField<PVIntArray>("status")) return false; pvField = pvStructure->getSubField("message"); if(pvField && !pvStructure->getSubField<PVStringArray>("message")) return false; pvField = pvStructure->getSubField("secondsPastEpoch"); if(pvField && !pvStructure->getSubField<PVLongArray>("secondsPastEpoch")) return false; pvField = pvStructure->getSubField("nanoseconds"); if(pvField && !pvStructure->getSubField<PVIntArray>("nanoseconds")) return false; pvField = pvStructure->getSubField("userTag"); if(pvField && !pvStructure->getSubField<PVIntArray>("userTag")) return false; return true; }
StructureConstPtr NTScalarBuilder::createStructure() { if (!valueTypeSet) throw std::runtime_error("value type not set"); FieldBuilderPtr builder = getFieldCreate()->createFieldBuilder()-> setId(NTScalar::URI)-> add("value", valueType); if (descriptor) builder->add("descriptor", pvString); if (alarm) builder->add("alarm", ntField->createAlarm()); if (timeStamp) builder->add("timeStamp", ntField->createTimeStamp()); if (display) builder->add("display", ntField->createDisplay()); if (control) builder->add("control", ntField->createControl()); size_t extraCount = extraFieldNames.size(); for (size_t i = 0; i< extraCount; i++) builder->add(extraFieldNames[i], extraFields[i]); StructureConstPtr s = builder->createStructure(); reset(); return s; }
bool NTTable::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; PVFieldPtr pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; PVStringArrayPtr pvLabel = pvStructure->getSubField<PVStringArray>("labels"); if(!pvLabel) return false; return true; }
void test_builder() { testDiag("test_builder"); NTEnumBuilderPtr builder = NTEnum::createBuilder(); testOk(builder.get() != 0, "Got builder"); StructureConstPtr structure = builder-> addDescriptor()-> addAlarm()-> addTimeStamp()-> add("valueAlarm",standardField->doubleAlarm()) -> add("extra",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) return; testOk1(NTEnum::is_a(structure)); testOk1(structure->getID() == NTEnum::URI); testOk1(structure->getNumberFields() == 6); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); testOk1(structure->getField("timeStamp").get() != 0); FieldConstPtr valueField = structure->getField("value"); testOk(valueField.get() != 0 && ntField->isEnumerated(valueField), "value is enum"); std::cout << *structure << std::endl; }
bool NTScalar::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; PVScalarPtr pvValue = pvStructure->getSubField<PVScalar>("value"); if(!pvValue) return false; PVFieldPtr pvField = pvStructure->getSubField("descriptor"); if(pvField && !pvStructure->getSubField<PVString>("descriptor")) return false; pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; pvField = pvStructure->getSubField("display"); if(pvField && !ntField->isDisplay(pvField->getField())) return false; pvField = pvStructure->getSubField("control"); if(pvField && !ntField->isControl(pvField->getField())) return false; return true; }
void testPVNTField() { testDiag("testPVNTField"); StringArray choices; choices.resize(3); choices[0] = "one"; choices[1] = "two"; choices[2] = "three"; PVStructurePtr pvStructure = PVStructurePtr( pvntField->createEnumerated(choices)); cout << *pvStructure << endl; testOk1(ntField->isEnumerated(pvStructure->getStructure())); pvStructure = PVStructurePtr(pvntField->createTimeStamp()); cout << *pvStructure << endl; testOk1(ntField->isTimeStamp(pvStructure->getStructure())); pvStructure = PVStructurePtr(pvntField->createAlarm()); cout << *pvStructure << endl; testOk1(ntField->isAlarm(pvStructure->getStructure())); pvStructure = PVStructurePtr(pvntField->createDisplay()); cout << *pvStructure << endl; testOk1(ntField->isDisplay(pvStructure->getStructure())); pvStructure = PVStructurePtr(pvDataCreate->createPVStructure(standardField->doubleAlarm())); cout << *pvStructure << endl; testOk1(ntField->isAlarmLimit(pvStructure->getStructure())); PVStructureArrayPtr pvStructureArray = PVStructureArrayPtr( pvntField->createEnumeratedArray()); cout << *pvStructure << endl; cout << *pvStructureArray->getStructureArray()->getStructure(); pvStructureArray = PVStructureArrayPtr( pvntField->createTimeStampArray()); cout << *pvStructure << endl; cout << *pvStructureArray->getStructureArray()->getStructure(); pvStructureArray = PVStructureArrayPtr( pvntField->createAlarmArray()); cout << *pvStructure << endl; cout << *pvStructureArray->getStructureArray()->getStructure(); }
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; }
bool NTScalar::isCompatible(StructureConstPtr const &structure) { if (structure.get() == 0) return false; ScalarConstPtr valueField = structure->getField<Scalar>("value"); if (valueField.get() == 0) return false; FieldConstPtr 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; field = structure->getField("control"); if (field.get() && !ntField->isControl(field)) return false; return true; }
namespace detail { static NTFieldPtr ntField = NTField::get(); NTScalarBuilder::shared_pointer NTScalarBuilder::value( epics::pvData::ScalarType scalarType ) { valueType = scalarType; valueTypeSet = true; return shared_from_this(); } StructureConstPtr NTScalarBuilder::createStructure() { if (!valueTypeSet) throw std::runtime_error("value type not set"); FieldBuilderPtr builder = getFieldCreate()->createFieldBuilder()-> setId(NTScalar::URI)-> add("value", valueType); if (descriptor) builder->add("descriptor", pvString); if (alarm) builder->add("alarm", ntField->createAlarm()); if (timeStamp) builder->add("timeStamp", ntField->createTimeStamp()); if (display) builder->add("display", ntField->createDisplay()); if (control) builder->add("control", ntField->createControl()); size_t extraCount = extraFieldNames.size(); for (size_t i = 0; i< extraCount; i++) builder->add(extraFieldNames[i], extraFields[i]); StructureConstPtr s = builder->createStructure(); reset(); return s; } NTScalarBuilder::shared_pointer NTScalarBuilder::addDescriptor() { descriptor = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addAlarm() { alarm = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addTimeStamp() { timeStamp = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addDisplay() { display = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addControl() { control = true; return shared_from_this(); } PVStructurePtr NTScalarBuilder::createPVStructure() { return getPVDataCreate()->createPVStructure(createStructure()); } NTScalarPtr NTScalarBuilder::create() { return NTScalarPtr(new NTScalar(createPVStructure())); } NTScalarBuilder::NTScalarBuilder() { reset(); } void NTScalarBuilder::reset() { valueTypeSet = false; descriptor = false; alarm = false; timeStamp = false; display = false; control = false; } NTScalarBuilder::shared_pointer NTScalarBuilder::add(string const & name, FieldConstPtr const & field) { extraFields.push_back(field); extraFieldNames.push_back(name); return shared_from_this(); } }
namespace epics { namespace nt { static NTFieldPtr ntField = NTField::get(); namespace detail { NTTableBuilder::shared_pointer NTTableBuilder::add( std::string const & name, epics::pvData::ScalarType scalarType ) { if (std::find(labels.begin(), labels.end(), name) != labels.end()) throw std::runtime_error("duplicate column name"); labels.push_back(name); types.push_back(scalarType); return shared_from_this(); } StructureConstPtr NTTableBuilder::createStructure() { FieldBuilderPtr builder = getFieldCreate()->createFieldBuilder(); FieldBuilderPtr nestedBuilder = builder-> setId(NTTable::URI)-> addArray("labels", pvString)-> addNestedStructure("value"); vector<string>::size_type len = labels.size(); for (vector<string>::size_type i = 0; i < len; i++) nestedBuilder->addArray(labels[i], types[i]); builder = nestedBuilder->endNested(); if (descriptor) builder->add("descriptor", pvString); if (alarm) builder->add("alarm", ntField->createAlarm()); if (timeStamp) builder->add("timeStamp", ntField->createTimeStamp()); StructureConstPtr s = builder->createStructure(); size_t extraCount = extraFieldNames.size(); for (size_t i = 0; i< extraCount; i++) builder->add(extraFieldNames[i], extraFields[i]); reset(); return s; } NTTableBuilder::shared_pointer NTTableBuilder::addDescriptor() { descriptor = true; return shared_from_this(); } NTTableBuilder::shared_pointer NTTableBuilder::addAlarm() { alarm = true; return shared_from_this(); } NTTableBuilder::shared_pointer NTTableBuilder::addTimeStamp() { timeStamp = true; return shared_from_this(); } PVStructurePtr NTTableBuilder::createPVStructure() { size_t len = labels.size(); shared_vector<string> l(len); for(size_t i=0; i<len; ++i) l[i] = labels[i]; PVStructurePtr s = getPVDataCreate()->createPVStructure(createStructure()); s->getSubField<PVStringArray>("labels")->replace(freeze(l)); return s; } NTTablePtr NTTableBuilder::create() { return NTTablePtr(new NTTable(createPVStructure())); } NTTableBuilder::NTTableBuilder() { reset(); } void NTTableBuilder::reset() { labels.clear(); types.clear(); descriptor = false; alarm = false; timeStamp = false; } NTTableBuilder::shared_pointer NTTableBuilder::add(string const & name, FieldConstPtr const & field) { extraFields.push_back(field); extraFieldNames.push_back(name); return shared_from_this(); } } const std::string NTTable::URI("epics:nt/NTTable:1.0"); NTTable::shared_pointer NTTable::wrap(PVStructurePtr const & structure) { if(!isCompatible(structure)) return shared_pointer(); return wrapUnsafe(structure); } NTTable::shared_pointer NTTable::wrapUnsafe(PVStructurePtr const & structure) { return shared_pointer(new NTTable(structure)); } bool NTTable::is_a(StructureConstPtr const & structure) { return NTUtils::is_a(structure->getID(), URI); } bool NTTable::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; PVFieldPtr pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; PVStringArrayPtr pvLabel = pvStructure->getSubField<PVStringArray>("labels"); if(!pvLabel) return false; return true; } NTTableBuilderPtr NTTable::createBuilder() { return NTTableBuilderPtr(new detail::NTTableBuilder()); } bool NTTable::attachTimeStamp(PVTimeStamp &pvTimeStamp) const { PVStructurePtr ts = getTimeStamp(); if (ts) return pvTimeStamp.attach(ts); else return false; } bool NTTable::attachAlarm(PVAlarm &pvAlarm) const { PVStructurePtr al = getAlarm(); if (al) return pvAlarm.attach(al); else return false; } PVStructurePtr NTTable::getPVStructure() const { return pvNTTable; } PVStringPtr NTTable::getDescriptor() const { return pvNTTable->getSubField<PVString>("descriptor"); } PVStructurePtr NTTable::getTimeStamp() const { return pvNTTable->getSubField<PVStructure>("timeStamp"); } PVStructurePtr NTTable::getAlarm() const { return pvNTTable->getSubField<PVStructure>("alarm"); } PVStringArrayPtr NTTable::getLabels() const { return pvNTTable->getSubField<PVStringArray>("labels"); } PVFieldPtr NTTable::getColumn(std::string const & columnName) const { return pvNTTable->getSubField("value." + columnName); } NTTable::NTTable(PVStructurePtr const & pvStructure) : pvNTTable(pvStructure) {} }}
void testNTField() { testDiag("testNTField"); StructureConstPtr structureConstPtr = ntField->createEnumerated(); cout << *structureConstPtr << endl; testOk1(ntField->isEnumerated(structureConstPtr)); structureConstPtr = ntField->createTimeStamp(); cout << *structureConstPtr << endl; testOk1(ntField->isTimeStamp(structureConstPtr)); structureConstPtr = ntField->createAlarm(); cout << *structureConstPtr << endl; testOk1(ntField->isAlarm(structureConstPtr)); structureConstPtr = ntField->createDisplay(); cout << *structureConstPtr << endl; testOk1(ntField->isDisplay(structureConstPtr)); structureConstPtr = standardField->doubleAlarm(); cout << *structureConstPtr << endl; testOk1(ntField->isAlarmLimit(structureConstPtr)); structureConstPtr = ntField->createControl(); cout << *structureConstPtr << endl; testOk1(ntField->isControl(structureConstPtr)); StructureArrayConstPtr structureArrayConstPtr = ntField->createEnumeratedArray(); cout << *structureConstPtr << endl; structureArrayConstPtr = ntField->createTimeStampArray(); cout << *structureConstPtr << endl; structureArrayConstPtr = ntField->createAlarmArray(); cout << *structureConstPtr << endl; }
namespace epics { namespace nt { static NTFieldPtr ntField = NTField::get(); namespace detail { static NTFieldPtr ntField = NTField::get(); NTScalarBuilder::shared_pointer NTScalarBuilder::value( epics::pvData::ScalarType scalarType ) { valueType = scalarType; valueTypeSet = true; return shared_from_this(); } StructureConstPtr NTScalarBuilder::createStructure() { if (!valueTypeSet) throw std::runtime_error("value type not set"); FieldBuilderPtr builder = getFieldCreate()->createFieldBuilder()-> setId(NTScalar::URI)-> add("value", valueType); if (descriptor) builder->add("descriptor", pvString); if (alarm) builder->add("alarm", ntField->createAlarm()); if (timeStamp) builder->add("timeStamp", ntField->createTimeStamp()); if (display) builder->add("display", ntField->createDisplay()); if (control) builder->add("control", ntField->createControl()); size_t extraCount = extraFieldNames.size(); for (size_t i = 0; i< extraCount; i++) builder->add(extraFieldNames[i], extraFields[i]); StructureConstPtr s = builder->createStructure(); reset(); return s; } NTScalarBuilder::shared_pointer NTScalarBuilder::addDescriptor() { descriptor = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addAlarm() { alarm = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addTimeStamp() { timeStamp = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addDisplay() { display = true; return shared_from_this(); } NTScalarBuilder::shared_pointer NTScalarBuilder::addControl() { control = true; return shared_from_this(); } PVStructurePtr NTScalarBuilder::createPVStructure() { return getPVDataCreate()->createPVStructure(createStructure()); } NTScalarPtr NTScalarBuilder::create() { return NTScalarPtr(new NTScalar(createPVStructure())); } NTScalarBuilder::NTScalarBuilder() { reset(); } void NTScalarBuilder::reset() { valueTypeSet = false; descriptor = false; alarm = false; timeStamp = false; display = false; control = false; } NTScalarBuilder::shared_pointer NTScalarBuilder::add(string const & name, FieldConstPtr const & field) { extraFields.push_back(field); extraFieldNames.push_back(name); return shared_from_this(); } } const std::string NTScalar::URI("epics:nt/NTScalar:1.0"); NTScalar::shared_pointer NTScalar::wrap(PVStructurePtr const & structure) { if(!isCompatible(structure)) return shared_pointer(); return wrapUnsafe(structure); } NTScalar::shared_pointer NTScalar::wrapUnsafe(PVStructurePtr const & structure) { return shared_pointer(new NTScalar(structure)); } bool NTScalar::is_a(StructureConstPtr const & structure) { return NTUtils::is_a(structure->getID(), URI); } bool NTScalar::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure) return false; PVScalarPtr pvValue = pvStructure->getSubField<PVScalar>("value"); if(!pvValue) return false; PVFieldPtr pvField = pvStructure->getSubField("descriptor"); if(pvField && !pvStructure->getSubField<PVString>("descriptor")) return false; pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; pvField = pvStructure->getSubField("display"); if(pvField && !ntField->isDisplay(pvField->getField())) return false; pvField = pvStructure->getSubField("control"); if(pvField && !ntField->isControl(pvField->getField())) return false; return true; } NTScalarBuilderPtr NTScalar::createBuilder() { return NTScalarBuilderPtr(new detail::NTScalarBuilder()); } bool NTScalar::attachTimeStamp(PVTimeStamp &pvTimeStamp) const { PVStructurePtr ts = getTimeStamp(); if (ts) return pvTimeStamp.attach(ts); else return false; } bool NTScalar::attachAlarm(PVAlarm &pvAlarm) const { PVStructurePtr al = getAlarm(); if (al) return pvAlarm.attach(al); else return false; } bool NTScalar::attachDisplay(PVDisplay &pvDisplay) const { PVStructurePtr dp = getDisplay(); if (dp) return pvDisplay.attach(dp); else return false; } bool NTScalar::attachControl(PVControl &pvControl) const { PVStructurePtr ctrl = getControl(); if (ctrl) return pvControl.attach(ctrl); else return false; } PVStructurePtr NTScalar::getPVStructure() const { return pvNTScalar; } PVStringPtr NTScalar::getDescriptor() const { return pvNTScalar->getSubField<PVString>("descriptor"); } PVStructurePtr NTScalar::getTimeStamp() const { return pvNTScalar->getSubField<PVStructure>("timeStamp"); } PVStructurePtr NTScalar::getAlarm() const { return pvNTScalar->getSubField<PVStructure>("alarm"); } PVStructurePtr NTScalar::getDisplay() const { return pvNTScalar->getSubField<PVStructure>("display"); } PVStructurePtr NTScalar::getControl() const { return pvNTScalar->getSubField<PVStructure>("control"); } PVFieldPtr NTScalar::getValue() const { return pvValue; } NTScalar::NTScalar(PVStructurePtr const & pvStructure) : pvNTScalar(pvStructure), pvValue(pvNTScalar->getSubField("value")) {} }}
namespace epics { namespace nt { static NTFieldPtr ntField = NTField::get(); namespace detail { NTHistogramBuilder::shared_pointer NTHistogramBuilder::value( epics::pvData::ScalarType scalarType ) { valueType = scalarType; valueTypeSet = true; return shared_from_this(); } StructureConstPtr NTHistogramBuilder::createStructure() { if (!valueTypeSet) throw std::runtime_error("value array element type not set"); FieldBuilderPtr builder = getFieldCreate()->createFieldBuilder()-> setId(NTHistogram::URI)-> addArray("ranges", pvDouble)-> addArray("value", valueType); if (descriptor) builder->add("descriptor", pvString); if (alarm) builder->add("alarm", ntField->createAlarm()); if (timeStamp) builder->add("timeStamp", ntField->createTimeStamp()); size_t extraCount = extraFieldNames.size(); for (size_t i = 0; i< extraCount; i++) builder->add(extraFieldNames[i], extraFields[i]); StructureConstPtr s = builder->createStructure(); reset(); return s; } NTHistogramBuilder::shared_pointer NTHistogramBuilder::addDescriptor() { descriptor = true; return shared_from_this(); } NTHistogramBuilder::shared_pointer NTHistogramBuilder::addAlarm() { alarm = true; return shared_from_this(); } NTHistogramBuilder::shared_pointer NTHistogramBuilder::addTimeStamp() { timeStamp = true; return shared_from_this(); } PVStructurePtr NTHistogramBuilder::createPVStructure() { return getPVDataCreate()->createPVStructure(createStructure()); } NTHistogramPtr NTHistogramBuilder::create() { return NTHistogramPtr(new NTHistogram(createPVStructure())); } NTHistogramBuilder::NTHistogramBuilder() { reset(); } void NTHistogramBuilder::reset() { valueTypeSet = false; descriptor = false; alarm = false; timeStamp = false; extraFieldNames.clear(); extraFields.clear(); } NTHistogramBuilder::shared_pointer NTHistogramBuilder::add(string const & name, FieldConstPtr const & field) { extraFields.push_back(field); extraFieldNames.push_back(name); return shared_from_this(); } } const std::string NTHistogram::URI("epics:nt/NTHistogram:1.0"); NTHistogram::shared_pointer NTHistogram::wrap(PVStructurePtr const & pvStructure) { if(!isCompatible(pvStructure)) return shared_pointer(); return wrapUnsafe(pvStructure); } NTHistogram::shared_pointer NTHistogram::wrapUnsafe(PVStructurePtr const & pvStructure) { return shared_pointer(new NTHistogram(pvStructure)); } bool NTHistogram::is_a(StructureConstPtr const & structure) { return NTUtils::is_a(structure->getID(), URI); } 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; } bool NTHistogram::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure.get()) return false; return isCompatible(pvStructure->getStructure()); } bool NTHistogram::isValid() { return (getValue()->getLength()+1 == getRanges()->getLength()); } NTHistogramBuilderPtr NTHistogram::createBuilder() { return NTHistogramBuilderPtr(new detail::NTHistogramBuilder()); } bool NTHistogram::attachTimeStamp(PVTimeStamp &pvTimeStamp) const { PVStructurePtr ts = getTimeStamp(); if (ts) return pvTimeStamp.attach(ts); else return false; } bool NTHistogram::attachAlarm(PVAlarm &pvAlarm) const { PVStructurePtr al = getAlarm(); if (al) return pvAlarm.attach(al); else return false; } PVStructurePtr NTHistogram::getPVStructure() const { return pvNTHistogram; } PVStringPtr NTHistogram::getDescriptor() const { return pvNTHistogram->getSubField<PVString>("descriptor"); } PVStructurePtr NTHistogram::getTimeStamp() const { return pvNTHistogram->getSubField<PVStructure>("timeStamp"); } PVStructurePtr NTHistogram::getAlarm() const { return pvNTHistogram->getSubField<PVStructure>("alarm"); } PVDoubleArrayPtr NTHistogram::getRanges() const { return pvNTHistogram->getSubField<PVDoubleArray>("ranges"); } PVScalarArrayPtr NTHistogram::getValue() const { return pvValue; } NTHistogram::NTHistogram(PVStructurePtr const & pvStructure) : pvNTHistogram(pvStructure), pvValue(pvNTHistogram->getSubField<PVScalarArray>("value")) {} }}
bool NTNDArray::isCompatible(StructureConstPtr const &structure) { if(!structure.get()) return false; UnionConstPtr valueField = structure->getField<Union>("value"); if(!NTValueType::isCompatible(valueField)) return false; StructureConstPtr codecField = structure->getField<Structure>("codec"); if(!NTCodec::isCompatible(codecField)) return false; ScalarConstPtr compressedSizeField = structure->getField<Scalar>("compressedSize"); if (compressedSizeField.get() == 0) return false; if (compressedSizeField->getScalarType() != pvLong) return false; ScalarConstPtr uncompressedSizeField = structure->getField<Scalar>("uncompressedSize"); if (uncompressedSizeField.get() == 0) return false; if (uncompressedSizeField->getScalarType() != pvLong) return false; StructureArrayConstPtr dimensionField = structure->getField<StructureArray>("dimension"); if (dimensionField.get() == 0) return false; StructureConstPtr dimElementStruc = dimensionField->getStructure(); if(!NTDimension::isCompatible(dimElementStruc)) return false; NTFieldPtr ntField = NTField::get(); StructureConstPtr dataTimeStampField = structure->getField<Structure>( "dataTimeStamp"); if (dataTimeStampField.get() == 0 || !ntField->isTimeStamp(dataTimeStampField)) return false; ScalarConstPtr uniqueIdField = structure->getField<Scalar>("uniqueId"); if (uniqueIdField.get() == 0) return false; if (uniqueIdField->getScalarType() != pvInt) return false; StructureArrayConstPtr attributeField = structure->getField<StructureArray>( "attribute"); StructureConstPtr attributeElementStruc = attributeField->getStructure(); if (!NTNDArrayAttribute::isCompatible(attributeElementStruc)) return false; FieldConstPtr field = structure->getField("descriptor"); if (field.get()) { 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; field = structure->getField("display"); if (field.get() && !ntField->isDisplay(field)) return false; return true; }
namespace epics { namespace nt { static FieldCreatePtr fieldCreate = getFieldCreate(); static PVDataCreatePtr pvDataCreate = getPVDataCreate(); static NTFieldPtr ntField = NTField::get(); namespace detail { NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::value(UnionConstPtr valuePtr) { valueType = valuePtr; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addDescriptor() { descriptor = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addAlarm() { alarm = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addTimeStamp() { timeStamp = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addSeverity() { severity = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addStatus() { status = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addMessage() { message = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addSecondsPastEpoch() { secondsPastEpoch = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addNanoseconds() { nanoseconds = true; return shared_from_this(); } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addUserTag() { userTag = true; return shared_from_this(); } StructureConstPtr NTMultiChannelBuilder::createStructure() { StandardFieldPtr standardField = getStandardField(); size_t nfields = 3; size_t extraCount = extraFieldNames.size(); nfields += extraCount; if(descriptor) ++nfields; if(alarm) ++nfields; if(timeStamp) ++nfields; if(severity) ++nfields; if(status) ++nfields; if(message) ++nfields; if(secondsPastEpoch) ++nfields; if(nanoseconds) ++nfields; if(userTag) ++nfields; FieldConstPtrArray fields(nfields); StringArray names(nfields); size_t ind = 0; names[ind] = "value"; if(valueType) { fields[ind++] = fieldCreate->createUnionArray(valueType); } else { fields[ind++] = fieldCreate->createVariantUnionArray(); } names[ind] = "channelName"; fields[ind++] = fieldCreate->createScalarArray(pvString); names[ind] = "isConnected"; fields[ind++] = fieldCreate->createScalarArray(pvBoolean); if(timeStamp) { names[ind] = "timeStamp"; fields[ind++] = standardField->timeStamp(); } if(alarm) { names[ind] = "alarm"; fields[ind++] = standardField->alarm(); } if(descriptor) { names[ind] = "descriptor"; fields[ind++] = fieldCreate->createScalar(pvString); } if(severity) { names[ind] = "severity"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } if(status) { names[ind] = "status"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } if(message) { names[ind] = "message"; fields[ind++] = fieldCreate->createScalarArray(pvString); } if(secondsPastEpoch) { names[ind] = "secondsPastEpoch"; fields[ind++] = fieldCreate->createScalarArray(pvLong); } if(nanoseconds) { names[ind] = "nanoseconds"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } if(userTag) { names[ind] = "userTag"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } for (size_t i = 0; i< extraCount; i++) { names[ind] = extraFieldNames[i]; fields[ind++] = extraFields[i]; } StructureConstPtr st = fieldCreate->createStructure(NTMultiChannel::URI,names,fields); reset(); return st; } PVStructurePtr NTMultiChannelBuilder::createPVStructure() { return pvDataCreate->createPVStructure(createStructure()); } NTMultiChannelPtr NTMultiChannelBuilder::create() { return NTMultiChannelPtr(new NTMultiChannel(createPVStructure())); } NTMultiChannelBuilder::NTMultiChannelBuilder() { reset(); } void NTMultiChannelBuilder::reset() { valueType.reset(); extraFieldNames.clear(); extraFields.clear(); descriptor = false; alarm = false; timeStamp = false; severity = false; status = false; message = false; secondsPastEpoch = false; nanoseconds = false; userTag = false; } NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::add(string const & name, FieldConstPtr const & field) { extraFields.push_back(field); extraFieldNames.push_back(name); return shared_from_this(); } } const std::string NTMultiChannel::URI("epics:nt/NTMultiChannel:1.0"); NTMultiChannel::shared_pointer NTMultiChannel::wrap(PVStructurePtr const & structure) { if(!isCompatible(structure)) return shared_pointer(); return wrapUnsafe(structure); } NTMultiChannel::shared_pointer NTMultiChannel::wrapUnsafe(PVStructurePtr const & structure) { return shared_pointer(new NTMultiChannel(structure)); } bool NTMultiChannel::is_a(StructureConstPtr const &structure) { return NTUtils::is_a(structure->getID(), URI); } bool NTMultiChannel::isCompatible(PVStructurePtr const &pvStructure) { if(!pvStructure) return false; PVUnionArrayPtr pvValue = pvStructure->getSubField<PVUnionArray>("value"); if(!pvValue) return false; PVFieldPtr pvField = pvStructure->getSubField("descriptor"); if(pvField && !pvStructure->getSubField<PVString>("descriptor")) return false; pvField = pvStructure->getSubField("alarm"); if(pvField && !ntField->isAlarm(pvField->getField())) return false; pvField = pvStructure->getSubField("timeStamp"); if(pvField && !ntField->isTimeStamp(pvField->getField())) return false; pvField = pvStructure->getSubField("severity"); if(pvField && !pvStructure->getSubField<PVIntArray>("severity")) return false; pvField = pvStructure->getSubField("status"); if(pvField && !pvStructure->getSubField<PVIntArray>("status")) return false; pvField = pvStructure->getSubField("message"); if(pvField && !pvStructure->getSubField<PVStringArray>("message")) return false; pvField = pvStructure->getSubField("secondsPastEpoch"); if(pvField && !pvStructure->getSubField<PVLongArray>("secondsPastEpoch")) return false; pvField = pvStructure->getSubField("nanoseconds"); if(pvField && !pvStructure->getSubField<PVIntArray>("nanoseconds")) return false; pvField = pvStructure->getSubField("userTag"); if(pvField && !pvStructure->getSubField<PVIntArray>("userTag")) return false; return true; } NTMultiChannelBuilderPtr NTMultiChannel::createBuilder() { return NTMultiChannelBuilderPtr(new detail::NTMultiChannelBuilder()); } NTMultiChannel::NTMultiChannel(PVStructurePtr const & pvStructure) : pvNTMultiChannel(pvStructure), pvTimeStamp(pvStructure->getSubField<PVStructure>("timeStamp")), pvAlarm(pvStructure->getSubField<PVStructure>("alarm")), pvValue(pvStructure->getSubField<PVUnionArray>("value")), pvChannelName(pvStructure->getSubField<PVStringArray>("channelName")), pvIsConnected(pvStructure->getSubField<PVBooleanArray>("isConnected")), pvSeverity(pvStructure->getSubField<PVIntArray>("severity")), pvStatus(pvStructure->getSubField<PVIntArray>("status")), pvMessage(pvStructure->getSubField<PVStringArray>("message")), pvSecondsPastEpoch(pvStructure->getSubField<PVLongArray>("secondsPastEpoch")), pvNanoseconds(pvStructure->getSubField<PVIntArray>("nanoseconds")), pvUserTag(pvStructure->getSubField<PVIntArray>("userTag")), pvDescriptor(pvStructure->getSubField<PVString>("descriptor")) { } void NTMultiChannel::attachTimeStamp(PVTimeStamp &pv) const { if(!pvTimeStamp) return; pv.attach(pvTimeStamp); } void NTMultiChannel::attachAlarm(PVAlarm &pv) const { if(!pvAlarm) return; pv.attach(pvAlarm); } }}