QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
Joystick.h
Go to the documentation of this file.
1#pragma once
2
3#include "QGCMAVLink.h"
4
5#include <QtCore/QObject>
6#include <QtCore/QThread>
7#include <QtCore/QVariantMap>
8#include <QtGui/QVector3D>
9#include <QtQmlIntegration/QtQmlIntegration>
10
11#include <functional>
12#include <array>
13
15#include "JoystickSettings.h"
16
19class Vehicle;
20class JoystickManager;
22
24{
25public:
26 AssignedButtonAction(const QString &name, bool repeat);
27
28 QString actionName;
29 bool repeat = false;
30 QElapsedTimer buttonElapsedTimer;
31};
32
33class AvailableButtonAction : public QObject
34{
35 Q_OBJECT
36 Q_PROPERTY(QString action READ action CONSTANT)
37 Q_PROPERTY(bool canRepeat READ canRepeat CONSTANT)
38
39public:
40 AvailableButtonAction(const QString &actionName,
41 std::function<void()> onDown,
42 std::function<void()> onUp = nullptr,
43 std::function<void()> onRepeat = nullptr,
44 QObject *parent = nullptr);
45
46 const QString &action() const { return _actionName; }
47 bool canRepeat() const { return bool(_onRepeat); }
48 const std::function<void()> &onDown() const { return _onDown; }
49 const std::function<void()> &onRepeat() const { return _onRepeat; }
50 const std::function<void()> &onUp() const { return _onUp; }
51
52private:
53 const QString _actionName;
54 const std::function<void()> _onDown;
55 const std::function<void()> _onRepeat;
56 const std::function<void()> _onUp;
57};
58
59// There is only one Joystick instance active in the system at a time.
60// You get access to it through JoystickManager.
61// It is associated with a specific Vehicle instance.
62class Joystick : public QThread
63{
64 Q_OBJECT
65 QML_ELEMENT
66 QML_UNCREATABLE("")
67 Q_MOC_INCLUDE("QmlObjectListModel.h")
68 Q_MOC_INCLUDE("Vehicle.h")
69
70 friend class JoystickManager;
72#ifdef QGC_UNITTEST_BUILD
73 friend class JoystickTest;
74#endif
75
76public:
77 Q_PROPERTY(QString name READ name CONSTANT)
78 Q_PROPERTY(JoystickSettings* settings READ settings CONSTANT)
79 Q_PROPERTY(int axisCount READ axisCount CONSTANT)
80 Q_PROPERTY(int buttonCount READ buttonCount CONSTANT)
81 Q_PROPERTY(bool requiresCalibration READ requiresCalibration CONSTANT)
82 Q_PROPERTY(bool hasRumble READ hasRumble CONSTANT)
83 Q_PROPERTY(bool hasRumbleTriggers READ hasRumbleTriggers CONSTANT)
84 Q_PROPERTY(bool hasLED READ hasLED CONSTANT)
85 Q_PROPERTY(QString guid READ guid CONSTANT)
86 Q_PROPERTY(quint16 vendorId READ vendorId CONSTANT)
87 Q_PROPERTY(quint16 productId READ productId CONSTANT)
88 Q_PROPERTY(QString serial READ serial CONSTANT)
89 Q_PROPERTY(QString deviceType READ deviceType CONSTANT)
90 Q_PROPERTY(int playerIndex READ playerIndex WRITE setPlayerIndex NOTIFY playerIndexChanged)
91 Q_PROPERTY(int batteryPercent READ batteryPercent NOTIFY batteryStateChanged)
92 Q_PROPERTY(QString powerState READ powerState NOTIFY batteryStateChanged)
93 Q_PROPERTY(bool isGamepad READ isGamepad CONSTANT)
94 Q_PROPERTY(QString gamepadType READ gamepadType CONSTANT)
95 Q_PROPERTY(QString path READ path CONSTANT)
96 Q_PROPERTY(bool isVirtual READ isVirtual CONSTANT)
97 Q_PROPERTY(quint16 firmwareVersion READ firmwareVersion CONSTANT)
98 Q_PROPERTY(QString connectionType READ connectionType CONSTANT)
99 Q_PROPERTY(int ballCount READ ballCount CONSTANT)
101 Q_PROPERTY(QString disabledActionName READ disabledActionName CONSTANT)
103 Q_PROPERTY(QStringList buttonActions READ buttonActions NOTIFY buttonActionsChanged)
104 Q_PROPERTY(QString buttonActionNone READ buttonActionNone CONSTANT)
105 Q_PROPERTY(QString linkedGroupId READ linkedGroupId WRITE setLinkedGroupId NOTIFY linkedGroupChanged)
106 Q_PROPERTY(QString linkedGroupRole READ linkedGroupRole WRITE setLinkedGroupRole NOTIFY linkedGroupChanged)
107
108 Joystick(const QString &name, int axisCount, int buttonCount, int hatCount, QObject *parent = nullptr);
109 virtual ~Joystick();
110
111 static constexpr int AxisMin = -32768;
112 static constexpr int AxisMax = 32767;
113
120
124 int center = 0;
125 int deadband = 0;
126 bool reversed = false;
127
128 void reset() {
129 min = AxisMin;
130 max = AxisMax;
131 center = 0;
132 deadband = 0;
133 reversed = false;
134 }
135 };
136
152 static QString axisFunctionToString(AxisFunction_t function);
153
166 Q_ENUM(HatDirection)
167
168
186 Q_ENUM(GamepadButton)
187
188
197 Q_ENUM(GamepadAxis)
198
199 Q_INVOKABLE void setButtonRepeat(int button, bool repeat);
200 Q_INVOKABLE bool getButtonRepeat(int button);
201 Q_INVOKABLE void setButtonAction(int button, const QString &action);
202 Q_INVOKABLE QString getButtonAction(int button) const;
203
204 JoystickSettings* settings() { return &_joystickSettings; }
205 QString name() const { return _name; }
206 int buttonCount() const { return _totalButtonCount; }
207 int axisCount() const { return _axisCount; }
208 virtual bool requiresCalibration() const { return true; }
209 virtual bool hasRumble() const { return false; }
210 virtual bool hasRumbleTriggers() const { return false; }
211 virtual bool hasLED() const { return false; }
212 virtual QString guid() const { return QString(); }
213 virtual quint16 vendorId() const { return 0; }
214 virtual quint16 productId() const { return 0; }
215 virtual QString serial() const { return QString(); }
216 virtual QString deviceType() const { return QString(); }
217 virtual int playerIndex() const { return -1; }
218 virtual void setPlayerIndex(int index) { Q_UNUSED(index); }
219 virtual int batteryPercent() const { return -1; }
220 virtual QString powerState() const { return QString(); }
221 virtual bool isGamepad() const { return false; }
222 virtual QString gamepadType() const { return QString(); }
223 virtual QString path() const { return QString(); }
224 virtual bool isVirtual() const { return false; }
225 virtual quint16 firmwareVersion() const { return 0; }
226 virtual QString connectionType() const { return QString(); }
227 virtual int ballCount() const { return 0; }
228
229 Q_INVOKABLE virtual void rumble(quint16 lowFreq, quint16 highFreq, quint32 durationMs) { Q_UNUSED(lowFreq); Q_UNUSED(highFreq); Q_UNUSED(durationMs); }
230 Q_INVOKABLE virtual void rumbleTriggers(quint16 left, quint16 right, quint32 durationMs) { Q_UNUSED(left); Q_UNUSED(right); Q_UNUSED(durationMs); }
231 Q_INVOKABLE virtual void setLED(quint8 red, quint8 green, quint8 blue) { Q_UNUSED(red); Q_UNUSED(green); Q_UNUSED(blue); }
232 Q_INVOKABLE virtual QString axisLabel(int axis) const { Q_UNUSED(axis); return QString(); }
233 Q_INVOKABLE virtual QString buttonLabel(int button) const { Q_UNUSED(button); return QString(); }
234 Q_INVOKABLE virtual QString getMapping() const { return QString(); }
235 Q_INVOKABLE virtual bool addMapping(const QString &mapping) { Q_UNUSED(mapping); return false; }
236
237 // Sensor support (gyroscope/accelerometer)
238 Q_INVOKABLE virtual bool hasGyroscope() const { return false; }
239 Q_INVOKABLE virtual bool hasAccelerometer() const { return false; }
240 Q_INVOKABLE virtual bool setGyroscopeEnabled(bool enabled) { Q_UNUSED(enabled); return false; }
241 Q_INVOKABLE virtual bool setAccelerometerEnabled(bool enabled) { Q_UNUSED(enabled); return false; }
242 Q_INVOKABLE virtual QVector3D gyroscopeData() const { return QVector3D(); }
243 Q_INVOKABLE virtual QVector3D accelerometerData() const { return QVector3D(); }
244 Q_INVOKABLE virtual float gyroscopeDataRate() const { return 0.0f; }
245 Q_INVOKABLE virtual float accelerometerDataRate() const { return 0.0f; }
246
247 // Touchpad support (PS4/PS5 controllers)
248 Q_INVOKABLE virtual int touchpadCount() const { return 0; }
249 Q_INVOKABLE virtual int touchpadFingerCount(int touchpad) const { Q_UNUSED(touchpad); return 0; }
250 Q_INVOKABLE virtual QVariantMap getTouchpadFinger(int touchpad, int finger) const {
251 Q_UNUSED(touchpad); Q_UNUSED(finger); return QVariantMap();
252 }
253
254 // Trackball support
255 Q_INVOKABLE virtual QVariantMap getBall(int ball) const { Q_UNUSED(ball); return QVariantMap(); }
256
257 // PS5 adaptive trigger effects
258 Q_INVOKABLE virtual bool sendEffect(const QByteArray &data) { Q_UNUSED(data); return false; }
259
260 // Binding queries (debug/UI)
261 Q_INVOKABLE virtual QVariantMap getAxisBinding(int axis) const { Q_UNUSED(axis); return QVariantMap(); }
262 Q_INVOKABLE virtual QVariantMap getButtonBinding(int button) const { Q_UNUSED(button); return QVariantMap(); }
263
264 // Capability queries
265 Q_INVOKABLE virtual bool hasButton(int button) const { Q_UNUSED(button); return false; }
266 Q_INVOKABLE virtual bool hasAxis(int axis) const { Q_UNUSED(axis); return false; }
267
268 // Real gamepad type (actual hardware vs mapped type)
269 Q_INVOKABLE virtual QString realGamepadType() const { return QString(); }
270
271 // Type-specific button labels (shows correct names for controller type, e.g., "Cross" vs "A")
272 Q_INVOKABLE virtual QString buttonLabelForType(int button) const { Q_UNUSED(button); return QString(); }
273
274 // Haptic/Force Feedback support
275 Q_INVOKABLE virtual bool hasHaptic() const { return false; }
276 Q_INVOKABLE virtual int hapticEffectsCount() const { return 0; }
277 Q_INVOKABLE virtual bool hapticRumbleSupported() const { return false; }
278 Q_INVOKABLE virtual bool hapticRumbleInit() { return false; }
279 Q_INVOKABLE virtual bool hapticRumblePlay(float strength, quint32 durationMs) { Q_UNUSED(strength); Q_UNUSED(durationMs); return false; }
280 Q_INVOKABLE virtual void hapticRumbleStop() {}
281
282 // Mapping for GUID (static in implementation)
283 Q_INVOKABLE virtual QString getMappingForGUID(const QString &guid) const { Q_UNUSED(guid); return QString(); }
284
285 // Virtual joystick control (for software-based joystick input)
286 Q_INVOKABLE virtual bool setVirtualAxis(int axis, int value) { Q_UNUSED(axis); Q_UNUSED(value); return false; }
287 Q_INVOKABLE virtual bool setVirtualButton(int button, bool down) { Q_UNUSED(button); Q_UNUSED(down); return false; }
288 Q_INVOKABLE virtual bool setVirtualHat(int hat, quint8 value) { Q_UNUSED(hat); Q_UNUSED(value); return false; }
289 Q_INVOKABLE virtual bool setVirtualBall(int ball, int dx, int dy) { Q_UNUSED(ball); Q_UNUSED(dx); Q_UNUSED(dy); return false; }
290 Q_INVOKABLE virtual bool setVirtualTouchpad(int touchpad, int finger, bool down, float x, float y, float pressure) {
291 Q_UNUSED(touchpad); Q_UNUSED(finger); Q_UNUSED(down); Q_UNUSED(x); Q_UNUSED(y); Q_UNUSED(pressure); return false;
292 }
293 Q_INVOKABLE virtual bool sendVirtualSensorData(int sensorType, float x, float y, float z) {
294 Q_UNUSED(sensorType); Q_UNUSED(x); Q_UNUSED(y); Q_UNUSED(z); return false;
295 }
296
297 // Properties/Capability detection
298 Q_INVOKABLE virtual bool hasMonoLED() const { return false; }
299 Q_INVOKABLE virtual bool hasRGBLED() const { return false; }
300 Q_INVOKABLE virtual bool hasPlayerLED() const { return false; }
301
302 // Connection state
303 Q_INVOKABLE virtual QString connectionState() const { return QString(); }
304
305 // Initial axis state (for drift detection) - returns {valid, value}
306 Q_INVOKABLE virtual QVariantMap getAxisInitialState(int axis) const { Q_UNUSED(axis); return QVariantMap(); }
307
308 // Per-device custom mapping
309 Q_INVOKABLE virtual bool setMapping(const QString &mapping) { Q_UNUSED(mapping); return false; }
310
311 QStringList buttonActions() const;
312 QString buttonActionNone() const { return _buttonActionNone; }
313 QString disabledActionName() const { return _buttonActionNone; }
314 const QmlObjectListModel *assignableActions() const { return _availableButtonActions; }
315 QStringList assignableActionTitles() const { return _availableActionTitles; }
316
318 QString linkedGroupId() const { return _linkedGroupId; }
319 void setLinkedGroupId(const QString &groupId);
320 QString linkedGroupRole() const { return _linkedGroupRole; }
321 void setLinkedGroupRole(const QString &role);
322
323 void setAxisCalibration(int axis, const AxisCalibration_t &calibration);
325
328
331
332 Q_INVOKABLE void startConfiguration();
333 Q_INVOKABLE void stopConfiguration();
334
335 void stop();
336
337signals:
342 void connectionStateChanged(const QString &newState);
344 void axisValues(float roll, float pitch, float yaw, float throttle);
345 void startContinuousZoom(int direction);
347 void stepZoom(int direction);
348 void startContinuousFocus(int direction);
350 void stepFocus(int direction);
351 void stepCamera(int direction);
352 void stepStream(int direction);
357 void gimbalPitchStart(int direction);
358 void gimbalYawStart(int direction);
362 void gimbalYawLock(bool lock);
363 void setArmed(bool arm);
364 void setVtolInFwdFlight(bool set);
365 void setFlightMode(const QString &flightMode);
367 void gripperAction(GRIPPER_ACTIONS gripperAction);
370 void motorInterlock(bool enable);
371 void unknownAction(const QString &action);
372 void vehicleJoystickData(float roll, float pitch, float yaw, float throttle, uint16_t buttonsLow, uint16_t buttonsHigh, float gimbalPitch, float gimbalYaw);
373 void rawChannelValuesChanged(QVector<int> channelValues);
374 void rawButtonPressedChanged(int index, bool pressed);
375
376 // Sensor event signals (for event-driven updates)
377 void gyroscopeDataUpdated(const QVector3D &data);
378 void accelerometerDataUpdated(const QVector3D &data);
379 void touchpadEvent(int touchpad, int finger, bool down, float x, float y, float pressure);
380
381 // Additional event signals
384
385protected:
386 QString _name;
387 int _axisCount = 0;
389 int _hatCount = 0;
390
391private slots:
392 void _flightModesChanged() { _buildAvailableButtonsActionList(_pollingVehicle); }
393
394private:
395 enum PollingFlag {
396 PollingNone = 0x0,
397 PollingForVehicle = 0x1,
398 PollingForConfiguration = 0x2,
399 };
400 using PollingFlags = QFlags<PollingFlag>;
401
402 using AxisFunctionMap_t = QMap<AxisFunction_t, int>;
403
404 virtual bool _open() = 0;
405 virtual void _close() = 0;
406 virtual bool _update() = 0;
407
408 virtual bool _getButton(int i) const = 0;
409 virtual int _getAxisValue(int axis) const = 0;
410 virtual bool _getHat(int hat, int i) const = 0;
411
412 void run() override;
413
414 void _startPollingForVehicle(Vehicle &vehicle);
415 void _startPollingForActiveVehicle();
416 void _startPollingForConfiguration();
417 void _stopPollingForConfiguration();
418 void _stopAllPollingForVehicle();
419 void _startPollingThread();
420 void _stopPollingThread();
421 QString _pollingFlagsToString(PollingFlags flags) const;
422 PollingFlags _pollingFlags = PollingNone;
423
424 Vehicle* _pollingVehicle = nullptr;
425
426 void _resetFunctionToAxisMap();
427 void _resetAxisCalibrationData();
428 void _resetButtonActionData();
429 void _resetButtonEventStates();
430
431 void _foundInvalidAxisSettingsCleanup();
432
433 void _loadButtonSettings();
434 void _loadAxisSettings(bool joystickCalibrated, int transmitterMode);
435 void _saveButtonSettings();
436 void _saveAxisSettings(int transmitterMode);
437 void _loadFromSettingsIntoCalibrationData();
438 void _saveFromCalibrationDataIntoSettings();
439 void _clearAxisSettings();
440 void _clearButtonSettings();
441
443 float _adjustRange(int reversedAxisValue, const AxisCalibration_t &calibration, bool withDeadbands);
444 uint16_t _adjustRangeToRcOverridePwm(int value, const AxisCalibration_t &calibration, bool withDeadbands);
445
446 void _executeButtonAction(const QString &action, const ButtonEvent_t buttonEvent);
447 int _findAvailableButtonActionIndex(const QString &action);
448 bool _validAxis(int axis) const;
449 bool _validButton(int button) const;
450 void _handleAxis();
451 void _handleButtons();
452 void _buildAvailableButtonsActionList(Vehicle *vehicle);
453 AxisFunction_t _getAxisFunctionForJoystickAxis(int joystickAxis) const;
454 int _getJoystickAxisForAxisFunction(AxisFunction_t axisFunction) const;
455 void _setJoystickAxisForAxisFunction(AxisFunction_t axisFunction, int axis);
456 void _updateButtonEventState(int buttonIndex, const bool buttonPressed, ButtonEvent_t &buttonEventState);
457 void _updateButtonEventStates(QVector<ButtonEvent_t> &buttonEventStates);
458
460 void _remapFunctionsInFunctionMapToNewTransmittedMode(int fromMode, int toMode);
461
462 int _hatButtonCount = 0;
463 int _totalButtonCount = 0;
464 QVector<AxisCalibration_t> _rgCalibration;
465 QVector<ButtonEvent_t> _buttonEventStates;
466 QVector<AssignedButtonAction*> _assignedButtonActions;
467 MavlinkActionManager *_mavlinkActionManager = nullptr;
468 QmlObjectListModel *_availableButtonActions = nullptr;
469
470 JoystickManager* _joystickManager = nullptr;
471 JoystickSettings _joystickSettings;
472
473 AxisFunctionMap_t _axisFunctionToJoystickAxisMap;
474 static constexpr const int kJoystickAxisNotAssigned = -1;
475
476 QElapsedTimer _axisElapsedTimer;
477 QStringList _availableActionTitles;
478 std::atomic<bool> _exitPollingThread = false;
479
480 // HOTAS/Multi-device linking
481 QString _linkedGroupId;
482 QString _linkedGroupRole;
483
484 static constexpr const char *_buttonActionNone = QT_TR_NOOP("No Action");
485 static constexpr const char *_buttonActionArm = QT_TR_NOOP("Arm");
486 static constexpr const char *_buttonActionDisarm = QT_TR_NOOP("Disarm");
487 static constexpr const char *_buttonActionToggleArm = QT_TR_NOOP("Toggle Arm");
488 static constexpr const char *_buttonActionVTOLFixedWing = QT_TR_NOOP("VTOL: Fixed Wing");
489 static constexpr const char *_buttonActionVTOLMultiRotor = QT_TR_NOOP("VTOL: Multi-Rotor");
490 static constexpr const char *_buttonActionContinuousZoomIn = QT_TR_NOOP("Continuous Zoom In");
491 static constexpr const char *_buttonActionContinuousZoomOut = QT_TR_NOOP("Continuous Zoom Out");
492 static constexpr const char *_buttonActionStepZoomIn = QT_TR_NOOP("Step Zoom In");
493 static constexpr const char *_buttonActionStepZoomOut = QT_TR_NOOP("Step Zoom Out");
494 static constexpr const char *_buttonActionContinuousFocusIn = QT_TR_NOOP("Continuous Focus In");
495 static constexpr const char *_buttonActionContinuousFocusOut = QT_TR_NOOP("Continuous Focus Out");
496 static constexpr const char *_buttonActionStepFocusIn = QT_TR_NOOP("Step Focus In");
497 static constexpr const char *_buttonActionStepFocusOut = QT_TR_NOOP("Step Focus Out");
498 static constexpr const char *_buttonActionNextStream = QT_TR_NOOP("Next Video Stream");
499 static constexpr const char *_buttonActionPreviousStream = QT_TR_NOOP("Previous Video Stream");
500 static constexpr const char *_buttonActionNextCamera = QT_TR_NOOP("Next Camera");
501 static constexpr const char *_buttonActionPreviousCamera = QT_TR_NOOP("Previous Camera");
502 static constexpr const char *_buttonActionTriggerCamera = QT_TR_NOOP("Trigger Camera");
503 static constexpr const char *_buttonActionStartVideoRecord = QT_TR_NOOP("Start Recording Video");
504 static constexpr const char *_buttonActionStopVideoRecord = QT_TR_NOOP("Stop Recording Video");
505 static constexpr const char *_buttonActionToggleVideoRecord = QT_TR_NOOP("Toggle Recording Video");
506 static constexpr const char *_buttonActionGimbalDown = QT_TR_NOOP("Gimbal Down");
507 static constexpr const char *_buttonActionGimbalUp = QT_TR_NOOP("Gimbal Up");
508 static constexpr const char *_buttonActionGimbalLeft = QT_TR_NOOP("Gimbal Left");
509 static constexpr const char *_buttonActionGimbalRight = QT_TR_NOOP("Gimbal Right");
510 static constexpr const char *_buttonActionGimbalCenter = QT_TR_NOOP("Gimbal Center");
511 static constexpr const char *_buttonActionGimbalYawLock = QT_TR_NOOP("Gimbal Yaw Lock");
512 static constexpr const char *_buttonActionGimbalYawFollow = QT_TR_NOOP("Gimbal Yaw Follow");
513 static constexpr const char *_buttonActionEmergencyStop = QT_TR_NOOP("Emergency Stop");
514 static constexpr const char *_buttonActionGripperGrab = QT_TR_NOOP("Gripper Grab");
515 static constexpr const char *_buttonActionGripperRelease = QT_TR_NOOP("Gripper Release");
516 static constexpr const char *_buttonActionGripperHold = QT_TR_NOOP("Gripper Hold");
517 static constexpr const char *_buttonActionLandingGearDeploy= QT_TR_NOOP("Landing gear deploy");
518 static constexpr const char *_buttonActionLandingGearRetract= QT_TR_NOOP("Landing gear retract");
519 static constexpr const char *_buttonActionMotorInterlockEnable= QT_TR_NOOP("Motor Interlock enable");
520 static constexpr const char *_buttonActionMotorInterlockDisable= QT_TR_NOOP("Motor Interlock disable");
521
522};
QElapsedTimer buttonElapsedTimer
Definition Joystick.h:30
const std::function< void()> & onUp() const
Definition Joystick.h:50
const QString & action() const
Definition Joystick.h:46
const std::function< void()> & onDown() const
Definition Joystick.h:48
const std::function< void()> & onRepeat() const
Definition Joystick.h:49
bool canRepeat() const
Definition Joystick.h:47
virtual void setPlayerIndex(int index)
Definition Joystick.h:218
virtual Q_INVOKABLE QString getMappingForGUID(const QString &guid) const
Definition Joystick.h:283
void setLinkedGroupId(const QString &groupId)
Definition Joystick.cc:1884
virtual Q_INVOKABLE bool hasGyroscope() const
Definition Joystick.h:238
Q_INVOKABLE void stopConfiguration()
Tells the joystick that the configuration UI is being closed so it can do any special processing requ...
Definition Joystick.cc:1851
void rawButtonPressedChanged(int index, bool pressed)
Signalled during PollingForConfiguration.
virtual Q_INVOKABLE bool setAccelerometerEnabled(bool enabled)
Definition Joystick.h:241
virtual Q_INVOKABLE QVariantMap getButtonBinding(int button) const
Definition Joystick.h:262
virtual Q_INVOKABLE void setLED(quint8 red, quint8 green, quint8 blue)
Definition Joystick.h:231
virtual Q_INVOKABLE bool setMapping(const QString &mapping)
Definition Joystick.h:309
void setArmed(bool arm)
virtual Q_INVOKABLE bool setGyroscopeEnabled(bool enabled)
Definition Joystick.h:240
void gimbalYawLock(bool lock)
virtual bool hasRumbleTriggers() const
Definition Joystick.h:210
void touchpadEvent(int touchpad, int finger, bool down, float x, float y, float pressure)
virtual quint16 firmwareVersion() const
Definition Joystick.h:225
virtual int batteryPercent() const
Definition Joystick.h:219
int _buttonCount
Definition Joystick.h:388
virtual bool requiresCalibration() const
Definition Joystick.h:208
void triggerCamera()
QString linkedGroupId() const
HOTAS/Multi-device linking (devices with same groupId act as single joystick)
Definition Joystick.h:318
virtual int ballCount() const
Definition Joystick.h:227
virtual Q_INVOKABLE QString realGamepadType() const
Definition Joystick.h:269
virtual Q_INVOKABLE void hapticRumbleStop()
Definition Joystick.h:280
virtual Q_INVOKABLE float gyroscopeDataRate() const
Definition Joystick.h:244
virtual ~Joystick()
Definition Joystick.cc:165
virtual Q_INVOKABLE bool setVirtualButton(int button, bool down)
Definition Joystick.h:287
virtual Q_INVOKABLE QString connectionState() const
Definition Joystick.h:303
virtual Q_INVOKABLE bool setVirtualAxis(int axis, int value)
Definition Joystick.h:286
@ pitchExtensionFunction
Definition Joystick.h:142
@ additionalAxis2Function
Definition Joystick.h:145
@ rollFunction
Definition Joystick.h:138
@ yawFunction
Definition Joystick.h:140
@ additionalAxis6Function
Definition Joystick.h:149
@ additionalAxis3Function
Definition Joystick.h:146
@ additionalAxis4Function
Definition Joystick.h:147
@ maxAxisFunction
Definition Joystick.h:150
@ additionalAxis1Function
Definition Joystick.h:144
@ additionalAxis5Function
Definition Joystick.h:148
@ throttleFunction
Definition Joystick.h:141
@ rollExtensionFunction
Definition Joystick.h:143
@ pitchFunction
Definition Joystick.h:139
QString name() const
Definition Joystick.h:205
QString disabledActionName() const
Definition Joystick.h:313
virtual Q_INVOKABLE bool hasRGBLED() const
Definition Joystick.h:299
void mappingRemapped()
void batteryStateChanged()
void stopContinuousFocus()
virtual Q_INVOKABLE void rumble(quint16 lowFreq, quint16 highFreq, quint32 durationMs)
Definition Joystick.h:229
virtual QString deviceType() const
Definition Joystick.h:216
virtual Q_INVOKABLE bool sendEffect(const QByteArray &data)
Definition Joystick.h:258
virtual bool isVirtual() const
Definition Joystick.h:224
virtual Q_INVOKABLE bool setVirtualTouchpad(int touchpad, int finger, bool down, float x, float y, float pressure)
Definition Joystick.h:290
RemoteControlCalibrationController::StickFunction mapAxisFunctionToRCCStickFunction(AxisFunction_t axisFunction) const
Definition Joystick.cc:1406
void startVideoRecord()
virtual bool isGamepad() const
Definition Joystick.h:221
HatDirection
Standard gamepad hat/D-pad directions.
Definition Joystick.h:155
@ HatRightUp
Definition Joystick.h:161
@ HatLeftDown
Definition Joystick.h:164
@ HatRightDown
Definition Joystick.h:162
@ HatCentered
Definition Joystick.h:156
@ HatLeftUp
Definition Joystick.h:163
QString _name
Definition Joystick.h:386
int _hatCount
Definition Joystick.h:389
const QmlObjectListModel * assignableActions() const
Definition Joystick.h:314
virtual QString gamepadType() const
Definition Joystick.h:222
void setLinkedGroupRole(const QString &role)
Definition Joystick.cc:1905
void setFlightMode(const QString &flightMode)
virtual Q_INVOKABLE bool hapticRumblePlay(float strength, quint32 durationMs)
Definition Joystick.h:279
void motorInterlock(bool enable)
virtual Q_INVOKABLE QString buttonLabel(int button) const
Definition Joystick.h:233
static QString axisFunctionToString(AxisFunction_t function)
Definition Joystick.cc:1813
void setFunctionForChannel(RemoteControlCalibrationController::StickFunction stickFunction, int channel)
Definition Joystick.cc:1472
void updateComplete()
virtual Q_INVOKABLE void rumbleTriggers(quint16 left, quint16 right, quint32 durationMs)
Definition Joystick.h:230
virtual Q_INVOKABLE bool setVirtualHat(int hat, quint8 value)
Definition Joystick.h:288
void axisValues(float roll, float pitch, float yaw, float throttle)
void landingGearDeploy()
virtual Q_INVOKABLE QString axisLabel(int axis) const
Definition Joystick.h:232
void buttonActionsChanged()
void stop()
Definition Joystick.cc:1872
virtual Q_INVOKABLE bool hasButton(int button) const
Definition Joystick.h:265
int axisCount() const
Definition Joystick.h:207
@ ButtonEventDownTransition
Definition Joystick.h:116
@ ButtonEventNone
Definition Joystick.h:118
@ ButtonEventRepeat
Definition Joystick.h:117
@ ButtonEventUpTransition
Definition Joystick.h:115
void assignableActionsChanged()
virtual Q_INVOKABLE bool hasAccelerometer() const
Definition Joystick.h:239
static constexpr int AxisMin
Definition Joystick.h:111
virtual Q_INVOKABLE QVector3D accelerometerData() const
Definition Joystick.h:243
void centerGimbal()
void unknownAction(const QString &action)
void playerIndexChanged()
virtual quint16 vendorId() const
Definition Joystick.h:213
virtual Q_INVOKABLE QString getMapping() const
Definition Joystick.h:234
int getChannelForFunction(RemoteControlCalibrationController::StickFunction stickFunction) const
Definition Joystick.cc:1477
void vehicleJoystickData(float roll, float pitch, float yaw, float throttle, uint16_t buttonsLow, uint16_t buttonsHigh, float gimbalPitch, float gimbalYaw)
virtual Q_INVOKABLE QVariantMap getAxisBinding(int axis) const
Definition Joystick.h:261
virtual int playerIndex() const
Definition Joystick.h:217
Q_INVOKABLE QString getButtonAction(int button) const
Definition Joystick.cc:1559
virtual QString serial() const
Definition Joystick.h:215
void connectionStateChanged(const QString &newState)
void stopVideoRecord()
void stepZoom(int direction)
QStringList buttonActions() const
Definition Joystick.cc:1570
AxisFunction_t mapRCCStickFunctionToAxisFunction(RemoteControlCalibrationController::StickFunction stickFunction) const
Definition Joystick.cc:1439
virtual Q_INVOKABLE bool hasMonoLED() const
Definition Joystick.h:298
Q_INVOKABLE void startConfiguration()
Tells the joystick that the configuration UI is being displayed so it can do any special processing r...
Definition Joystick.cc:1846
virtual QString connectionType() const
Definition Joystick.h:226
virtual quint16 productId() const
Definition Joystick.h:214
Joystick::AxisCalibration_t getAxisCalibration(int axis) const
Definition Joystick.cc:1369
virtual bool hasRumble() const
Definition Joystick.h:209
void setAxisCalibration(int axis, const AxisCalibration_t &calibration)
Definition Joystick.cc:1360
void gimbalPitchStop()
int _axisCount
Definition Joystick.h:387
virtual Q_INVOKABLE bool setVirtualBall(int ball, int dx, int dy)
Definition Joystick.h:289
virtual Q_INVOKABLE QVariantMap getBall(int ball) const
Definition Joystick.h:255
void gimbalYawStop()
QString buttonActionNone() const
Definition Joystick.h:312
void startContinuousZoom(int direction)
virtual Q_INVOKABLE bool hapticRumbleInit()
Definition Joystick.h:278
JoystickSettings * settings()
Definition Joystick.h:204
void stopContinuousZoom()
void emergencyStop()
virtual Q_INVOKABLE int hapticEffectsCount() const
Definition Joystick.h:276
virtual Q_INVOKABLE bool hasPlayerLED() const
Definition Joystick.h:300
GamepadAxis
Standard gamepad axis indices.
Definition Joystick.h:189
@ AxisTriggerLeft
Definition Joystick.h:194
@ AxisLeftX
Definition Joystick.h:190
@ AxisRightY
Definition Joystick.h:193
@ AxisLeftY
Definition Joystick.h:191
@ AxisTriggerRight
Definition Joystick.h:195
@ AxisRightX
Definition Joystick.h:192
Q_INVOKABLE bool getButtonRepeat(int button)
Definition Joystick.cc:1502
virtual bool hasLED() const
Definition Joystick.h:211
static constexpr int AxisMax
Definition Joystick.h:112
int buttonCount() const
Definition Joystick.h:206
Q_INVOKABLE void setButtonAction(int button, const QString &action)
Definition Joystick.cc:1511
void stepCamera(int direction)
virtual Q_INVOKABLE int touchpadFingerCount(int touchpad) const
Definition Joystick.h:249
void accelerometerDataUpdated(const QVector3D &data)
virtual Q_INVOKABLE bool addMapping(const QString &mapping)
Definition Joystick.h:235
virtual Q_INVOKABLE bool sendVirtualSensorData(int sensorType, float x, float y, float z)
Definition Joystick.h:293
void setVtolInFwdFlight(bool set)
void gripperAction(GRIPPER_ACTIONS gripperAction)
void stepStream(int direction)
virtual Q_INVOKABLE bool hapticRumbleSupported() const
Definition Joystick.h:277
virtual Q_INVOKABLE QVector3D gyroscopeData() const
Definition Joystick.h:242
void landingGearRetract()
void toggleVideoRecord()
virtual Q_INVOKABLE bool hasAxis(int axis) const
Definition Joystick.h:266
GamepadButton
Standard gamepad button indices.
Definition Joystick.h:169
@ ButtonDPadLeft
Definition Joystick.h:183
@ ButtonRightShoulder
Definition Joystick.h:180
@ ButtonDPadRight
Definition Joystick.h:184
@ ButtonStart
Definition Joystick.h:176
@ ButtonDPadDown
Definition Joystick.h:182
@ ButtonLeftShoulder
Definition Joystick.h:179
@ ButtonLeftStick
Definition Joystick.h:177
@ ButtonBack
Definition Joystick.h:174
@ ButtonGuide
Definition Joystick.h:175
@ ButtonRightStick
Definition Joystick.h:178
@ ButtonDPadUp
Definition Joystick.h:181
void stepFocus(int direction)
virtual QString path() const
Definition Joystick.h:223
void gimbalPitchStart(int direction)
virtual Q_INVOKABLE int touchpadCount() const
Definition Joystick.h:248
virtual Q_INVOKABLE float accelerometerDataRate() const
Definition Joystick.h:245
QStringList assignableActionTitles() const
Definition Joystick.h:315
virtual Q_INVOKABLE QVariantMap getTouchpadFinger(int touchpad, int finger) const
Definition Joystick.h:250
void gyroscopeDataUpdated(const QVector3D &data)
virtual QString guid() const
Definition Joystick.h:212
virtual Q_INVOKABLE QVariantMap getAxisInitialState(int axis) const
Definition Joystick.h:306
void linkedGroupChanged()
void rawChannelValuesChanged(QVector< int > channelValues)
Signalled during PollingForConfiguration.
QString linkedGroupRole() const
Definition Joystick.h:320
void startContinuousFocus(int direction)
void gimbalYawStart(int direction)
virtual Q_INVOKABLE QString buttonLabelForType(int button) const
Definition Joystick.h:272
Q_INVOKABLE void setButtonRepeat(int button, bool repeat)
Definition Joystick.cc:1482
virtual QString powerState() const
Definition Joystick.h:220
virtual Q_INVOKABLE bool hasHaptic() const
Definition Joystick.h:275
Loads the specified action file and provides access to the actions it contains.
StickFunction
These identify the various controls functions. They are also used as indices into the _rgFunctioInfo ...