Commit 5464e107 authored by Matej Frančeškin's avatar Matej Frančeškin

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
parent a7381c4e
......@@ -73,7 +73,6 @@ JoystickAndroid::~JoystickAndroid() {
QMap<QString, Joystick*> JoystickAndroid::discover(MultiVehicleManager* _multiVehicleManager) {
bool joystickFound = false;
static QMap<QString, Joystick*> ret;
QMutexLocker lock(&m_mutex);
......@@ -87,27 +86,29 @@ QMap<QString, Joystick*> JoystickAndroid::discover(MultiVehicleManager* _multiVe
int SOURCE_GAMEPAD = QAndroidJniObject::getStaticField<jint>("android/view/InputDevice", "SOURCE_GAMEPAD");
int SOURCE_JOYSTICK = QAndroidJniObject::getStaticField<jint>("android/view/InputDevice", "SOURCE_JOYSTICK");
QList<QString> 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<jint>("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<jint>("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<QString, Joystick*> 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);
......
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
* (c) 2009-2019 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* 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
}
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