QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
JoystickConfigController.cc
Go to the documentation of this file.
2#include "Fact.h"
3#include "ParameterManager.h"
4#include "QGCApplication.h"
6#include "Vehicle.h"
7
8#include <QtCore/QSettings>
9
10QGC_LOGGING_CATEGORY(JoystickConfigControllerLog, "AutoPilotPlugins.JoystickConfigController")
11QGC_LOGGING_CATEGORY(JoystickConfigControllerVerboseLog, "AutoPilotPlugins.JoystickConfigController:verbose")
12
15{
16 // Channel values are based on -32768:32767 range from SDL
17
18 _calCenterPoint = 0;
19 _calDefaultMinValue = -32768;
20 _calDefaultMaxValue = 32767;
21 _calRoughCenterDelta = 700;
22 _calMoveDelta = 32768/2;
23 _calSettleDelta = 1000;
24 _stickDetectSettleMSecs = 300;
25
26 int valueRange = _calDefaultMaxValue - _calDefaultMinValue;
27 _calValidMinValue = _calDefaultMinValue + (valueRange * 0.3f);
28 _calValidMaxValue = _calDefaultMaxValue - (valueRange * 0.3f);
29}
30
32{
33 if (_joystick) {
34 _joystick->_stopPollingForConfiguration();
35 }
36}
37
39{
40 if (!_joystick) {
41 qCWarning(JoystickConfigControllerLog) << "No joystick set!";
42 return;
43 }
44
45 qCDebug(JoystickConfigControllerLog) << "Starting joystick configuration for joystick:" << _joystick->name();
46 RemoteControlCalibrationController::start();
47 _joystick->_startPollingForConfiguration();
48}
49
50void JoystickConfigController::_setJoystick(Joystick* joystick)
51{
52 if (!joystick) {
53 qCWarning(JoystickConfigControllerLog) << "Cannot set joystick: null joystick";
54 return;
55 }
56 if (_joystick) {
57 qCWarning(JoystickConfigControllerLog) << "Joystick should only be set a single time";
58 return;
59 }
60
61 _joystick = joystick;
62 _readStoredCalibrationValues();
64
65 // Connect to settings changes to emit extension enabled signals
66 connect(_joystick->settings()->enableManualControlPitchExtension(), &Fact::rawValueChanged, this, [this]() {
67 emit pitchExtensionEnabledChanged(pitchExtensionEnabled());
68 emit anyExtensionEnabledChanged(anyExtensionEnabled());
69 });
70 connect(_joystick->settings()->enableManualControlRollExtension(), &Fact::rawValueChanged, this, [this]() {
71 emit rollExtensionEnabledChanged(rollExtensionEnabled());
72 emit anyExtensionEnabledChanged(anyExtensionEnabled());
73 });
74 connect(_joystick->settings()->enableManualControlAux1(), &Fact::rawValueChanged, this, [this]() {
75 emit aux1ExtensionEnabledChanged(aux1ExtensionEnabled());
76 emit anyExtensionEnabledChanged(anyExtensionEnabled());
77 });
78 connect(_joystick->settings()->enableManualControlAux2(), &Fact::rawValueChanged, this, [this]() {
79 emit aux2ExtensionEnabledChanged(aux2ExtensionEnabled());
80 emit anyExtensionEnabledChanged(anyExtensionEnabled());
81 });
82 connect(_joystick->settings()->enableManualControlAux3(), &Fact::rawValueChanged, this, [this]() {
83 emit aux3ExtensionEnabledChanged(aux3ExtensionEnabled());
84 emit anyExtensionEnabledChanged(anyExtensionEnabled());
85 });
86 connect(_joystick->settings()->enableManualControlAux4(), &Fact::rawValueChanged, this, [this]() {
87 emit aux4ExtensionEnabledChanged(aux4ExtensionEnabled());
88 emit anyExtensionEnabledChanged(anyExtensionEnabled());
89 });
90 connect(_joystick->settings()->enableManualControlAux5(), &Fact::rawValueChanged, this, [this]() {
91 emit aux5ExtensionEnabledChanged(aux5ExtensionEnabled());
92 emit anyExtensionEnabledChanged(anyExtensionEnabled());
93 });
94 connect(_joystick->settings()->enableManualControlAux6(), &Fact::rawValueChanged, this, [this]() {
95 emit aux6ExtensionEnabledChanged(aux6ExtensionEnabled());
96 emit anyExtensionEnabledChanged(anyExtensionEnabled());
97 });
98
99 emit joystickChanged(_joystick);
100}
101
102void JoystickConfigController::_saveStoredCalibrationValues()
103{
104 if (!_joystick) {
105 qCWarning(JoystickConfigControllerLog) << "Internal Error: No joystick to save calibration for";
106 return;
107 }
108
109 qCDebug(JoystickConfigControllerLog) << _joystick->name();
110
112
113 _joystick->settings()->calibrated()->setRawValue(true);
114 _joystick->settings()->transmitterMode()->setRawValue(transmitterMode());
115
116 for (int chan = 0; chan < _joystick->axisCount(); chan++) {
117 ChannelInfo *const channelInfo = &_rgChannelInfo[chan];
118 Joystick::AxisCalibration_t joystickAxisInfo;
119
120 qCDebug(JoystickConfigControllerLog)
121 << "chan:" << chan
122 << "function:" << _stickFunctionToString(channelInfo->stickFunction)
123 << "min:" << channelInfo->channelMin
124 << "max:" << channelInfo->channelMax
125 << "trim:" << channelInfo->channelTrim
126 << "reversed:" << channelInfo->channelReversed
127 << "deadband:" << channelInfo->deadband;
128
129 joystickAxisInfo.center = channelInfo->channelTrim;
130 joystickAxisInfo.min = channelInfo->channelMin;
131 joystickAxisInfo.max = channelInfo->channelMax;
132 joystickAxisInfo.reversed = channelInfo->channelReversed;
133 joystickAxisInfo.deadband = channelInfo->deadband;
134 _joystick->setAxisCalibration(chan, joystickAxisInfo);
135
136 _joystick->setFunctionForChannel(channelInfo->stickFunction, chan);
137 }
138
139 _joystick->_saveFromCalibrationDataIntoSettings();
140
141 // Read back since validation may have changed values
142 _readStoredCalibrationValues();
143}
144
145void JoystickConfigController::_readStoredCalibrationValues()
146{
147 if (!_joystick) {
148 qCWarning(JoystickConfigControllerLog) << "Internal Error: No joystick to read calibration for";
149 return;
150 }
151
152 setTransmitterMode(_joystick->settings()->transmitterMode()->rawValue().toInt());
153
154 // Initialize all function mappings to not set
155 for (int i = 0; i < _chanMax; i++) {
156 ChannelInfo *const info = &_rgChannelInfo[i];
157 info->stickFunction = stickFunctionMax;
158 }
159 for (size_t i = 0; i < stickFunctionMax; i++) {
161 }
162
163 for (int i = 0; i < _joystick->axisCount(); ++i) {
164 ChannelInfo *const info = &_rgChannelInfo[i];
165 Joystick::AxisCalibration_t calibration = _joystick->getAxisCalibration(i);
166
167 info->channelTrim = calibration.center;
168 info->channelMin = calibration.min;
169 info->channelMax = calibration.max;
170 info->channelReversed = calibration.reversed;
171 info->deadband = calibration.deadband;
172 }
173
174 for (int stickFunctionInt = 0; stickFunctionInt < Joystick::maxAxisFunction; stickFunctionInt++) {
175 auto stickFunction = static_cast<StickFunction>(stickFunctionInt);
176 int functionChannel = _joystick->getChannelForFunction(stickFunction);
177 if (functionChannel >= 0 && functionChannel < _chanMax) {
178 _rgFunctionChannelMapping[stickFunction] = functionChannel;
179 _rgChannelInfo[functionChannel].stickFunction = stickFunction;
180 }
181 }
182
184}
185
186
187bool JoystickConfigController::_stickFunctionEnabled(StickFunction stickFunction)
188{
190 return true;
191 }
192
193 switch (stickFunction) {
194 case stickFunctionRollExtension:
195 return _joystick->settings()->enableManualControlRollExtension()->rawValue().toBool();
196 case stickFunctionPitchExtension:
197 return _joystick->settings()->enableManualControlPitchExtension()->rawValue().toBool();
198 case stickFunctionAux1Extension:
199 return _joystick->settings()->enableManualControlAux1()->rawValue().toBool();
200 case stickFunctionAux2Extension:
201 return _joystick->settings()->enableManualControlAux2()->rawValue().toBool();
202 case stickFunctionAux3Extension:
203 return _joystick->settings()->enableManualControlAux3()->rawValue().toBool();
204 case stickFunctionAux4Extension:
205 return _joystick->settings()->enableManualControlAux4()->rawValue().toBool();
206 case stickFunctionAux5Extension:
207 return _joystick->settings()->enableManualControlAux5()->rawValue().toBool();
208 case stickFunctionAux6Extension:
209 return _joystick->settings()->enableManualControlAux6()->rawValue().toBool();
210 case stickFunctionRoll:
211 case stickFunctionPitch:
212 case stickFunctionYaw:
213 case stickFunctionThrottle:
215 case stickFunctionMax:
216 qCWarning(JoystickConfigControllerLog) << "Invalid stick function requested: stickFunctionMax";
217 break;
218 }
219
220 return false;
221}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void rawValueChanged(const QVariant &value)
void joystickChanged(Joystick *joystick)
Joystick *joystick READ joystick WRITE _setJoystick NOTIFY joystickChanged REQUIRED Joystick * joystick() const
Fact *enableManualControlAux2 READ enableManualControlAux2 CONSTANT Fact * enableManualControlAux2()
Fact *transmitterMode READ transmitterMode CONSTANT Fact * transmitterMode()
Fact *enableManualControlAux6 READ enableManualControlAux6 CONSTANT Fact * enableManualControlAux6()
Fact *calibrated READ calibrated CONSTANT Fact * calibrated()
Fact *enableManualControlRollExtension READ enableManualControlRollExtension CONSTANT Fact * enableManualControlRollExtension()
Fact *enableManualControlPitchExtension READ enableManualControlPitchExtension CONSTANT Fact * enableManualControlPitchExtension()
Fact *enableManualControlAux3 READ enableManualControlAux3 CONSTANT Fact * enableManualControlAux3()
Fact *enableManualControlAux4 READ enableManualControlAux4 CONSTANT Fact * enableManualControlAux4()
Fact *enableManualControlAux5 READ enableManualControlAux5 CONSTANT Fact * enableManualControlAux5()
Fact *enableManualControlAux1 READ enableManualControlAux1 CONSTANT Fact * enableManualControlAux1()
@ maxAxisFunction
Definition Joystick.h:143
QString name() const
Definition Joystick.h:198
void setFunctionForChannel(RemoteControlCalibrationController::StickFunction stickFunction, int channel)
Definition Joystick.cc:1294
int getChannelForFunction(RemoteControlCalibrationController::StickFunction stickFunction) const
Definition Joystick.cc:1299
QString name READ name int axisCount
Definition Joystick.h:101
Joystick::AxisCalibration_t getAxisCalibration(int axis) const
Definition Joystick.cc:1191
void setAxisCalibration(int axis, const AxisCalibration_t &calibration)
Definition Joystick.cc:1182
JoystickSettings * settings()
Definition Joystick.h:197
void rawChannelValuesChanged(QVector< int > channelValues)
Signalled during PollingForConfiguration.
Abstract base class for calibrating RC and Joystick controller.
QString _stickFunctionToString(StickFunction stickFunction)
void rawChannelValuesChanged(QVector< int > channelValues)
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.
enum StickFunction stickFunction
Function mapped to this channel, stickFunctionMax for none.