diff --git a/src/Camera/QGCCameraIO.cc b/src/Camera/QGCCameraIO.cc index 5f98ff41976989a57f8e57fe4f0c26ce0816d5ba..bd26288ab74f3142676c37d34c5fe37ab5f3b4aa 100644 --- a/src/Camera/QGCCameraIO.cc +++ b/src/Camera/QGCCameraIO.cc @@ -57,9 +57,18 @@ QGCCameraParamIO::QGCCameraParamIO(QGCCameraControl *control, Fact* fact, Vehicl case FactMetaData::valueTypeUint32: _mavParamType = MAV_PARAM_EXT_TYPE_UINT32; break; + case FactMetaData::valueTypeUint64: + _mavParamType = MAV_PARAM_EXT_TYPE_UINT64; + break; + case FactMetaData::valueTypeInt64: + _mavParamType = MAV_PARAM_EXT_TYPE_INT64; + break; case FactMetaData::valueTypeFloat: _mavParamType = MAV_PARAM_EXT_TYPE_REAL32; break; + case FactMetaData::valueTypeDouble: + _mavParamType = MAV_PARAM_EXT_TYPE_REAL64; + break; //-- String and custom are the same for now case FactMetaData::valueTypeString: case FactMetaData::valueTypeCustom: @@ -145,9 +154,18 @@ QGCCameraParamIO::_sendParameter() case FactMetaData::valueTypeUint32: union_value.param_uint32 = (uint32_t)_fact->rawValue().toUInt(); 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: union_value.param_float = _fact->rawValue().toFloat(); break; + case FactMetaData::valueTypeDouble: + union_value.param_double = _fact->rawValue().toDouble(); + break; //-- String and custom are the same for now case FactMetaData::valueTypeString: case FactMetaData::valueTypeCustom: @@ -282,6 +300,12 @@ QGCCameraParamIO::_valueFromMessage(const char* value, uint8_t param_type) case MAV_PARAM_EXT_TYPE_INT32: var = QVariant(u.param_int32); 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: var = QVariant(QByteArray(value, MAVLINK_MSG_PARAM_EXT_SET_FIELD_PARAM_VALUE_LEN)); break; diff --git a/src/Camera/QGCCameraIO.h b/src/Camera/QGCCameraIO.h index 0337266340912840fe9c46e79c50b39700ac1dd0..236ef6fe40ed235bc84509fc208a2383c403f7b5 100644 --- a/src/Camera/QGCCameraIO.h +++ b/src/Camera/QGCCameraIO.h @@ -19,6 +19,9 @@ MAVPACKED( typedef struct { union { float param_float; + double param_double; + int64_t param_int64; + uint64_t param_uint64; int32_t param_int32; uint32_t param_uint32; int16_t param_int16; diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 5dc608cf688cb83b7d835591c4f3625701db5ab9..f55d898093e3a0b875c92c608739857bc7ae2e09 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -254,9 +254,13 @@ QVariant FactMetaData::_minForType(void) const case valueTypeInt16: return QVariant(std::numeric_limits::min()); case valueTypeUint32: - return QVariant(std::numeric_limits::min()); + return QVariant(std::numeric_limits::min()); case valueTypeInt32: - return QVariant(std::numeric_limits::min()); + return QVariant(std::numeric_limits::min()); + case valueTypeUint64: + return QVariant(std::numeric_limits::min()); + case valueTypeInt64: + return QVariant(std::numeric_limits::min()); case valueTypeFloat: return QVariant(-std::numeric_limits::max()); case valueTypeDouble: @@ -287,9 +291,13 @@ QVariant FactMetaData::_maxForType(void) const case valueTypeInt16: return QVariant(std::numeric_limits::max()); case valueTypeUint32: - return QVariant(std::numeric_limits::max()); + return QVariant(std::numeric_limits::max()); case valueTypeInt32: - return QVariant(std::numeric_limits::max()); + return QVariant(std::numeric_limits::max()); + case valueTypeUint64: + return QVariant(std::numeric_limits::max()); + case valueTypeInt64: + return QVariant(std::numeric_limits::max()); case valueTypeFloat: return QVariant(std::numeric_limits::max()); case valueTypeElapsedTimeInSeconds: @@ -324,6 +332,14 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO } } 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::valueTypeUint16: case FactMetaData::valueTypeUint32: @@ -334,6 +350,14 @@ bool FactMetaData::convertAndValidateRaw(const QVariant& rawValue, bool convertO } } 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: typedValue = QVariant(rawValue.toFloat(&convertOk)); if (!convertOnly && convertOk) { @@ -389,6 +413,14 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co } } 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::valueTypeUint16: case FactMetaData::valueTypeUint32: @@ -399,6 +431,14 @@ bool FactMetaData::convertAndValidateCooked(const QVariant& cookedValue, bool co } } 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: typedValue = QVariant(cookedValue.toFloat(&convertOk)); if (!convertOnly && convertOk) { @@ -453,6 +493,16 @@ bool FactMetaData::clampValue(const QVariant& cookedValue, QVariant& typedValue) } } 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::valueTypeUint16: case FactMetaData::valueTypeUint32: @@ -465,6 +515,16 @@ bool FactMetaData::clampValue(const QVariant& cookedValue, QVariant& typedValue) } } 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: typedValue = QVariant(cookedValue.toFloat(&convertOk)); if (convertOk) { @@ -742,6 +802,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString, << QStringLiteral("Int16") << QStringLiteral("Uint32") << QStringLiteral("Int32") + << QStringLiteral("Uint64") + << QStringLiteral("Int64") << QStringLiteral("Float") << QStringLiteral("Double") << QStringLiteral("String") @@ -755,6 +817,8 @@ FactMetaData::ValueType_t FactMetaData::stringToType(const QString& typeString, << valueTypeInt16 << valueTypeUint32 << valueTypeInt32 + << valueTypeUint64 + << valueTypeInt64 << valueTypeFloat << valueTypeDouble << valueTypeString @@ -789,6 +853,8 @@ size_t FactMetaData::typeToSize(ValueType_t type) case valueTypeFloat: return 4; + case valueTypeUint64: + case valueTypeInt64: case valueTypeDouble: return 8; diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index 28c924fa0bdc76b01d5956c4470957a32a13672a..4b298ca2422b2407b6b9c3b0fc5e814fc48756f8 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -36,6 +36,8 @@ public: valueTypeInt16, valueTypeUint32, valueTypeInt32, + valueTypeUint64, + valueTypeInt64, valueTypeFloat, valueTypeDouble, valueTypeString, diff --git a/src/FactSystem/ParameterManager.cc b/src/FactSystem/ParameterManager.cc index 0d223761eb9ca126439bd36e2a5d719064514a15..bccb88ec47a45f2df71336303beaf849c5c70df3 100644 --- a/src/FactSystem/ParameterManager.cc +++ b/src/FactSystem/ParameterManager.cc @@ -289,6 +289,12 @@ void ParameterManager::_parameterUpdate(int vehicleId, int componentId, QString case MAV_PARAM_TYPE_INT32: factType = FactMetaData::valueTypeInt32; break; + case MAV_PARAM_TYPE_UINT64: + factType = FactMetaData::valueTypeUint64; + break; + case MAV_PARAM_TYPE_INT64: + factType = FactMetaData::valueTypeInt64; + break; case MAV_PARAM_TYPE_REAL32: factType = FactMetaData::valueTypeFloat; break; @@ -983,9 +989,18 @@ MAV_PARAM_TYPE ParameterManager::_factTypeToMavType(FactMetaData::ValueType_t fa case FactMetaData::valueTypeUint32: return MAV_PARAM_TYPE_UINT32; + case FactMetaData::valueTypeUint64: + return MAV_PARAM_TYPE_UINT64; + + case FactMetaData::valueTypeInt64: + return MAV_PARAM_TYPE_INT64; + case FactMetaData::valueTypeFloat: return MAV_PARAM_TYPE_REAL32; + case FactMetaData::valueTypeDouble: + return MAV_PARAM_TYPE_REAL64; + default: qWarning() << "Unsupported fact type" << factType; // fall through @@ -1013,9 +1028,18 @@ FactMetaData::ValueType_t ParameterManager::_mavTypeToFactType(MAV_PARAM_TYPE ma case MAV_PARAM_TYPE_UINT32: return FactMetaData::valueTypeUint32; + case MAV_PARAM_TYPE_UINT64: + return FactMetaData::valueTypeUint64; + + case MAV_PARAM_TYPE_INT64: + return FactMetaData::valueTypeInt64; + case MAV_PARAM_TYPE_REAL32: return FactMetaData::valueTypeFloat; + case MAV_PARAM_TYPE_REAL64: + return FactMetaData::valueTypeDouble; + default: qWarning() << "Unsupported mav param type" << mavType; // fall through diff --git a/src/FirmwarePlugin/APM/APMParameterMetaData.cc b/src/FirmwarePlugin/APM/APMParameterMetaData.cc index f707163b6c3c467423f52c5be4a88e7cde3d3d76..2760464324a7ea528ca20a9e2e31818b98dc8868 100644 --- a/src/FirmwarePlugin/APM/APMParameterMetaData.cc +++ b/src/FirmwarePlugin/APM/APMParameterMetaData.cc @@ -44,11 +44,13 @@ QVariant APMParameterMetaData::_stringToTypedVariant(const QString& string, case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint32: + case FactMetaData::valueTypeUint64: convertTo = QVariant::UInt; break; case FactMetaData::valueTypeInt8: case FactMetaData::valueTypeInt16: case FactMetaData::valueTypeInt32: + case FactMetaData::valueTypeInt64: convertTo = QVariant::Int; break; case FactMetaData::valueTypeFloat: @@ -531,12 +533,14 @@ void APMParameterMetaData::addMetaDataToFact(Fact* fact, MAV_TYPE vehicleType) break; case FactMetaData::valueTypeInt32: + case FactMetaData::valueTypeInt64: typedBitSet = QVariant((int)bitSet); break; case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint32: + case FactMetaData::valueTypeUint64: typedBitSet = QVariant(bitSet); break; diff --git a/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc b/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc index 84aaaf6e73c323d07cd612ae8d03359630f7d3f9..a4c3b6fc1889a75c1799f72518468986ad706611 100644 --- a/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc +++ b/src/FirmwarePlugin/PX4/PX4ParameterMetaData.cc @@ -44,11 +44,13 @@ QVariant PX4ParameterMetaData::_stringToTypedVariant(const QString& string, Fact case FactMetaData::valueTypeUint8: case FactMetaData::valueTypeUint16: case FactMetaData::valueTypeUint32: + case FactMetaData::valueTypeUint64: convertTo = QVariant::UInt; break; case FactMetaData::valueTypeInt8: case FactMetaData::valueTypeInt16: case FactMetaData::valueTypeInt32: + case FactMetaData::valueTypeInt64: convertTo = QVariant::Int; break; case FactMetaData::valueTypeFloat: