25#ifdef QGC_UNITTEST_BUILD
26 friend class JoystickTest;
28 friend class MockJoystick;
31 explicit JoystickSDL(
const QString &name,
const QList<int> &gamepadAxes,
const QList<int> &nonGamepadAxes,
int buttonCount,
int hatCount,
int instanceId, QObject *parent =
nullptr);
40 bool hasRumble()
const override;
41 bool hasRumbleTriggers()
const override;
42 bool hasLED()
const override;
43 void rumble(quint16 lowFreq, quint16 highFreq, quint32 durationMs)
override;
44 void rumbleTriggers(quint16 left, quint16 right, quint32 durationMs)
override;
45 void setLED(quint8 red, quint8 green, quint8 blue)
override;
46 bool sendEffect(
const QByteArray &data)
override;
49 QString guid()
const override;
50 quint16 vendorId()
const override;
51 quint16 productId()
const override;
52 QString serial()
const override;
53 QString deviceType()
const override;
54 QString path()
const override;
55 bool isVirtual()
const override;
56 quint16 firmwareVersion()
const override;
57 QString connectionType()
const override;
60 int playerIndex()
const override;
61 void setPlayerIndex(
int index)
override;
64 int batteryPercent()
const override;
65 QString powerState()
const override;
68 bool isGamepad()
const override;
69 QString gamepadType()
const override;
72 QString axisLabel(
int axis)
const override;
73 QString buttonLabel(
int button)
const override;
76 QString getMapping()
const override;
77 bool addMapping(
const QString &mapping)
override;
78 QVariantMap getAxisBinding(
int axis)
const override;
79 QVariantMap getButtonBinding(
int button)
const override;
82 bool hasGyroscope()
const override;
83 bool hasAccelerometer()
const override;
84 bool setGyroscopeEnabled(
bool enabled)
override;
85 bool setAccelerometerEnabled(
bool enabled)
override;
86 QVector3D gyroscopeData()
const override;
87 QVector3D accelerometerData()
const override;
88 float gyroscopeDataRate()
const override;
89 float accelerometerDataRate()
const override;
92 int touchpadCount()
const override;
93 int touchpadFingerCount(
int touchpad)
const override;
94 QVariantMap getTouchpadFinger(
int touchpad,
int finger)
const override;
97 int ballCount()
const override;
98 QVariantMap getBall(
int ball)
const override;
101 bool hasButton(
int button)
const override;
102 bool hasAxis(
int axis)
const override;
105 QString realGamepadType()
const override;
108 QString buttonLabelForType(
int button)
const override;
111 bool hasHaptic()
const override;
112 int hapticEffectsCount()
const override;
113 bool hapticRumbleSupported()
const override;
114 [[nodiscard]]
bool hapticRumbleInit()
override;
115 bool hapticRumblePlay(
float strength, quint32 durationMs)
override;
116 void hapticRumbleStop()
override;
119 QString getMappingForGUID(
const QString &guid)
const override;
122 bool setVirtualAxis(
int axis,
int value)
override;
123 bool setVirtualButton(
int button,
bool down)
override;
124 bool setVirtualHat(
int hat, quint8 value)
override;
125 bool setVirtualBall(
int ball,
int dx,
int dy)
override;
126 bool setVirtualTouchpad(
int touchpad,
int finger,
bool down,
float x,
float y,
float pressure)
override;
127 bool sendVirtualSensorData(
int sensorType,
float x,
float y,
float z)
override;
130 bool hasMonoLED()
const override;
131 bool hasRGBLED()
const override;
132 bool hasPlayerLED()
const override;
135 QString connectionState()
const override;
138 QVariantMap getAxisInitialState(
int axis)
const override;
141 bool setMapping(
const QString &mapping)
override;
143 [[nodiscard]]
static bool init();
144 static void shutdown(
bool deleteDiscoveryCache =
true);
145 static QMap<QString, Joystick*> discover();
148 [[nodiscard]]
bool _open() final;
150 bool _update() final;
152 bool _getButton(
int idx) const final;
153 int _getAxisValue(
int idx) const final;
154 bool _getHat(
int hat,
int idx) const final;
156 quint64 _getProperties() const;
157 bool _checkVirtualJoystick(const
char *methodName) const;
158 bool _hasGamepadCapability(const
char *propertyName) const;
160 QList<
int> _gamepadAxes;
161 QList<
int> _nonGamepadAxes;
162 int _instanceId = -1;
171 QVector3D _cachedGyroData;
172 QVector3D _cachedAccelData;
173 std::atomic<
bool> _gyroDataCached{
false};
174 std::atomic<bool> _accelDataCached{
false};
177 QString _lastConnectionState;
180 QVector<int> _initialAxisValues;
181 bool _driftWarningEmitted =
false;
185 void updateCachedGyroData(
const QVector3D &data);
186 void updateCachedAccelData(
const QVector3D &data);
187 void checkConnectionStateChanged();
191 Q_INVOKABLE QVariantList detectAxisDrift(
int threshold = 8000)
const;