QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FactGroup.cc
Go to the documentation of this file.
1#include "FactGroup.h"
3
4QGC_LOGGING_CATEGORY(FactGroupLog, "FactSystem.FactGroup")
5
6FactGroup::FactGroup(int updateRateMsecs, const QString &metaDataFile, QObject *parent, bool ignoreCamelCase)
7 : QObject(parent)
8 , _updateRateMSecs(updateRateMsecs)
9 , _ignoreCamelCase(ignoreCamelCase)
10{
11 // qCDebug(FactGroupLog) << Q_FUNC_INFO << this;
12 _setupTimer();
13 _nameToFactMetaDataMap = FactMetaData::createMapFromJsonFile(metaDataFile, this);
14}
15
16FactGroup::FactGroup(int updateRateMsecs, QObject *parent, bool ignoreCamelCase)
17 : QObject(parent)
18 , _updateRateMSecs(updateRateMsecs)
19 , _ignoreCamelCase(ignoreCamelCase)
20{
21 // qCDebug(FactGroupLog) << Q_FUNC_INFO << this;
22 _setupTimer();
23}
24
25FactGroup::~FactGroup()
26{
27 // qCDebug(FactGroupLog) << Q_FUNC_INFO << this;
28}
29
30void FactGroup::_loadFromJsonArray(const QJsonArray &jsonArray)
31{
32 QMap<QString, QString> defineMap;
34}
35
36void FactGroup::_setupTimer()
37{
38 if (_updateRateMSecs > 0) {
39 (void) connect(&_updateTimer, &QTimer::timeout, this, &FactGroup::_updateAllValues);
40 _updateTimer.setSingleShot(false);
41 _updateTimer.setInterval(_updateRateMSecs);
42 _updateTimer.start();
43 }
44}
45
46bool FactGroup::factExists(const QString &name) const
47{
48 if (name.contains(".")) {
49 const QStringList parts = name.split(".");
50 if (parts.count() != 2) {
51 qCWarning(FactGroupLog) << "Only single level of hierarchy supported";
52 return false;
53 }
54
55 FactGroup *const factGroup = getFactGroup(parts[0]);
56 if (!factGroup) {
57 qCWarning(FactGroupLog) << "Unknown FactGroup" << parts[0];
58 return false;
59 }
60
61 return factGroup->factExists(parts[1]);
62 }
63
64 const QString camelCaseName = _ignoreCamelCase ? name : _camelCase(name);
65
66 return _nameToFactMap.contains(camelCaseName);
67}
68
69Fact *FactGroup::getFact(const QString &name) const
70{
71 if (name.contains(".")) {
72 const QStringList parts = name.split(".");
73 if (parts.count() != 2) {
74 qCWarning(FactGroupLog) << "Only single level of hierarchy supported";
75 return nullptr;
76 }
77
78 FactGroup *const factGroup = getFactGroup(parts[0]);
79 if (!factGroup) {
80 qCWarning(FactGroupLog) << "Unknown FactGroup" << parts[0];
81 return nullptr;
82 }
83
84 return factGroup->getFact(parts[1]);
85 }
86
87 Fact *fact = nullptr;
88 const QString camelCaseName = _ignoreCamelCase ? name : _camelCase(name);
89
90 if (_nameToFactMap.contains(camelCaseName)) {
91 fact = _nameToFactMap[camelCaseName];
92 } else {
93 qCWarning(FactGroupLog) << "Unknown Fact" << camelCaseName;
94 }
95
96 return fact;
97}
98
99FactGroup *FactGroup::getFactGroup(const QString &name) const
100{
101 FactGroup * factGroup = nullptr;
102 const QString camelCaseName = _ignoreCamelCase ? name : _camelCase(name);
103
104 if (_nameToFactGroupMap.contains(camelCaseName)) {
105 factGroup = _nameToFactGroupMap[camelCaseName];
106 } else {
107 qCWarning(FactGroupLog) << "Unknown FactGroup" << camelCaseName;
108 }
109
110 return factGroup;
111}
112
113void FactGroup::_addFact(Fact *fact, const QString &name)
114{
115 if (_nameToFactMap.contains(name)) {
116 qCWarning(FactGroupLog) << "Duplicate Fact" << name;
117 return;
118 }
119
120 fact->setSendValueChangedSignals(_updateRateMSecs == 0);
121 if (_nameToFactMetaDataMap.contains(name)) {
122 fact->setMetaData(_nameToFactMetaDataMap[name], true /* setDefaultFromMetaData */);
123 }
124 _nameToFactMap[name] = fact;
125 _factNames.append(name);
126
127 emit factNamesChanged();
128}
129
130void FactGroup::_addFactGroup(FactGroup *factGroup, const QString &name)
131{
132 if (_nameToFactGroupMap.contains(name)) {
133 qCWarning(FactGroupLog) << "Duplicate FactGroup" << name;
134 return;
135 }
136
137 _nameToFactGroupMap[name] = factGroup;
138
140}
141
143{
144 for (Fact *fact: _nameToFactMap) {
145 fact->sendDeferredValueChangedSignal();
146 }
147}
148
149void FactGroup::setLiveUpdates(bool liveUpdates)
150{
151 if (_updateTimer.interval() == 0) {
152 return;
153 }
154
155 if (liveUpdates) {
156 _updateTimer.stop();
157 } else {
158 _updateTimer.start();
159 }
160
161 for (Fact *fact: _nameToFactMap) {
162 fact->setSendValueChangedSignals(liveUpdates);
163 }
164}
165
166
167QString FactGroup::_camelCase(const QString &text)
168{
169 return (text[0].toLower() + text.right(text.length() - 1));
170}
171
172void FactGroup::_setTelemetryAvailable (bool telemetryAvailable)
173{
174 if (telemetryAvailable != _telemetryAvailable) {
175 _telemetryAvailable = telemetryAvailable;
176 emit telemetryAvailableChanged(_telemetryAvailable);
177 }
178}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Used to group Facts together into an object hierarachy.
Definition FactGroup.h:19
QMap< QString, Fact * > _nameToFactMap
Definition FactGroup.h:72
void telemetryAvailableChanged(bool telemetryAvailable)
QMap< QString, FactMetaData * > _nameToFactMetaDataMap
Definition FactGroup.h:74
virtual void _updateAllValues()
Definition FactGroup.cc:142
void _setTelemetryAvailable(bool telemetryAvailable)
Definition FactGroup.cc:172
void factGroupNamesChanged()
void _addFactGroup(FactGroup *factGroup, const QString &name)
Definition FactGroup.cc:130
void factNamesChanged()
QMap< QString, FactGroup * > _nameToFactGroupMap
Definition FactGroup.h:73
QStringList _factNames
Definition FactGroup.h:75
void _addFact(Fact *fact, const QString &name)
Definition FactGroup.cc:113
const int _updateRateMSecs
Update rate for Fact::valueChanged signals, 0: immediate update.
Definition FactGroup.h:70
void _loadFromJsonArray(const QJsonArray &jsonArray)
Definition FactGroup.cc:30
static QMap< QString, FactMetaData * > createMapFromJsonFile(const QString &jsonFilename, QObject *metaDataParent)
static QMap< QString, FactMetaData * > createMapFromJsonArray(const QJsonArray &jsonArray, const DefineMap_t &defineMap, QObject *metaDataParent)
A Fact is used to hold a single value within the system.
Definition Fact.h:19