QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
InstrumentValueData.cc
Go to the documentation of this file.
2#include "FactValueGrid.h"
3#include "QGC.h"
6#include "Vehicle.h"
7#include "FactGroup.h"
8
9// Important: The indices of these strings must match the InstrumentValueData::RangeType enum
10const QStringList InstrumentValueData::_rangeTypeNames = {
11 QT_TRANSLATE_NOOP("InstrumentValue", "None"),
12 QT_TRANSLATE_NOOP("InstrumentValue", "Color"),
13 QT_TRANSLATE_NOOP("InstrumentValue", "Opacity"),
14 QT_TRANSLATE_NOOP("InstrumentValue", "Icon"),
15};
16
18 : QObject (parent)
19 , _factValueGrid(factValueGrid)
20 , _vehicle (factValueGrid->currentVehicle())
21{
22 connect(this, &InstrumentValueData::rangeTypeChanged, this, &InstrumentValueData::_resetRangeInfo);
23 connect(this, &InstrumentValueData::rangeTypeChanged, this, &InstrumentValueData::_updateRanges);
24 connect(this, &InstrumentValueData::rangeValuesChanged, this, &InstrumentValueData::_updateRanges);
25 connect(this, &InstrumentValueData::rangeColorsChanged, this, &InstrumentValueData::_updateRanges);
26 connect(this, &InstrumentValueData::rangeOpacitiesChanged, this, &InstrumentValueData::_updateRanges);
27 connect(this, &InstrumentValueData::rangeIconsChanged, this, &InstrumentValueData::_updateRanges);
28
29 connect(_vehicle, &Vehicle::factGroupNamesChanged, this, &InstrumentValueData::_lookForMissingFact);
30
32
33 if (!_factGroupName.isEmpty() && !_factName.isEmpty()) {
34 _setFactWorker();
35 }
36}
37
38void InstrumentValueData::_lookForMissingFact(void)
39{
40 // This is called when new fact groups show up on the vehicle. We need to see if we can fill in any
41 // facts which may have been missing up to now.
42 if (!_fact) {
43 _setFactWorker();
44 }
45}
46
48{
49 _fact = nullptr;
50 _factName.clear();
51 _text.clear();
52 _icon.clear();
53 _showUnits = true;
54
56 emit factChanged (_fact);
57 emit factNameChanged (_factName);
58 emit factGroupNameChanged (_factGroupName);
59 emit textChanged (_text);
60 emit iconChanged (_icon);
61 emit showUnitsChanged (_showUnits);
62}
63
64void InstrumentValueData::_setFactWorker(void)
65{
66 if (_fact) {
67 disconnect(_fact, &Fact::rawValueChanged, this, &InstrumentValueData::_updateRanges);
68 _fact = nullptr;
69 }
70
71 FactGroup* factGroup = nullptr;
72 if (_factGroupName == vehicleFactGroupName) {
73 factGroup = _vehicle;
74 } else {
75 factGroup = _vehicle->getFactGroup(_factGroupName);
76 }
77
78 QString nonEmptyFactName;
79 if (factGroup) {
80 if (_factName.isEmpty()) {
81 nonEmptyFactName = factValueNames()[0];
82 } else {
83 nonEmptyFactName = _factName;
84 }
85 _fact = factGroup->getFact(nonEmptyFactName);
86 }
87
88 if (_fact) {
89 _factName = nonEmptyFactName;
90 connect(_fact, &Fact::rawValueChanged, this, &InstrumentValueData::_updateRanges);
91 }
92
94 emit factChanged (_fact);
95 emit factNameChanged (_factName);
96 emit factGroupNameChanged (_factGroupName);
97
98 _updateRanges();
99}
100void InstrumentValueData::setFact(const QString& factGroupName, const QString& factName)
101{
102 _factGroupName = factGroupName;
103 _factName = factName;
104
105 _setFactWorker();
106}
107
108void InstrumentValueData::setText(const QString& text)
109{
110 if (text != _text) {
111 _text = text;
112 emit textChanged(text);
113 }
114}
115
117{
118 if (showUnits != _showUnits) {
119 _showUnits = showUnits;
121 }
122}
123
124void InstrumentValueData::setIcon(const QString& icon)
125{
126 if (icon != _icon) {
127 _icon = icon;
128 emit iconChanged(_icon);
129 }
130}
131
133{
134 if (rangeType != _rangeType) {
135 _rangeType = rangeType;
137 }
138}
139
140void InstrumentValueData::setRangeValues(const QVariantList& rangeValues)
141{
142 _rangeValues = rangeValues;
144}
145
146void InstrumentValueData::setRangeColors (const QVariantList& rangeColors)
147{
148 _rangeColors = rangeColors;
150}
151
152void InstrumentValueData::setRangeIcons(const QVariantList& rangeIcons)
153{
154 _rangeIcons = rangeIcons;
156}
157
158void InstrumentValueData::setRangeOpacities(const QVariantList& rangeOpacities)
159{
160 _rangeOpacities = rangeOpacities;
162}
163
164void InstrumentValueData::_resetRangeInfo(void)
165{
166 _rangeValues.clear();
167 _rangeColors.clear();
168 _rangeOpacities.clear();
169 _rangeIcons.clear();
170
171 if (_rangeType != NoRangeInfo) {
172 _rangeValues = { 0.0, 100.0 };
173 }
174 for (int i=0; i<_rangeValues.count() + 1; i++) {
175 switch (_rangeType) {
176 case NoRangeInfo:
177 break;
178 case ColorRange:
179 _rangeColors.append(QColor("green"));
180 break;
181 case OpacityRange:
182 _rangeOpacities.append(1.0);
183 break;
184 case IconSelectRange:
185 _rangeIcons.append(_factValueGrid->iconNames()[0]);
186 break;
187 }
188 }
189
190 emit rangeValuesChanged (_rangeValues);
191 emit rangeColorsChanged (_rangeColors);
192 emit rangeOpacitiesChanged (_rangeOpacities);
193 emit rangeIconsChanged (_rangeIcons);
194}
195
197{
198 _rangeValues.append(_rangeValues.last().toDouble() + 1);
199
200 switch (_rangeType) {
201 case NoRangeInfo:
202 break;
203 case ColorRange:
204 _rangeColors.append(QColor("green"));
205 break;
206 case OpacityRange:
207 _rangeOpacities.append(1.0);
208 break;
209 case IconSelectRange:
210 _rangeIcons.append(_factValueGrid->iconNames()[0]);
211 break;
212 }
213
214 emit rangeValuesChanged (_rangeValues);
215 emit rangeColorsChanged (_rangeColors);
216 emit rangeOpacitiesChanged (_rangeOpacities);
217 emit rangeIconsChanged (_rangeIcons);
218}
219
221{
222 if (_rangeValues.count() < 2 || index <0 || index >= _rangeValues.count()) {
223 return;
224 }
225
226 _rangeValues.removeAt(index);
227
228 switch (_rangeType) {
229 case NoRangeInfo:
230 break;
231 case ColorRange:
232 _rangeColors.removeAt(index + 1);
233 break;
234 case OpacityRange:
235 _rangeOpacities.removeAt(index + 1);
236 break;
237 case IconSelectRange:
238 _rangeIcons.removeAt(index + 1);
239 break;
240 }
241
242 emit rangeValuesChanged (_rangeValues);
243 emit rangeColorsChanged (_rangeColors);
244 emit rangeOpacitiesChanged (_rangeOpacities);
245 emit rangeIconsChanged (_rangeIcons);
246}
247
248void InstrumentValueData::_updateRanges(void)
249{
250 _updateColor();
251 _updateIcon();
252 _updateOpacity();
253}
254
255void InstrumentValueData::_updateColor(void)
256{
257 QColor newColor;
258
259 int rangeIndex = -1;
260
261 if (_rangeType == ColorRange && _fact) {
262 rangeIndex =_currentRangeIndex(_fact->rawValue().toDouble());
263 }
264 if (rangeIndex != -1) {
265 newColor = _rangeColors[rangeIndex].value<QColor>();
266 }
267
268 if (newColor != _currentColor) {
269 _currentColor = newColor;
270 emit currentColorChanged(_currentColor);
271 }
272}
273
274void InstrumentValueData::_updateOpacity(void)
275{
276 double newOpacity = 1.0;
277
278 int rangeIndex = -1;
279
280 if (_rangeType == OpacityRange && _fact) {
281 rangeIndex =_currentRangeIndex(_fact->rawValue().toDouble());
282 }
283 if (rangeIndex != -1) {
284 newOpacity = _rangeOpacities[rangeIndex].toDouble();
285 }
286
287 if (!QGC::fuzzyCompare(newOpacity, _currentOpacity)) {
288 _currentOpacity = newOpacity;
289 emit currentOpacityChanged(newOpacity);
290 }
291}
292
293void InstrumentValueData::_updateIcon(void)
294{
295 QString newIcon;
296
297 int rangeIndex = -1;
298
299 if (_rangeType == IconSelectRange && _fact) {
300 rangeIndex =_currentRangeIndex(_fact->rawValue().toDouble());
301 }
302 if (rangeIndex != -1) {
303 newIcon = _rangeIcons[rangeIndex].toString();
304 }
305
306 if (newIcon != _currentIcon) {
307 _currentIcon = newIcon;
308 emit currentIconChanged(newIcon);
309 }
310}
311
312int InstrumentValueData::_currentRangeIndex(const QVariant& value)
313{
314 if (qIsNaN(value.toDouble())) {
315 return 0;
316 }
317 for (int i=0; i<_rangeValues.count(); i++) {
318 if (value.toDouble() <= _rangeValues[i].toDouble()) {
319 return i;
320 }
321 }
322 return _rangeValues.count();
323}
324
326{
327 QStringList groupNames = _vehicle->factGroupNames();
328
329 for (QString& name: groupNames) {
330 name[0] = name[0].toUpper();
331 }
332 groupNames.prepend(vehicleFactGroupName);
333
334 return groupNames;
335}
336
338{
339 QStringList valueNames;
340
341 FactGroup* factGroup = nullptr;
342 if (_factGroupName == vehicleFactGroupName) {
343 factGroup = _vehicle;
344 } else {
345 factGroup = _vehicle->getFactGroup(_factGroupName);
346 }
347
348 if (factGroup) {
349 valueNames = factGroup->factNames();
350 for (QString& name: valueNames) {
351 name[0] = name[0].toUpper();
352 }
353 }
354
355 return valueNames;
356}
Used to group Facts together into an object hierarachy.
Definition FactGroup.h:19
void factGroupNamesChanged()
QStringList iconNames(void) const
void rawValueChanged(const QVariant &value)
static constexpr const char * vehicleFactGroupName
void currentIconChanged(const QString &currentIcon)
void setRangeOpacities(const QVariantList &rangeOpacities)
void rangeOpacitiesChanged(const QVariantList &rangeOpacities)
QStringList factGroupNames(void) const
QStringList factValueNames(void) const
FactValueGrid *factValueGrid MEMBER _factValueGrid const QString & factName
QString text(void) const
void showUnitsChanged(bool showUnits)
void factGroupNameChanged(const QString &factGroup)
QVariantList rangeOpacities(void) const
void rangeTypeChanged(RangeType rangeType)
void factChanged(Fact *fact)
void setText(const QString &text)
QVariantList rangeColors(void) const
void setRangeType(RangeType rangeType)
void currentColorChanged(const QColor &currentColor)
QVariantList rangeValues(void) const
void setIcon(const QString &icon)
RangeType rangeType(void) const
void removeRangeValue(int index)
void factValueNamesChanged(void)
void textChanged(QString text)
void factGroupNamesChanged(void)
bool showUnits(void) const
void rangeIconsChanged(const QVariantList &rangeIcons)
void rangeValuesChanged(const QVariantList &rangeValues)
void rangeColorsChanged(const QVariantList &rangeColors)
QString factGroupName(void) const
void setRangeColors(const QVariantList &rangeColors)
void factNameChanged(const QString &factName)
void setRangeIcons(const QVariantList &rangeIcons)
void setShowUnits(bool showUnits)
void setRangeValues(const QVariantList &rangeValues)
QString icon(void) const
QVariantList rangeIcons(void) const
InstrumentValueData(FactValueGrid *factValueGrid, QObject *parent)
void iconChanged(const QString &icon)
void currentOpacityChanged(double currentOpacity)
bool fuzzyCompare(double value1, double value2)
Returns true if the two values are equal or close. Correctly handles 0 and NaN values.
Definition QGC.cc:106