Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement motion sensor support #416

Merged
merged 31 commits into from
Jun 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
fbc2404
Show sensors in controller properties dialog
mmmaisel May 3, 2022
3f9d8e4
Add sensors to InputDaemon
mmmaisel May 3, 2022
410e5c4
Add JoySensor subclasses for the two sensor types
mmmaisel May 30, 2022
bc86567
Enumerate sensors during SetJoystick initialization
mmmaisel May 4, 2022
98862e2
Show raw sensor values in Properties dialog
mmmaisel May 4, 2022
dfdacdc
Add constant for maximum mouse speed
mmmaisel May 5, 2022
f06eef8
Allow overriding JoyButton defaultMouseCurve
mmmaisel May 5, 2022
41120ef
Add JoySensorButton class
mmmaisel May 5, 2022
62cf09d
Add sensor buttons to JoyTabWidget
mmmaisel May 5, 2022
922d05e
Add sensor preview widget
mmmaisel May 5, 2022
e9dc259
Implement sensor distance and angle calculations
mmmaisel May 6, 2022
0cf9fc0
Implement sensor settings accessors and events
mmmaisel May 6, 2022
c1f3c44
Implement JoySensorEditDialog
mmmaisel May 6, 2022
4384fe0
Refactor MouseSettingsDialog UI layout
mmmaisel May 6, 2022
23e81f3
Implement mouse sensor settings dialog
mmmaisel May 6, 2022
b1cadee
Implement sensor presets
mmmaisel May 7, 2022
1d779f7
Implement sensor context menues
mmmaisel May 7, 2022
8cf5148
Implement gyroscope calibration
mmmaisel May 7, 2022
8f6e831
Implement gyroscope calibration workflow
mmmaisel May 7, 2022
f70b1e4
Implement sensor name interfaces
mmmaisel May 7, 2022
a03771e
Implement sensor XML serialization/deserialization
mmmaisel May 7, 2022
b6a8cb3
Implement directional distance calculation
mmmaisel May 7, 2022
9fdccdb
Implement sensor delay timer
mmmaisel May 7, 2022
b6282cf
Calculate sensor directions
mmmaisel May 8, 2022
ccdb9cd
Add accelerometer shock detection
mmmaisel May 8, 2022
dec1afa
Implement set change events
mmmaisel May 8, 2022
2009ead
Implement copyAssignments for JoySensor
mmmaisel May 27, 2022
4d096ed
Generate sensor input events
mmmaisel May 8, 2022
7e0bf84
Set sensor count to zero for SDL version without sensor support
mmmaisel May 30, 2022
e0a2b50
Add accelerometer neutral position calibration
mmmaisel Jun 25, 2022
cfaef22
Implement accelerometer calibration workflow
mmmaisel Jun 25, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ set(antimicrox_SOURCES
src/gui/joybuttonwidget.cpp
src/gui/joycontrolstickeditdialog.cpp
src/gui/joydpadbuttonwidget.cpp
src/gui/joysensoreditdialog.cpp
src/gui/joystickstatuswindow.cpp
src/gui/joytabwidget.cpp
src/gui/joytabwidgetcontainer.cpp
Expand All @@ -169,24 +170,36 @@ set(antimicrox_SOURCES
src/inputdaemon.cpp
src/inputdevice.cpp
src/inputdevicebitarraystatus.cpp
src/joyaccelerometersensor.cpp
src/joyaxis.cpp
src/joyaxiscontextmenu.cpp
src/joybutton.cpp
src/joybuttoncontextmenu.cpp
src/joybuttonmousehelper.cpp
src/joybuttonslot.cpp
src/joybuttonstatusbox.cpp
src/joybuttontypes/joyaccelerometerbutton.cpp
src/joybuttontypes/joyaxisbutton.cpp
src/joybuttontypes/joycontrolstickbutton.cpp
src/joybuttontypes/joycontrolstickmodifierbutton.cpp
src/joybuttontypes/joydpadbutton.cpp
src/joybuttontypes/joygradientbutton.cpp
src/joybuttontypes/joygyroscopebutton.cpp
src/joybuttontypes/joysensorbutton.cpp
src/joycontrolstick.cpp
src/joycontrolstickbuttonpushbutton.cpp
src/joycontrolstickcontextmenu.cpp
src/joycontrolstickpushbutton.cpp
src/joycontrolstickstatusbox.cpp
src/joydpad.cpp
src/joygyroscopesensor.cpp
src/joysensor.cpp
src/joysensorbuttonpushbutton.cpp
src/joysensorcontextmenu.cpp
src/joysensorfactory.cpp
src/joysensorpreset.cpp
src/joysensorpushbutton.cpp
src/joysensorstatusbox.cpp
src/joystick.cpp
src/keyboard/virtualkeyboardmousewidget.cpp
src/keyboard/virtualkeypushbutton.cpp
Expand All @@ -197,6 +210,7 @@ set(antimicrox_SOURCES
src/mousedialog/mousebuttonsettingsdialog.cpp
src/mousedialog/mousecontrolsticksettingsdialog.cpp
src/mousedialog/mousedpadsettingsdialog.cpp
src/mousedialog/mousesensorsettingsdialog.cpp
src/mousedialog/springmoderegionpreview.cpp
src/mousedialog/uihelpers/mouseaxissettingsdialoghelper.cpp
src/mousedialog/uihelpers/mousebuttonsettingsdialoghelper.cpp
Expand All @@ -206,6 +220,7 @@ set(antimicrox_SOURCES
src/pt1filter.cpp
src/qtkeymapperbase.cpp
src/sdleventreader.cpp
src/sensorpushbuttongroup.cpp
src/setjoystick.cpp
src/simplekeygrabberbutton.cpp
src/statisticsestimator.cpp
Expand All @@ -218,6 +233,7 @@ set(antimicrox_SOURCES
src/uihelpers/joyaxiscontextmenuhelper.cpp
src/uihelpers/joycontrolstickcontextmenuhelper.cpp
src/uihelpers/joycontrolstickeditdialoghelper.cpp
src/uihelpers/joysensoriothreadhelper.cpp
src/uihelpers/joytabwidgethelper.cpp
src/vdpad.cpp
src/xml/inputdevicexml.cpp
Expand Down Expand Up @@ -269,6 +285,7 @@ set(antimicrox_HEADERS
src/gui/joybuttonwidget.h
src/gui/joycontrolstickeditdialog.h
src/gui/joydpadbuttonwidget.h
src/gui/joysensoreditdialog.h
src/gui/joystickstatuswindow.h
src/gui/joytabwidget.h
src/gui/joytabwidgetcontainer.h
Expand All @@ -283,24 +300,38 @@ set(antimicrox_HEADERS
src/inputdaemon.h
src/inputdevice.h
src/inputdevicebitarraystatus.h
src/joyaccelerometersensor.h
src/joyaxis.h
src/joyaxiscontextmenu.h
src/joybutton.h
src/joybuttoncontextmenu.h
src/joybuttonmousehelper.h
src/joybuttonslot.h
src/joybuttonstatusbox.h
src/joybuttontypes/joyaccelerometerbutton.h
src/joybuttontypes/joyaxisbutton.h
src/joybuttontypes/joycontrolstickbutton.h
src/joybuttontypes/joycontrolstickmodifierbutton.h
src/joybuttontypes/joydpadbutton.h
src/joybuttontypes/joygradientbutton.h
src/joybuttontypes/joygyroscopebutton.h
src/joybuttontypes/joysensorbutton.h
src/joycontrolstick.h
src/joycontrolstickbuttonpushbutton.h
src/joycontrolstickcontextmenu.h
src/joycontrolstickpushbutton.h
src/joycontrolstickstatusbox.h
src/joydpad.h
src/joygyroscopesensor.h
src/joysensor.h
src/joysensorbuttonpushbutton.h
src/joysensorcontextmenu.h
src/joysensordirection.h
src/joysensorfactory.h
src/joysensorpreset.h
src/joysensorpushbutton.h
src/joysensorstatusbox.h
src/joysensortype.h
src/joystick.h
src/keyboard/virtualkeyboardmousewidget.h
src/keyboard/virtualkeypushbutton.h
Expand All @@ -312,6 +343,7 @@ set(antimicrox_HEADERS
src/mousedialog/mousecontrolsticksettingsdialog.h
src/mousedialog/mousedpadsettingsdialog.h
src/mousedialog/springmoderegionpreview.h
src/mousedialog/mousesensorsettingsdialog.h
src/mousedialog/uihelpers/mouseaxissettingsdialoghelper.h
src/mousedialog/uihelpers/mousebuttonsettingsdialoghelper.h
src/mousedialog/uihelpers/mousecontrolsticksettingsdialoghelper.h
Expand All @@ -320,6 +352,7 @@ set(antimicrox_HEADERS
src/pt1filter.h
src/qtkeymapperbase.h
src/sdleventreader.h
src/sensorpushbuttongroup.h
src/setjoystick.h
src/simplekeygrabberbutton.h
src/statisticsestimator.h
Expand All @@ -332,6 +365,7 @@ set(antimicrox_HEADERS
src/uihelpers/joyaxiscontextmenuhelper.h
src/uihelpers/joycontrolstickcontextmenuhelper.h
src/uihelpers/joycontrolstickeditdialoghelper.h
src/uihelpers/joysensoriothreadhelper.h
src/uihelpers/joytabwidgethelper.h
src/vdpad.h
src/xml/inputdevicexml.h
Expand Down Expand Up @@ -369,6 +403,7 @@ set(antimicrox_FORMS
src/gui/extraprofilesettingsdialog.ui
src/gui/gamecontrollermappingdialog.ui
src/gui/joycontrolstickeditdialog.ui
src/gui/joysensoreditdialog.ui
src/gui/joystickstatuswindow.ui
src/gui/mainsettingsdialog.ui
src/gui/mainwindow.ui
Expand Down Expand Up @@ -804,4 +839,4 @@ if(BUILD_DOCS)
else (DOXYGEN_FOUND)
message("Doxygen need to be installed to generate the doxygen documentation")
endif (DOXYGEN_FOUND)
endif(BUILD_DOCS)
endif(BUILD_DOCS)
33 changes: 33 additions & 0 deletions src/gamecontroller/gamecontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,39 @@ int GameController::getNumberRawAxes()
return SDL_CONTROLLER_AXIS_MAX;
}

/**
* @brief Queries the data rate of the given sensor from SDL.
* @returns Data rate in events per second or zero if data rate is unavailable.
*/
double GameController::getRawSensorRate(JoySensorType type)
{
double rate = 0;
#if SDL_VERSION_ATLEAST(2, 0, 16)
if (type == ACCELEROMETER)
rate = SDL_GameControllerGetSensorDataRate(controller, SDL_SENSOR_ACCEL);
else if (type == GYROSCOPE)
rate = SDL_GameControllerGetSensorDataRate(controller, SDL_SENSOR_GYRO);
#endif
if (qFuzzyIsNull(rate))
WARN() << "Sensor rate is zero. Some calculations may be inaccurate!";
return rate;
}

/**
* @brief Queries if the hardware has the given sensor type.
* @returns True if the sensor is present, false otherwise.
*/
bool GameController::hasRawSensor(JoySensorType type)
{
#if SDL_VERSION_ATLEAST(2, 0, 14)
if (type == ACCELEROMETER)
return SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL);
else if (type == GYROSCOPE)
return SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO);
#endif
return false;
}

int GameController::getNumberRawHats() { return 0; }

void GameController::setCounterUniques(int counter) { counterUniques = counter; }
Expand Down
2 changes: 2 additions & 0 deletions src/gamecontroller/gamecontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ class GameController : public InputDevice
virtual int getNumberRawButtons() override;
virtual int getNumberRawAxes() override;
virtual int getNumberRawHats() override;
virtual double getRawSensorRate(JoySensorType type) override;
virtual bool hasRawSensor(JoySensorType type) override;
void setCounterUniques(int counter) override;

QString getBindStringForAxis(int index, bool trueIndex = true);
Expand Down
12 changes: 12 additions & 0 deletions src/gamecontroller/gamecontrollerset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "gamecontrollertrigger.h"
#include "inputdevice.h"
#include "joycontrolstick.h"
#include "joysensor.h"
#include "xml/joyaxisxml.h"
#include "xml/joybuttonxml.h"
#include "xml/joydpadxml.h"
Expand Down Expand Up @@ -189,6 +190,9 @@ void GameControllerSet::readJoystickConfig(QXmlStreamReader *xml, QHash<int, SDL
} else if ((xml->name() == "stick") && xml->isStartElement())
{
getElemFromXml("stick", xml);
} else if ((xml->name() == "sensor") && xml->isStartElement())
{
getElemFromXml("sensor", xml);
} else if ((xml->name() == "vdpad") && xml->isStartElement())
{
readConfDpad(xml, hatButtons, vdpadExists, dpadExists);
Expand Down Expand Up @@ -228,6 +232,9 @@ void GameControllerSet::readConfig(QXmlStreamReader *xml)
} else if ((xml->name() == "stick") && xml->isStartElement())
{
getElemFromXml("stick", xml);
} else if ((xml->name() == "sensor") && xml->isStartElement())
{
getElemFromXml("sensor", xml);
} else if ((xml->name() == "dpad") && xml->isStartElement())
{
getElemFromXml("dpad", xml);
Expand Down Expand Up @@ -310,6 +317,11 @@ void GameControllerSet::getElemFromXml(QString elemName, QXmlStreamReader *xml)
{
xml->skipCurrentElement();
}
} else if (elemName == "sensor")
{
int type = xml->attributes().value("type").toString().toInt();
JoySensor *sensor = getSensor(static_cast<JoySensorType>(type));
readConf(sensor, xml);
}
}

Expand Down
3 changes: 3 additions & 0 deletions src/gamecontroller/gamecontrollerset.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
class QXmlStreamReader;
class InputDevice;

/**
* @brief A SetJoystick specialized for gamepads
*/
class GameControllerSet : public SetJoystick
{
Q_OBJECT
Expand Down
Loading