22 setMetaData(metaData);
30 , _componentId(componentId)
43 , _name(metaData->name())
45 , _type(metaData->type())
142 bool changed =
false;
202 QVariant currentRaw = value;
203 bool changed =
false;
252 if ((enumIndex >= 0) && (enumIndex < _metaData->
enumStrings().count())) {
274 const double diff = fabs(enumValue.toDouble() -
rawValue().toDouble());
275 static constexpr double accuracy = 1.0 / 1000000.0;
276 if (diff < accuracy) {
300 return QStringList();
310 return QVariantList();
330 return QStringList();
340 return QVariantList();
349 if (values.size() != strings.size()) {
350 qCWarning(FactLog) <<
"Size of bitmask value and string is different." <<
name();
354 QStringList selected;
355 for (qsizetype i = 0; i < values.size(); i++) {
356 if (
rawValue().toInt() & values[i].toInt()) {
357 selected += strings[i];
361 if (selected.isEmpty()) {
362 selected +=
"Not value selected";
376 const auto stripNegativeZero = [](QString &candidate) {
377 static const QRegularExpression reNegativeZero(QStringLiteral(
"^-0\\.0+$"));
378 const auto match = reNegativeZero.match(candidate);
379 if (match.hasMatch() || candidate == QStringLiteral(
"-0")) {
380 candidate = candidate.mid(1);
387 const float fValue = variant.toFloat();
388 if (qIsNaN(fValue)) {
391 valueString = QStringLiteral(
"%1").arg(fValue, 0,
'f',
decimalPlaces);
392 stripNegativeZero(valueString);
398 const double dValue = variant.toDouble();
399 if (qIsNaN(dValue)) {
402 valueString = QStringLiteral(
"%1").arg(dValue, 0,
'f',
decimalPlaces);
403 stripNegativeZero(valueString);
408 valueString = variant.toBool() ? tr(
"true") : tr(
"false");
412 const double dValue = variant.toDouble();
413 if (qIsNaN(dValue)) {
416 QTime time(0, 0, 0, 0);
417 time = time.addSecs(dValue);
418 valueString = time.toString(QStringLiteral(
"hh:mm:ss"));
423 valueString = variant.toString();
435 return QStringLiteral(
"–");
437 return QStringLiteral(
"–.") +
440 return QStringLiteral(
"––:––:––");
442 return QStringLiteral(
"–");
449 const float fValue =
rawValue().toFloat();
450 if (std::isnan(fValue)) {
457 for (
int p = 1; p <= std::numeric_limits<float>::max_digits10; ++p) {
458 std::snprintf(buf,
sizeof(buf),
"%.*g", p,
static_cast<double>(fValue));
459 if (std::strtof(buf,
nullptr) == fValue) {
463 if (std::strcmp(buf,
"-0") == 0) {
467 return QString::fromLatin1(buf);
469 const double dValue =
rawValue().toDouble();
470 if (std::isnan(dValue)) {
474 QString result = QString::number(dValue,
'g', QLocale::FloatingPointShortest);
475 if (result == QStringLiteral(
"-0")) {
476 result = QStringLiteral(
"0");
498 qCDebug(FactLog) <<
"Access to unavailable default value";
511 qCDebug(FactLog) <<
"Access to unavailable default value";
758void Fact::_appSettingsUnitsChanged()
799 return QStringLiteral(
"Internal error: Meta data pointer missing");
886 return std::numeric_limits<double>::quiet_NaN();
896 return std::numeric_limits<double>::quiet_NaN();
939void Fact::_checkForRebootMessaging()
#define QGC_LOGGING_CATEGORY(name, categoryStr)
A Fact is used to hold a single value within the system.
bool _sendValueChangedSignals
QStringList bitmaskStrings() const
int valueIndex(const QString &value) const
QString enumOrValueString()
void setMetaData(FactMetaData *metaData, bool setDefaultFromMetaData=false)
QStringList selectedBitmaskStrings() const
Provide a list of selected strings based on the fact value with the bitmaskString/bitmaskValues map.
QString cookedUnits() const
bool qgcRebootRequired() const
QString longDescription() const
Fact(QObject *parent=nullptr)
bool _deferredValueChangeSignal
Q_INVOKABLE QVariant rawToCooked(const QVariant &rawValue) const
QVariant cookedValue() const
void sendValueChangedSignalsChanged(bool sendValueChangedSignals)
QString shortDescription() const
void containerSetRawValue(const QVariant &value)
Value coming from Vehicle. This does NOT send a _containerRawValueChanged signal.
QVariantList enumValues() const
QString cookedMaxString() const
FactMetaData * metaData()
QVariant rawDefaultValue() const
bool valueEqualsDefault() const
FactMetaData::ValueType_t _type
double rawIncrement() const
bool maxIsDefaultForType() const
QString cookedMinString() const
QString cookedUserMinString() const
void setEnumInfo(const QStringList &strings, const QVariantList &values)
Generally this is done during parsing. But if you know what you are doing, you can.
void sendDeferredValueChangedSignal()
QVariant cookedUserMax() const
QString invalidValueString() const
void rawValueChanged(const QVariant &value)
QRecursiveMutex _rawValueMutex
QString cookedUserMaxString() const
static constexpr const char * kMissingMetadata
FactMetaData::ValueType_t type() const
void setSendValueChangedSignals(bool sendValueChangedSignals)
QVariant cookedUserMin() const
QString cookedDefaultValueString() const
const Fact & operator=(const Fact &other)
QVariant cookedMin() const
double cookedIncrement() const
void setRawValue(const QVariant &value)
QString rawValueString() const
void setEnumIndex(int index)
bool sendValueChangedSignals() const
bool defaultValueAvailable() const
QVariant rawUserMax() const
bool volatileValue() const
void forceSetRawValue(const QVariant &value)
Sets and sends new value to vehicle even if value is the same.
int decimalPlaces() const
QStringList enumStrings() const
QString cookedValueString() const
void containerRawValueChanged(const QVariant &value)
This signal is meant for use by Fact container implementations. Used to send changed values to vehicl...
void cookedValuesChanged()
Cooked units, ranges, defaults, increment or precision changed without a raw value change.
QString rawValueStringFullPrecision() const
Returns the values as a string with full 18 digit precision if float/double.
QVariantList bitmaskValues() const
QVariant cookedMax() const
Q_INVOKABLE QString validate(const QString &cookedValue, bool convertOnly)
void setEnumStringValue(const QString &value)
Q_INVOKABLE QVariant clamp(const QString &cookedValue)
Convert and clamp value.
QString _variantToString(const QVariant &variant, int decimalPlaces) const
QVariant cookedDefaultValue() const
bool minIsDefaultForType() const
void _sendValueChangedSignal(const QVariant &value)
int maxStringLength() const
void setCookedValue(const QVariant &value)
QVariant rawUserMin() const
QString enumStringValue()
void vehicleUpdated(const QVariant &value)
Signalled when the param write ack comes back from the vehicle.
bool vehicleRebootRequired() const
QVariant rawValue() const
void valueChanged(const QVariant &value)
This signal is only meant for use by the QT property system. It should not be connected to by client ...
static void adjustSettingMetaData(const QString &settingsGroup, FactMetaData &metaData, bool &userVisible)
void showRebootAppMessage(const QString &message, const QString &title)
Modal reboot-required message. Debounced within 2 minutes.