Browse Source

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
QGC4.4
Matej Frančeškin 6 years ago
parent
commit
5464e10758
  1. 22
      src/Joystick/JoystickAndroid.cc
  2. 33
      src/Joystick/JoystickManager.cc

22
src/Joystick/JoystickAndroid.cc

@ -73,7 +73,6 @@ JoystickAndroid::~JoystickAndroid() { @@ -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 @@ -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 @@ -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);

33
src/Joystick/JoystickManager.cc

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
/****************************************************************************
*
* (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"; @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -208,8 +207,6 @@ void JoystickManager::_updateAvailableJoysticks(void)
}
}
#elif defined(__android__)
/*
* TODO: Investigate Android events for Joystick hot plugging
*/
_setActiveJoystickFromSettings();
#endif
}

Loading…
Cancel
Save