Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
e44fed2f
Commit
e44fed2f
authored
8 years ago
by
Gregory Dymarek
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Restructuring + Initial Android handler
parent
fcf1b5d2
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
498 additions
and
255 deletions
+498
-255
qgroundcontrol.pro
qgroundcontrol.pro
+9
-0
Joystick.cc
src/Joystick/Joystick.cc
+106
-123
Joystick.h
src/Joystick/Joystick.h
+12
-5
JoystickAndroid.cc
src/Joystick/JoystickAndroid.cc
+199
-0
JoystickAndroid.h
src/Joystick/JoystickAndroid.h
+48
-0
JoystickManager.cc
src/Joystick/JoystickManager.cc
+16
-113
JoystickManager.h
src/Joystick/JoystickManager.h
+1
-14
JoystickSDL.cc
src/Joystick/JoystickSDL.cc
+73
-0
joysticksdl.h
src/Joystick/joysticksdl.h
+34
-0
No files found.
qgroundcontrol.pro
View file @
e44fed2f
...
@@ -315,6 +315,11 @@ HEADERS += \
...
@@ -315,6 +315,11 @@ HEADERS += \
src
/
QtLocationPlugin
/
QMLControl
/
QGCMapEngineManager
.
h
\
src
/
QtLocationPlugin
/
QMLControl
/
QGCMapEngineManager
.
h
\
src
/
PositionManager
/
PositionManager
.
h
src
/
PositionManager
/
PositionManager
.
h
AndroidBuild
{
HEADERS
+=
\
src
/
Joystick
/
JoystickAndroid
.
h
\
}
DebugBuild
{
DebugBuild
{
HEADERS
+=
\
HEADERS
+=
\
src
/
comm
/
MockLink
.
h
\
src
/
comm
/
MockLink
.
h
\
...
@@ -347,6 +352,7 @@ HEADERS += \
...
@@ -347,6 +352,7 @@ HEADERS += \
src
/
comm
/
QGCHilLink
.
h
\
src
/
comm
/
QGCHilLink
.
h
\
src
/
comm
/
QGCJSBSimLink
.
h
\
src
/
comm
/
QGCJSBSimLink
.
h
\
src
/
comm
/
QGCXPlaneLink
.
h
\
src
/
comm
/
QGCXPlaneLink
.
h
\
src
/
Joystick
/
JoystickSDL
.
h
\
src
/
QGCFileDialog
.
h
\
src
/
QGCFileDialog
.
h
\
src
/
QGCMessageBox
.
h
\
src
/
QGCMessageBox
.
h
\
src
/
uas
/
FileManager
.
h
\
src
/
uas
/
FileManager
.
h
\
...
@@ -403,8 +409,10 @@ iOSBuild {
...
@@ -403,8 +409,10 @@ iOSBuild {
src
/
audio
/
QGCAudioWorker_iOS
.
mm
\
src
/
audio
/
QGCAudioWorker_iOS
.
mm
\
src
/
MobileScreenMgr
.
mm
\
src
/
MobileScreenMgr
.
mm
\
}
}
AndroidBuild
{
AndroidBuild
{
SOURCES
+=
src
/
MobileScreenMgr
.
cc
\
SOURCES
+=
src
/
MobileScreenMgr
.
cc
\
src
/
Joystick
/
JoystickAndroid
.
cc
\
}
}
...
@@ -502,6 +510,7 @@ SOURCES += \
...
@@ -502,6 +510,7 @@ SOURCES += \
src
/
comm
/
QGCFlightGearLink
.
cc
\
src
/
comm
/
QGCFlightGearLink
.
cc
\
src
/
comm
/
QGCJSBSimLink
.
cc
\
src
/
comm
/
QGCJSBSimLink
.
cc
\
src
/
comm
/
QGCXPlaneLink
.
cc
\
src
/
comm
/
QGCXPlaneLink
.
cc
\
src
/
Joystick
/
JoystickSDL
.
cc
\
src
/
ui
/
HILDockWidget
.
cc
\
src
/
ui
/
HILDockWidget
.
cc
\
src
/
ui
/
linechart
/
ChartPlot
.
cc
\
src
/
ui
/
linechart
/
ChartPlot
.
cc
\
src
/
ui
/
linechart
/
IncrementalPlot
.
cc
\
src
/
ui
/
linechart
/
IncrementalPlot
.
cc
\
...
...
This diff is collapsed.
Click to expand it.
src/Joystick/Joystick.cc
View file @
e44fed2f
This diff is collapsed.
Click to expand it.
src/Joystick/Joystick.h
View file @
e44fed2f
...
@@ -39,9 +39,9 @@ class Joystick : public QThread
...
@@ -39,9 +39,9 @@ class Joystick : public QThread
Q_OBJECT
Q_OBJECT
public:
public:
Joystick
(
const
QString
&
name
,
int
axisCount
,
int
buttonCount
,
int
sdlIndex
,
MultiVehicleManager
*
multiVehicleManager
);
Joystick
(
const
QString
&
name
,
int
axisCount
,
int
buttonCount
,
MultiVehicleManager
*
multiVehicleManager
);
~
Joystick
();
~
Joystick
();
typedef
struct
{
typedef
struct
{
int
min
;
int
min
;
int
max
;
int
max
;
...
@@ -136,7 +136,7 @@ signals:
...
@@ -136,7 +136,7 @@ signals:
void
buttonActionTriggered
(
int
action
);
void
buttonActionTriggered
(
int
action
);
pr
ivate
:
pr
otected
:
void
_saveSettings
(
void
);
void
_saveSettings
(
void
);
void
_loadSettings
(
void
);
void
_loadSettings
(
void
);
float
_adjustRange
(
int
value
,
Calibration_t
calibration
);
float
_adjustRange
(
int
value
,
Calibration_t
calibration
);
...
@@ -144,11 +144,18 @@ private:
...
@@ -144,11 +144,18 @@ private:
bool
_validAxis
(
int
axis
);
bool
_validAxis
(
int
axis
);
bool
_validButton
(
int
button
);
bool
_validButton
(
int
button
);
private:
virtual
bool
open
()
=
0
;
virtual
void
close
()
=
0
;
virtual
bool
update
()
=
0
;
virtual
bool
getButton
(
int
i
)
=
0
;
virtual
int
getAxis
(
int
i
)
=
0
;
// Override from QThread
// Override from QThread
virtual
void
run
(
void
);
virtual
void
run
(
void
);
private:
protected:
int
_sdlIndex
;
///< Index for SDL_JoystickOpen
bool
_exitThread
;
///< true: signal thread to exit
bool
_exitThread
;
///< true: signal thread to exit
...
...
This diff is collapsed.
Click to expand it.
src/Joystick/JoystickAndroid.cc
0 → 100644
View file @
e44fed2f
#include "JoystickAndroid.h"
#include "QGCApplication.h"
#include <QQmlEngine>
int
JoystickAndroid
::
_androidBtnListCount
;
int
*
JoystickAndroid
::
_androidBtnList
;
QMutex
JoystickAndroid
::
m_mutex
;
JoystickAndroid
::
JoystickAndroid
(
const
QString
&
name
,
int
id
,
MultiVehicleManager
*
multiVehicleManager
)
:
Joystick
(
name
,
0
,
0
,
multiVehicleManager
)
//buttonCount and axisCount is computed below
,
deviceId
(
id
)
{
int
i
;
QAndroidJniEnvironment
env
;
QAndroidJniObject
inputDevice
=
QAndroidJniObject
::
callStaticObjectMethod
(
"android/view/InputDevice"
,
"getDevice"
,
"(I)Landroid/view/InputDevice;"
,
id
);
//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
<
jbooleanArray
>
();
int
btn_sz
=
env
->
GetArrayLength
(
jSupportedButtons
);
jboolean
*
supportedButtons
=
env
->
GetBooleanArrayElements
(
jSupportedButtons
,
nullptr
);
_buttonCount
=
0
;
for
(
i
=
0
;
i
<
btn_sz
;
i
++
)
if
(
supportedButtons
[
i
])
_buttonCount
++
;
//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
<
btn_sz
;
i
++
)
if
(
supportedButtons
[
i
])
{
btnValue
[
c
]
=
false
;
btnCode
[
c
]
=
_androidBtnList
[
i
];
c
++
;
}
env
->
ReleaseBooleanArrayElements
(
jSupportedButtons
,
supportedButtons
,
0
);
//get number of axis
QAndroidJniObject
rangeListNative
=
inputDevice
.
callObjectMethod
(
"getMotionRanges"
,
"()Ljava/util/List;"
);
_axisCount
=
rangeListNative
.
callMethod
<
jint
>
(
"size"
);
axisValue
=
new
int
[
_axisCount
];
axisCode
=
new
int
[
_axisCount
];
for
(
i
=
0
;
i
<
_axisCount
;
i
++
)
{
QAndroidJniObject
range
=
rangeListNative
.
callObjectMethod
(
"get"
,
"()Landroid/view/InputDevice/MotionRange;"
);
if
(
range
.
isValid
())
axisCode
[
i
]
=
range
.
callMethod
<
jint
>
(
"getAxis"
);
axisValue
[
i
]
=
0
;
}
qDebug
()
<<
"joystick constructor:"
<<
_name
;
QtAndroidPrivate
::
registerGenericMotionEventListener
(
this
);
QtAndroidPrivate
::
registerKeyEventListener
(
this
);
}
JoystickAndroid
::~
JoystickAndroid
()
{
qDebug
()
<<
"joystick destructor"
<<
_name
;
delete
btnCode
;
delete
axisCode
;
delete
btnValue
;
delete
axisValue
;
QtAndroidPrivate
::
unregisterGenericMotionEventListener
(
this
);
QtAndroidPrivate
::
unregisterKeyEventListener
(
this
);
}
bool
JoystickAndroid
::
handleKeyEvent
(
jobject
event
)
{
QJNIObjectPrivate
ev
(
event
);
QMutexLocker
lock
(
&
m_mutex
);
const
int
_deviceId
=
ev
.
callMethod
<
jint
>
(
"getDeviceId"
,
"()I"
);
if
(
_deviceId
!=
deviceId
)
return
false
;
qDebug
()
<<
"handleKeyEvent!"
<<
deviceId
;
return
true
;
}
bool
JoystickAndroid
::
handleGenericMotionEvent
(
jobject
event
)
{
QJNIObjectPrivate
ev
(
event
);
QMutexLocker
lock
(
&
m_mutex
);
const
int
_deviceId
=
ev
.
callMethod
<
jint
>
(
"getDeviceId"
,
"()I"
);
if
(
_deviceId
!=
deviceId
)
return
false
;
qDebug
()
<<
"handleMotionEvent!"
<<
deviceId
;
return
true
;
}
QMap
<
QString
,
Joystick
*>
JoystickAndroid
::
discover
(
MultiVehicleManager
*
_multiVehicleManager
)
{
bool
joystickFound
=
false
;
static
QMap
<
QString
,
Joystick
*>
ret
;
_buttonList
();
//it's enough to run it once, should be in a static constructor
QMutexLocker
lock
(
&
m_mutex
);
QAndroidJniEnvironment
env
;
QAndroidJniObject
o
=
QAndroidJniObject
::
callStaticObjectMethod
<
jintArray
>
(
"android/view/InputDevice"
,
"getDeviceIds"
);
jintArray
jarr
=
o
.
object
<
jintArray
>
();
size_t
sz
=
env
->
GetArrayLength
(
jarr
);
jint
*
buff
=
env
->
GetIntArrayElements
(
jarr
,
nullptr
);
int
SOURCE_GAMEPAD
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/InputDevice"
,
"SOURCE_GAMEPAD"
);
int
SOURCE_JOYSTICK
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/InputDevice"
,
"SOURCE_JOYSTICK"
);
for
(
size_t
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
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
;
}
qDebug
()
<<
"
\t
"
<<
name
<<
"id:"
<<
buff
[
i
];
ret
[
name
]
=
new
JoystickAndroid
(
name
,
buff
[
i
],
_multiVehicleManager
);
joystickFound
=
true
;
}
env
->
ReleaseIntArrayElements
(
jarr
,
buff
,
0
);
return
ret
;
}
bool
JoystickAndroid
::
open
(
void
)
{
return
true
;
}
void
JoystickAndroid
::
close
(
void
)
{
}
bool
JoystickAndroid
::
update
(
void
)
{
return
true
;
}
bool
JoystickAndroid
::
getButton
(
int
i
)
{
return
btnValue
[
btnCode
[
i
]
];
}
int
JoystickAndroid
::
getAxis
(
int
i
)
{
return
axisValue
[
axisCode
[
i
]
];
}
//helper method
void
JoystickAndroid
::
_buttonList
()
{
//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
<
jint
>
(
"android/view/KeyEvent"
,
name
.
toStdString
().
c_str
());
}
i
--
;
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_A"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_B"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_C"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_L1"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_L2"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_R1"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_R2"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_MODE"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_SELECT"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_START"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_THUMBL"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_THUMBR"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_X"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_Y"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_Z"
);
for
(
int
j
=
0
;
j
<
_androidBtnListCount
;
j
++
)
qDebug
()
<<
"
\t
possible button: "
+
QString
::
number
(
_androidBtnList
[
j
]);
}
This diff is collapsed.
Click to expand it.
src/Joystick/JoystickAndroid.h
0 → 100644
View file @
e44fed2f
#ifndef JOYSTICKANDROID_H
#define JOYSTICKANDROID_H
#include "Joystick.h"
#include "Vehicle.h"
#include "MultiVehicleManager.h"
#include <jni.h>
#include <QtCore/private/qjni_p.h>
#include <QtCore/private/qjnihelpers_p.h>
#include <QtAndroidExtras/QtAndroidExtras>
#include <QtAndroidExtras/QAndroidJniObject>
class
JoystickAndroid
:
public
Joystick
,
public
QtAndroidPrivate
::
GenericMotionEventListener
,
public
QtAndroidPrivate
::
KeyEventListener
{
public:
JoystickAndroid
(
const
QString
&
name
,
int
id
,
MultiVehicleManager
*
multiVehicleManager
);
~
JoystickAndroid
();
static
QMap
<
QString
,
Joystick
*>
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
_buttonList
();
static
int
*
_androidBtnList
;
//list of all possible android buttons
static
int
_androidBtnListCount
;
static
QMutex
m_mutex
;
int
deviceId
;
};
#endif // JOYSTICKANDROID_H
This diff is collapsed.
Click to expand it.
src/Joystick/JoystickManager.cc
View file @
e44fed2f
...
@@ -27,12 +27,12 @@
...
@@ -27,12 +27,12 @@
#include <QQmlEngine>
#include <QQmlEngine>
#ifndef __mobile__
#ifndef __mobile__
#include "JoystickSDL.h"
#define __sdljoystick__
#define __sdljoystick__
#ifdef Q_OS_MAC
#endif
#include <SDL.h>
#else
#ifdef __android__
#include <SDL/SDL.h>
#include "JoystickAndroid.h"
#endif
#endif
#endif
QGC_LOGGING_CATEGORY
(
JoystickManagerLog
,
"JoystickManagerLog"
)
QGC_LOGGING_CATEGORY
(
JoystickManagerLog
,
"JoystickManagerLog"
)
...
@@ -45,7 +45,15 @@ JoystickManager::JoystickManager(QGCApplication* app)
...
@@ -45,7 +45,15 @@ JoystickManager::JoystickManager(QGCApplication* app)
,
_activeJoystick
(
NULL
)
,
_activeJoystick
(
NULL
)
,
_multiVehicleManager
(
NULL
)
,
_multiVehicleManager
(
NULL
)
{
{
}
JoystickManager
::~
JoystickManager
()
{
QMap
<
QString
,
Joystick
*>::
iterator
i
;
for
(
i
=
_name2JoystickMap
.
begin
();
i
!=
_name2JoystickMap
.
end
();
++
i
)
{
qDebug
()
<<
"Releasing joystick:"
<<
i
.
key
();
delete
i
.
value
();
}
qDebug
()
<<
"Done"
;
}
}
void
JoystickManager
::
setToolbox
(
QGCToolbox
*
toolbox
)
void
JoystickManager
::
setToolbox
(
QGCToolbox
*
toolbox
)
...
@@ -57,82 +65,9 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox)
...
@@ -57,82 +65,9 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox)
QQmlEngine
::
setObjectOwnership
(
this
,
QQmlEngine
::
CppOwnership
);
QQmlEngine
::
setObjectOwnership
(
this
,
QQmlEngine
::
CppOwnership
);
#ifdef __sdljoystick__
#ifdef __sdljoystick__
if
(
SDL_InitSubSystem
(
SDL_INIT_JOYSTICK
|
SDL_INIT_NOPARACHUTE
)
<
0
)
{
_name2JoystickMap
=
JoystickSDL
::
discover
(
_multiVehicleManager
);
qWarning
()
<<
"Couldn't initialize SimpleDirectMediaLayer:"
<<
SDL_GetError
();
return
;
}
// Load available joysticks
qCDebug
(
JoystickManagerLog
)
<<
"Available joysticks"
;
for
(
int
i
=
0
;
i
<
SDL_NumJoysticks
();
i
++
)
{
QString
name
=
SDL_JoystickName
(
i
);
if
(
!
_name2JoystickMap
.
contains
(
name
))
{
int
axisCount
,
buttonCount
;
SDL_Joystick
*
sdlJoystick
=
SDL_JoystickOpen
(
i
);
axisCount
=
SDL_JoystickNumAxes
(
sdlJoystick
);
buttonCount
=
SDL_JoystickNumButtons
(
sdlJoystick
);
SDL_JoystickClose
(
sdlJoystick
);
qCDebug
(
JoystickManagerLog
)
<<
"
\t
"
<<
name
<<
"axes:"
<<
axisCount
<<
"buttons:"
<<
buttonCount
;
_name2JoystickMap
[
name
]
=
new
Joystick
(
name
,
axisCount
,
buttonCount
,
i
,
_multiVehicleManager
);
}
else
{
qCDebug
(
JoystickManagerLog
)
<<
"
\t
Skipping duplicate"
<<
name
;
}
}
#elif defined(__android__)
#elif defined(__android__)
QMutexLocker
lock
(
&
m_mutex
);
_name2JoystickMap
=
JoystickAndroid
::
discover
(
_multiVehicleManager
);
computePossibleButtons
();
//this is just needed to get number of supported buttons
QAndroidJniEnvironment
env
;
QAndroidJniObject
o
=
QAndroidJniObject
::
callStaticObjectMethod
<
jintArray
>
(
"android/view/InputDevice"
,
"getDeviceIds"
);
jintArray
jarr
=
o
.
object
<
jintArray
>
();
size_t
sz
=
env
->
GetArrayLength
(
jarr
);
jint
*
buff
=
env
->
GetIntArrayElements
(
jarr
,
nullptr
);
int
SOURCE_GAMEPAD
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/InputDevice"
,
"SOURCE_GAMEPAD"
);
int
SOURCE_JOYSTICK
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/InputDevice"
,
"SOURCE_JOYSTICK"
);
for
(
size_t
i
=
0
;
i
<
sz
;
++
i
)
{
int
axisCount
,
buttonCount
;
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
QString
id
=
inputDevice
.
callObjectMethod
(
"getDescriptor"
,
"()Ljava/lang/String;"
).
toString
();
QString
name
=
inputDevice
.
callObjectMethod
(
"getName"
,
"()Ljava/lang/String;"
).
toString
();
//get number of buttons
jintArray
a
=
env
->
NewIntArray
(
31
);
env
->
SetIntArrayRegion
(
a
,
0
,
31
,
_possibleButtons
);
//QAndroidJniObject keyMap = inputDevice.callObjectMethod("getKeyCharacterMap", "()Landroid/view/KeyCharacterMap;");
//QAndroidJniObject btns = keyMap.callStaticObjectMethod("android/view/KeyCharacterMap","deviceHasKeys", "([I)[Z", a);
QAndroidJniObject
btns
=
inputDevice
.
callObjectMethod
(
"hasKeys"
,
"([I)[Z"
,
a
);
jbooleanArray
jSupportedButtons
=
btns
.
object
<
jbooleanArray
>
();
size_t
btn_sz
=
env
->
GetArrayLength
(
jSupportedButtons
);
jboolean
*
supportedButtons
=
env
->
GetBooleanArrayElements
(
jSupportedButtons
,
nullptr
);
buttonCount
=
0
;
for
(
size_t
j
=
0
;
j
<
btn_sz
;
j
++
)
if
(
supportedButtons
[
j
])
buttonCount
++
;
env
->
ReleaseBooleanArrayElements
(
jSupportedButtons
,
supportedButtons
,
0
);
//get number of axis
QAndroidJniObject
rangeListNative
=
inputDevice
.
callObjectMethod
(
"getMotionRanges"
,
"()Ljava/util/List;"
);
axisCount
=
rangeListNative
.
callMethod
<
jint
>
(
"size"
);
qCDebug
(
JoystickManagerLog
)
<<
"
\t
"
<<
name
<<
"axes:"
<<
axisCount
<<
"buttons:"
<<
buttonCount
;
_name2JoystickMap
[
name
]
=
new
Joystick
(
name
,
axisCount
,
buttonCount
,
buff
[
i
],
_multiVehicleManager
);
}
env
->
ReleaseIntArrayElements
(
jarr
,
buff
,
0
);
#endif
#endif
if
(
!
_name2JoystickMap
.
count
())
{
if
(
!
_name2JoystickMap
.
count
())
{
...
@@ -143,38 +78,6 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox)
...
@@ -143,38 +78,6 @@ void JoystickManager::setToolbox(QGCToolbox *toolbox)
_setActiveJoystickFromSettings
();
_setActiveJoystickFromSettings
();
}
}
void
JoystickManager
::
computePossibleButtons
()
{
static
int
ret
[
31
];
int
i
;
for
(
i
=
1
;
i
<=
16
;
i
++
)
{
QString
name
=
"KEYCODE_BUTTON_"
+
QString
::
number
(
i
);
ret
[
i
-
1
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
name
.
toStdString
().
c_str
());
}
i
--
;
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_A"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_B"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_C"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_L1"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_L2"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_R1"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_R2"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_MODE"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_SELECT"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_START"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_THUMBL"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_THUMBR"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_X"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_Y"
);
ret
[
i
++
]
=
QAndroidJniObject
::
getStaticField
<
jint
>
(
"android/view/KeyEvent"
,
"KEYCODE_BUTTON_Z"
);
for
(
int
j
=
0
;
j
<
i
;
j
++
)
qCDebug
(
JoystickManagerLog
)
<<
"
\t
possible button: "
+
ret
[
j
];
_possibleButtons
=
ret
;
}
void
JoystickManager
::
_setActiveJoystickFromSettings
(
void
)
void
JoystickManager
::
_setActiveJoystickFromSettings
(
void
)
{
{
QSettings
settings
;
QSettings
settings
;
...
...
This diff is collapsed.
Click to expand it.
src/Joystick/JoystickManager.h
View file @
e44fed2f
...
@@ -31,14 +31,6 @@
...
@@ -31,14 +31,6 @@
#include <QVariantList>
#include <QVariantList>
#ifdef __android__
#include <jni.h>
#include <QtCore/private/qjni_p.h>
#include <QtCore/private/qjnihelpers_p.h>
#include <QtAndroidExtras/QtAndroidExtras>
#include <QtAndroidExtras/QAndroidJniObject>
#endif
Q_DECLARE_LOGGING_CATEGORY
(
JoystickManagerLog
)
Q_DECLARE_LOGGING_CATEGORY
(
JoystickManagerLog
)
class
QGCApplicaiton
;
class
QGCApplicaiton
;
...
@@ -49,6 +41,7 @@ class JoystickManager : public QGCTool
...
@@ -49,6 +41,7 @@ class JoystickManager : public QGCTool
public:
public:
JoystickManager
(
QGCApplication
*
app
);
JoystickManager
(
QGCApplication
*
app
);
~
JoystickManager
();
/// List of available joysticks
/// List of available joysticks
Q_PROPERTY
(
QVariantList
joysticks
READ
joysticks
CONSTANT
)
Q_PROPERTY
(
QVariantList
joysticks
READ
joysticks
CONSTANT
)
...
@@ -86,12 +79,6 @@ private:
...
@@ -86,12 +79,6 @@ private:
static
const
char
*
_settingsGroup
;
static
const
char
*
_settingsGroup
;
static
const
char
*
_settingsKeyActiveJoystick
;
static
const
char
*
_settingsKeyActiveJoystick
;
#ifdef __android__
void
computePossibleButtons
();
int
*
_possibleButtons
;
QMutex
m_mutex
;
#endif
};
};
#endif
#endif
This diff is collapsed.
Click to expand it.
src/Joystick/JoystickSDL.cc
0 → 100644
View file @
e44fed2f
#include "JoystickSDL.h"
#include "QGCApplication.h"
#include <QQmlEngine>
JoystickSDL
::
JoystickSDL
(
const
QString
&
name
,
int
axisCount
,
int
buttonCount
,
int
index
,
MultiVehicleManager
*
multiVehicleManager
)
:
Joystick
(
name
,
axisCount
,
buttonCount
,
multiVehicleManager
)
,
_index
(
index
)
{
}
QMap
<
QString
,
Joystick
*>
JoystickSDL
::
discover
(
MultiVehicleManager
*
_multiVehicleManager
)
{
static
QMap
<
QString
,
Joystick
*>
ret
;
if
(
SDL_InitSubSystem
(
SDL_INIT_JOYSTICK
|
SDL_INIT_NOPARACHUTE
)
<
0
)
{
qWarning
()
<<
"Couldn't initialize SimpleDirectMediaLayer:"
<<
SDL_GetError
();
return
ret
;
}
// Load available joysticks
qCDebug
(
JoystickLog
)
<<
"Available joysticks"
;
for
(
int
i
=
0
;
i
<
SDL_NumJoysticks
();
i
++
)
{
QString
name
=
SDL_JoystickName
(
i
);
if
(
!
ret
.
contains
(
name
))
{
int
axisCount
,
buttonCount
;
SDL_Joystick
*
sdlJoystick
=
SDL_JoystickOpen
(
i
);
axisCount
=
SDL_JoystickNumAxes
(
sdlJoystick
);
buttonCount
=
SDL_JoystickNumButtons
(
sdlJoystick
);
SDL_JoystickClose
(
sdlJoystick
);
qCDebug
(
JoystickLog
)
<<
"
\t
"
<<
name
<<
"axes:"
<<
axisCount
<<
"buttons:"
<<
buttonCount
;
ret
[
name
]
=
new
JoystickSDL
(
name
,
axisCount
,
buttonCount
,
i
,
_multiVehicleManager
);
}
else
{
qCDebug
(
JoystickLog
)
<<
"
\t
Skipping duplicate"
<<
name
;
}
}
return
ret
;
}
bool
JoystickSDL
::
open
(
void
)
{
sdlJoystick
=
SDL_JoystickOpen
(
_index
);
if
(
!
sdlJoystick
)
{
qCWarning
(
JoystickLog
)
<<
"SDL_JoystickOpen failed:"
<<
SDL_GetError
();
return
false
;
}
return
true
;
}
void
JoystickSDL
::
close
(
void
)
{
SDL_JoystickClose
(
sdlJoystick
);
}
bool
JoystickSDL
::
update
(
void
)
{
SDL_JoystickUpdate
();
return
true
;
}
bool
JoystickSDL
::
getButton
(
int
i
)
{
return
!!
SDL_JoystickGetButton
(
sdlJoystick
,
i
);
}
int
JoystickSDL
::
getAxis
(
int
i
)
{
return
SDL_JoystickGetAxis
(
sdlJoystick
,
i
);
}
This diff is collapsed.
Click to expand it.
src/Joystick/joysticksdl.h
0 → 100644
View file @
e44fed2f
#ifndef JOYSTICKSDL_H
#define JOYSTICKSDL_H
#include "Joystick.h"
#include "Vehicle.h"
#include "MultiVehicleManager.h"
#ifdef Q_OS_MAC
#include <SDL.h>
#else
#include <SDL/SDL.h>
#endif
class
JoystickSDL
:
public
Joystick
{
public:
JoystickSDL
(
const
QString
&
name
,
int
axisCount
,
int
buttonCount
,
int
index
,
MultiVehicleManager
*
multiVehicleManager
);
static
QMap
<
QString
,
Joystick
*>
discover
(
MultiVehicleManager
*
_multiVehicleManager
);
private:
virtual
bool
open
();
virtual
void
close
();
virtual
bool
update
();
virtual
bool
getButton
(
int
i
);
virtual
int
getAxis
(
int
i
);
SDL_Joystick
*
sdlJoystick
;
int
_index
;
///< Index for SDL_JoystickOpen
};
#endif // JOYSTICKSDL_H
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment