builds and tests work. must still look carefully

This commit is contained in:
Marty Kraimer
2012-08-02 09:47:19 -04:00
parent 42c6c2dc38
commit 0f251f5eb1
8 changed files with 213 additions and 284 deletions

View File

@@ -150,7 +150,7 @@ bool NTField::isAlarmLimit(FieldConstPtr const & field)
if(names[0].compare("active")!=0) return false;
if(f->getType()!=scalar) return false;
ScalarConstPtr s = static_pointer_cast<const Scalar>(f);
if(s->getScalarType()!=pvDouble) return false;
if(s->getScalarType()!=pvBoolean) return false;
f = fields[1];
if(names[1].compare("lowAlarmLimit")!=0) return false;
if(f->getType()!=scalar) return false;

View File

@@ -11,15 +11,14 @@ namespace epics { namespace pvData {
using std::tr1::static_pointer_cast;
bool NTNameValue::isNTNameValue(PVStructurePtr pvStructure)
bool NTNameValue::isNTNameValue(PVStructurePtr const & pvStructure)
{
String name = pvStructure->getField()->getFieldName();
if(name.compare("NTNameValue")!=0) return false;
PVFieldPtr pvField = pvStructure->getSubField("names");
if(pvField==0) return false;
if(pvField.get()==NULL) return false;
FieldConstPtr field = pvField->getField();
if(field->getType()!=scalarArray) return false;
ScalarArrayConstPtr pscalarArray = static_pointer_cast<const ScalarArray>(field);
ScalarArrayConstPtr pscalarArray =
static_pointer_cast<const ScalarArray>(field);
if(pscalarArray->getElementType()!=pvString) return false;
pvField = pvStructure->getSubField("values");
if(pvField==0) return false;
@@ -30,100 +29,76 @@ bool NTNameValue::isNTNameValue(PVStructurePtr pvStructure)
return true;
}
PVStructure::shared_pointer NTNameValue::create(
NTNameValuePtr NTNameValue::create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm)
{
StandardField *standardField = getStandardField();
int nfields = 2;
StandardFieldPtr standardField = getStandardField();
size_t nfields = 2;
if(hasFunction) nfields++;
if(hasTimeStamp) nfields++;
if(hasAlarm) nfields++;
FieldCreate *fieldCreate = getFieldCreate();
PVDataCreate *pvDataCreate = getPVDataCreate();
FieldConstPtrArray fields = new FieldConstPtr[nfields];
fields[0] = fieldCreate->createScalarArray("names",pvString);
fields[1] = fieldCreate->createScalarArray("values",pvString);
FieldCreatePtr fieldCreate = getFieldCreate();
PVDataCreatePtr pvDataCreate = getPVDataCreate();
FieldConstPtrArray fields;
StringArray names;
fields.resize(nfields);
names.resize(nfields);
names[0] = "names";
fields[0] = fieldCreate->createScalarArray(pvString);
names[1] = "values";
fields[1] = fieldCreate->createScalarArray(pvString);
int ind = 2;
if(hasFunction) {
fields[ind++] = fieldCreate->createScalar(String("function"),pvString);
names[ind] = "function";
fields[ind++] = fieldCreate->createScalar(pvString);
}
if(hasTimeStamp) {
names[ind] = "timeStamp";
fields[ind++] = standardField->timeStamp();
}
if(hasAlarm) {
names[ind] = "alarm";
fields[ind++] = standardField->alarm();
}
return PVStructure::shared_pointer(
pvDataCreate->createPVStructure(0,"NTNameValue",ind,fields));
StructureConstPtr st = fieldCreate->createStructure(names,fields);
PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st);
return NTNameValuePtr(new NTNameValue(pvStructure));
}
NTNameValue::NTNameValue(PVStructure::shared_pointer const & pvStructure)
: pvNTNameValue(pvStructure),
pvFunction(0),
pvTimeStamp(0),
pvAlarm(0),
pvNames(0),
pvValues(0)
: pvNTNameValue(pvStructure)
{
NTField *ntfield = NTField::get();
String name = pvStructure->getField()->getFieldName();
if(name.compare("NTNameValue")!=0) {
throw std::invalid_argument(
"pvArgument does not have name NTNameValue");
}
PVArray * pvArray = pvStructure->getScalarArrayField("names",pvString);
if(pvArray==0) {
throw std::invalid_argument(
"pvArgument does not have a string array field names");
}
pvNames = static_cast<PVStringArray *>(pvArray);
NTFieldPtr ntfield = NTField::get();
PVScalarArrayPtr pvArray =
pvStructure->getScalarArrayField("names",pvString);
pvNames = static_pointer_cast<PVStringArray>(pvArray);
pvArray = pvStructure->getScalarArrayField("values",pvString);
if(pvArray==0) {
throw std::invalid_argument(
"pvArgument does not have a string array field values");
}
pvValues = static_cast<PVStringArray *>(pvArray);
pvValues = static_pointer_cast<PVStringArray>(pvArray);
PVFieldPtr pvField = pvStructure->getSubField("function");
if(pvField!=0) {
if(pvField.get()!=NULL) {
pvFunction = pvStructure->getStringField("function");
}
pvField = pvStructure->getSubField("timeStamp");
if(pvField!=0 && ntfield->isTimeStamp(pvField->getField())) {
pvTimeStamp = static_cast<PVStructure *>(pvField);
if(pvField.get()!=NULL && ntfield->isTimeStamp(pvField->getField())) {
pvTimeStamp = static_pointer_cast<PVStructure>(pvField);
}
pvField = pvStructure->getSubField("alarm");
if(pvField!=0 && ntfield->isAlarm(pvField->getField())) {
pvAlarm = static_cast<PVStructure *>(pvField);
if(pvField.get()!=NULL && ntfield->isAlarm(pvField->getField())) {
pvAlarm = static_pointer_cast<PVStructure>(pvField);
}
}
NTNameValue::~NTNameValue()
void NTNameValue::attachTimeStamp(PVTimeStamp &pv)
{
if(pvTimeStamp.get()==NULL) return;
pv.attach(pvTimeStamp);
}
PVString * NTNameValue::getFunction()
void NTNameValue::attachAlarm(PVAlarm &pv)
{
return pvFunction;
}
void NTNameValue::attachTimeStamp(PVTimeStamp &pvTimeStamp)
{
if(this->pvTimeStamp==0) return;
pvTimeStamp.attach(this->pvTimeStamp);
}
void NTNameValue::attachAlarm(PVAlarm &pvAlarm)
{
if(this->pvAlarm==0) return;
pvAlarm.attach(this->pvAlarm);
}
PVStringArray * NTNameValue::getNames() {
return pvNames;
}
PVStringArray * NTNameValue::getValues() {
return pvValues;
if(pvAlarm.get()==NULL) return;
pv.attach(pvAlarm);
}
}}

View File

@@ -17,7 +17,7 @@ namespace epics { namespace pvData {
*
*/
class NTNameValue
class NTNameValue;
typedef std::tr1::shared_ptr<NTNameValue> NTNameValuePtr;
class NTNameValue
@@ -35,25 +35,19 @@ public:
* @param hasFunction Create a PVString field named function.
* @param hasTimeStamp Create a timeStamp structure field.
* @param hasAlarm Create an alarm structure field.
* @return a NTNameValue pvStructure.
* @return NTNameValuePtr
*/
static PVStructurePtr create(
static NTNameValuePtr create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm);
/**
* Constructor
* @param pvStructure The pvStructure to which to attach.
* @return A NTNameValue that is attached to the pvStructure
*/
NTNameValue(PVStructurePtr const & pvStructure);
/**
* Destructor
*/
~NTNameValue();
~NTNameValue() {}
/**
* Get the function field.
* @return The pvString or null if no function field.
*/
PVStringPtr getFunction();
PVStringPtr & getFunction() {return pvFunction;}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
@@ -70,28 +64,29 @@ public:
* Get the pvStructure.
* @return PVStructurePtr.
*/
PVStructurePtr getPVStructure(){return pvNTNameValue;}
PVStructurePtr & getPVStructure(){return pvNTNameValue;}
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
PVStructurePtr getTimeStamp(){return pvTimeStamp;}
PVStructurePtr & getTimeStamp(){return pvTimeStamp;}
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
PVStructurePtr getAlarm() {return pvAlarm;}
PVStructurePtr & getAlarm() {return pvAlarm;}
/**
* Get the string array on names.
* @return The array of names.
*/
PVStringArrayPtr getNames();
PVStringArrayPtr & getNames() {return pvNames;}
/**
* Get the string array on values.
* @return The array of values.
*/
PVStringArrayPtr getValues();
PVStringArrayPtr & getValues() {return pvValues;}
private:
NTNameValue(PVStructurePtr const & pvStructure);
PVStructurePtr pvNTNameValue;
PVStringPtr pvFunction;
PVStructurePtr pvTimeStamp;

View File

@@ -9,25 +9,26 @@
namespace epics { namespace pvData {
bool NTTable::isNTTable(PVStructurePtr pvStructure)
using std::tr1::static_pointer_cast;
bool NTTable::isNTTable(PVStructurePtr const & pvStructure)
{
NTField *ntfield = NTField::get();
NTFieldPtr ntfield = NTField::get();
//StandardField *standardField = getStandardField();
String name = pvStructure->getField()->getFieldName();
if(name.compare("NTTable")!=0) return false;
PVStringArray *pvLabel = static_cast<PVStringArray *>
PVStringArrayPtr pvLabel = static_pointer_cast<PVStringArray>
(pvStructure->getScalarArrayField("label",pvString));
if(pvLabel==0) return false;
int nfields = pvLabel->getLength();
int nextra = 1; // label is 1 field
if(pvLabel.get()==NULL) return false;
size_t nfields = pvLabel->getLength();
size_t nextra = 1; // label is 1 field
PVFieldPtr pvField = pvStructure->getSubField("function");
if(pvField!=0 && pvStructure->getStringField("function")) nextra++;
if(pvField.get()!=NULL
&& pvStructure->getStringField("function").get()!=NULL) nextra++;
pvField = pvStructure->getSubField("timeStamp");
if(pvField!=0 && ntfield->isTimeStamp(pvField->getField())) {
nextra++;
}
pvField = pvStructure->getSubField("alarm");
if(pvField!=0 && ntfield->isAlarm(pvField->getField())) {
if(pvField.get()!=NULL && ntfield->isAlarm(pvField->getField())) {
nextra++;
}
if(nfields!=(pvStructure->getStructure()->getNumberFields()-nextra)) return false;
@@ -41,122 +42,104 @@ bool NTTable::isNTTable(PVStructurePtr pvStructure)
return true;
}
PVStructure::shared_pointer NTTable::create(
NTTablePtr NTTable::create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm,
int numberValues,
FieldConstPtrArray valueFields)
StringArray const & valueNames,
FieldConstPtrArray const &valueFields)
{
StandardField *standardField = getStandardField();
int nfields = 1;
StandardFieldPtr standardField = getStandardField();
size_t nfields = 1;
if(hasFunction) nfields++;
if(hasTimeStamp) nfields++;
if(hasAlarm) nfields++;
nfields += numberValues;
FieldCreate *fieldCreate = getFieldCreate();
PVDataCreate *pvDataCreate = getPVDataCreate();
FieldConstPtrArray fields = new FieldConstPtr[nfields];
int ind = 0;
nfields += valueFields.size();
FieldCreatePtr fieldCreate = getFieldCreate();
PVDataCreatePtr pvDataCreate = getPVDataCreate();
FieldConstPtrArray fields;
StringArray names;
fields.resize(nfields);
names.resize(nfields);
size_t ind = 0;
if(hasFunction) {
fields[ind++] = fieldCreate->createScalar(String("function"),pvString);
names[ind] = "function";
fields[ind++] = fieldCreate->createScalar(pvString);
}
if(hasTimeStamp) {
names[ind] = "timeStamp";
fields[ind++] = standardField->timeStamp();
}
if(hasAlarm) {
names[ind] = "alarm";
fields[ind++] = standardField->alarm();
}
fields[ind++] = standardField->scalarArray("label",pvString);
for(int i=0; i<numberValues ; i++) fields[ind++] = valueFields[i];
PVStructure::shared_pointer pvStructure = PVStructure::shared_pointer(
pvDataCreate->createPVStructure(0,"NTTable",nfields,fields));
String label[numberValues];
for(int i=0; i<numberValues; i++) {
FieldConstPtr field = fields[nfields - numberValues +i];
label[i] = field->getFieldName();
names[ind] = "label";
fields[ind++] = fieldCreate->createScalarArray(pvString);
size_t numberValues = valueNames.size();
for(size_t i=0; i<numberValues ; i++) {
names[ind] = valueNames[i];
fields[ind++] = valueFields[i];
}
PVStringArray *pvLabel = static_cast<PVStringArray *>
StructureConstPtr st = fieldCreate->createStructure(names,fields);
PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st);
PVStringArrayPtr pvLabel = static_pointer_cast<PVStringArray>
(pvStructure->getScalarArrayField("label",pvString));
pvLabel->put(0,numberValues,label,0);
return pvStructure;
pvLabel->put(0,numberValues,valueNames,0);
return NTTablePtr(new NTTable(pvStructure));
}
NTTable::NTTable(PVStructure::shared_pointer const & pvStructure)
NTTable::NTTable(PVStructurePtr const & pvStructure)
: pvNTTable(pvStructure),
pvFunction(0),
pvTimeStamp(0),
pvAlarm(0),
pvLabel(0),
offsetFields(1)
{
NTField *ntfield = NTField::get();
String name = pvStructure->getField()->getFieldName();
if(name.compare("NTTable")!=0) {
throw std::invalid_argument(
"pvArgument does not have name NTTable");
}
PVScalarArray * pvScalarArray
NTFieldPtr ntfield = NTField::get();
PVScalarArrayPtr pvScalarArray
= pvStructure->getScalarArrayField("label",pvString);
if(pvScalarArray==0) {
throw std::invalid_argument(
"pvArgument did not have a structureArray field value");
}
pvLabel = static_cast<PVStringArray *>(pvScalarArray);
pvLabel = static_pointer_cast<PVStringArray>(pvScalarArray);
PVFieldPtr pvField = pvStructure->getSubField("function");
if(pvField!=0) {
pvFunction = pvStructure->getStringField("function");
if(pvField.get()!=NULL) {
offsetFields++;
pvFunction = pvStructure->getStringField("function");
}
pvField = pvStructure->getSubField("timeStamp");
if(pvField!=0 && ntfield->isTimeStamp(pvField->getField())) {
pvTimeStamp = static_cast<PVStructure *>(pvField);
if(pvField.get()!=NULL && ntfield->isTimeStamp(pvField->getField())) {
offsetFields++;
pvTimeStamp = static_pointer_cast<PVStructure>(pvField);
}
pvField = pvStructure->getSubField("alarm");
if(pvField!=0 && ntfield->isAlarm(pvField->getField())) {
pvAlarm = static_cast<PVStructure *>(pvField);
if(pvField.get()!=NULL && ntfield->isAlarm(pvField->getField())) {
offsetFields++;
pvAlarm = static_pointer_cast<PVStructure>(pvField);
}
}
NTTable::~NTTable()
void NTTable::attachTimeStamp(PVTimeStamp &pv)
{
if(pvTimeStamp.get()==NULL) return;
pv.attach(pvTimeStamp);
}
PVString * NTTable::getFunction()
void NTTable::attachAlarm(PVAlarm &pv)
{
return pvFunction;
if(pvAlarm.get()==NULL) return;
pv.attach(pvAlarm);
}
void NTTable::attachTimeStamp(PVTimeStamp &pvTimeStamp)
{
if(this->pvTimeStamp==0) return;
pvTimeStamp.attach(this->pvTimeStamp);
}
void NTTable::attachAlarm(PVAlarm &pvAlarm)
{
if(this->pvAlarm==0) return;
pvAlarm.attach(this->pvAlarm);
}
PVStringArray * NTTable::getLabel()
{
return pvLabel;
}
int NTTable::getNumberValues()
size_t NTTable::getNumberValues()
{
return pvLabel->getLength();
}
FieldConstPtr NTTable::getField(int index)
FieldConstPtr & NTTable::getField(size_t index)
{
return pvNTTable->getStructure()->getFields()[index+offsetFields];
FieldConstPtrArray fields = pvNTTable->getStructure()->getFields();
return fields[index + offsetFields];
}
PVFieldPtr NTTable::getPVField(int index)
PVFieldPtr & NTTable::getPVField(size_t index)
{
return pvNTTable->getPVFields()[index+offsetFields];
PVFieldPtrArray pvFields = pvNTTable->getPVFields();
return pvFields[index+offsetFields];
}
}}

View File

@@ -17,7 +17,7 @@ namespace epics { namespace pvData {
*
*/
class NTTable
class NTTable;
typedef std::tr1::shared_ptr<NTTable> NTTablePtr;
class NTTable
@@ -37,27 +37,21 @@ public:
* @param hasAlarm Create an alarm structure field.
* @param numberValues The number of fields that follow the label field.
* @param valueFields The fields that follow the label field.
* @return an NTTable pvStructure.
* @return an NTTablePtr
*/
static PVStructurePtr create(
static NTTablePtr create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm,
size_t numberValues,
StringArray const & valueNames,
FieldConstPtrArray const &valueFields);
/**
* Constructor
* @param pvStructure The pvStructure to which to attach.
* @return A NTTable that is attached to the pvStructure
*/
NTTable(PVStructurePtr const & pvStructure);
/**
* Destructor
*/
~NTTable();
~NTTable() {}
/**
* Get the function field.
* @return The pvString or null if no function field.
*/
PVStringPtr getFunction();
PVStringPtr & getFunction() {return pvFunction;}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
@@ -74,40 +68,41 @@ public:
* Get the pvStructure.
* @return PVStructurePtr.
*/
PVStructurePtr getPVStructure(){return pvNTTable;}
PVStructurePtr & getPVStructure(){return pvNTTable;}
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
PVStructurePtr getTimeStamp(){return pvTimeStamp;}
PVStructurePtr & getTimeStamp(){return pvTimeStamp;}
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
PVStructurePtr getAlarm() {return pvAlarm;}
PVStructurePtr & getAlarm() {return pvAlarm;}
/**
* Get the label field.
* @return The pvStringArray for the label.
*/
PVStringArrayPtr getLabel();
PVStringArrayPtr & getLabel() {return pvLabel;}
/**
* Get the the number of fields that follow the label field.
* @return The number of fields.
*/
int getNumberValues();
size_t getNumberValues();
/**
* Get the Field for a field that follows the label field.
* @param index The index of the field desired.
* @return The FieldConstPtr for the field.
*/
FieldConstPtr getField(int index);
FieldConstPtr & getField(size_t index);
/**
* Get the PVField for a field that follows the label field.
* @param index The index of the field desired.
* @return The PVFieldPtr for the field.
*/
PVFieldPtr getPVField(int index);
PVFieldPtr & getPVField(size_t index);
private:
NTTable(PVStructurePtr const & pvStructure);
PVStructurePtr pvNTTable;
PVStringPtr pvFunction;
PVStructurePtr pvTimeStamp;