Commit 5d435d39 authored by Gus Grubba's avatar Gus Grubba

Add support for 64-bit metadata values

parent eba58fe3
...@@ -57,9 +57,18 @@ QGCCameraParamIO::QGCCameraParamIO(QGCCameraControl *control, Fact* fact, Vehicl ...@@ -57,9 +57,18 @@ QGCCameraParamIO::QGCCameraParamIO(QGCCameraControl *control, Fact* fact, Vehicl
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
_mavParamType = MAV_PARAM_EXT_TYPE_UINT32; _mavParamType = MAV_PARAM_EXT_TYPE_UINT32;
break; break;
case FactMetaData::valueTypeUint64:
_mavParamType = MAV_PARAM_EXT_TYPE_UINT64;
break;
case FactMetaData::valueTypeInt64:
_mavParamType = MAV_PARAM_EXT_TYPE_INT64;
break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
_mavParamType = MAV_PARAM_EXT_TYPE_REAL32; _mavParamType = MAV_PARAM_EXT_TYPE_REAL32;
break; break;
case FactMetaData::valueTypeDouble:
_mavParamType = MAV_PARAM_EXT_TYPE_REAL64;
break;
//-- String and custom are the same for now //-- String and custom are the same for now
case FactMetaData::valueTypeString: case FactMetaData::valueTypeString:
case FactMetaData::valueTypeCustom: case FactMetaData::valueTypeCustom:
...@@ -145,9 +154,18 @@ QGCCameraParamIO::_sendParameter() ...@@ -145,9 +154,18 @@ QGCCameraParamIO::_sendParameter()
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
union_value.param_uint32 = (uint32_t)_fact->rawValue().toUInt(); union_value.param_uint32 = (uint32_t)_fact->rawValue().toUInt();
break; break;
case FactMetaData::valueTypeInt64:
union_value.param_int64 = (int64_t)_fact->rawValue().toLongLong();
break;
case FactMetaData::valueTypeUint64:
union_value.param_uint64 = (uint64_t)_fact->rawValue().toULongLong();
break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
union_value.param_float = _fact->rawValue().toFloat(); union_value.param_float = _fact->rawValue().toFloat();
break; break;
case FactMetaData::valueTypeDouble:
union_value.param_double = _fact->rawValue().toDouble();
break;
//-- String and custom are the same for now //-- String and custom are the same for now
case FactMetaData::valueTypeString: case FactMetaData::valueTypeString:
case FactMetaData::valueTypeCustom: case FactMetaData::valueTypeCustom:
...@@ -282,6 +300,12 @@ QGCCameraParamIO::_valueFromMessage(const char* value, uint8_t param_type) ...@@ -282,6 +300,12 @@ QGCCameraParamIO::_valueFromMessage(const char* value, uint8_t param_type)
case MAV_PARAM_EXT_TYPE_INT32: case MAV_PARAM_EXT_TYPE_INT32:
var = QVariant(u.param_int32); var = QVariant(u.param_int32);
break; break;
case MAV_PARAM_EXT_TYPE_UINT64:
var = QVariant(u.param_uint64);
break;
case MAV_PARAM_EXT_TYPE_INT64:
var = QVariant(u.param_int64);
break;
case MAV_PARAM_EXT_TYPE_CUSTOM: case MAV_PARAM_EXT_TYPE_CUSTOM:
var = QVariant(QByteArray(value, MAVLINK_MSG_PARAM_EXT_SET_FIELD_PARAM_VALUE_LEN)); var = QVariant(QByteArray(value, MAVLINK_MSG_PARAM_EXT_SET_FIELD_PARAM_VALUE_LEN));
break; break;
......
...@@ -19,6 +19,9 @@ MAVPACKED( ...@@ -19,6 +19,9 @@ MAVPACKED(
typedef struct { typedef struct {
union { union {
float param_float; float param_float;
double param_double;
int64_t param_int64;
uint64_t param_uint64;
int32_t param_int32; int32_t param_int32;
uint32_t param_uint32; uint32_t param_uint32;
int16_t param_int16; int16_t param_int16;
......
...@@ -254,9 +254,13 @@ QVariant FactMetaData::_minForType(void) const ...@@ -254,9 +254,13 @@ QVariant FactMetaData::_minForType(void) const
case valueTypeInt16: case valueTypeInt16:
return QVariant(std::numeric_limits<short int>::min()); return QVariant(std::numeric_limits<short int>::min());
case valueTypeUint32: case valueTypeUint32:
return QVariant(std::numeric_limits<unsigned int>::min()); return QVariant(std::numeric_limits<uint32_t>::min());
case valueTypeInt32: case valueTypeInt32:
return QVariant(std::numeric_limits<int>::min()); return QVariant(std::numeric_limits<int32_t>::min());
case valueTypeUint64:
return QVariant(std::numeric_limits<uint64_t>::min());
case valueTypeInt64:
return QVariant(std::numeric_limits<int64_t>::min());
case valueTypeFloat: case valueTypeFloat:
return QVariant(-std::numeric_limits<float>::max()); return QVariant(-std::numeric_limits<float>::max());
case valueTypeDouble: case valueTypeDouble:
...@@ -287,9 +291,13 @@ QVariant FactMetaData::_maxForType(void) const ...@@ -287,9 +291,13 @@ QVariant FactMetaData::_maxForType(void) const
case valueTypeInt16: case valueTypeInt16:
return QVariant(std::numeric_limits<short int>::max()); return QVariant(std::numeric_limits<short int>::max());
case valueTypeUint32: case valueTypeUint32:
return QVariant(std::numeric_limits<unsigned int>::max()); return QVariant(std::numeric_limits<uint32_t>::max());
case valueTypeInt32: case valueTypeInt32:
return QVariant(std::numeric_limits<int>::max()); return QVariant(std::numeric_limits<int32_t>::max());
case valueTypeUint64:
return QVariant(std::numeric_limits<uint64_t>::max());
case valueTypeInt64:
return QVariant(std::numeric_limits<int64_t>::max());
case valueTypeFloat: case valueTypeFloat:
return QVariant(std::numeric_limits<float>::max()); return QVariant(std::numeric_limits<float>::max());
case valueTypeElapsedTimeInSeconds: case valueTypeElapsedTimeInSeconds:
...@@ -324,6 +332,14 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO ...@@ -324,6 +332,14 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO
} }
} }
break; break;
case FactMetaData::valueTypeInt64:
typedValue = QVariant(rawValue.toLongLong(&convertOk));
if (!convertOnly && convertOk) {
if (typedValue < rawMin() || typedValue > rawMax()) {
errorString = tr("Value must be within %1 and %2").arg(rawMin().toInt()).arg(rawMax().toInt());
}
}
break;
case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
...@@ -334,6 +350,14 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO ...@@ -334,6 +350,14 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO
} }
} }
break; break;
case FactMetaData::valueTypeUint64:
typedValue = QVariant(rawValue.toULongLong(&convertOk));
if (!convertOnly && convertOk) {
if (typedValue < rawMin() || typedValue > rawMax()) {
errorString = tr("Value must be within %1 and %2").arg(rawMin().toUInt()).arg(rawMax().toUInt());
}
}
break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
typedValue = QVariant(rawValue.toFloat(&convertOk)); typedValue = QVariant(rawValue.toFloat(&convertOk));
if (!convertOnly && convertOk) { if (!convertOnly && convertOk) {
...@@ -389,6 +413,14 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co ...@@ -389,6 +413,14 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co
} }
} }
break; break;
case FactMetaData::valueTypeInt64:
typedValue = QVariant(cookedValue.toLongLong(&convertOk));
if (!convertOnly && convertOk) {
if (cookedMin() > typedValue || typedValue > cookedMax()) {
errorString = tr("Value must be within %1 and %2").arg(cookedMin().toInt()).arg(cookedMax().toInt());
}
}
break;
case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
...@@ -399,6 +431,14 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co ...@@ -399,6 +431,14 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co
} }
} }
break; break;
case FactMetaData::valueTypeUint64:
typedValue = QVariant(cookedValue.toULongLong(&convertOk));
if (!convertOnly && convertOk) {
if (cookedMin() > typedValue || typedValue > cookedMax()) {
errorString = tr("Value must be within %1 and %2").arg(cookedMin().toUInt()).arg(cookedMax().toUInt());
}
}
break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
typedValue = QVariant(cookedValue.toFloat(&convertOk)); typedValue = QVariant(cookedValue.toFloat(&convertOk));
if (!convertOnly && convertOk) { if (!convertOnly && convertOk) {
...@@ -453,6 +493,16 @@ bool FactMetaData::clampValue(const QVariant& cookedValue, QVariant& typedValue) ...@@ -453,6 +493,16 @@ bool FactMetaData::clampValue(const QVariant& cookedValue, QVariant& typedValue)
} }
} }
break; break;
case FactMetaData::valueTypeInt64:
typedValue = QVariant(cookedValue.toLongLong(&convertOk));
if (convertOk) {
if (cookedMin() > typedValue) {
typedValue = cookedMin();
} else if(typedValue > cookedMax()) {
typedValue = cookedMax();
}
}
break;
case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
...@@ -465,6 +515,16 @@ bool FactMetaData::clampValue(const QVariant& cookedValue, QVariant& typedValue) ...@@ -465,6 +515,16 @@ bool FactMetaData::clampValue(const QVariant& cookedValue, QVariant& typedValue)
} }
} }
break; break;
case FactMetaData::valueTypeUint64:
typedValue = QVariant(cookedValue.toULongLong(&convertOk));
if (convertOk) {
if (cookedMin() > typedValue) {
typedValue = cookedMin();
} else if(typedValue > cookedMax()) {
typedValue = cookedMax();
}
}
break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
typedValue = QVariant(cookedValue.toFloat(&convertOk)); typedValue = QVariant(cookedValue.toFloat(&convertOk));
if (convertOk) { if (convertOk) {
...@@ -742,6 +802,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString, ...@@ -742,6 +802,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString,
<< QStringLiteral("Int16") << QStringLiteral("Int16")
<< QStringLiteral("Uint32") << QStringLiteral("Uint32")
<< QStringLiteral("Int32") << QStringLiteral("Int32")
<< QStringLiteral("Uint64")
<< QStringLiteral("Int64")
<< QStringLiteral("Float") << QStringLiteral("Float")
<< QStringLiteral("Double") << QStringLiteral("Double")
<< QStringLiteral("String") << QStringLiteral("String")
...@@ -755,6 +817,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString, ...@@ -755,6 +817,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString,
<< valueTypeInt16 << valueTypeInt16
<< valueTypeUint32 << valueTypeUint32
<< valueTypeInt32 << valueTypeInt32
<< valueTypeUint64
<< valueTypeInt64
<< valueTypeFloat << valueTypeFloat
<< valueTypeDouble << valueTypeDouble
<< valueTypeString << valueTypeString
...@@ -789,6 +853,8 @@ size_t FactMetaData::typeToSize(ValueType_t type) ...@@ -789,6 +853,8 @@ size_t FactMetaData::typeToSize(ValueType_t type)
case valueTypeFloat: case valueTypeFloat:
return 4; return 4;
case valueTypeUint64:
case valueTypeInt64:
case valueTypeDouble: case valueTypeDouble:
return 8; return 8;
......
...@@ -36,6 +36,8 @@ public: ...@@ -36,6 +36,8 @@ public:
valueTypeInt16, valueTypeInt16,
valueTypeUint32, valueTypeUint32,
valueTypeInt32, valueTypeInt32,
valueTypeUint64,
valueTypeInt64,
valueTypeFloat, valueTypeFloat,
valueTypeDouble, valueTypeDouble,
valueTypeString, valueTypeString,
......
...@@ -289,6 +289,12 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString ...@@ -289,6 +289,12 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString
case MAV_PARAM_TYPE_INT32: case MAV_PARAM_TYPE_INT32:
factType = FactMetaData::valueTypeInt32; factType = FactMetaData::valueTypeInt32;
break; break;
case MAV_PARAM_TYPE_UINT64:
factType = FactMetaData::valueTypeUint64;
break;
case MAV_PARAM_TYPE_INT64:
factType = FactMetaData::valueTypeInt64;
break;
case MAV_PARAM_TYPE_REAL32: case MAV_PARAM_TYPE_REAL32:
factType = FactMetaData::valueTypeFloat; factType = FactMetaData::valueTypeFloat;
break; break;
...@@ -983,9 +989,18 @@ MAV_PARAM_TYPE ParameterManager::_factTypeToMavType(FactMetaData::ValueType_t fa ...@@ -983,9 +989,18 @@ MAV_PARAM_TYPE ParameterManager::_factTypeToMavType(FactMetaData::ValueType_t fa
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
return MAV_PARAM_TYPE_UINT32; return MAV_PARAM_TYPE_UINT32;
case FactMetaData::valueTypeUint64:
return MAV_PARAM_TYPE_UINT64;
case FactMetaData::valueTypeInt64:
return MAV_PARAM_TYPE_INT64;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
return MAV_PARAM_TYPE_REAL32; return MAV_PARAM_TYPE_REAL32;
case FactMetaData::valueTypeDouble:
return MAV_PARAM_TYPE_REAL64;
default: default:
qWarning() << "Unsupported fact type" << factType; qWarning() << "Unsupported fact type" << factType;
// fall through // fall through
...@@ -1013,9 +1028,18 @@ FactMetaData::ValueType_t ParameterManager::_mavTypeToFactType(MAV_PARAM_TYPE ma ...@@ -1013,9 +1028,18 @@ FactMetaData::ValueType_t ParameterManager::_mavTypeToFactType(MAV_PARAM_TYPE ma
case MAV_PARAM_TYPE_UINT32: case MAV_PARAM_TYPE_UINT32:
return FactMetaData::valueTypeUint32; return FactMetaData::valueTypeUint32;
case MAV_PARAM_TYPE_UINT64:
return FactMetaData::valueTypeUint64;
case MAV_PARAM_TYPE_INT64:
return FactMetaData::valueTypeInt64;
case MAV_PARAM_TYPE_REAL32: case MAV_PARAM_TYPE_REAL32:
return FactMetaData::valueTypeFloat; return FactMetaData::valueTypeFloat;
case MAV_PARAM_TYPE_REAL64:
return FactMetaData::valueTypeDouble;
default: default:
qWarning() << "Unsupported mav param type" << mavType; qWarning() << "Unsupported mav param type" << mavType;
// fall through // fall through
......
...@@ -44,11 +44,13 @@ QVariant APMParameterMetaData::_stringToTypedVariant(const QString& string, ...@@ -44,11 +44,13 @@ QVariant APMParameterMetaData::_stringToTypedVariant(const QString& string,
case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
case FactMetaData::valueTypeUint64:
convertTo = QVariant::UInt; convertTo = QVariant::UInt;
break; break;
case FactMetaData::valueTypeInt8: case FactMetaData::valueTypeInt8:
case FactMetaData::valueTypeInt16: case FactMetaData::valueTypeInt16:
case FactMetaData::valueTypeInt32: case FactMetaData::valueTypeInt32:
case FactMetaData::valueTypeInt64:
convertTo = QVariant::Int; convertTo = QVariant::Int;
break; break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
...@@ -531,12 +533,14 @@ void APMParameterMetaData::addMetaDataToFact(Fact* fact, MAV_TYPE vehicleType) ...@@ -531,12 +533,14 @@ void APMParameterMetaData::addMetaDataToFact(Fact* fact, MAV_TYPE vehicleType)
break; break;
case FactMetaData::valueTypeInt32: case FactMetaData::valueTypeInt32:
case FactMetaData::valueTypeInt64:
typedBitSet = QVariant((int)bitSet); typedBitSet = QVariant((int)bitSet);
break; break;
case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
case FactMetaData::valueTypeUint64:
typedBitSet = QVariant(bitSet); typedBitSet = QVariant(bitSet);
break; break;
......
...@@ -44,11 +44,13 @@ QVariant PX4ParameterMetaData::_stringToTypedVariant(const QString& string, Fact ...@@ -44,11 +44,13 @@ QVariant PX4ParameterMetaData::_stringToTypedVariant(const QString& string, Fact
case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint8:
case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint16:
case FactMetaData::valueTypeUint32: case FactMetaData::valueTypeUint32:
case FactMetaData::valueTypeUint64:
convertTo = QVariant::UInt; convertTo = QVariant::UInt;
break; break;
case FactMetaData::valueTypeInt8: case FactMetaData::valueTypeInt8:
case FactMetaData::valueTypeInt16: case FactMetaData::valueTypeInt16:
case FactMetaData::valueTypeInt32: case FactMetaData::valueTypeInt32:
case FactMetaData::valueTypeInt64:
convertTo = QVariant::Int; convertTo = QVariant::Int;
break; break;
case FactMetaData::valueTypeFloat: case FactMetaData::valueTypeFloat:
......
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