QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
Fact.cc
Go to the documentation of this file.
1#include <cmath>
2#include <cstdio>
3#include <cstdlib>
4#include <cstring>
5#include <limits>
6
7#include "Fact.h"
9#include "AppMessages.h"
10#include "QGCApplication.h"
11#include "QGCCorePlugin.h"
12#include "QGCLoggingCategory.h"
13#include "SettingsManager.h"
14
15QGC_LOGGING_CATEGORY(FactLog, "FactSystem.Fact")
16
17Fact::Fact(QObject *parent)
18 : QObject(parent)
19{
20 // qCDebug(FactLog) << Q_FUNC_INFO << this;
21
22 FactMetaData *const metaData = new FactMetaData(_type, this);
23 setMetaData(metaData);
24
25 _init();
26}
27
28Fact::Fact(int componentId, const QString &name, FactMetaData::ValueType_t type, QObject *parent)
29 : QObject(parent)
30 , _name(name)
31 , _componentId(componentId)
32 , _type(type)
33{
34 // qCDebug(FactLog) << Q_FUNC_INFO << this;
35
36 FactMetaData *const metaData = new FactMetaData(_type, this);
38
39 _init();
40}
41
42Fact::Fact(const QString& settingsGroup, FactMetaData *metaData, QObject *parent)
43 : QObject(parent)
44 , _name(metaData->name())
45 , _componentId(0)
46 , _type(metaData->type())
47{
48 // qCDebug(FactLog) << Q_FUNC_INFO << this;
49
50 bool visible = true;
51 SettingsManager::adjustSettingMetaData(settingsGroup, *metaData, visible);
52 setMetaData(metaData, true /* setDefaultFromMetaData */);
53
54 if (!QGC::runningUnitTests()) {
55 if (metaData->defaultValueAvailable() && !visible) {
56 // If setting is not visible, we force to default value
57 const QVariant defaultValue = metaData->rawDefaultValue();
58 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
59 _rawValue = defaultValue;
60 }
61 }
62
63 _init();
64}
65
66Fact::Fact(const Fact &other, QObject *parent)
67 : QObject(parent)
68{
69 // qCDebug(FactLog) << Q_FUNC_INFO << this;
70
71 *this = other;
72
73 _init();
74}
75
77{
78 // qCDebug(FactLog) << Q_FUNC_INFO << this;
79}
80
81void Fact::_init()
82{
83 (void) connect(this, &Fact::containerRawValueChanged, this, &Fact::_checkForRebootMessaging);
84}
85
86const Fact &Fact::operator=(const Fact& other)
87{
88 if (this == &other) {
89 return *this;
90 }
91
92 QMutexLocker<QRecursiveMutex> otherLocker(&other._rawValueMutex);
93 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
94
95 _name = other._name;
97 _rawValue = other._rawValue;
98 _type = other._type;
101 _valueSliderModel = nullptr;
102 if (_metaData && other._metaData) {
103 *_metaData = *other._metaData;
104 } else {
105 _metaData = nullptr;
106 }
107
108 return *this;
109}
110
111void Fact::forceSetRawValue(const QVariant &value)
112{
113 if (_metaData) {
114 QVariant typedValue;
115 QString errorString;
116
117 if (_metaData->convertAndValidateRaw(value, true /* convertOnly */, typedValue, errorString)) {
118 {
119 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
120 _rawValue = typedValue;
121 }
122
123 const QVariant cooked = _metaData->rawTranslator()(typedValue);
125 //-- Must be in this order
126 emit containerRawValueChanged(typedValue);
127 emit rawValueChanged(typedValue);
128 }
129 } else {
130 qCWarning(FactLog) << kMissingMetadata << name();
131 }
132}
133
134void Fact::setRawValue(const QVariant &value)
135{
136 if (_metaData) {
137 QVariant typedValue;
138 QString errorString;
139
140 if (_metaData->convertAndValidateRaw(value, true /* convertOnly */, typedValue, errorString)) {
141 bool changed = false;
142 {
143 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
144 if (typedValue != _rawValue) {
145 _rawValue = typedValue;
146 changed = true;
147 }
148 }
149
150 if (changed) {
151 const QVariant cooked = _metaData->rawTranslator()(typedValue);
153 //-- Must be in this order
154 emit containerRawValueChanged(typedValue);
155 emit rawValueChanged(typedValue);
156 }
157 }
158 } else {
159 qCWarning(FactLog) << kMissingMetadata << name();
160 }
161}
162
163void Fact::setCookedValue(const QVariant& value)
164{
165 if (_metaData) {
167 } else {
168 qCWarning(FactLog) << kMissingMetadata << name();
169 }
170}
171
172int Fact::valueIndex(const QString &value) const
173{
174 if (_metaData) {
175 return _metaData->enumStrings().indexOf(value);
176 }
177 qCWarning(FactLog) << kMissingMetadata << name();
178 return -1;
179}
180
181void Fact::setEnumStringValue(const QString &value)
182{
183 const int index = valueIndex(value);
184 if (index != -1) {
186 }
187}
188
189void Fact::setEnumIndex(int index)
190{
191 if (_metaData) {
193 } else {
194 qCWarning(FactLog) << kMissingMetadata << name();
195 }
196}
197
198void Fact::containerSetRawValue(const QVariant &value)
199{
200 QVariant cooked;
201 QVariant currentRaw = value;
202 bool changed = false;
203 {
204 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
205 if (_rawValue != value) {
206 _rawValue = value;
207 changed = true;
208 }
209 currentRaw = _rawValue;
210 if (_metaData) {
211 cooked = _metaData->rawTranslator()(_rawValue);
212 } else {
213 cooked = _rawValue;
214 }
215 }
216
217 if (changed) {
219 emit rawValueChanged(currentRaw);
220 }
221
222 // This always need to be signalled in order to support forceSetRawValue usage and waiting for vehicleUpdated signal
223 emit vehicleUpdated(currentRaw);
224}
225
226QVariant Fact::cookedValue() const
227{
228 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
229 if (_metaData) {
231 }
232
233 qCWarning(FactLog) << kMissingMetadata << name();
234 return _rawValue;
235}
236
238{
239 if (_metaData) {
240 const int enumIndex = this->enumIndex();
241 if ((enumIndex >= 0) && (enumIndex < _metaData->enumStrings().count())) {
243 }
244 } else {
245 qCWarning(FactLog) << kMissingMetadata << name();
246 }
247
248 return QString();
249}
250
252{
253 if (_metaData) {
254 //-- Only enums have an index
255 if (!_metaData->enumValues().isEmpty()) {
256 int index = 0;
257 for (const QVariant &enumValue: _metaData->enumValues()) {
258 if (enumValue == rawValue()) {
259 return index;
260 }
261 //-- Float comparisons don't always work
263 const double diff = fabs(enumValue.toDouble() - rawValue().toDouble());
264 static constexpr double accuracy = 1.0 / 1000000.0;
265 if (diff < accuracy) {
266 return index;
267 }
268 }
269 index++;
270 }
271 // Current value is not in list, add it manually
272 _metaData->addEnumInfo(tr("Unknown: %1").arg(rawValue().toString()), rawValue());
273 emit enumsChanged();
274 return index;
275 }
276 } else {
277 qCWarning(FactLog) << kMissingMetadata << name();
278 }
279 return -1;
280}
281
282QStringList Fact::enumStrings() const
283{
284 if (_metaData) {
285 return _metaData->enumStrings();
286 } else {
287 qCWarning(FactLog) << kMissingMetadata << name();
288 return QStringList();
289 }
290}
291
292QVariantList Fact::enumValues() const
293{
294 if (_metaData) {
295 return _metaData->enumValues();
296 } else {
297 qCWarning(FactLog) << kMissingMetadata << name();
298 return QVariantList();
299 }
300}
301
302void Fact::setEnumInfo(const QStringList &strings, const QVariantList &values)
303{
304 if (_metaData) {
305 _metaData->setEnumInfo(strings, values);
306 emit enumsChanged();
307 } else {
308 qCWarning(FactLog) << kMissingMetadata << name();
309 }
310}
311
312QStringList Fact::bitmaskStrings() const
313{
314 if (_metaData) {
315 return _metaData->bitmaskStrings();
316 } else {
317 qCWarning(FactLog) << kMissingMetadata << name();
318 return QStringList();
319 }
320}
321
322QVariantList Fact::bitmaskValues() const
323{
324 if (_metaData) {
325 return _metaData->bitmaskValues();
326 } else {
327 qCWarning(FactLog) << kMissingMetadata << name();
328 return QVariantList();
329 }
330}
331
333{
334 if (_metaData) {
335 const auto values = _metaData->bitmaskValues();
336 const auto strings = _metaData->bitmaskStrings();
337 if (values.size() != strings.size()) {
338 qCWarning(FactLog) << "Size of bitmask value and string is different." << name();
339 return {};
340 }
341
342 QStringList selected;
343 for (qsizetype i = 0; i < values.size(); i++) {
344 if (rawValue().toInt() & values[i].toInt()) {
345 selected += strings[i];
346 }
347 }
348
349 if (selected.isEmpty()) {
350 selected += "Not value selected";
351 }
352
353 return selected;
354 } else {
355 qCWarning(FactLog) << kMissingMetadata << name();
356 return {};
357 }
358}
359
360QString Fact::_variantToString(const QVariant &variant, int decimalPlaces) const
361{
362 QString valueString;
363
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);
369 }
370 };
371
372 switch (type()) {
374 {
375 const float fValue = variant.toFloat();
376 if (qIsNaN(fValue)) {
377 valueString = invalidValueString(decimalPlaces);
378 } else {
379 valueString = QStringLiteral("%1").arg(fValue, 0, 'f', decimalPlaces);
380 stripNegativeZero(valueString);
381 }
382 }
383 break;
385 {
386 const double dValue = variant.toDouble();
387 if (qIsNaN(dValue)) {
388 valueString = invalidValueString(decimalPlaces);
389 } else {
390 valueString = QStringLiteral("%1").arg(dValue, 0, 'f', decimalPlaces);
391 stripNegativeZero(valueString);
392 }
393 break;
394 }
396 valueString = variant.toBool() ? tr("true") : tr("false");
397 break;
399 {
400 const double dValue = variant.toDouble();
401 if (qIsNaN(dValue)) {
402 valueString = invalidValueString(decimalPlaces);
403 } else {
404 QTime time(0, 0, 0, 0);
405 time = time.addSecs(dValue);
406 valueString = time.toString(QStringLiteral("hh:mm:ss"));
407 }
408 break;
409 }
410 default:
411 valueString = variant.toString();
412 break;
413 }
414
415 return valueString;
416}
417
418QString Fact::invalidValueString(int decimalPlaces) const {
419 switch (type()) {
422 if (decimalPlaces <= 0) {
423 return QStringLiteral("–");
424 }
425 return QStringLiteral("–.") +
426 QString(decimalPlaces, QChar(u'–'));
428 return QStringLiteral("––:––:––");
429 default:
430 return QStringLiteral("–");
431 }
432}
433
435{
437 const float fValue = rawValue().toFloat();
438 if (std::isnan(fValue)) {
439 return invalidValueString(0);
440 }
441 // Find the shortest decimal string that round-trips back to the same float bits.
442 // snprintf with "%.*g" formats to p significant digits; strtof checks the round-trip.
443 // TODO: replace with std::to_chars once macOS min target >= 13.3
444 char buf[32];
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) {
448 break;
449 }
450 }
451 if (std::strcmp(buf, "-0") == 0) {
452 buf[0] = '0';
453 buf[1] = '\0';
454 }
455 return QString::fromLatin1(buf);
456 } else if (type() == FactMetaData::valueTypeDouble) {
457 const double dValue = rawValue().toDouble();
458 if (std::isnan(dValue)) {
459 return invalidValueString(0);
460 }
461 // TODO: replace with std::to_chars once macOS min target >= 13.3
462 QString result = QString::number(dValue, 'g', QLocale::FloatingPointShortest);
463 if (result == QStringLiteral("-0")) {
464 result = QStringLiteral("0");
465 }
466 return result;
467 } else {
468 return _variantToString(rawValue(), 0);
469 }
470}
471
472QString Fact::rawValueString() const
473{
475}
476
478{
480}
481
482QVariant Fact::rawDefaultValue() const
483{
484 if (_metaData) {
486 qCDebug(FactLog) << "Access to unavailable default value";
487 }
488 return _metaData->rawDefaultValue();
489 } else {
490 qCWarning(FactLog) << kMissingMetadata << name();
491 return QVariant(0);
492 }
493}
494
496{
497 if (_metaData) {
499 qCDebug(FactLog) << "Access to unavailable default value";
500 }
502 } else {
503 qCWarning(FactLog) << kMissingMetadata << name();
504 return QVariant(0);
505 }
506}
507
512
514{
515 if (_metaData) {
516 return _metaData->shortDescription();
517 } else {
518 qCWarning(FactLog) << kMissingMetadata << name();
519 return QString();
520 }
521}
522
523QString Fact::label() const
524{
525 if (_metaData) {
526 return _metaData->label();
527 } else {
528 qCWarning(FactLog) << kMissingMetadata << name();
529 return QString();
530 }
531}
532
534{
535 if (_metaData) {
536 return _metaData->longDescription();
537 } else {
538 qCWarning(FactLog) << kMissingMetadata << name();
539 return QString();
540 }
541}
542
543QString Fact::rawUnits() const
544{
545 if (_metaData) {
546 return _metaData->rawUnits();
547 } else {
548 qCWarning(FactLog) << kMissingMetadata << name();
549 return QString();
550 }
551}
552
553QString Fact::cookedUnits() const
554{
555 if (_metaData) {
556 return _metaData->cookedUnits();
557 } else {
558 qCWarning(FactLog) << kMissingMetadata << name();
559 return QString();
560 }
561}
562
563QVariant Fact::rawMin() const
564{
565 if (_metaData) {
566 return _metaData->rawMin();
567 } else {
568 qCWarning(FactLog) << kMissingMetadata << name();
569 return QVariant(0);
570 }
571}
572
573QVariant Fact::cookedMin() const
574{
575 if (_metaData) {
576 return _metaData->cookedMin();
577 } else {
578 qCWarning(FactLog) << kMissingMetadata << name();
579 return QVariant(0);
580 }
581}
582
583QVariant Fact::rawUserMin() const
584{
585 if (_metaData) {
586 return _metaData->rawUserMin();
587 }
588
589 qCWarning(FactLog) << kMissingMetadata << name();
590 return QVariant(0);
591}
592
593QVariant Fact::cookedUserMin() const
594{
595 if (_metaData) {
596 return _metaData->cookedUserMin();
597 }
598
599 qCWarning(FactLog) << kMissingMetadata << name();
600 return QVariant(0);
601}
602
604{
606}
607
609{
611}
612
613QVariant Fact::rawMax() const
614{
615 if (_metaData) {
616 return _metaData->rawMax();
617 } else {
618 qCWarning(FactLog) << kMissingMetadata << name();
619 return QVariant(0);
620 }
621}
622
623QVariant Fact::cookedMax() const
624{
625 if (_metaData) {
626 return _metaData->cookedMax();
627 } else {
628 qCWarning(FactLog) << kMissingMetadata << name();
629 return QVariant(0);
630 }
631}
632
633QVariant Fact::rawUserMax() const
634{
635 if (_metaData) {
636 return _metaData->rawUserMax();
637 }
638
639 qCWarning(FactLog) << kMissingMetadata << name();
640 return QVariant(0);
641}
642
643QVariant Fact::cookedUserMax() const
644{
645 if (_metaData) {
646 return _metaData->cookedUserMax();
647 }
648
649 qCWarning(FactLog) << kMissingMetadata << name();
650 return QVariant(0);
651}
652
654{
656}
657
659{
661}
662
664{
665 if (_metaData) {
667 } else {
668 qCWarning(FactLog) << kMissingMetadata << name();
669 return false;
670 }
671}
672
674{
675 if (_metaData) {
677 } else {
678 qCWarning(FactLog) << kMissingMetadata << name();
679 return false;
680 }
681}
682
684{
685 if (_metaData) {
686 return _metaData->decimalPlaces();
687 } else {
688 qCWarning(FactLog) << kMissingMetadata << name();
690 }
691}
692
693QString Fact::category() const
694{
695 if (_metaData) {
696 return _metaData->category();
697 } else {
698 qCWarning(FactLog) << kMissingMetadata << name();
699 return QString();
700 }
701}
702
703QString Fact::group() const
704{
705 if (_metaData) {
706 return _metaData->group();
707 } else {
708 qCWarning(FactLog) << kMissingMetadata << name();
709 return QString();
710 }
711}
712
713void Fact::setMetaData(FactMetaData *metaData, bool setDefaultFromMetaData)
714{
716 if (setDefaultFromMetaData && metaData->defaultValueAvailable()) {
718 }
720}
721
723{
724 if (_metaData) {
726 return _metaData->rawDefaultValue() == rawValue();
727 } else {
728 return false;
729 }
730 } else {
731 qCWarning(FactLog) << kMissingMetadata << name();
732 return false;
733 }
734}
735
737{
738 if (_metaData) {
740 } else {
741 qCWarning(FactLog) << kMissingMetadata << name();
742 return false;
743 }
744}
745
746QString Fact::validate(const QString &cookedValue, bool convertOnly)
747{
748 if (_metaData) {
749 QVariant typedValue;
750 QString errorString;
751
752 _metaData->convertAndValidateCooked(cookedValue, convertOnly, typedValue, errorString);
753
754 return errorString;
755 } else {
756 qCWarning(FactLog) << kMissingMetadata << name();
757 return QStringLiteral("Internal error: Meta data pointer missing");
758 }
759}
760
761QVariant Fact::clamp(const QString &cookedValue)
762{
763 if (_metaData) {
764 QVariant typedValue;
765 if (_metaData->clampValue(cookedValue, typedValue)) {
766 return typedValue;
767 } else {
768 //-- If conversion failed, return current value
769 return rawValue();
770 }
771 } else {
772 qCWarning(FactLog) << kMissingMetadata << name();
773 }
774 return QVariant();
775}
776
778{
779 if (_metaData) {
781 } else {
782 qCWarning(FactLog) << kMissingMetadata << name();
783 return false;
784 }
785}
786
788{
789 if (_metaData) {
791 } else {
792 qCWarning(FactLog) << kMissingMetadata << name();
793 return false;
794 }
795}
796
804
805void Fact::_sendValueChangedSignal(const QVariant &value)
806{
808 emit valueChanged(value);
810 } else {
812 }
813}
814
822
824{
825 if (_metaData) {
826 if (_metaData->enumStrings().count()) {
827 return enumStringValue();
828 } else {
829 return cookedValueString();
830 }
831 } else {
832 qCWarning(FactLog) << kMissingMetadata << name();
833 }
834 return QString();
835}
836
837double Fact::rawIncrement() const
838{
839 if (_metaData) {
840 return _metaData->rawIncrement();
841 } else {
842 qCWarning(FactLog) << kMissingMetadata << name();
843 }
844 return std::numeric_limits<double>::quiet_NaN();
845}
846
848{
849 if (_metaData) {
850 return _metaData->cookedIncrement();
851 } else {
852 qCWarning(FactLog) << kMissingMetadata << name();
853 }
854 return std::numeric_limits<double>::quiet_NaN();
855}
856
858{
859 if (_metaData) {
860 return _metaData->hasControl();
861 } else {
862 qCWarning(FactLog) << kMissingMetadata << name();
863 return false;
864 }
865}
866
867bool Fact::readOnly() const
868{
869 if (_metaData) {
870 return _metaData->readOnly();
871 } else {
872 qCWarning(FactLog) << kMissingMetadata << name();
873 return false;
874 }
875}
876
877bool Fact::writeOnly() const
878{
879 if (_metaData) {
880 return _metaData->writeOnly();
881 } else {
882 qCWarning(FactLog) << kMissingMetadata << name();
883 return false;
884 }
885}
886
888{
889 if (_metaData) {
890 return _metaData->volatileValue();
891 } else {
892 qCWarning(FactLog) << kMissingMetadata << name();
893 return false;
894 }
895}
896
905
906void Fact::_checkForRebootMessaging()
907{
908 if (qgcApp()) {
909 if (!QGC::runningUnitTests()) {
910 if (vehicleRebootRequired()) {
911 QGC::showRebootAppMessage(tr("Reboot vehicle for changes to take effect."));
912 } else if (qgcRebootRequired()) {
913 QGC::showRebootAppMessage(tr("Restart application for changes to take effect."));
914 }
915 }
916 }
917}
#define qgcApp()
QString errorString
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Holds the meta data associated with a Fact.
QString label() const
QStringList enumStrings() const
QVariant cookedDefaultValue() const
bool hasControl() const
QVariant cookedMin() const
QStringList bitmaskStrings() const
bool clampValue(const QVariant &cookedValue, QVariant &typedValue) const
bool qgcRebootRequired() const
bool convertAndValidateCooked(const QVariant &cookedValue, bool convertOnly, QVariant &typedValue, QString &errorString) const
Same as convertAndValidateRaw except for cookedValue input.
QVariant cookedUserMax() const
Translator cookedTranslator() const
QVariant cookedMax() const
QString group() const
QVariant rawMin() const
@ valueTypeElapsedTimeInSeconds
QVariantList enumValues() const
QString cookedUnits() const
QString shortDescription() const
bool maxIsDefaultForType() const
int decimalPlaces() const
static constexpr int kDefaultDecimalPlaces
Default value for decimal places if not specified/known.
QVariant cookedUserMin() const
QVariant rawUserMin() const
bool convertAndValidateRaw(const QVariant &rawValue, bool convertOnly, QVariant &typedValue, QString &errorString) const
QString rawUnits() const
QVariant rawUserMax() const
double rawIncrement() const
void setEnumInfo(const QStringList &strings, const QVariantList &values)
bool readOnly() const
QString category() const
QString longDescription() const
bool minIsDefaultForType() const
bool writeOnly() const
void addEnumInfo(const QString &name, const QVariant &value)
Used to add new values to the enum lists after the meta data has been loaded.
QVariantList bitmaskValues() const
QVariant rawDefaultValue() const
bool vehicleRebootRequired() const
bool volatileValue() const
QVariant rawMax() const
bool defaultValueAvailable() const
double cookedIncrement() const
Translator rawTranslator() const
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.
Definition Fact.h:17
bool _sendValueChangedSignals
Definition Fact.h:208
QString _name
Definition Fact.h:202
QStringList bitmaskStrings() const
Definition Fact.cc:312
bool writeOnly() const
Definition Fact.cc:877
int valueIndex(const QString &value) const
Definition Fact.cc:172
Q_INVOKABLE FactValueSliderListModel * valueSliderModel()
Definition Fact.cc:897
int enumIndex()
Definition Fact.cc:251
QString enumOrValueString()
Definition Fact.cc:823
void setMetaData(FactMetaData *metaData, bool setDefaultFromMetaData=false)
Definition Fact.cc:713
QStringList selectedBitmaskStrings() const
Provide a list of selected strings based on the fact value with the bitmaskString/bitmaskValues map.
Definition Fact.cc:332
QString cookedUnits() const
Definition Fact.cc:553
bool qgcRebootRequired() const
Definition Fact.cc:787
QString longDescription() const
Definition Fact.cc:533
Fact(QObject *parent=nullptr)
Definition Fact.cc:17
virtual ~Fact()
Definition Fact.cc:76
bool _deferredValueChangeSignal
Definition Fact.h:209
QVariant cookedValue() const
Definition Fact.cc:226
void sendValueChangedSignalsChanged(bool sendValueChangedSignals)
QString shortDescription() const
Definition Fact.cc:513
void containerSetRawValue(const QVariant &value)
Value coming from Vehicle. This does NOT send a _containerRawValueChanged signal.
Definition Fact.cc:198
FactMetaData * _metaData
Definition Fact.h:207
QVariantList enumValues() const
Definition Fact.cc:292
QString cookedMaxString() const
Definition Fact.cc:653
FactMetaData * metaData()
Definition Fact.h:171
QVariant rawDefaultValue() const
Definition Fact.cc:482
bool valueEqualsDefault() const
Definition Fact.cc:722
FactMetaData::ValueType_t _type
Definition Fact.h:206
double rawIncrement() const
Definition Fact.cc:837
bool maxIsDefaultForType() const
Definition Fact.cc:673
bool readOnly() const
Definition Fact.cc:867
QString cookedMinString() const
Definition Fact.cc:603
QString cookedUserMinString() const
Definition Fact.cc:608
void setEnumInfo(const QStringList &strings, const QVariantList &values)
Generally this is done during parsing. But if you know what you are doing, you can.
Definition Fact.cc:302
void sendDeferredValueChangedSignal()
Definition Fact.cc:815
QVariant cookedUserMax() const
Definition Fact.cc:643
QString invalidValueString() const
Definition Fact.h:128
void rawValueChanged(const QVariant &value)
QRecursiveMutex _rawValueMutex
Definition Fact.h:205
QString cookedUserMaxString() const
Definition Fact.cc:658
static constexpr const char * kMissingMetadata
Definition Fact.h:212
QString group() const
Definition Fact.cc:703
FactMetaData::ValueType_t type() const
Definition Fact.h:124
void setSendValueChangedSignals(bool sendValueChangedSignals)
Definition Fact.cc:797
QVariant cookedUserMin() const
Definition Fact.cc:593
QString cookedDefaultValueString() const
Definition Fact.cc:508
const Fact & operator=(const Fact &other)
Definition Fact.cc:86
QVariant cookedMin() const
Definition Fact.cc:573
double cookedIncrement() const
Definition Fact.cc:847
void setRawValue(const QVariant &value)
Definition Fact.cc:134
QString rawValueString() const
Definition Fact.cc:472
void setEnumIndex(int index)
Definition Fact.cc:189
bool sendValueChangedSignals() const
Definition Fact.h:158
bool defaultValueAvailable() const
Definition Fact.cc:736
QVariant rawUserMax() const
Definition Fact.cc:633
bool volatileValue() const
Definition Fact.cc:887
QVariant rawMax() const
Definition Fact.cc:613
void forceSetRawValue(const QVariant &value)
Sets and sends new value to vehicle even if value is the same.
Definition Fact.cc:111
int decimalPlaces() const
Definition Fact.cc:683
QStringList enumStrings() const
Definition Fact.cc:282
QString cookedValueString() const
Definition Fact.cc:477
QString name() const
Definition Fact.h:121
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.
Definition Fact.cc:434
QVariantList bitmaskValues() const
Definition Fact.cc:322
QVariant cookedMax() const
Definition Fact.cc:623
QVariant rawMin() const
Definition Fact.cc:563
Q_INVOKABLE QString validate(const QString &cookedValue, bool convertOnly)
Definition Fact.cc:746
void setEnumStringValue(const QString &value)
Definition Fact.cc:181
int _componentId
Definition Fact.h:203
QString rawUnits() const
Definition Fact.cc:543
Q_INVOKABLE QVariant clamp(const QString &cookedValue)
Convert and clamp value.
Definition Fact.cc:761
QString _variantToString(const QVariant &variant, int decimalPlaces) const
Definition Fact.cc:360
FactValueSliderListModel * _valueSliderModel
Definition Fact.h:210
QVariant cookedDefaultValue() const
Definition Fact.cc:495
QString category() const
Definition Fact.cc:693
bool minIsDefaultForType() const
Definition Fact.cc:663
QVariant _rawValue
Definition Fact.h:204
void _sendValueChangedSignal(const QVariant &value)
Definition Fact.cc:805
void setCookedValue(const QVariant &value)
Definition Fact.cc:163
QVariant rawUserMin() const
Definition Fact.cc:583
void enumsChanged()
QString enumStringValue()
Definition Fact.cc:237
QString label() const
Definition Fact.cc:523
void vehicleUpdated(const QVariant &value)
Signalled when the param write ack comes back from the vehicle.
bool hasControl() const
Definition Fact.cc:857
bool vehicleRebootRequired() const
Definition Fact.cc:777
QVariant rawValue() const
Value after translation.
Definition Fact.h:85
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)
bool runningUnitTests()
void showRebootAppMessage(const QString &message, const QString &title)
Modal reboot-required message. Debounced within 2 minutes.