QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
Mixer.h
Go to the documentation of this file.
1#pragma once
2
3#include "Common.h"
5
6#include <QtCore/QObject>
7#include <QtCore/QString>
8#include <QtCore/QList>
9#include <QtCore/QMap>
10#include <QtCore/QSet>
11
12namespace Mixer {
13
14enum class Function {
20 AxisX,
21 AxisY,
22 AxisZ,
23 Type,
24};
25
32
37{
38 struct Values {
39 float min{};
40 float max{};
41 float defaultVal{};
42 bool reversible{};
43 };
44
48 QList<Parameter> perItemParams{};
50};
51
52using ActuatorTypes = QMap<QString, ActuatorType>;
53
58{
60 QString groupLabel{};
61 QString count{};
63 QString actuatorType{};
64 bool required{};
65 QList<Parameter> parameters{};
66 QList<MixerParameter> perItemParameters{};
67 QStringList itemLabelPrefix{};
68 };
69 QString option{};
70 QString type{};
71 QString title{};
72 QString helpUrl{};
73 QList<ActuatorGroup> actuators{};
74};
75
76using MixerOptions = QList<MixerOption>;
77
78struct Rule {
79 struct RuleItem {
80 bool hasMin{false};
81 bool hasMax{false};
82 bool hasDefault{false};
83
84 float min{};
85 float max{};
86 float defaultVal{};
87 bool hidden{false};
88 bool disabled{false};
89 };
91 QList<QString> applyIdentifiers;
92 QMap<int, QList<RuleItem>> items;
93};
94
95using Rules = QList<Rule>;
96
100class ConfigParameter : public QObject
101{
102 Q_OBJECT
103public:
104 ConfigParameter(QObject* parent, Fact* fact, const QString& label, bool advanced)
105 : QObject(parent), _fact(fact), _label(label), _advanced(advanced) {}
106
107 Q_PROPERTY(QString label READ label CONSTANT)
108 Q_PROPERTY(Fact* fact READ fact CONSTANT)
109 Q_PROPERTY(bool advanced READ advanced CONSTANT)
110
111 const QString& label() const { return _label; }
112 Fact* fact() { return _fact; }
113 bool advanced() const { return _advanced; }
114
115private:
116 Fact* _fact{nullptr};
117 const QString _label;
118 const bool _advanced;
119};
120
121class ChannelConfigInstance;
122
126class ChannelConfig : public QObject
127{
128 Q_OBJECT
129public:
130
131 ChannelConfig(QObject* parent, const MixerParameter& parameter, bool isActuatorTypeConfig=false)
132 : QObject(parent), _parameter(parameter), _isActuatorTypeConfig(isActuatorTypeConfig) {}
133
134 Q_PROPERTY(QString label READ label CONSTANT)
135 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
136 Q_PROPERTY(bool advanced READ advanced CONSTANT)
137
138 const QString& label() const { return _parameter.param.label; }
139 Function function() const { return _parameter.function; }
140 bool advanced() const { return _parameter.param.advanced; }
141 bool isActuatorTypeConfig() const { return _isActuatorTypeConfig; }
142
143 bool visible() const { return _visible; }
144
145 const QList<float>& fixedValues() const { return _parameter.values; }
146
148 int indexOffset() const { return _parameter.param.indexOffset; }
149
150 const QString& identifier() const { return _parameter.identifier; }
151
152 const MixerParameter& config() const { return _parameter; }
153
154 virtual ChannelConfigInstance* instantiate(int paramIndex, int actuatorTypeIndex,
155 ParameterManager* parameterManager, std::function<void(Function, Fact*)> factAddedCb);
156
157signals:
159protected:
161
162private slots:
163 void instanceVisibleChanged();
164
165private:
166 const MixerParameter _parameter;
167 const bool _isActuatorTypeConfig;
168 bool _visible{true};
169 QList<ChannelConfigInstance*> _instances;
170};
171
173{
174 Q_OBJECT
175public:
176 ChannelConfigVirtualAxis(QObject* parent, const MixerParameter& parameter)
177 : ChannelConfig(parent, parameter) {}
178
179 ChannelConfigInstance* instantiate(int paramIndex, int actuatorTypeIndex,
180 ParameterManager* parameterManager, std::function<void(Function, Fact*)> factAddedCb) override;
181private:
182};
183
187class ChannelConfigInstance : public QObject
188{
189 Q_OBJECT
190public:
191 ChannelConfigInstance(QObject* parent, Fact* fact, ChannelConfig& config)
192 : QObject(parent), _fact(fact), _config(config) {}
193
194 Q_PROPERTY(ChannelConfig* config READ channelConfig CONSTANT)
195 Q_PROPERTY(Fact* fact READ fact CONSTANT)
196 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
197 Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged)
198
199 ChannelConfig* channelConfig() const { return &_config; }
200
201 Fact* fact() { return _fact; }
202
203 bool visible() const { return _visibleRule && _visibleAxis; }
204 bool enabled() const { return _enabledRule; }
205
206 bool visibleRule() const { return _visibleRule; }
207 bool enabledRule() const { return _enabledRule; }
208
209 void setVisibleRule(bool visible) { _visibleRule = visible; emit visibleChanged(); }
210 void setEnabledRule(bool enabled) { _enabledRule = enabled; emit enabledChanged(); }
211
212 void setVisibleAxis(bool visible) { _visibleAxis = visible; emit visibleChanged(); }
213
214 int ruleApplyIdentifierIdx() const { return _ruleApplyIdentifierIdx; }
215 void setRuleApplyIdentifierIdx(int idx) { _ruleApplyIdentifierIdx = idx; }
216
217 virtual void allInstancesInitialized([[maybe_unused]] QmlObjectListModel* configInstances) {}
218
219signals:
222
223protected:
224 Fact* _fact{nullptr};
225
226private:
227 ChannelConfig& _config;
228 int _ruleApplyIdentifierIdx{-1};
229
230 bool _visibleRule{true};
231 bool _enabledRule{true};
232
233 bool _visibleAxis{true};
234};
235
237{
238 Q_OBJECT
239public:
240 enum class Direction {
241 Custom = 0,
242 Upwards = 1,
243 Downwards = 2,
244 Forwards = 3,
245 Backwards = 4,
246 Leftwards = 5,
247 Rightwards = 6,
248 };
250 : ChannelConfigInstance(parent, nullptr, config) {}
251
252 void allInstancesInitialized(QmlObjectListModel* configInstances) override;
253
254private slots:
255 void setFactFromAxes(bool keepVisible = false);
256 void setAxesFromFact();
257 void axisVisibleChanged();
258 void axisEnableChanged();
259
260private:
261 ChannelConfigInstance* _axes[3]{};
262 bool _ignoreChange{false};
263};
264
265class MixerChannel : public QObject
266{
267 Q_OBJECT
268public:
269 MixerChannel(QObject* parent, const QString& label, int actuatorFunction,
270 int paramIndex, int actuatorTypeIndex, QmlObjectListModel& channelConfigs, ParameterManager* parameterManager,
271 const Rule* rule, std::function<void(Function, Fact*)> factAddedCb);
272
273 Q_PROPERTY(QString label READ label CONSTANT)
275
276 const QString& label() const { return _label; }
277 int actuatorFunction() const { return _actuatorFunction; }
278
279 QmlObjectListModel* configInstances() { return _configInstances; }
280
281 bool getGeometry(const ActuatorTypes& actuatorTypes, const MixerOption::ActuatorGroup& group,
282 ActuatorGeometry& geometry) const;
283
284 Fact* getFact(Function function) const;
285
286public slots:
287 void applyRule(bool noConstraints = false);
288
289signals:
291
292private:
293
294 const QString _label;
295 const int _actuatorFunction;
296 const int _paramIndex;
297 const int _actuatorTypeIndex;
298 const Rule* _rule;
299
300 QmlObjectListModel* _configInstances = new QmlObjectListModel(this);
301 int _ruleSelectIdentifierIdx{-1};
302 int _currentSelectIdentifierValue{};
303 bool _applyingRule{false};
304};
305
306class MixerConfigGroup : public QObject
307{
308 Q_OBJECT
309public:
311 : QObject(parent), _group(group) {}
312
313 Q_PROPERTY(QString label READ label CONSTANT)
314 Q_PROPERTY(QmlObjectListModel* channels READ channels NOTIFY channelsChanged)
318
319 const QString& label() const { return _group.groupLabel; }
320
321 // per-channel-params
322 QmlObjectListModel* channelConfigs() { return _channelConfigs; }
323 void addChannelConfig(ChannelConfig* channelConfig);
324
325 QmlObjectListModel* channels() { return _channels; }
326 void addChannel(MixerChannel* channel);
327
328 ConfigParameter* countParam() const { return _countParam; }
329 void addConfigParam(ConfigParameter* param);
330 QmlObjectListModel* configParams() { return _params; }
331
332 void setCountParam(ConfigParameter* param) { delete _countParam; _countParam = param; }
333
334 const MixerOption::ActuatorGroup& group() const { return _group; }
335
336signals:
339
340private:
341 const MixerOption::ActuatorGroup& _group;
342 QmlObjectListModel* _channels = new QmlObjectListModel(this);
343 QmlObjectListModel* _channelConfigs = new QmlObjectListModel(this);
344
345 ConfigParameter* _countParam{nullptr};
346 QmlObjectListModel* _params = new QmlObjectListModel(this);
347};
348
349class Mixers : public QObject
350{
351 Q_OBJECT
352public:
353 Mixers(ParameterManager* parameterManager)
354 : _parameterManager(parameterManager) {}
355
357 QString label;
359 QString note;
361 QString actuatorType{};
362
363 operator QString() const { return label; }
364 };
365
366 void reset(const ActuatorTypes& actuatorTypes, const MixerOptions& mixerOptions,
367 const QMap<int, OutputFunction>& functions, const Rules& rules);
368
369 Q_PROPERTY(QmlObjectListModel* groups READ groups NOTIFY groupsChanged)
370 Q_PROPERTY(QString title READ title NOTIFY groupsChanged)
371 Q_PROPERTY(QString helpUrl READ helpUrl NOTIFY groupsChanged)
372
373 QmlObjectListModel* groups() { return _groups; }
374
375 QString title() const;
376 QString helpUrl() const;
377
378 const ActuatorTypes& actuatorTypes() const { return _actuatorTypes; }
379
387 QString getSpecificLabelForFunction(int function) const;
388
392 QSet<int> getFunctions(bool requiredOnly) const;
393
394 QString configuredType() const;
395
396 const QMap<int, OutputFunction>& functions() const { return _functions; }
397
398public slots:
399
403 void update();
404
405signals:
409
410private:
411
412 Fact* getFact(const QString& paramName);
413 void subscribeFact(Fact* fact, bool geometry=false);
414 void unsubscribeFacts();
415
416 QSet<Fact*> _subscribedFacts{};
417 QSet<Fact*> _subscribedFactsGeometry{};
418
419 ActuatorTypes _actuatorTypes;
420 MixerOptions _mixerOptions;
421 QMap<int, OutputFunction> _functions;
422
423 QList<Condition> _mixerConditions;
424 int _selectedMixer{-1};
425 QmlObjectListModel* _groups = new QmlObjectListModel(this);
426
427 QMap<int, QString> _functionsSpecificLabel;
428 ParameterManager* _parameterManager{nullptr};
429
430 Rules _rules;
431};
432
433} // namespace Mixer
A Fact is used to hold a single value within the system.
Definition Fact.h:19
void allInstancesInitialized(QmlObjectListModel *configInstances) override
Definition Mixer.cc:82
ChannelConfigInstanceVirtualAxis(QObject *parent, ChannelConfig &config)
Definition Mixer.h:249
bool visibleRule() const
Definition Mixer.h:206
int ruleApplyIdentifierIdx() const
Definition Mixer.h:214
void setVisibleAxis(bool visible)
Definition Mixer.h:212
virtual void allInstancesInitialized(QmlObjectListModel *configInstances)
Definition Mixer.h:217
ChannelConfigInstance(QObject *parent, Fact *fact, ChannelConfig &config)
Definition Mixer.h:191
void setRuleApplyIdentifierIdx(int idx)
Definition Mixer.h:215
ChannelConfig *config READ channelConfig CONSTANT(Fact *fact READ fact CONSTANT) 1(bool visible READ visible NOTIFY visibleChanged) 1(bool enabled READ enabled NOTIFY enabledChanged) ChannelConfig *channelConfig() const
Definition Mixer.h:195
bool enabledRule() const
Definition Mixer.h:207
void setEnabledRule(bool enabled)
Definition Mixer.h:210
void setVisibleRule(bool visible)
Definition Mixer.h:209
ChannelConfigInstance * instantiate(int paramIndex, int actuatorTypeIndex, ParameterManager *parameterManager, std::function< void(Function, Fact *)> factAddedCb) override
Definition Mixer.cc:72
ChannelConfigVirtualAxis(QObject *parent, const MixerParameter &parameter)
Definition Mixer.h:176
bool visible() const
Definition Mixer.h:143
ChannelConfig(QObject *parent, const MixerParameter &parameter, bool isActuatorTypeConfig=false)
Definition Mixer.h:131
bool isActuatorTypeConfig() const
Definition Mixer.h:141
const MixerParameter & config() const
Definition Mixer.h:152
void channelInstanceCreated(ChannelConfigInstance *instance)
Definition Mixer.cc:50
Function function() const
Definition Mixer.h:139
int indexOffset() const
Definition Mixer.h:148
const QList< float > & fixedValues() const
Definition Mixer.h:145
QString label READ label CONSTANT(bool visible READ visible NOTIFY visibleChanged) 1(bool advanced READ advanced CONSTANT) const QString &label() const
Definition Mixer.h:135
Parameter::DisplayOption displayOption() const
Definition Mixer.h:147
const QString & identifier() const
Definition Mixer.h:150
virtual ChannelConfigInstance * instantiate(int paramIndex, int actuatorTypeIndex, ParameterManager *parameterManager, std::function< void(Function, Fact *)> factAddedCb)
Definition Mixer.cc:6
bool advanced() const
Definition Mixer.h:140
QString label READ label CONSTANT(Fact *fact READ fact CONSTANT) 1(bool advanced READ advanced CONSTANT) const QString &label() const
Definition Mixer.h:108
bool advanced() const
Definition Mixer.h:113
ConfigParameter(QObject *parent, Fact *fact, const QString &label, bool advanced)
Definition Mixer.h:104
int actuatorFunction() const
Definition Mixer.h:277
bool getGeometry(const ActuatorTypes &actuatorTypes, const MixerOption::ActuatorGroup &group, ActuatorGeometry &geometry) const
Definition Mixer.cc:313
void applyRule(bool noConstraints=false)
Definition Mixer.cc:260
Fact * getFact(Function function) const
Definition Mixer.cc:359
QString label READ label CONSTANT(QmlObjectListModel *configInstances READ configInstances NOTIFY configInstancesChanged) const QString &label() const
Definition Mixer.h:274
void configInstancesChanged()
QmlObjectListModel * configInstances()
Definition Mixer.h:279
QmlObjectListModel * channelConfigs()
Definition Mixer.h:322
const MixerOption::ActuatorGroup & group() const
Definition Mixer.h:334
void setCountParam(ConfigParameter *param)
Definition Mixer.h:332
QString label READ label CONSTANT(QmlObjectListModel *channels READ channels NOTIFY channelsChanged) 1(QmlObjectListModel *channelConfigs READ channelConfigs NOTIFY channelConfigsChanged) 1(ConfigParameter *countParam READ countParam CONSTANT) 1(QmlObjectListModel *configParams READ configParams CONSTANT) const QString &label() const
Definition Mixer.h:314
ConfigParameter * countParam() const
Definition Mixer.h:328
void addConfigParam(ConfigParameter *param)
Definition Mixer.cc:382
void addChannelConfig(ChannelConfig *channelConfig)
Definition Mixer.cc:370
QmlObjectListModel * channels()
Definition Mixer.h:325
void addChannel(MixerChannel *channel)
Definition Mixer.cc:376
QmlObjectListModel * configParams()
Definition Mixer.h:330
MixerConfigGroup(QObject *parent, const MixerOption::ActuatorGroup &group)
Definition Mixer.h:310
const ActuatorTypes & actuatorTypes() const
Definition Mixer.h:378
Mixers(ParameterManager *parameterManager)
Definition Mixer.h:353
QString configuredType() const
Definition Mixer.cc:600
void update()
Definition Mixer.cc:403
void groupsChanged()
const QMap< int, OutputFunction > & functions() const
Definition Mixer.h:396
void reset(const ActuatorTypes &actuatorTypes, const MixerOptions &mixerOptions, const QMap< int, OutputFunction > &functions, const Rules &rules)
Definition Mixer.cc:387
QString getSpecificLabelForFunction(int function) const
Definition Mixer.cc:539
QString title() const
Definition Mixer.cc:608
void geometryParamChanged()
void paramChanged()
QString helpUrl() const
Definition Mixer.cc:615
QSet< int > getFunctions(bool requiredOnly) const
Definition Mixer.cc:582
Definition Mixer.h:12
Function
Definition Mixer.h:14
@ SpinDirection
CCW = true or 1.
QList< Rule > Rules
Definition Mixer.h:95
QList< MixerOption > MixerOptions
Definition Mixer.h:76
QMap< QString, ActuatorType > ActuatorTypes
key is the group name, where 'DEFAULT' is the default group
Definition Mixer.h:52
QList< Parameter > perItemParams
Definition Mixer.h:48
QList< Parameter > parameters
Definition Mixer.h:65
QList< MixerParameter > perItemParameters
Definition Mixer.h:66
QString count
param to configure the amount. If empty, fixedCount is non-zero
Definition Mixer.h:61
QStringList itemLabelPrefix
size = either fixedCount or 1 or 0 items
Definition Mixer.h:67
bool required
if true, actuator has to be configured for a valid setup
Definition Mixer.h:64
QList< ActuatorGroup > actuators
Definition Mixer.h:73
QString title
Definition Mixer.h:71
QString type
Mixer type, e.g. multirotor.
Definition Mixer.h:70
QString helpUrl
Definition Mixer.h:72
QString option
Definition Mixer.h:69
Function function
Definition Mixer.h:28
QList< float > values
fixed values if not configurable (param.name == "")
Definition Mixer.h:30
Parameter param
Definition Mixer.h:27
QString identifier
optional identifier for rules
Definition Mixer.h:29
QList< QString > applyIdentifiers
Definition Mixer.h:91
QMap< int, QList< RuleItem > > items
Definition Mixer.h:92
QString selectIdentifier
Definition Mixer.h:90
DisplayOption displayOption
Definition Common.h:28
int indexOffset
extra offset to the ${i} index, or bitset shift offset
Definition Common.h:27
DisplayOption
Definition Common.h:19
QString label
Definition Common.h:25
bool advanced
whether this should only be shown as advanced option
Definition Common.h:29