23 setMetaData(metaData);
31 , _componentId(componentId)
44 , _name(metaData->name())
46 , _type(metaData->type())
141 bool changed =
false;
201 QVariant currentRaw = value;
202 bool changed =
false;
241 if ((enumIndex >= 0) && (enumIndex < _metaData->
enumStrings().count())) {
263 const double diff = fabs(enumValue.toDouble() -
rawValue().toDouble());
264 static constexpr double accuracy = 1.0 / 1000000.0;
265 if (diff < accuracy) {
288 return QStringList();
298 return QVariantList();
318 return QStringList();
328 return QVariantList();
337 if (values.size() != strings.size()) {
338 qCWarning(FactLog) <<
"Size of bitmask value and string is different." <<
name();
342 QStringList selected;
343 for (qsizetype i = 0; i < values.size(); i++) {
344 if (
rawValue().toInt() & values[i].toInt()) {
345 selected += strings[i];
349 if (selected.isEmpty()) {
350 selected +=
"Not value selected";
364 const auto stripNegativeZero = [](QString &candidate) {
365 static const QRegularExpression reNegativeZero(QStringLiteral(
"^-0\\.0+$"));
366 const auto match = reNegativeZero.match(candidate);
367 if (match.hasMatch() || candidate == QStringLiteral(
"-0")) {
368 candidate = candidate.mid(1);
375 const float fValue = variant.toFloat();
376 if (qIsNaN(fValue)) {
379 valueString = QStringLiteral(
"%1").arg(fValue, 0,
'f',
decimalPlaces);
380 stripNegativeZero(valueString);
386 const double dValue = variant.toDouble();
387 if (qIsNaN(dValue)) {
390 valueString = QStringLiteral(
"%1").arg(dValue, 0,
'f',
decimalPlaces);
391 stripNegativeZero(valueString);
396 valueString = variant.toBool() ? tr(
"true") : tr(
"false");
400 const double dValue = variant.toDouble();
401 if (qIsNaN(dValue)) {
404 QTime time(0, 0, 0, 0);
405 time = time.addSecs(dValue);
406 valueString = time.toString(QStringLiteral(
"hh:mm:ss"));
411 valueString = variant.toString();
423 return QStringLiteral(
"–");
425 return QStringLiteral(
"–.") +
428 return QStringLiteral(
"––:––:––");
430 return QStringLiteral(
"–");
437 const float fValue =
rawValue().toFloat();
438 if (std::isnan(fValue)) {
445 for (
int p = 1; p <= std::numeric_limits<float>::max_digits10; ++p) {
446 std::snprintf(buf,
sizeof(buf),
"%.*g", p,
static_cast<double>(fValue));
447 if (std::strtof(buf,
nullptr) == fValue) {
451 if (std::strcmp(buf,
"-0") == 0) {
455 return QString::fromLatin1(buf);
457 const double dValue =
rawValue().toDouble();
458 if (std::isnan(dValue)) {
462 QString result = QString::number(dValue,
'g', QLocale::FloatingPointShortest);
463 if (result == QStringLiteral(
"-0")) {
464 result = QStringLiteral(
"0");
486 qCDebug(FactLog) <<
"Access to unavailable default value";
499 qCDebug(FactLog) <<
"Access to unavailable default value";
757 return QStringLiteral(
"Internal error: Meta data pointer missing");
844 return std::numeric_limits<double>::quiet_NaN();
854 return std::numeric_limits<double>::quiet_NaN();
906void Fact::_checkForRebootMessaging()
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Provides a list model of values for incrementing/decrementing the value of a Fact.
A Fact is used to hold a single value within the system.
bool _sendValueChangedSignals
QStringList bitmaskStrings() const
int valueIndex(const QString &value) const
Q_INVOKABLE FactValueSliderListModel * valueSliderModel()
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
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...
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
FactValueSliderListModel * _valueSliderModel
QVariant cookedDefaultValue() const
bool minIsDefaultForType() const
void _sendValueChangedSignal(const QVariant &value)
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
Value after translation.
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.