implemented is_compatible

This commit is contained in:
Marty Kraimer
2014-09-12 15:41:36 -04:00
parent ddee226a49
commit 7465da3217
7 changed files with 116 additions and 16 deletions

View File

@ -16,11 +16,10 @@ namespace epics { namespace nt {
static FieldCreatePtr fieldCreate = getFieldCreate();
static PVDataCreatePtr pvDataCreate = getPVDataCreate();
static NTFieldPtr ntField = NTField::get();
namespace detail {
static NTFieldPtr ntField = NTField::get();
NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::addValue(UnionConstPtr valuePtr)
{
value = true;
@ -222,6 +221,24 @@ bool NTMultiChannel::is_compatible(PVStructurePtr const &pvStructure)
{
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;
}

View File

@ -11,10 +11,10 @@ using namespace std;
using namespace epics::pvData;
namespace epics { namespace nt {
static NTFieldPtr ntField = NTField::get();
namespace detail {
static NTFieldPtr ntField = NTField::get();
NTNameValueBuilder::shared_pointer NTNameValueBuilder::value(
epics::pvData::ScalarType scalarType
@ -134,6 +134,12 @@ bool NTNameValue::is_compatible(PVStructurePtr const & pvStructure)
if(!pvNames) return false;
PVFieldPtr pvValues = pvStructure->getSubField("values");
if(!pvValues) 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;
return true;
}

View File

@ -14,6 +14,8 @@ using namespace epics::pvData;
namespace epics { namespace nt {
static NTFieldPtr ntField = NTField::get();
namespace detail {
const std::string ntAttrStr("uri:ev4:nt/2014/pwd:NTAttribute");
@ -212,6 +214,29 @@ bool NTNDArray::is_a(StructureConstPtr const & structure)
bool NTNDArray::is_compatible(PVStructurePtr const & pvStructure)
{
PVUnionPtr pvValue = pvStructure->getSubField<PVUnion>("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;
if(!pvStructure->getSubField<PVLong>("compressedSize")) return false;
if(!pvStructure->getSubField<PVLong>("uncompressedSize")) return false;
PVStructurePtr pvCodec = pvStructure->getSubField<PVStructure>("codec");
if(!pvCodec) return false;
if(!pvCodec->getSubField<PVString>("name")) return false;
if(!pvCodec->getSubField<PVUnion>("parameters")) return false;
PVStructureArrayPtr pvDimension = pvStructure->getSubField<PVStructureArray>("dimension");
if(pvDimension->getStructureArray()->getStructure()->getID().compare("dimension_t")!=0) return false;
if(!pvStructure->getSubField<PVInt>("uniqueId")) return false;
pvField = pvStructure->getSubField("dataTimeStamp");
if(pvField && !ntField->isTimeStamp(pvField->getField())) return false;
PVStructureArrayPtr pvAttribute = pvStructure->getSubField<PVStructureArray>("attribute");
if(!pvAttribute->getStructureArray()->getStructure()->getID().compare("ntAttrStr")!=0) return false;
return true;
}

View File

@ -12,6 +12,8 @@ using namespace epics::pvData;
namespace epics { namespace nt {
static NTFieldPtr ntField = NTField::get();
namespace detail {
static NTFieldPtr ntField = NTField::get();
@ -150,6 +152,16 @@ bool NTScalar::is_compatible(PVStructurePtr const & pvStructure)
{
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;
}

View File

@ -12,10 +12,10 @@ using namespace epics::pvData;
namespace epics { namespace nt {
namespace detail {
static NTFieldPtr ntField = NTField::get();
namespace detail {
NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::arrayValue(
epics::pvData::ScalarType elementType
)
@ -123,7 +123,6 @@ NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::add(string const & na
return shared_from_this();
}
}
const std::string NTScalarArray::URI("uri:ev4:nt/2014/pwd:NTScalarArray");
@ -150,6 +149,16 @@ bool NTScalarArray::is_compatible(PVStructurePtr const & pvStructure)
{
PVScalarArrayPtr pvValue = pvStructure->getSubField<PVScalarArray>("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;
}

View File

@ -14,10 +14,10 @@ using namespace epics::pvData;
namespace epics { namespace nt {
namespace detail {
static NTFieldPtr ntField = NTField::get();
namespace detail {
NTTableBuilder::shared_pointer NTTableBuilder::add(
std::string const & name, epics::pvData::ScalarType scalarType
)
@ -87,13 +87,13 @@ NTTableBuilder::shared_pointer NTTableBuilder::addTimeStamp()
PVStructurePtr NTTableBuilder::createPVStructure()
{
PVStringArray::svector l;
l.resize(labels.size());
std::copy(labels.begin(), labels.end(), l.begin());
PVStructurePtr s = getPVDataCreate()->createPVStructure(createStructure());
s->getSubField<PVStringArray>("labels")->replace(freeze(l));
StringArray const & fieldNames =
s->getSubField<PVStructure>("value")->getStructure()->getFieldNames();
size_t len = fieldNames.size();
shared_vector<string> names(len);
for(size_t i=0; i<len; ++i) names[i] = fieldNames[i];
s->getSubField<PVStringArray>("labels")->replace(freeze(names));
return s;
}
@ -147,6 +147,17 @@ bool NTTable::is_a(StructureConstPtr const & structure)
bool NTTable::is_compatible(PVStructurePtr const & pvStructure)
{
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");
const shared_vector<const string> column(pvLabel->view());
size_t len = column.size();
for(size_t i=0; i<len; ++i) {
string value = "value." + column[i];
if(!pvStructure->getSubField<PVScalarArray>(value)) return false;
}
return true;
}

View File

@ -51,6 +51,25 @@ void test_builder()
}
void test_all()
{
testDiag("test_builder");
NTNDArrayBuilderPtr builder = NTNDArray::createBuilder();
testOk(builder.get() != 0, "Got builder");
PVStructurePtr pvStructure = builder->
addDescriptor()->
addTimeStamp()->
addAlarm()->
addDisplay()->
add("extra1",fieldCreate->createScalar(pvString)) ->
add("extra2",fieldCreate->createScalarArray(pvString)) ->
createPVStructure();
std::cout << *pvStructure << std::endl;
testOk1(NTNDArray::is_compatible(pvStructure)==true);
}
void test_narrow()
{
@ -75,8 +94,8 @@ void test_narrow()
testOk1(pvStructure.get() != 0);
if (!pvStructure)
return;
testOk1(NTNDArray::is_compatible(pvStructure)==true);
NTNDArrayPtr ptr = NTNDArray::narrow(pvStructure);
testOk(ptr.get() != 0, "narrow OK");
@ -85,8 +104,9 @@ void test_narrow()
}
MAIN(testNTNDArray) {
testPlan(23);
testPlan(25);
test_builder();
test_all();
test_narrow();
return testDone();
}