From 5464e10758a27c7c90ce06e7e9ce85b59c490dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Fran=C4=8De=C5=A1kin?= Date: Tue, 8 Jan 2019 14:15:41 +0100 Subject: [PATCH] Bugfix: [Android] Joystick is not visible if connected after start of QGC When starting up, if you start the GS before connecting the bluetooth joystick the QGC needs to be closed and restarted to get it to recognize the joystick --- src/Joystick/JoystickAndroid.cc | 22 +++++++++++++++------- src/Joystick/JoystickManager.cc | 33 +++++++++++++++------------------ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/Joystick/JoystickAndroid.cc b/src/Joystick/JoystickAndroid.cc index bc9f22b67..d66f0c0b9 100644 --- a/src/Joystick/JoystickAndroid.cc +++ b/src/Joystick/JoystickAndroid.cc @@ -73,7 +73,6 @@ JoystickAndroid::~JoystickAndroid() { QMap JoystickAndroid::discover(MultiVehicleManager* _multiVehicleManager) { - bool joystickFound = false; static QMap ret; QMutexLocker lock(&m_mutex); @@ -87,27 +86,29 @@ QMap JoystickAndroid::discover(MultiVehicleManager* _multiVe int SOURCE_GAMEPAD = QAndroidJniObject::getStaticField("android/view/InputDevice", "SOURCE_GAMEPAD"); int SOURCE_JOYSTICK = QAndroidJniObject::getStaticField("android/view/InputDevice", "SOURCE_JOYSTICK"); + QList names; + for (int i = 0; i < sz; ++i) { QAndroidJniObject inputDevice = QAndroidJniObject::callStaticObjectMethod("android/view/InputDevice", "getDevice", "(I)Landroid/view/InputDevice;", buff[i]); int sources = inputDevice.callMethod("getSources", "()I"); if (((sources & SOURCE_GAMEPAD) != SOURCE_GAMEPAD) //check if the input device is interesting to us && ((sources & SOURCE_JOYSTICK) != SOURCE_JOYSTICK)) continue; - //get id and name + // get id and name QString id = inputDevice.callObjectMethod("getDescriptor", "()Ljava/lang/String;").toString(); QString name = inputDevice.callObjectMethod("getName", "()Ljava/lang/String;").toString(); + names.push_back(name); - if (joystickFound) { //skipping { - qWarning() << "Skipping joystick:" << name; + if (ret.contains(name)) { continue; } - //get number of axis + // get number of axis QAndroidJniObject rangeListNative = inputDevice.callObjectMethod("getMotionRanges", "()Ljava/util/List;"); int axisCount = rangeListNative.callMethod("size"); - //get number of buttons + // get number of buttons jintArray a = env->NewIntArray(_androidBtnListCount); env->SetIntArrayRegion(a,0,_androidBtnListCount,_androidBtnList); QAndroidJniObject btns = inputDevice.callObjectMethod("hasKeys", "([I)[Z", a); @@ -121,7 +122,14 @@ QMap JoystickAndroid::discover(MultiVehicleManager* _multiVe qCDebug(JoystickLog) << "\t" << name << "id:" << buff[i] << "axes:" << axisCount << "buttons:" << buttonCount; ret[name] = new JoystickAndroid(name, axisCount, buttonCount, buff[i], _multiVehicleManager); - joystickFound = true; + } + + for (auto i = ret.begin(); i != ret.end();) { + if (!names.contains(i.key())) { + i = ret.erase(i); + } else { + i++; + } } env->ReleaseIntArrayElements(jarr, buff, 0); diff --git a/src/Joystick/JoystickManager.cc b/src/Joystick/JoystickManager.cc index f546609fb..2383a4b6a 100644 --- a/src/Joystick/JoystickManager.cc +++ b/src/Joystick/JoystickManager.cc @@ -1,6 +1,6 @@ /**************************************************************************** * - * (c) 2009-2016 QGROUNDCONTROL PROJECT + * (c) 2009-2019 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. @@ -29,8 +29,8 @@ const char * JoystickManager::_settingsKeyActiveJoystick = "ActiveJoystick"; JoystickManager::JoystickManager(QGCApplication* app, QGCToolbox* toolbox) : QGCTool(app, toolbox) - , _activeJoystick(NULL) - , _multiVehicleManager(NULL) + , _activeJoystick(nullptr) + , _multiVehicleManager(nullptr) { } @@ -54,18 +54,17 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox) void JoystickManager::init() { #ifdef __sdljoystick__ - if (JoystickSDL::init()) { - _setActiveJoystickFromSettings(); - connect(&_joystickCheckTimer, &QTimer::timeout, this, &JoystickManager::_updateAvailableJoysticks); - _joystickCheckTimer.start(250); + if (!JoystickSDL::init()) { + return; } + _setActiveJoystickFromSettings(); #elif defined(__android__) - if (JoystickAndroid::init()) { - _setActiveJoystickFromSettings(); - connect(&_joystickCheckTimer, &QTimer::timeout, this, &JoystickManager::_updateAvailableJoysticks); - _joystickCheckTimer.start(250); + if (!JoystickAndroid::init()) { + return; } #endif + connect(&_joystickCheckTimer, &QTimer::timeout, this, &JoystickManager::_updateAvailableJoysticks); + _joystickCheckTimer.start(1000); } void JoystickManager::_setActiveJoystickFromSettings(void) @@ -81,7 +80,7 @@ void JoystickManager::_setActiveJoystickFromSettings(void) if (_activeJoystick && !newMap.contains(_activeJoystick->name())) { qCDebug(JoystickManagerLog) << "Active joystick removed"; - setActiveJoystick(NULL); + setActiveJoystick(nullptr); } // Check to see if our current mapping contains any joysticks that are not in the new mapping @@ -100,7 +99,7 @@ void JoystickManager::_setActiveJoystickFromSettings(void) emit availableJoysticksChanged(); if (!_name2JoystickMap.count()) { - setActiveJoystick(NULL); + setActiveJoystick(nullptr); return; } @@ -126,7 +125,7 @@ void JoystickManager::setActiveJoystick(Joystick* joystick) { QSettings settings; - if (joystick != NULL && !_name2JoystickMap.contains(joystick->name())) { + if (joystick != nullptr && !_name2JoystickMap.contains(joystick->name())) { qCWarning(JoystickManagerLog) << "Set active not in map" << joystick->name(); return; } @@ -141,7 +140,7 @@ void JoystickManager::setActiveJoystick(Joystick* joystick) _activeJoystick = joystick; - if (_activeJoystick != NULL) { + if (_activeJoystick != nullptr) { qCDebug(JoystickManagerLog) << "Set active:" << _activeJoystick->name(); settings.beginGroup(_settingsGroup); @@ -208,8 +207,6 @@ void JoystickManager::_updateAvailableJoysticks(void) } } #elif defined(__android__) - /* - * TODO: Investigate Android events for Joystick hot plugging - */ + _setActiveJoystickFromSettings(); #endif } -- 2.22.0