QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
JoystickConfigController.cc
Go to the documentation of this file.
2
3#include "Fact.h"
4#include "Joystick.h"
5#include "ParameterManager.h"
7#include "Vehicle.h"
8
9#include <QtCore/QSettings>
10
11QGC_LOGGING_CATEGORY(JoystickConfigControllerLog, "AutoPilotPlugins.JoystickConfigController")
12QGC_LOGGING_CATEGORY(JoystickConfigControllerVerboseLog, "AutoPilotPlugins.JoystickConfigController:verbose")
13
16{
17 // Channel values are based on -32768:32767 range from SDL
18
19 _calCenterPoint = 0;
20 _calDefaultMinValue = -32768;
21 _calDefaultMaxValue = 32767;
22 _calRoughCenterDelta = 700;
23 _calMoveDelta = 32768/2;
24 _calSettleDelta = 1000;
25 _stickDetectSettleMSecs = 300;
26
27 int valueRange = _calDefaultMaxValue - _calDefaultMinValue;
28 _calValidMinValue = _calDefaultMinValue + (valueRange * 0.3f);
29 _calValidMaxValue = _calDefaultMaxValue - (valueRange * 0.3f);
30}
31
33{
34 if (_joystick) {
35 _joystick->_stopPollingForConfiguration();
36 }
37}
38
40{
41 if (!_joystick) {
42 qCWarning(JoystickConfigControllerLog) << "No joystick set!";
43 return;
44 }
45
46 qCDebug(JoystickConfigControllerLog) << "Starting joystick configuration for joystick:" << _joystick->name();
48 _joystick->_startPollingForConfiguration();
49}
50
51void JoystickConfigController::_setJoystick(Joystick* joystick)
52{
53 if (!joystick) {
54 qCWarning(JoystickConfigControllerLog) << "Cannot set joystick: null joystick";
55 return;
56 }
57 if (_joystick) {
58 qCWarning(JoystickConfigControllerLog) << "Joystick should only be set a single time";
59 return;
60 }
61
62 _joystick = joystick;
63 _readStoredCalibrationValues();
65
66 // Connect to settings changes to emit extension enabled signals
67 connect(_joystick->settings()->enableManualControlPitchExtension(), &Fact::rawValueChanged, this, [this]() {
68 emit pitchExtensionEnabledChanged(pitchExtensionEnabled());
69 });
70 connect(_joystick->settings()->enableManualControlRollExtension(), &Fact::rawValueChanged, this, [this]() {
71 emit rollExtensionEnabledChanged(rollExtensionEnabled());
72 });
73 connect(_joystick->settings()->enableAdditionalAxis1(), &Fact::rawValueChanged, this, [this]() {
74 emit additionalAxis1EnabledChanged(additionalAxis1Enabled());
75 });
76 connect(_joystick->settings()->enableAdditionalAxis2(), &Fact::rawValueChanged, this, [this]() {
77 emit additionalAxis2EnabledChanged(additionalAxis2Enabled());
78 });
79 connect(_joystick->settings()->enableAdditionalAxis3(), &Fact::rawValueChanged, this, [this]() {
80 emit additionalAxis3EnabledChanged(additionalAxis3Enabled());
81 });
82 connect(_joystick->settings()->enableAdditionalAxis4(), &Fact::rawValueChanged, this, [this]() {
83 emit additionalAxis4EnabledChanged(additionalAxis4Enabled());
84 });
85 connect(_joystick->settings()->enableAdditionalAxis5(), &Fact::rawValueChanged, this, [this]() {
86 emit additionalAxis5EnabledChanged(additionalAxis5Enabled());
87 });
88 connect(_joystick->settings()->enableAdditionalAxis6(), &Fact::rawValueChanged, this, [this]() {
89 emit additionalAxis6EnabledChanged(additionalAxis6Enabled());
90 });
91
92 emit joystickChanged(_joystick);
93}
94
95void JoystickConfigController::_saveStoredCalibrationValues()
96{
97 if (!_joystick) {
98 qCWarning(JoystickConfigControllerLog) << "Internal Error: No joystick to save calibration for";
99 return;
100 }
101
102 qCDebug(JoystickConfigControllerLog) << _joystick->name();
103
105
106 _joystick->settings()->calibrated()->setRawValue(true);
107 _joystick->settings()->transmitterMode()->setRawValue(transmitterMode());
108
109 for (int chan = 0; chan < _joystick->axisCount(); chan++) {
110 ChannelInfo *const channelInfo = &_rgChannelInfo[chan];
111 Joystick::AxisCalibration_t joystickAxisInfo;
112
113 qCDebug(JoystickConfigControllerLog)
114 << "chan:" << chan
115 << "function:" << _stickFunctionToString(channelInfo->stickFunction)
116 << "min:" << channelInfo->channelMin
117 << "max:" << channelInfo->channelMax
118 << "trim:" << channelInfo->channelTrim
119 << "reversed:" << channelInfo->channelReversed
120 << "deadband:" << channelInfo->deadband;
121
122 joystickAxisInfo.center = channelInfo->channelTrim;
123 joystickAxisInfo.min = channelInfo->channelMin;
124 joystickAxisInfo.max = channelInfo->channelMax;
125 joystickAxisInfo.reversed = channelInfo->channelReversed;
126 joystickAxisInfo.deadband = channelInfo->deadband;
127 _joystick->setAxisCalibration(chan, joystickAxisInfo);
128
129 _joystick->setFunctionForChannel(channelInfo->stickFunction, chan);
130 }
131
132 _joystick->_saveFromCalibrationDataIntoSettings();
133
134 // Read back since validation may have changed values
135 _readStoredCalibrationValues();
136}
137
138void JoystickConfigController::_readStoredCalibrationValues()
139{
140 if (!_joystick) {
141 qCWarning(JoystickConfigControllerLog) << "Internal Error: No joystick to read calibration for";
142 return;
143 }
144
145 setTransmitterMode(_joystick->settings()->transmitterMode()->rawValue().toInt());
146
147 // Initialize all function mappings to not set
148 for (int i = 0; i < _chanMax; i++) {
149 ChannelInfo *const info = &_rgChannelInfo[i];
151 }
152 for (size_t i = 0; i < stickFunctionMax; i++) {
154 }
155
156 for (int i = 0; i < _joystick->axisCount(); ++i) {
157 ChannelInfo *const info = &_rgChannelInfo[i];
158 Joystick::AxisCalibration_t calibration = _joystick->getAxisCalibration(i);
159
160 info->channelTrim = calibration.center;
161 info->channelMin = calibration.min;
162 info->channelMax = calibration.max;
163 info->channelReversed = calibration.reversed;
164 info->deadband = calibration.deadband;
165 }
166
167 for (int stickFunctionInt = 0; stickFunctionInt < Joystick::maxAxisFunction; stickFunctionInt++) {
168 auto stickFunction = static_cast<StickFunction>(stickFunctionInt);
169 int functionChannel = _joystick->getChannelForFunction(stickFunction);
170 if (functionChannel >= 0 && functionChannel < _chanMax) {
171 _rgFunctionChannelMapping[stickFunction] = functionChannel;
172 _rgChannelInfo[functionChannel].stickFunction = stickFunction;
173 }
174 }
175
177}
178
179
180bool JoystickConfigController::_stickFunctionEnabled(StickFunction stickFunction)
181{
183 return true;
184 }
185
186 switch (stickFunction) {
188 return _joystick->settings()->enableManualControlRollExtension()->rawValue().toBool();
190 return _joystick->settings()->enableManualControlPitchExtension()->rawValue().toBool();
192 return _joystick->settings()->enableAdditionalAxis1()->rawValue().toBool();
194 return _joystick->settings()->enableAdditionalAxis2()->rawValue().toBool();
196 return _joystick->settings()->enableAdditionalAxis3()->rawValue().toBool();
198 return _joystick->settings()->enableAdditionalAxis4()->rawValue().toBool();
200 return _joystick->settings()->enableAdditionalAxis5()->rawValue().toBool();
202 return _joystick->settings()->enableAdditionalAxis6()->rawValue().toBool();
205 case stickFunctionYaw:
208 case stickFunctionMax:
209 qCWarning(JoystickConfigControllerLog) << "Invalid stick function requested: stickFunctionMax";
210 break;
211 }
212
213 return false;
214}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void rawValueChanged(const QVariant &value)
void joystickChanged(Joystick *joystick)
@ maxAxisFunction
Definition Joystick.h:150
QString name() const
Definition Joystick.h:205
void setFunctionForChannel(RemoteControlCalibrationController::StickFunction stickFunction, int channel)
Definition Joystick.cc:1472
int axisCount() const
Definition Joystick.h:207
int getChannelForFunction(RemoteControlCalibrationController::StickFunction stickFunction) const
Definition Joystick.cc:1477
Joystick::AxisCalibration_t getAxisCalibration(int axis) const
Definition Joystick.cc:1369
void setAxisCalibration(int axis, const AxisCalibration_t &calibration)
Definition Joystick.cc:1360
JoystickSettings * settings()
Definition Joystick.h:204
void rawChannelValuesChanged(QVector< int > channelValues)
Signalled during PollingForConfiguration.
Abstract base class for calibrating RC and Joystick controller.
QString _stickFunctionToString(StickFunction stickFunction)
StickFunction
These identify the various controls functions. They are also used as indices into the _rgFunctioInfo ...
static constexpr int _chanMax
A set of information associated with a radio channel.
virtual bool _stickFunctionEnabled(StickFunction stickFunction)
Returns true if the stick function is enabled.
ChannelInfo _rgChannelInfo[_chanMax]
Information associated with each rc channel.
int _rgFunctionChannelMapping[stickFunctionMax]
Maps from StickFunction to channel index. _chanMax indicates channel not set for this function.
void _rawChannelValuesChanged(QVector< int > channelValues)
enum StickFunction stickFunction
Function mapped to this channel, stickFunctionMax for none.