diff --git a/src/Joystick/JoystickAndroid.cc b/src/Joystick/JoystickAndroid.cc index bc9f22b6773ecd01d253c245468dc8f184fc1cf8..d66f0c0b928499271c248b828c3b99196092c408 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 f546609fbaa06aba378017eb061b4cf99b4171c7..2383a4b6ac19cce9ee77e92d34b6e8d65d35d48e 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 }