Newer
Older
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
/// @file
/// @author Don Gagne <don@thegagnes.com>
#include "Fact.h"
#include <QQmlEngine>
static const char* kMissingMetadata = "Meta data pointer missing";
Fact::Fact(QObject* parent)
: QObject(parent)
, _componentId(-1)
, _type(FactMetaData::valueTypeInt32)
, _metaData(NULL)
, _sendValueChangedSignals(true)
, _deferredValueChangeSignal(false)
{
FactMetaData* metaData = new FactMetaData(_type, this);
setMetaData(metaData);
// Better sage than sorry on object ownership
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObject* parent)
: QObject(parent)
, _name(name)
, _componentId(componentId)
, _sendValueChangedSignals(true)
, _deferredValueChangeSignal(false)
FactMetaData* metaData = new FactMetaData(_type, this);
setMetaData(metaData);
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
Fact::Fact(const Fact& other, QObject* parent)
: QObject(parent)
{
*this = other;
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
}
const Fact& Fact::operator=(const Fact& other)
{
_name = other._name;
_componentId = other._componentId;
_rawValue = other._rawValue;
_type = other._type;
_sendValueChangedSignals = other._sendValueChangedSignals;
_deferredValueChangeSignal = other._deferredValueChangeSignal;
if (_metaData && other._metaData) {
*_metaData = *other._metaData;
} else {
_metaData = NULL;
}
return *this;
void Fact::forceSetRawValue(const QVariant& value)
{
if (_metaData) {
QVariant typedValue;
QString errorString;
if (_metaData->convertAndValidateRaw(value, true /* convertOnly */, typedValue, errorString)) {
if (_metaData) {
QVariant typedValue;
QString errorString;
if (_metaData->convertAndValidateRaw(value, true /* convertOnly */, typedValue, errorString)) {
if (typedValue != _rawValue) {
_rawValue.setValue(typedValue);
emit _containerRawValueChanged(rawValue());
emit rawValueChanged(_rawValue);
{
if (_metaData) {
setRawValue(_metaData->cookedTranslator()(value));
} else {
}
}
void Fact::setEnumStringValue(const QString& value)
{
if (_metaData) {
int index = _metaData->enumStrings().indexOf(value);
if (index != -1) {
}
}
void Fact::setEnumIndex(int index)
{
if (_metaData) {
void Fact::_containerSetRawValue(const QVariant& value)
QString Fact::name(void) const
{
return _name;
}
int Fact::componentId(void) const
{
return _componentId;
}
if (_metaData) {
return _metaData->rawTranslator()(_rawValue);
} else {
{
if (_metaData) {
int enumIndex = this->enumIndex();
if (enumIndex >= 0 && enumIndex < _metaData->enumStrings().count()) {
return _metaData->enumStrings()[enumIndex];
}
} else {
static const double accuracy = 1.0 / 1000000.0;
if (_metaData) {
int index = 0;
foreach (QVariant enumValue, _metaData->enumValues()) {
//-- Float comparissons don't always work
if(type() == FactMetaData::valueTypeFloat || type() == FactMetaData::valueTypeDouble) {
double diff = fabs(enumValue.toDouble() - rawValue().toDouble());
if(diff < accuracy) {
return index;
}
}
// Current value is not in list, add it manually
_metaData->addEnumInfo(QString("Unknown: %1").arg(rawValue().toString()), rawValue());
emit enumsChanged();
}
return -1;
}
QStringList Fact::enumStrings(void) const
{
if (_metaData) {
return _metaData->enumStrings();
} else {
return QStringList();
}
}
QVariantList Fact::enumValues(void) const
{
if (_metaData) {
return _metaData->enumValues();
} else {
void Fact::setEnumInfo(const QStringList& strings, const QVariantList& values)
{
if (_metaData) {
return _metaData->setEnumInfo(strings, values);
} else {
qWarning() << kMissingMetadata;
}
}
QStringList Fact::bitmaskStrings(void) const
{
if (_metaData) {
return _metaData->bitmaskStrings();
} else {
return QStringList();
}
}
QVariantList Fact::bitmaskValues(void) const
{
if (_metaData) {
return _metaData->bitmaskValues();
} else {
QString Fact::_variantToString(const QVariant& variant, int decimalPlaces) const
QString valueString;
switch (type()) {
case FactMetaData::valueTypeFloat:
{
float fValue = variant.toFloat();
if (qIsNaN(fValue)) {
valueString = QStringLiteral("--.--");
} else {
valueString = QString("%1").arg(fValue, 0, 'f', decimalPlaces);
}
}
break;
case FactMetaData::valueTypeDouble:
{
double dValue = variant.toDouble();
if (qIsNaN(dValue)) {
valueString = QStringLiteral("--.--");
} else {
valueString = QString("%1").arg(dValue, 0, 'f', decimalPlaces);
case FactMetaData::valueTypeElapsedTimeInSeconds:
{
double dValue = variant.toDouble();
if (qIsNaN(dValue)) {
valueString = QStringLiteral("--:--:--");
} else {
QTime time(0, 0, 0, 0);
time = time.addSecs(dValue);
valueString = time.toString(QStringLiteral("hh:mm:ss"));
}
}
break;
default:
valueString = variant.toString();
break;
QString Fact::rawValueStringFullPrecision(void) const
{
return _variantToString(rawValue(), 18);
}
QString Fact::rawValueString(void) const
{
return _variantToString(rawValue(), decimalPlaces());
}
QString Fact::cookedValueString(void) const
return _variantToString(cookedValue(), decimalPlaces());
QVariant Fact::rawDefaultValue(void) const
{
if (_metaData) {
if (!_metaData->defaultValueAvailable()) {
qDebug() << "Access to unavailable default value";
}
return _metaData->rawDefaultValue();
} else {
return QVariant(0);
}
}
QVariant Fact::cookedDefaultValue(void) const
if (_metaData) {
if (!_metaData->defaultValueAvailable()) {
qDebug() << "Access to unavailable default value";
}
return _metaData->cookedDefaultValue();
QString Fact::cookedDefaultValueString(void) const
return _variantToString(cookedDefaultValue(), decimalPlaces());
FactMetaData::ValueType_t Fact::type(void) const
QString Fact::shortDescription(void) const
if (_metaData) {
return _metaData->shortDescription();
} else {
QString Fact::longDescription(void) const
if (_metaData) {
return _metaData->longDescription();
} else {
QString Fact::rawUnits(void) const
{
if (_metaData) {
return _metaData->rawUnits();
} else {
return QString();
}
}
QString Fact::cookedUnits(void) const
return _metaData->cookedUnits();
QVariant Fact::rawMin(void) const
return _metaData->rawMin();
QVariant Fact::cookedMin(void) const
if (_metaData) {
return _metaData->cookedMin();
} else {
QString Fact::cookedMinString(void) const
{
return _variantToString(cookedMin(), decimalPlaces());
}
QVariant Fact::rawMax(void) const
return _metaData->rawMax();
QVariant Fact::cookedMax(void) const
if (_metaData) {
return _metaData->cookedMax();
} else {
return QVariant(0);
}
}
QString Fact::cookedMaxString(void) const
{
return _variantToString(cookedMax(), decimalPlaces());
bool Fact::minIsDefaultForType(void) const
{
if (_metaData) {
return _metaData->minIsDefaultForType();
} else {
bool Fact::maxIsDefaultForType(void) const
{
if (_metaData) {
return _metaData->maxIsDefaultForType();
} else {
int Fact::decimalPlaces(void) const
{
if (_metaData) {
return _metaData->decimalPlaces();
} else {
return FactMetaData::defaultDecimalPlaces;
}
}
QString Fact::group(void) const
if (_metaData) {
return _metaData->group();
} else {
void Fact::setMetaData(FactMetaData* metaData)
{
_metaData = metaData;
bool Fact::valueEqualsDefault(void) const
if (_metaData) {
if (_metaData->defaultValueAvailable()) {
return _metaData->rawDefaultValue() == rawValue();
bool Fact::defaultValueAvailable(void) const
if (_metaData) {
return _metaData->defaultValueAvailable();
} else {
QString Fact::validate(const QString& cookedValue, bool convertOnly)
{
if (_metaData) {
QVariant typedValue;
QString errorString;
_metaData->convertAndValidateCooked(cookedValue, convertOnly, typedValue, errorString);
return QString("Internal error: Meta data pointer missing");
}
}
bool Fact::rebootRequired(void) const
{
if (_metaData) {
return _metaData->rebootRequired();
} else {
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
void Fact::setSendValueChangedSignals (bool sendValueChangedSignals)
{
if (sendValueChangedSignals != _sendValueChangedSignals) {
_sendValueChangedSignals = sendValueChangedSignals;
emit sendValueChangedSignalsChanged(_sendValueChangedSignals);
}
}
void Fact::_sendValueChangedSignal(QVariant value)
{
if (_sendValueChangedSignals) {
emit valueChanged(value);
_deferredValueChangeSignal = false;
} else {
_deferredValueChangeSignal = true;
}
}
void Fact::sendDeferredValueChangedSignal(void)
{
if (_deferredValueChangeSignal) {
_deferredValueChangeSignal = false;
emit valueChanged(cookedValue());
}
}
QString Fact::enumOrValueString(void)
{
if (_metaData) {
if (_metaData->enumStrings().count()) {
return enumStringValue();
} else {
return cookedValueString();
}
} else {
double Fact::increment(void) const
{
if (_metaData) {
return _metaData->increment();
} else {
}
return std::numeric_limits<double>::quiet_NaN();
}