Commit a9d84d8e authored by Don Gagne's avatar Don Gagne

Better validation of meta data

parent 5b65318a
...@@ -116,10 +116,11 @@ void PX4ParameterLoader::loadParameterFactMetaData(void) ...@@ -116,10 +116,11 @@ void PX4ParameterLoader::loadParameterFactMetaData(void)
return; return;
} }
QString factGroup; QString factGroup;
FactMetaData* metaData = NULL; QString errorString;
int xmlState = XmlStateNone; FactMetaData* metaData = NULL;
bool badMetaData = true; int xmlState = XmlStateNone;
bool badMetaData = true;
while (!xml.atEnd()) { while (!xml.atEnd()) {
if (xml.isStartElement()) { if (xml.isStartElement()) {
...@@ -221,22 +222,22 @@ void PX4ParameterLoader::loadParameterFactMetaData(void) ...@@ -221,22 +222,22 @@ void PX4ParameterLoader::loadParameterFactMetaData(void)
Q_CHECK_PTR(metaData); Q_CHECK_PTR(metaData);
if (_mapParameterName2FactMetaData.contains(name)) { if (_mapParameterName2FactMetaData.contains(name)) {
// We can't trust the meta dafa since we have dups // We can't trust the meta dafa since we have dups
qCDebug(PX4ParameterLoaderLog) << "Duplicate parameter found:" << name; qCWarning(PX4ParameterLoaderLog) << "Duplicate parameter found:" << name;
badMetaData = true; badMetaData = true;
// Reset to default meta data // Reset to default meta data
_mapParameterName2FactMetaData[name] = metaData; _mapParameterName2FactMetaData[name] = metaData;
} else { } else {
_mapParameterName2FactMetaData[name] = metaData; _mapParameterName2FactMetaData[name] = metaData;
metaData->setName(name);
metaData->setGroup(factGroup); metaData->setGroup(factGroup);
if (xml.attributes().hasAttribute("default")) { if (xml.attributes().hasAttribute("default") && !strDefault.isEmpty()) {
bool convertOk; QVariant varDefault;
QVariant varDefault = _stringToTypedVariant(strDefault, metaData->type(), &convertOk);
if (convertOk) { if (metaData->convertAndValidate(strDefault, false, varDefault, errorString)) {
metaData->setDefaultValue(varDefault); metaData->setDefaultValue(varDefault);
} else { } else {
// Non-fatal qCWarning(PX4ParameterLoaderLog) << "Invalid default value, name:" << name << " type:" << type << " default:" << strDefault << " error:" << errorString;
qCDebug(PX4ParameterLoaderLog) << "Parameter meta data with bad default value, name:" << name << " type:" << type << " default:" << strDefault;
} }
} }
} }
...@@ -252,12 +253,14 @@ void PX4ParameterLoader::loadParameterFactMetaData(void) ...@@ -252,12 +253,14 @@ void PX4ParameterLoader::loadParameterFactMetaData(void)
if (elementName == "short_desc") { if (elementName == "short_desc") {
Q_ASSERT(metaData); Q_ASSERT(metaData);
QString text = xml.readElementText(); QString text = xml.readElementText();
text = text.replace("\n", " ");
qCDebug(PX4ParameterLoaderLog) << "Short description:" << text; qCDebug(PX4ParameterLoaderLog) << "Short description:" << text;
metaData->setShortDescription(text); metaData->setShortDescription(text);
} else if (elementName == "long_desc") { } else if (elementName == "long_desc") {
Q_ASSERT(metaData); Q_ASSERT(metaData);
QString text = xml.readElementText(); QString text = xml.readElementText();
text = text.replace("\n", " ");
qCDebug(PX4ParameterLoaderLog) << "Long description:" << text; qCDebug(PX4ParameterLoaderLog) << "Long description:" << text;
metaData->setLongDescription(text); metaData->setLongDescription(text);
...@@ -265,26 +268,24 @@ void PX4ParameterLoader::loadParameterFactMetaData(void) ...@@ -265,26 +268,24 @@ void PX4ParameterLoader::loadParameterFactMetaData(void)
Q_ASSERT(metaData); Q_ASSERT(metaData);
QString text = xml.readElementText(); QString text = xml.readElementText();
qCDebug(PX4ParameterLoaderLog) << "Min:" << text; qCDebug(PX4ParameterLoaderLog) << "Min:" << text;
bool convertOk;
QVariant varMin = _stringToTypedVariant(text, metaData->type(), &convertOk); QVariant varMin;
if (convertOk) { if (metaData->convertAndValidate(text, true /* convertOnly */, varMin, errorString)) {
metaData->setMin(varMin); metaData->setMin(varMin);
} else { } else {
// Non-fatal qCWarning(PX4ParameterLoaderLog) << "Invalid min value, name:" << metaData->name() << " type:" << metaData->type() << " min:" << text << " error:" << errorString;
qDebug() << "Parameter meta data with bad min value:" << text;
} }
} else if (elementName == "max") { } else if (elementName == "max") {
Q_ASSERT(metaData); Q_ASSERT(metaData);
QString text = xml.readElementText(); QString text = xml.readElementText();
qCDebug(PX4ParameterLoaderLog) << "Max:" << text; qCDebug(PX4ParameterLoaderLog) << "Max:" << text;
bool convertOk;
QVariant varMax = _stringToTypedVariant(text, metaData->type(), &convertOk); QVariant varMax;
if (convertOk) { if (metaData->convertAndValidate(text, true /* convertOnly */, varMax, errorString)) {
metaData->setMax(varMax); metaData->setMax(varMax);
} else { } else {
// Non-fatal qCWarning(PX4ParameterLoaderLog) << "Invalid max value, name:" << metaData->name() << " type:" << metaData->type() << " max:" << text << " error:" << errorString;
qDebug() << "Parameter meta data with bad max value:" << text;
} }
} else if (elementName == "unit") { } else if (elementName == "unit") {
...@@ -302,7 +303,16 @@ void PX4ParameterLoader::loadParameterFactMetaData(void) ...@@ -302,7 +303,16 @@ void PX4ParameterLoader::loadParameterFactMetaData(void)
QString elementName = xml.name().toString(); QString elementName = xml.name().toString();
if (elementName == "parameter") { if (elementName == "parameter") {
// Done loading this one parameter // Done loading this parameter, validate default value
if (metaData->defaultValueAvailable()) {
QVariant var;
if (!metaData->convertAndValidate(metaData->defaultValue(), false /* convertOnly */, var, errorString)) {
qCWarning(PX4ParameterLoaderLog) << "Invalid default value, name:" << metaData->name() << " type:" << metaData->type() << " default:" << metaData->defaultValue() << " error:" << errorString;
}
}
// Reset for next parameter
metaData = NULL; metaData = NULL;
badMetaData = false; badMetaData = false;
xmlState = XmlStateFoundGroup; xmlState = XmlStateFoundGroup;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment