From 907520b00d340bdbd9dacb859f60ac6ec6b17359 Mon Sep 17 00:00:00 2001 From: Gregory Dymarek Date: Wed, 1 Jun 2016 21:58:18 +0100 Subject: [PATCH] Removing AndroidJoystick (requires Qt5.6) --- qgroundcontrol.pro | 2 - src/Joystick/JoystickAndroid.cc | 221 -------------------------------- src/Joystick/JoystickAndroid.h | 49 ------- src/Joystick/JoystickManager.cc | 10 +- 4 files changed, 8 insertions(+), 274 deletions(-) delete mode 100644 src/Joystick/JoystickAndroid.cc delete mode 100644 src/Joystick/JoystickAndroid.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 0661c96ff..bb9a53c94 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -306,7 +306,6 @@ HEADERS += \ AndroidBuild { HEADERS += \ - src/Joystick/JoystickAndroid.h \ } DebugBuild { @@ -401,7 +400,6 @@ iOSBuild { AndroidBuild { SOURCES += src/MobileScreenMgr.cc \ - src/Joystick/JoystickAndroid.cc \ } diff --git a/src/Joystick/JoystickAndroid.cc b/src/Joystick/JoystickAndroid.cc deleted file mode 100644 index 777c0c336..000000000 --- a/src/Joystick/JoystickAndroid.cc +++ /dev/null @@ -1,221 +0,0 @@ -#include "JoystickAndroid.h" - -#include "QGCApplication.h" - -#include - -int JoystickAndroid::_androidBtnListCount; -int *JoystickAndroid::_androidBtnList; -int JoystickAndroid::ACTION_DOWN; -int JoystickAndroid::ACTION_UP; -QMutex JoystickAndroid::m_mutex; - -JoystickAndroid::JoystickAndroid(const QString& name, int axisCount, int buttonCount, int id, MultiVehicleManager* multiVehicleManager) - : Joystick(name,axisCount,buttonCount,multiVehicleManager) - , deviceId(id) -{ - int i; - - QAndroidJniEnvironment env; - QAndroidJniObject inputDevice = QAndroidJniObject::callStaticObjectMethod("android/view/InputDevice", "getDevice", "(I)Landroid/view/InputDevice;", id); - - //set button mapping (number->code) - jintArray b = env->NewIntArray(_androidBtnListCount); - env->SetIntArrayRegion(b,0,_androidBtnListCount,_androidBtnList); - - QAndroidJniObject btns = inputDevice.callObjectMethod("hasKeys", "([I)[Z", b); - jbooleanArray jSupportedButtons = btns.object(); - jboolean* supportedButtons = env->GetBooleanArrayElements(jSupportedButtons, nullptr); - //create a mapping table (btnCode) that maps button number with button code - btnValue = new bool[_buttonCount]; - btnCode = new int[_buttonCount]; - int c = 0; - for (i=0;i<_androidBtnListCount;i++) - if (supportedButtons[i]) { - btnValue[c] = false; - btnCode[c] = _androidBtnList[i]; - c++; - } - - env->ReleaseBooleanArrayElements(jSupportedButtons, supportedButtons, 0); - - //set axis mapping (number->code) - axisValue = new int[_axisCount]; - axisCode = new int[_axisCount]; - QAndroidJniObject rangeListNative = inputDevice.callObjectMethod("getMotionRanges", "()Ljava/util/List;"); - for (i=0;i<_axisCount;i++) { - QAndroidJniObject range = rangeListNative.callObjectMethod("get", "(I)Ljava/lang/Object;",i); - axisCode[i] = range.callMethod("getAxis"); - axisValue[i] = 0; - } - - - qCDebug(JoystickLog) << "axis:" <<_axisCount << "buttons:" <<_buttonCount; - QtAndroidPrivate::registerGenericMotionEventListener(this); - QtAndroidPrivate::registerKeyEventListener(this); -} - -JoystickAndroid::~JoystickAndroid() { - delete btnCode; - delete axisCode; - delete btnValue; - delete axisValue; - - QtAndroidPrivate::unregisterGenericMotionEventListener(this); - QtAndroidPrivate::unregisterKeyEventListener(this); -} - -QMap JoystickAndroid::discover(MultiVehicleManager* _multiVehicleManager) { - bool joystickFound = false; - static QMap ret; - - _initStatic(); //it's enough to run it once, should be in a static constructor - - QMutexLocker lock(&m_mutex); - - QAndroidJniEnvironment env; - QAndroidJniObject o = QAndroidJniObject::callStaticObjectMethod("android/view/InputDevice", "getDeviceIds"); - jintArray jarr = o.object(); - int sz = env->GetArrayLength(jarr); - jint *buff = env->GetIntArrayElements(jarr, nullptr); - - int SOURCE_GAMEPAD = QAndroidJniObject::getStaticField("android/view/InputDevice", "SOURCE_GAMEPAD"); - int SOURCE_JOYSTICK = QAndroidJniObject::getStaticField("android/view/InputDevice", "SOURCE_JOYSTICK"); - - 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 - QString id = inputDevice.callObjectMethod("getDescriptor", "()Ljava/lang/String;").toString(); - QString name = inputDevice.callObjectMethod("getName", "()Ljava/lang/String;").toString(); - - - if (joystickFound) { //skipping { - qWarning() << "Skipping joystick:" << name; - continue; - } - - //get number of axis - QAndroidJniObject rangeListNative = inputDevice.callObjectMethod("getMotionRanges", "()Ljava/util/List;"); - int axisCount = rangeListNative.callMethod("size"); - - //get number of buttons - jintArray a = env->NewIntArray(_androidBtnListCount); - env->SetIntArrayRegion(a,0,_androidBtnListCount,_androidBtnList); - QAndroidJniObject btns = inputDevice.callObjectMethod("hasKeys", "([I)[Z", a); - jbooleanArray jSupportedButtons = btns.object(); - jboolean* supportedButtons = env->GetBooleanArrayElements(jSupportedButtons, nullptr); - int buttonCount = 0; - for (int j=0;j<_androidBtnListCount;j++) - if (supportedButtons[j]) buttonCount++; - env->ReleaseBooleanArrayElements(jSupportedButtons, supportedButtons, 0); - - qCDebug(JoystickLog) << "\t" << name << "id:" << buff[i] << "axes:" << axisCount << "buttons:" << buttonCount; - - ret[name] = new JoystickAndroid(name, axisCount, buttonCount, buff[i], _multiVehicleManager); - joystickFound = true; - } - - env->ReleaseIntArrayElements(jarr, buff, 0); - - - return ret; -} - - -bool JoystickAndroid::handleKeyEvent(jobject event) { - QJNIObjectPrivate ev(event); - QMutexLocker lock(&m_mutex); - const int _deviceId = ev.callMethod("getDeviceId", "()I"); - if (_deviceId!=deviceId) return false; - - const int action = ev.callMethod("getAction", "()I"); - const int keyCode = ev.callMethod("getKeyCode", "()I"); - - for (int i=0;i<_buttonCount;i++) { - if (btnCode[i]==keyCode) { - if (action==ACTION_DOWN) btnValue[i] = true; - if (action==ACTION_UP) btnValue[i] = false; - qWarning() << "Btn:"<("getDeviceId", "()I"); - if (_deviceId!=deviceId) return false; - - for (int i=0;i<_axisCount;i++) { - const float v = ev.callMethod("getAxisValue", "(I)F",axisCode[i]); - axisValue[i] = (int)(v*32767.f); - } - return true; -} - - -bool JoystickAndroid::open(void) { - return true; -} - -void JoystickAndroid::close(void) { -} - -bool JoystickAndroid::update(void) -{ - return true; -} - -bool JoystickAndroid::getButton(int i) { - return btnValue[ i ]; -} - -int JoystickAndroid::getAxis(int i) { - return axisValue[ i ]; -} - - -//helper method -void JoystickAndroid::_initStatic() { - //this gets list of all possible buttons - this is needed to check how many buttons our gamepad supports - //instead of the whole logic below we could have just a simple array of hardcoded int values as these 'should' not change - - //int JoystickAndroid::_androidBtnListCount; - _androidBtnListCount = 31; - static int ret[31]; //there are 31 buttons in total accordingy to the API - int i; - //int *JoystickAndroid:: - _androidBtnList = ret; - - for (i=1;i<=16;i++) { - QString name = "KEYCODE_BUTTON_"+QString::number(i); - ret[i-1] = QAndroidJniObject::getStaticField("android/view/KeyEvent", name.toStdString().c_str()); - } - i--; - - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_A"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_B"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_C"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_L1"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_L2"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_R1"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_R2"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_MODE"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_SELECT"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_START"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_THUMBL"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_THUMBR"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_X"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_Y"); - ret[i++] = QAndroidJniObject::getStaticField("android/view/KeyEvent", "KEYCODE_BUTTON_Z"); - - ACTION_DOWN = QAndroidJniObject::getStaticField("android/view/KeyEvent", "ACTION_DOWN"); - ACTION_UP = QAndroidJniObject::getStaticField("android/view/KeyEvent", "ACTION_UP"); -} - diff --git a/src/Joystick/JoystickAndroid.h b/src/Joystick/JoystickAndroid.h deleted file mode 100644 index 75ea81363..000000000 --- a/src/Joystick/JoystickAndroid.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef JOYSTICKANDROID_H -#define JOYSTICKANDROID_H - -#include "Joystick.h" -#include "Vehicle.h" -#include "MultiVehicleManager.h" - -#include -#include -#include -#include -#include - - -class JoystickAndroid : public Joystick, public QtAndroidPrivate::GenericMotionEventListener, public QtAndroidPrivate::KeyEventListener -{ -public: - JoystickAndroid(const QString& name, int axisCount, int buttonCount, int id, MultiVehicleManager* multiVehicleManager); - ~JoystickAndroid(); - - static QMap discover(MultiVehicleManager* _multiVehicleManager); - -private: - bool handleKeyEvent(jobject event); - bool handleGenericMotionEvent(jobject event); - - virtual bool open(); - virtual void close(); - virtual bool update(); - - virtual bool getButton(int i); - virtual int getAxis(int i); - - int *btnCode; - int *axisCode; - bool *btnValue; - int *axisValue; - - static void _initStatic(); - static int * _androidBtnList; //list of all possible android buttons - static int _androidBtnListCount; - - static int ACTION_DOWN, ACTION_UP; - static QMutex m_mutex; - - int deviceId; -}; - -#endif // JOYSTICKANDROID_H diff --git a/src/Joystick/JoystickManager.cc b/src/Joystick/JoystickManager.cc index e6e5c3d60..1ef0fc607 100644 --- a/src/Joystick/JoystickManager.cc +++ b/src/Joystick/JoystickManager.cc @@ -19,7 +19,10 @@ #endif #ifdef __android__ - #include "JoystickAndroid.h" + /* + * Android Joystick not yet supported + * #include "JoystickAndroid.h" + */ #endif QGC_LOGGING_CATEGORY(JoystickManagerLog, "JoystickManagerLog") @@ -54,7 +57,10 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox) #ifdef __sdljoystick__ _name2JoystickMap = JoystickSDL::discover(_multiVehicleManager); #elif defined(__android__) - _name2JoystickMap = JoystickAndroid::discover(_multiVehicleManager); + /* + * Android Joystick not yet supported + * _name2JoystickMap = JoystickAndroid::discover(_multiVehicleManager); + */ #endif if (!_name2JoystickMap.count()) { -- 2.22.0