diff --git a/src/Joystick/JoystickManager.cc b/src/Joystick/JoystickManager.cc index 1ef0fc607b73b83326bf5724f84f91958aa2214a..a8d3f6f936e54d1522d736b9b01b9f9e5386c1a7 100644 --- a/src/Joystick/JoystickManager.cc +++ b/src/Joystick/JoystickManager.cc @@ -53,7 +53,10 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox) _multiVehicleManager = _toolbox->multiVehicleManager(); QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); +} +void JoystickManager::discoverJoysticks() +{ #ifdef __sdljoystick__ _name2JoystickMap = JoystickSDL::discover(_multiVehicleManager); #elif defined(__android__) diff --git a/src/Joystick/JoystickManager.h b/src/Joystick/JoystickManager.h index 26cf0093f986256206b80296044a3846f40e8072..8460b752f8b6346e4c45d2e63000c5ed8ce2d596 100644 --- a/src/Joystick/JoystickManager.h +++ b/src/Joystick/JoystickManager.h @@ -48,6 +48,9 @@ public: // Override from QGCTool virtual void setToolbox(QGCToolbox *toolbox); +public slots: + void discoverJoysticks(); + signals: void activeJoystickChanged(Joystick* joystick); void activeJoystickNameChanged(const QString& name); diff --git a/src/Joystick/JoystickSDL.cc b/src/Joystick/JoystickSDL.cc index 854ac44078f7cd913c1c9ef1cb6910a4c11259a8..303c3005c00c6ff659cecff0852e897b72141e4b 100644 --- a/src/Joystick/JoystickSDL.cc +++ b/src/Joystick/JoystickSDL.cc @@ -15,7 +15,7 @@ JoystickSDL::JoystickSDL(const QString& name, int axisCount, int buttonCount, in QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicleManager) { static QMap ret; - if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_NOPARACHUTE) < 0) { + if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE) < 0) { qWarning() << "Couldn't initialize SimpleDirectMediaLayer:" << SDL_GetError(); return ret; } @@ -33,7 +33,7 @@ QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicl int axisCount, buttonCount, hatCount; bool isGameController; - SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i); + if (SDL_IsGameController(i)) { isGameController = true; axisCount = SDL_CONTROLLER_AXIS_MAX; @@ -41,13 +41,21 @@ QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicl hatCount = 0; } else { isGameController = false; - axisCount = SDL_JoystickNumAxes(sdlJoystick); - buttonCount = SDL_JoystickNumButtons(sdlJoystick); - hatCount = SDL_JoystickNumHats(sdlJoystick); + if (SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i)) { + SDL_ClearError(); + axisCount = SDL_JoystickNumAxes(sdlJoystick); + buttonCount = SDL_JoystickNumButtons(sdlJoystick); + hatCount = SDL_JoystickNumHats(sdlJoystick); + if (axisCount < 0 || buttonCount < 0 || hatCount < 0) { + qCWarning(JoystickLog) << "\t libsdl error parsing joystick features:" << SDL_GetError(); + } + SDL_JoystickClose(sdlJoystick); + } else { + qCWarning(JoystickLog) << "\t libsdl failed opening joystick" << qPrintable(name) << "error:" << SDL_GetError(); + continue; + } } - SDL_JoystickClose(sdlJoystick); - qCDebug(JoystickLog) << "\t" << name << "axes:" << axisCount << "buttons:" << buttonCount << "hats:" << hatCount << "isGC:" << isGameController; ret[name] = new JoystickSDL(name, qMax(0,axisCount), qMax(0,buttonCount), qMax(0,hatCount), i, isGameController, _multiVehicleManager); } else { diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 8e2295509b8a450b7d0186712fa5f872765ed57a..d436f683248a7199b67b1fb290b69720287ca6d9 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -429,6 +429,9 @@ bool QGCApplication::_initForNormalAppBoot(void) // Load known link configurations toolbox()->linkManager()->loadLinkConfigurationList(); + // Probe for joysticks - TODO: manage on a timer or use events to deal with hotplug + toolbox()->joystickManager()->discoverJoysticks(); + if (_settingsUpgraded) { settings.clear(); settings.setValue(_settingsVersionKey, QGC_SETTINGS_VERSION);