Commit ce7035b4 authored by Don Gagne's avatar Don Gagne

Merge pull request #3459 from gregd72002/JoystickRestructure

Joystick restructure
parents 397465f0 92422bd5
......@@ -256,6 +256,7 @@ HEADERS += \
src/HomePositionManager.h \
src/Joystick/Joystick.h \
src/Joystick/JoystickManager.h \
src/VehicleSetup/JoystickConfigController.h \
src/FollowMe/FollowMe.h \
src/PositionManager/SimulatedPosition.h \
src/JsonHelper.h \
......@@ -303,6 +304,10 @@ HEADERS += \
src/QtLocationPlugin/QMLControl/QGCMapEngineManager.h \
src/PositionManager/PositionManager.h
AndroidBuild {
HEADERS += \
}
DebugBuild {
HEADERS += \
src/comm/MockLink.h \
......@@ -335,6 +340,7 @@ HEADERS += \
src/comm/QGCHilLink.h \
src/comm/QGCJSBSimLink.h \
src/comm/QGCXPlaneLink.h \
src/Joystick/JoystickSDL.h \
src/QGCFileDialog.h \
src/QGCMessageBox.h \
src/uas/FileManager.h \
......@@ -379,7 +385,6 @@ HEADERS += \
src/GPS/GPSManager.h \
src/GPS/GPSPositionMessage.h \
src/GPS/GPSProvider.h \
src/VehicleSetup/JoystickConfigController.h \
src/ViewWidgets/CustomCommandWidget.h \
src/ViewWidgets/CustomCommandWidgetController.h \
src/ViewWidgets/LogDownload.h \
......@@ -392,6 +397,7 @@ iOSBuild {
src/audio/QGCAudioWorker_iOS.mm \
src/MobileScreenMgr.mm \
}
AndroidBuild {
SOURCES += src/MobileScreenMgr.cc \
}
......@@ -412,6 +418,7 @@ SOURCES += \
src/HomePositionManager.cc \
src/Joystick/Joystick.cc \
src/Joystick/JoystickManager.cc \
src/VehicleSetup/JoystickConfigController.cc \
src/JsonHelper.cc \
src/FollowMe/FollowMe.cc \
src/LogCompressor.cc \
......@@ -489,6 +496,7 @@ SOURCES += \
src/comm/QGCFlightGearLink.cc \
src/comm/QGCJSBSimLink.cc \
src/comm/QGCXPlaneLink.cc \
src/Joystick/JoystickSDL.cc \
src/ui/HILDockWidget.cc \
src/ui/linechart/ChartPlot.cc \
src/ui/linechart/IncrementalPlot.cc \
......@@ -519,7 +527,6 @@ SOURCES += \
src/GPS/RTCM/RTCMMavlink.cc \
src/GPS/GPSManager.cc \
src/GPS/GPSProvider.cc \
src/VehicleSetup/JoystickConfigController.cc \
src/ViewWidgets/CustomCommandWidget.cc \
src/ViewWidgets/CustomCommandWidgetController.cc \
src/ViewWidgets/LogDownload.cc \
......
......@@ -15,14 +15,6 @@
#include <QSettings>
#ifndef __mobile__
#ifdef Q_OS_MAC
#include <SDL.h>
#else
#include <SDL/SDL.h>
#endif
#endif
QGC_LOGGING_CATEGORY(JoystickLog, "JoystickLog")
QGC_LOGGING_CATEGORY(JoystickValuesLog, "JoystickValuesLog")
......@@ -38,10 +30,8 @@ const char* Joystick::_rgFunctionSettingsKey[Joystick::maxFunction] = {
"ThrottleAxis"
};
Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int sdlIndex, MultiVehicleManager* multiVehicleManager)
#ifndef __mobile__
: _sdlIndex(sdlIndex)
, _exitThread(false)
Joystick::Joystick(const QString& name, int axisCount, int buttonCount, MultiVehicleManager* multiVehicleManager)
: _exitThread(false)
, _name(name)
, _axisCount(axisCount)
, _buttonCount(buttonCount)
......@@ -55,15 +45,7 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int sdlI
, _activeVehicle(NULL)
, _pollingStartedForCalibration(false)
, _multiVehicleManager(multiVehicleManager)
#endif // __mobile__
{
#ifdef __mobile__
Q_UNUSED(name)
Q_UNUSED(axisCount)
Q_UNUSED(buttonCount)
Q_UNUSED(sdlIndex)
Q_UNUSED(multiVehicleManager)
#else
_rgAxisValues = new int[_axisCount];
_rgCalibration = new Calibration_t[_axisCount];
_rgButtonValues = new bool[_buttonCount];
......@@ -77,21 +59,16 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int sdlI
}
_loadSettings();
#endif // __mobile__
}
Joystick::~Joystick()
{
#ifndef __mobile__
delete _rgAxisValues;
delete _rgCalibration;
delete _rgButtonValues;
delete _rgButtonActions;
#endif
}
#ifndef __mobile__
void Joystick::_loadSettings(void)
{
QSettings settings;
......@@ -244,19 +221,14 @@ float Joystick::_adjustRange(int value, Calibration_t calibration)
void Joystick::run(void)
{
SDL_Joystick* sdlJoystick = SDL_JoystickOpen(_sdlIndex);
if (!sdlJoystick) {
qCWarning(JoystickLog) << "SDL_JoystickOpen failed:" << SDL_GetError();
return;
}
_open();
while (!_exitThread) {
SDL_JoystickUpdate();
_update();
// Update axes
for (int axisIndex=0; axisIndex<_axisCount; axisIndex++) {
int newAxisValue = SDL_JoystickGetAxis(sdlJoystick, axisIndex);
int newAxisValue = _getAxis(axisIndex);
// Calibration code requires signal to be emitted even if value hasn't changed
_rgAxisValues[axisIndex] = newAxisValue;
emit rawAxisValueChanged(axisIndex, newAxisValue);
......@@ -264,7 +236,7 @@ void Joystick::run(void)
// Update buttons
for (int buttonIndex=0; buttonIndex<_buttonCount; buttonIndex++) {
bool newButtonValue = !!SDL_JoystickGetButton(sdlJoystick, buttonIndex);
bool newButtonValue = _getButton(buttonIndex);
if (newButtonValue != _rgButtonValues[buttonIndex]) {
_rgButtonValues[buttonIndex] = newButtonValue;
emit rawButtonPressedChanged(buttonIndex, newButtonValue);
......@@ -349,7 +321,7 @@ void Joystick::run(void)
QGC::SLEEP::msleep(40);
}
SDL_JoystickClose(sdlJoystick);
_close();
}
void Joystick::startPolling(Vehicle* vehicle)
......@@ -566,4 +538,3 @@ bool Joystick::_validButton(int button)
return button >= 0 && button < _buttonCount;
}
#endif // __mobile__
......@@ -26,9 +26,9 @@ class Joystick : public QThread
Q_OBJECT
public:
Joystick(const QString& name, int axisCount, int buttonCount, int sdlIndex, MultiVehicleManager* multiVehicleManager);
Joystick(const QString& name, int axisCount, int buttonCount, MultiVehicleManager* multiVehicleManager);
~Joystick();
typedef struct {
int min;
int max;
......@@ -50,7 +50,6 @@ public:
ThrottleModeMax
} ThrottleMode_t;
#ifndef __mobile__
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(bool calibrated MEMBER _calibrated NOTIFY calibratedChanged)
......@@ -124,7 +123,7 @@ signals:
void buttonActionTriggered(int action);
private:
protected:
void _saveSettings(void);
void _loadSettings(void);
float _adjustRange(int value, Calibration_t calibration);
......@@ -132,11 +131,18 @@ private:
bool _validAxis(int axis);
bool _validButton(int button);
private:
virtual bool _open() = 0;
virtual void _close() = 0;
virtual bool _update() = 0;
virtual bool _getButton(int i) = 0;
virtual int _getAxis(int i) = 0;
// Override from QThread
virtual void run(void);
private:
int _sdlIndex; ///< Index for SDL_JoystickOpen
protected:
bool _exitThread; ///< true: signal thread to exit
......@@ -161,7 +167,6 @@ private:
bool _pollingStartedForCalibration;
MultiVehicleManager* _multiVehicleManager;
#endif // __mobile__
private:
static const char* _rgFunctionSettingsKey[maxFunction];
......
......@@ -14,11 +14,15 @@
#include <QQmlEngine>
#ifndef __mobile__
#ifdef Q_OS_MAC
#include <SDL.h>
#else
#include <SDL/SDL.h>
#endif
#include "JoystickSDL.h"
#define __sdljoystick__
#endif
#ifdef __android__
/*
* Android Joystick not yet supported
* #include "JoystickAndroid.h"
*/
#endif
QGC_LOGGING_CATEGORY(JoystickManagerLog, "JoystickManagerLog")
......@@ -31,7 +35,15 @@ JoystickManager::JoystickManager(QGCApplication* app)
, _activeJoystick(NULL)
, _multiVehicleManager(NULL)
{
}
JoystickManager::~JoystickManager() {
QMap<QString, Joystick*>::iterator i;
for (i = _name2JoystickMap.begin(); i != _name2JoystickMap.end(); ++i) {
qDebug() << "Releasing joystick:" << i.key();
delete i.value();
}
qDebug() << "Done";
}
void JoystickManager::setToolbox(QGCToolbox *toolbox)
......@@ -42,33 +54,13 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox)
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
#ifndef __mobile__
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE) < 0) {
qWarning() << "Couldn't initialize SimpleDirectMediaLayer:" << SDL_GetError();
return;
}
// Load available joysticks
qCDebug(JoystickManagerLog) << "Available joysticks";
for (int i=0; i<SDL_NumJoysticks(); i++) {
QString name = SDL_JoystickName(i);
if (!_name2JoystickMap.contains(name)) {
int axisCount, buttonCount;
SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i);
axisCount = SDL_JoystickNumAxes(sdlJoystick);
buttonCount = SDL_JoystickNumButtons(sdlJoystick);
SDL_JoystickClose(sdlJoystick);
qCDebug(JoystickManagerLog) << "\t" << name << "axes:" << axisCount << "buttons:" << buttonCount;
_name2JoystickMap[name] = new Joystick(name, axisCount, buttonCount, i, _multiVehicleManager);
} else {
qCDebug(JoystickManagerLog) << "\tSkipping duplicate" << name;
}
}
#ifdef __sdljoystick__
_name2JoystickMap = JoystickSDL::discover(_multiVehicleManager);
#elif defined(__android__)
/*
* Android Joystick not yet supported
* _name2JoystickMap = JoystickAndroid::discover(_multiVehicleManager);
*/
#endif
if (!_name2JoystickMap.count()) {
......@@ -79,10 +71,8 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox)
_setActiveJoystickFromSettings();
}
void JoystickManager::_setActiveJoystickFromSettings(void)
{
#ifndef __mobile__
QSettings settings;
settings.beginGroup(_settingsGroup);
......@@ -94,7 +84,6 @@ void JoystickManager::_setActiveJoystickFromSettings(void)
setActiveJoystick(_name2JoystickMap.value(name, _name2JoystickMap.first()));
settings.setValue(_settingsKeyActiveJoystick, _activeJoystick->name());
#endif
}
Joystick* JoystickManager::activeJoystick(void)
......@@ -104,9 +93,6 @@ Joystick* JoystickManager::activeJoystick(void)
void JoystickManager::setActiveJoystick(Joystick* joystick)
{
#ifdef __mobile__
Q_UNUSED(joystick)
#else
QSettings settings;
if (!_name2JoystickMap.contains(joystick->name())) {
......@@ -125,7 +111,6 @@ void JoystickManager::setActiveJoystick(Joystick* joystick)
emit activeJoystickChanged(_activeJoystick);
emit activeJoystickNameChanged(_activeJoystick->name());
#endif
}
QVariantList JoystickManager::joysticks(void)
......@@ -146,11 +131,7 @@ QStringList JoystickManager::joystickNames(void)
QString JoystickManager::activeJoystickName(void)
{
#ifdef __mobile__
return QString();
#else
return _activeJoystick ? _activeJoystick->name() : QString();
#endif
}
void JoystickManager::setActiveJoystickName(const QString& name)
......
......@@ -28,6 +28,7 @@ class JoystickManager : public QGCTool
public:
JoystickManager(QGCApplication* app);
~JoystickManager();
/// List of available joysticks
Q_PROPERTY(QVariantList joysticks READ joysticks CONSTANT)
......
#include "JoystickSDL.h"
#include "QGCApplication.h"
#include <QQmlEngine>
JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, int index, MultiVehicleManager* multiVehicleManager)
: Joystick(name,axisCount,buttonCount,multiVehicleManager)
, _index(index)
{
}
QMap<QString, Joystick*> JoystickSDL::discover(MultiVehicleManager* _multiVehicleManager) {
static QMap<QString, Joystick*> ret;
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE) < 0) {
qWarning() << "Couldn't initialize SimpleDirectMediaLayer:" << SDL_GetError();
return ret;
}
// Load available joysticks
qCDebug(JoystickLog) << "Available joysticks";
for (int i=0; i<SDL_NumJoysticks(); i++) {
QString name = SDL_JoystickName(i);
if (!ret.contains(name)) {
int axisCount, buttonCount;
SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i);
axisCount = SDL_JoystickNumAxes(sdlJoystick);
buttonCount = SDL_JoystickNumButtons(sdlJoystick);
SDL_JoystickClose(sdlJoystick);
qCDebug(JoystickLog) << "\t" << name << "axes:" << axisCount << "buttons:" << buttonCount;
ret[name] = new JoystickSDL(name, axisCount, buttonCount, i, _multiVehicleManager);
} else {
qCDebug(JoystickLog) << "\tSkipping duplicate" << name;
}
}
return ret;
}
bool JoystickSDL::_open(void) {
sdlJoystick = SDL_JoystickOpen(_index);
if (!sdlJoystick) {
qCWarning(JoystickLog) << "SDL_JoystickOpen failed:" << SDL_GetError();
return false;
}
return true;
}
void JoystickSDL::_close(void) {
SDL_JoystickClose(sdlJoystick);
}
bool JoystickSDL::_update(void)
{
SDL_JoystickUpdate();
return true;
}
bool JoystickSDL::_getButton(int i) {
return !!SDL_JoystickGetButton(sdlJoystick, i);
}
int JoystickSDL::_getAxis(int i) {
return SDL_JoystickGetAxis(sdlJoystick, i);
}
#ifndef JOYSTICKSDL_H
#define JOYSTICKSDL_H
#include "Joystick.h"
#include "Vehicle.h"
#include "MultiVehicleManager.h"
#ifdef Q_OS_MAC
#include <SDL.h>
#else
#include <SDL/SDL.h>
#endif
class JoystickSDL : public Joystick
{
public:
JoystickSDL(const QString& name, int axisCount, int buttonCount, int index, MultiVehicleManager* multiVehicleManager);
static QMap<QString, Joystick*> discover(MultiVehicleManager* _multiVehicleManager);
private:
bool _open() final;
void _close() final;
bool _update() final;
bool _getButton(int i) final;
int _getAxis(int i) final;
SDL_Joystick *sdlJoystick;
int _index; ///< Index for SDL_JoystickOpen
};
#endif // JOYSTICKSDL_H
......@@ -72,6 +72,7 @@
#include "PX4/PX4FirmwarePlugin.h"
#include "Vehicle.h"
#include "MavlinkQmlSingleton.h"
#include "JoystickConfigController.h"
#include "JoystickManager.h"
#include "QmlObjectListModel.h"
#include "MissionManager.h"
......@@ -102,7 +103,6 @@
#include "QGCFileDialog.h"
#include "QGCMessageBox.h"
#include "FirmwareUpgradeController.h"
#include "JoystickConfigController.h"
#include "MainWindow.h"
#endif
......@@ -386,12 +386,11 @@ void QGCApplication::_initCommon(void)
qmlRegisterType<ValuesWidgetController> ("QGroundControl.Controllers", 1, 0, "ValuesWidgetController");
qmlRegisterType<QGCMobileFileDialogController> ("QGroundControl.Controllers", 1, 0, "QGCMobileFileDialogController");
qmlRegisterType<RCChannelMonitorController> ("QGroundControl.Controllers", 1, 0, "RCChannelMonitorController");
qmlRegisterType<JoystickConfigController> ("QGroundControl.Controllers", 1, 0, "JoystickConfigController");
#ifndef __mobile__
qmlRegisterType<ViewWidgetController> ("QGroundControl.Controllers", 1, 0, "ViewWidgetController");
qmlRegisterType<CustomCommandWidgetController> ("QGroundControl.Controllers", 1, 0, "CustomCommandWidgetController");
qmlRegisterType<FirmwareUpgradeController> ("QGroundControl.Controllers", 1, 0, "FirmwareUpgradeController");
qmlRegisterType<JoystickConfigController> ("QGroundControl.Controllers", 1, 0, "JoystickConfigController");
qmlRegisterType<LogDownloadController> ("QGroundControl.Controllers", 1, 0, "LogDownloadController");
#endif
......
......@@ -1111,7 +1111,6 @@ void Vehicle::setJoystickEnabled(bool enabled)
void Vehicle::_startJoystick(bool start)
{
#ifndef __mobile__
Joystick* joystick = _joystickManager->activeJoystick();
if (joystick) {
if (start) {
......@@ -1122,9 +1121,6 @@ void Vehicle::_startJoystick(bool start)
joystick->stopPolling();
}
}
#else
Q_UNUSED(start);
#endif
}
bool Vehicle::active(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment