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
59ad9be7
Commit
59ad9be7
authored
Apr 18, 2015
by
dogmaphobic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
First android commit.
parent
9a141821
Changes
53
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
53 changed files
with
7242 additions
and
55 deletions
+7242
-55
QGCApplication.pro
QGCApplication.pro
+64
-17
QGCCommon.pri
QGCCommon.pri
+4
-0
QGCSetup.pri
QGCSetup.pri
+8
-2
AndroidManifest.xml
android/AndroidManifest.xml
+67
-0
icon.png
android/res/drawable-ldpi/icon.png
+0
-0
device_filter.xml
android/res/xml/device_filter.xml
+40
-0
CdcAcmSerialDriver.java
...com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java
+252
-0
CommonUsbSerialDriver.java
.../hoho/android/usbserial/driver/CommonUsbSerialDriver.java
+156
-0
Cp2102SerialDriver.java
...com/hoho/android/usbserial/driver/Cp2102SerialDriver.java
+292
-0
FtdiSerialDriver.java
...c/com/hoho/android/usbserial/driver/FtdiSerialDriver.java
+552
-0
ProlificSerialDriver.java
...m/hoho/android/usbserial/driver/ProlificSerialDriver.java
+523
-0
UsbId.java
android/src/com/hoho/android/usbserial/driver/UsbId.java
+69
-0
UsbSerialDriver.java
...rc/com/hoho/android/usbserial/driver/UsbSerialDriver.java
+228
-0
UsbSerialProber.java
...rc/com/hoho/android/usbserial/driver/UsbSerialProber.java
+250
-0
UsbSerialRuntimeException.java
...o/android/usbserial/driver/UsbSerialRuntimeException.java
+46
-0
UsbDeviceJNI.java
android/src/org/qgroundcontrol/qgchelper/UsbDeviceJNI.java
+637
-0
UsbIoManager.java
android/src/org/qgroundcontrol/qgchelper/UsbIoManager.java
+218
-0
qextserialport_unix.cpp
libs/qextserialport/src/qextserialport_unix.cpp
+4
-0
qserialport.cpp
libs/qtandroidserialport/src/qserialport.cpp
+1375
-0
qserialport.h
libs/qtandroidserialport/src/qserialport.h
+287
-0
qserialport_android.cpp
libs/qtandroidserialport/src/qserialport_android.cpp
+867
-0
qserialport_android_p.h
libs/qtandroidserialport/src/qserialport_android_p.h
+133
-0
qserialport_p.h
libs/qtandroidserialport/src/qserialport_p.h
+338
-0
qserialportinfo.cpp
libs/qtandroidserialport/src/qserialportinfo.cpp
+292
-0
qserialportinfo.h
libs/qtandroidserialport/src/qserialportinfo.h
+95
-0
qserialportinfo_android.cpp
libs/qtandroidserialport/src/qserialportinfo_android.cpp
+158
-0
qserialportinfo_p.h
libs/qtandroidserialport/src/qserialportinfo_p.h
+95
-0
qtandroidserialport.pri
libs/qtandroidserialport/src/qtandroidserialport.pri
+28
-0
QGC.h
src/QGC.h
+3
-0
QGCFileDialog.cc
src/QGCFileDialog.cc
+10
-0
QGCMessageBox.h
src/QGCMessageBox.h
+4
-0
PX4Bootloader.cc
src/VehicleSetup/PX4Bootloader.cc
+4
-0
PX4FirmwareUpgradeThread.cc
src/VehicleSetup/PX4FirmwareUpgradeThread.cc
+4
-0
LinkConfiguration.cc
src/comm/LinkConfiguration.cc
+6
-0
LinkManager.cc
src/comm/LinkManager.cc
+8
-0
LinkManager.h
src/comm/LinkManager.h
+2
-0
SerialLink.cc
src/comm/SerialLink.cc
+6
-0
SerialLink.h
src/comm/SerialLink.h
+4
-0
main.cc
src/main.cc
+4
-0
UnitTest.h
src/qgcunittest/UnitTest.h
+2
-0
MainWindow.cc
src/ui/MainWindow.cc
+14
-1
MainWindow.h
src/ui/MainWindow.h
+4
-0
SerialConfigurationWindow.cc
src/ui/SerialConfigurationWindow.cc
+5
-0
SettingsDialog.cc
src/ui/SettingsDialog.cc
+12
-0
SettingsDialog.h
src/ui/SettingsDialog.h
+4
-0
SerialSettingsDialog.cc
src/ui/configuration/SerialSettingsDialog.cc
+5
-0
SerialSettingsDialog.h
src/ui/configuration/SerialSettingsDialog.h
+4
-0
terminalconsole.cpp
src/ui/configuration/terminalconsole.cpp
+5
-0
terminalconsole.h
src/ui/configuration/terminalconsole.h
+4
-0
QGCParamSlider.h
src/ui/designer/QGCParamSlider.h
+2
-0
QGCToolWidgetComboBox.h
src/ui/designer/QGCToolWidgetComboBox.h
+2
-1
MainToolBar.cc
src/ui/toolbar/MainToolBar.cc
+5
-0
MainToolBar.qml
src/ui/toolbar/MainToolBar.qml
+41
-34
No files found.
QGCApplication.pro
View file @
59ad9be7
...
...
@@ -61,12 +61,15 @@ QT += network \
qml
\
quick
\
quickwidgets
\
serialport
\
sql
\
svg
\
widgets
\
xml
\
!
AndroidBuild
{
QT
+=
serialport
}
contains
(
DEFINES
,
QGC_NOTIFY_TUNES_ENABLED
)
{
QT
+=
multimedia
}
...
...
@@ -78,6 +81,11 @@ QT += testlib
#
OS
Specific
settings
#
AndroidBuild
{
DEFINES
+=
__android__
DEFINES
+=
__STDC_LIMIT_MACROS
}
MacBuild
{
QMAKE_INFO_PLIST
=
Custom
-
Info
.
plist
ICON
=
$$
BASEDIR
/
resources
/
icons
/
macx
.
icns
...
...
@@ -173,9 +181,6 @@ FORMS += \
src
/
ui
/
designer
/
QGCToolWidgetComboBox
.
ui
\
src
/
ui
/
designer
/
QGCXYPlot
.
ui
\
src
/
ui
/
HDDisplay
.
ui
\
src
/
ui
/
JoystickAxis
.
ui
\
src
/
ui
/
JoystickButton
.
ui
\
src
/
ui
/
JoystickWidget
.
ui
\
src
/
ui
/
Linechart
.
ui
\
src
/
ui
/
MainWindow
.
ui
\
src
/
ui
/
map
/
QGCMapTool
.
ui
\
...
...
@@ -229,6 +234,13 @@ FORMS += \
src
/
ui
/
WaypointList
.
ui
\
src
/
ui
/
WaypointViewOnlyView
.
ui
\
!
AndroidBuild
{
FORMS
+=
\
src
/
ui
/
JoystickButton
.
ui
\
src
/
ui
/
JoystickAxis
.
ui
\
src
/
ui
/
JoystickWidget
.
ui
}
HEADERS
+=
\
src
/
audio
/
QGCAudioWorker
.
h
\
src
/
CmdLineOptParser
.
h
\
...
...
@@ -250,7 +262,6 @@ HEADERS += \
src
/
comm
/
TCPLink
.
h
\
src
/
comm
/
UDPLink
.
h
\
src
/
GAudioOutput
.
h
\
src
/
input
/
JoystickInput
.
h
\
src
/
LogCompressor
.
h
\
src
/
MG
.
h
\
src
/
QGC
.
h
\
...
...
@@ -281,7 +292,6 @@ HEADERS += \
src
/
uas
/
UASParameterCommsMgr
.
h
\
src
/
uas
/
UASParameterDataModel
.
h
\
src
/
uas
/
UASWaypointManager
.
h
\
src
/
ui
/
CameraView
.
h
\
src
/
ui
/
configuration
/
ApmHighlighter
.
h
\
src
/
ui
/
configuration
/
console
.
h
\
src
/
ui
/
configuration
/
SerialSettingsDialog
.
h
\
...
...
@@ -300,9 +310,6 @@ HEADERS += \
src
/
ui
/
HDDisplay
.
h
\
src
/
ui
/
HSIDisplay
.
h
\
src
/
ui
/
HUD
.
h
\
src
/
ui
/
JoystickAxis
.
h
\
src
/
ui
/
JoystickButton
.
h
\
src
/
ui
/
JoystickWidget
.
h
\
src
/
ui
/
linechart
/
ChartPlot
.
h
\
src
/
ui
/
linechart
/
IncrementalPlot
.
h
\
src
/
ui
/
linechart
/
LinechartPlot
.
h
\
...
...
@@ -376,6 +383,15 @@ HEADERS += \
src
/
ViewWidgets
/
ViewWidgetController
.
h
\
src
/
Waypoint
.
h
\
!
AndroidBuild
{
HEADERS
+=
\
src
/
input
/
JoystickInput
.
h
\
src
/
ui
/
JoystickAxis
.
h
\
src
/
ui
/
JoystickButton
.
h
\
src
/
ui
/
JoystickWidget
.
h
\
src
/
ui
/
CameraView
.
h
\
}
SOURCES
+=
\
src
/
audio
/
QGCAudioWorker
.
cpp
\
src
/
CmdLineOptParser
.
cc
\
...
...
@@ -393,7 +409,6 @@ SOURCES += \
src
/
comm
/
TCPLink
.
cc
\
src
/
comm
/
UDPLink
.
cc
\
src
/
GAudioOutput
.
cc
\
src
/
input
/
JoystickInput
.
cc
\
src
/
LogCompressor
.
cc
\
src
/
main
.
cc
\
src
/
QGC
.
cc
\
...
...
@@ -418,7 +433,6 @@ SOURCES += \
src
/
uas
/
UASParameterCommsMgr
.
cc
\
src
/
uas
/
UASParameterDataModel
.
cc
\
src
/
uas
/
UASWaypointManager
.
cc
\
src
/
ui
/
CameraView
.
cc
\
src
/
ui
/
configuration
/
ApmHighlighter
.
cc
\
src
/
ui
/
configuration
/
console
.
cpp
\
src
/
ui
/
configuration
/
SerialSettingsDialog
.
cc
\
...
...
@@ -437,9 +451,6 @@ SOURCES += \
src
/
ui
/
HDDisplay
.
cc
\
src
/
ui
/
HSIDisplay
.
cc
\
src
/
ui
/
HUD
.
cc
\
src
/
ui
/
JoystickAxis
.
cc
\
src
/
ui
/
JoystickButton
.
cc
\
src
/
ui
/
JoystickWidget
.
cc
\
src
/
ui
/
linechart
/
ChartPlot
.
cc
\
src
/
ui
/
linechart
/
IncrementalPlot
.
cc
\
src
/
ui
/
linechart
/
LinechartPlot
.
cc
\
...
...
@@ -513,6 +524,15 @@ SOURCES += \
src
/
ViewWidgets
/
ViewWidgetController
.
cc
\
src
/
Waypoint
.
cc
\
!
AndroidBuild
{
SOURCES
+=
\
src
/
input
/
JoystickInput
.
cc
\
src
/
ui
/
JoystickAxis
.
cc
\
src
/
ui
/
JoystickButton
.
cc
\
src
/
ui
/
JoystickWidget
.
cc
\
src
/
ui
/
CameraView
.
cc
}
#
#
Unit
Test
specific
configuration
goes
here
#
...
...
@@ -524,6 +544,11 @@ SOURCES += \
DebugBuild
|
WindowsDebugAndRelease
{
HEADERS
+=
src
/
QmlControls
/
QmlTestWidget
.
h
SOURCES
+=
src
/
QmlControls
/
QmlTestWidget
.
cc
!
AndroidBuild
{
INCLUDEPATH
+=
\
src
/
qgcunittest
...
...
@@ -550,7 +575,6 @@ HEADERS += \
src
/
qgcunittest
/
MockLinkMissionItemHandler
.
h
\
src
/
qgcunittest
/
PX4RCCalibrationTest
.
h
\
src
/
qgcunittest
/
UnitTest
.
h
\
src
/
QmlControls
/
QmlTestWidget
.
h
\
src
/
VehicleSetup
/
SetupViewTest
.
h
\
SOURCES
+=
\
...
...
@@ -575,10 +599,10 @@ SOURCES += \
src
/
qgcunittest
/
MockLinkMissionItemHandler
.
cc
\
src
/
qgcunittest
/
PX4RCCalibrationTest
.
cc
\
src
/
qgcunittest
/
UnitTest
.
cc
\
src
/
QmlControls
/
QmlTestWidget
.
cc
\
src
/
VehicleSetup
/
SetupViewTest
.
cc
\
}
}
#
DebugBuild
|
WindowsDebugAndRelease
}
#
AndroidBuild
#
#
AutoPilot
Plugin
Support
...
...
@@ -658,3 +682,26 @@ SOURCES += \
src
/
FactSystem
/
FactSystem
.
cc
\
src
/
FactSystem
/
FactValidator
.
cc
\
src
/
FactSystem
/
ParameterLoader
.
cc
\
#
Android
AndroidBuild
{
include
(
$$
PWD
/
libs
/
qtandroidserialport
/
src
/
qtandroidserialport
.
pri
)
message
(
"Adding Serial Java Classes"
)
QT
+=
androidextras
ANDROID_PACKAGE_SOURCE_DIR
=
$$
PWD
/
android
OTHER_FILES
+=
\
$$
PWD
/
android
/
AndroidManifest
.
xml
\
$$
PWD
/
android
/
res
/
xml
/
device_filter
.
xml
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
CdcAcmSerialDriver
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
CommonUsbSerialDriver
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
Cp2102SerialDriver
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
FtdiSerialDriver
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
ProlificSerialDriver
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
UsbId
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
UsbSerialDriver
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
UsbSerialProber
.
java
\
$$
PWD
/
android
/
src
/
com
/
hoho
/
android
/
usbserial
/
driver
/
UsbSerialRuntimeException
.
java
\
$$
PWD
/
android
/
src
/
org
/
qgroundcontrol
/
qgchelper
/
UsbDeviceJNI
.
java
\
$$
PWD
/
android
/
src
/
org
/
qgroundcontrol
/
qgchelper
/
UsbIoManager
.
java
}
QGCCommon.pri
View file @
59ad9be7
...
...
@@ -30,6 +30,10 @@ linux {
linux-g++ | linux-g++-64 {
message("Linux build")
CONFIG += LinuxBuild
} else : android-g++ {
message("Android build")
CONFIG += AndroidBuild
warning("Android build is experimental and not fully functional")
} else {
error("Unsuported Linux toolchain, only GCC 32- or 64-bit is supported")
}
...
...
QGCSetup.pri
View file @
59ad9be7
...
...
@@ -19,6 +19,10 @@
QMAKE_POST_LINK += echo "Copying files"
AndroidBuild {
INSTALLS += $$DESTDIR
}
#
# Copy the application resources to the associated place alongside the application
#
...
...
@@ -40,8 +44,10 @@ WindowsBuild {
BASEDIR_COPY_RESOURCE_LIST = $$replace(BASEDIR,"/","\\")
QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY_DIR \"$$BASEDIR_COPY_RESOURCE_LIST\\flightgear\" \"$$DESTDIR_COPY_RESOURCE_LIST\\flightgear\"
} else {
# Make sure to keep both side of this if using the same set of directories
QMAKE_POST_LINK += && $$QMAKE_COPY_DIR $$BASEDIR/flightgear $$DESTDIR_COPY_RESOURCE_LIST
!AndroidBuild {
# Make sure to keep both sides of this if using the same set of directories
QMAKE_POST_LINK += && $$QMAKE_COPY_DIR $$BASEDIR/flightgear $$DESTDIR_COPY_RESOURCE_LIST
}
}
#
...
...
android/AndroidManifest.xml
0 → 100644
View file @
59ad9be7
<?xml version="1.0"?>
<manifest
package=
"org.qgroundcontrol"
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:versionName=
"2.3.0"
android:versionCode=
"2"
android:installLocation=
"auto"
>
<application
android:hardwareAccelerated=
"true"
android:name=
"org.qtproject.qt5.android.bindings.QtApplication"
android:label=
"-- %%INSERT_APP_NAME%% --"
android:icon=
"@drawable/icon"
>
<activity
android:configChanges=
"orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
android:name=
"org.qgroundcontrol.qgchelper.UsbDeviceJNI"
android:label=
"-- %%INSERT_APP_NAME%% --"
android:screenOrientation=
"reverseLandscape"
android:launchMode=
"singleTask"
>
<intent-filter>
<action
android:name=
"android.intent.action.MAIN"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
<action
android:name=
"android.hardware.usb.action.USB_DEVICE_ATTACHED"
/>
<action
android:name=
"android.hardware.usb.action.USB_DEVICE_DETACHED"
/>
</intent-filter>
<!-- Needed to keep working while 'asleep' -->
<uses-permission
android:name=
"android.permission.WAKE_LOCK"
/>
<!-- Support devices without USB host mode since there are other connection types -->
<uses-feature
android:name=
"android.hardware.usb.host"
android:required=
"false"
/>
<meta-data
android:resource=
"@xml/device_filter"
android:name=
"android.hardware.usb.action.USB_DEVICE_ATTACHED"
/>
<meta-data
android:resource=
"@xml/device_filter"
android:name=
"android.hardware.usb.action.USB_DEVICE_DETACHED"
/>
<!-- Rest of Standard Manifest -->
<meta-data
android:name=
"android.app.lib_name"
android:value=
"-- %%INSERT_APP_LIB_NAME%% --"
/>
<meta-data
android:name=
"android.app.qt_sources_resource_id"
android:resource=
"@array/qt_sources"
/>
<meta-data
android:name=
"android.app.repository"
android:value=
"default"
/>
<meta-data
android:name=
"android.app.qt_libs_resource_id"
android:resource=
"@array/qt_libs"
/>
<meta-data
android:name=
"android.app.bundled_libs_resource_id"
android:resource=
"@array/bundled_libs"
/>
<!-- Deploy Qt libs as part of package -->
<meta-data
android:name=
"android.app.bundle_local_qt_libs"
android:value=
"-- %%BUNDLE_LOCAL_QT_LIBS%% --"
/>
<meta-data
android:name=
"android.app.bundled_in_lib_resource_id"
android:resource=
"@array/bundled_in_lib"
/>
<meta-data
android:name=
"android.app.bundled_in_assets_resource_id"
android:resource=
"@array/bundled_in_assets"
/>
<!-- Run with local libs -->
<meta-data
android:name=
"android.app.use_local_qt_libs"
android:value=
"-- %%USE_LOCAL_QT_LIBS%% --"
/>
<meta-data
android:name=
"android.app.libs_prefix"
android:value=
"/data/local/tmp/qt/"
/>
<meta-data
android:name=
"android.app.load_local_libs"
android:value=
"-- %%INSERT_LOCAL_LIBS%% --"
/>
<meta-data
android:name=
"android.app.load_local_jars"
android:value=
"-- %%INSERT_LOCAL_JARS%% --"
/>
<meta-data
android:name=
"android.app.static_init_classes"
android:value=
"-- %%INSERT_INIT_CLASSES%% --"
/>
<!-- Messages maps -->
<meta-data
android:value=
"@string/ministro_not_found_msg"
android:name=
"android.app.ministro_not_found_msg"
/>
<meta-data
android:value=
"@string/ministro_needed_msg"
android:name=
"android.app.ministro_needed_msg"
/>
<meta-data
android:value=
"@string/fatal_error_msg"
android:name=
"android.app.fatal_error_msg"
/>
<!-- Messages maps -->
<!-- Splash screen -->
<!--
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/>
-->
<!-- Splash screen -->
<!-- Background running -->
<!-- Warning: changing this value to true may cause unexpected crashes if the
application still try to draw after
"applicationStateChanged(Qt::ApplicationSuspended)"
signal is sent! -->
<meta-data
android:name=
"android.app.background_running"
android:value=
"false"
/>
<!-- Background running -->
</activity>
</application>
<uses-sdk
android:minSdkVersion=
"19"
android:targetSdkVersion=
"19"
/>
<supports-screens
android:largeScreens=
"true"
android:normalScreens=
"true"
android:anyDensity=
"true"
android:smallScreens=
"true"
/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
Remove the comment if you do not require these default permissions. -->
<!-- %%INSERT_PERMISSIONS -->
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
Remove the comment if you do not require these default features. -->
<!-- %%INSERT_FEATURES -->
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
</manifest>
android/res/drawable-ldpi/icon.png
0 → 100644
View file @
59ad9be7
48.1 KB
android/res/xml/device_filter.xml
0 → 100644
View file @
59ad9be7
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Everything -->
<usb-device
/>
<!-- 0x26AC / 0x11: PX4 FMU Pixhawk -->
<!--
<usb-device vendor-id="9900" product-id="17" />
-->
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
<!--
<usb-device vendor-id="1027" product-id="24577" />
-->
<!-- 0x0403 / 0x6015: FTDI FT231X -->
<!--
<usb-device vendor-id="1027" product-id="24597" />
-->
<!-- 0x2341 / Arduino -->
<!--
<usb-device vendor-id="9025" />
-->
<!-- 0x16C0 / 0x0483: Teensyduino -->
<!--
<usb-device vendor-id="5824" product-id="1155" />
-->
<!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
<!--
<usb-device vendor-id="4292" product-id="60000" />
-->
<!-- 0x067B / 0x2303: Prolific PL2303 -->
<!--
<usb-device vendor-id="1659" product-id="8963" />
-->
</resources>
android/src/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java
0 → 100644
View file @
59ad9be7
package
com
.
hoho
.
android
.
usbserial
.
driver
;
import
android.hardware.usb.UsbConstants
;
import
android.hardware.usb.UsbDevice
;
import
android.hardware.usb.UsbDeviceConnection
;
import
android.hardware.usb.UsbEndpoint
;
import
android.hardware.usb.UsbInterface
;
import
android.util.Log
;
import
java.io.IOException
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
/**
* USB CDC/ACM serial driver implementation.
*
* @author mike wakerly (opensource@hoho.com)
* @see <a
* href="http://www.usb.org/developers/devclass_docs/usbcdc11.pdf">Universal
* Serial Bus Class Definitions for Communication Devices, v1.1</a>
*/
public
class
CdcAcmSerialDriver
extends
CommonUsbSerialDriver
{
private
final
String
TAG
=
CdcAcmSerialDriver
.
class
.
getSimpleName
();
private
UsbInterface
mControlInterface
;
private
UsbInterface
mDataInterface
;
private
UsbEndpoint
mControlEndpoint
;
private
UsbEndpoint
mReadEndpoint
;
private
UsbEndpoint
mWriteEndpoint
;
private
boolean
mRts
=
false
;
private
boolean
mDtr
=
false
;
private
static
final
int
USB_RECIP_INTERFACE
=
0x01
;
private
static
final
int
USB_RT_ACM
=
UsbConstants
.
USB_TYPE_CLASS
|
USB_RECIP_INTERFACE
;
private
static
final
int
SET_LINE_CODING
=
0x20
;
// USB CDC 1.1 section 6.2
private
static
final
int
GET_LINE_CODING
=
0x21
;
private
static
final
int
SET_CONTROL_LINE_STATE
=
0x22
;
private
static
final
int
SEND_BREAK
=
0x23
;
public
CdcAcmSerialDriver
(
UsbDevice
device
,
UsbDeviceConnection
connection
)
{
super
(
device
,
connection
);
}
@Override
public
void
open
()
throws
IOException
{
Log
.
d
(
TAG
,
"claiming interfaces, count="
+
mDevice
.
getInterfaceCount
());
Log
.
d
(
TAG
,
"Claiming control interface."
);
mControlInterface
=
mDevice
.
getInterface
(
0
);
Log
.
d
(
TAG
,
"Control iface="
+
mControlInterface
);
// class should be USB_CLASS_COMM
if
(!
mConnection
.
claimInterface
(
mControlInterface
,
true
))
{
throw
new
IOException
(
"Could not claim control interface."
);
}
mControlEndpoint
=
mControlInterface
.
getEndpoint
(
0
);
Log
.
d
(
TAG
,
"Control endpoint direction: "
+
mControlEndpoint
.
getDirection
());
Log
.
d
(
TAG
,
"Claiming data interface."
);
mDataInterface
=
mDevice
.
getInterface
(
1
);
Log
.
d
(
TAG
,
"data iface="
+
mDataInterface
);
// class should be USB_CLASS_CDC_DATA
if
(!
mConnection
.
claimInterface
(
mDataInterface
,
true
))
{
throw
new
IOException
(
"Could not claim data interface."
);
}
mReadEndpoint
=
mDataInterface
.
getEndpoint
(
1
);
Log
.
d
(
TAG
,
"Read endpoint direction: "
+
mReadEndpoint
.
getDirection
());
mWriteEndpoint
=
mDataInterface
.
getEndpoint
(
0
);
Log
.
d
(
TAG
,
"Write endpoint direction: "
+
mWriteEndpoint
.
getDirection
());
}
private
int
sendAcmControlMessage
(
int
request
,
int
value
,
byte
[]
buf
)
{
return
mConnection
.
controlTransfer
(
USB_RT_ACM
,
request
,
value
,
0
,
buf
,
buf
!=
null
?
buf
.
length
:
0
,
5000
);
}
@Override
public
void
close
()
throws
IOException
{
mConnection
.
close
();
}
@Override
public
int
read
(
byte
[]
dest
,
int
timeoutMillis
)
throws
IOException
{
final
int
numBytesRead
;
synchronized
(
mReadBufferLock
)
{
int
readAmt
=
Math
.
min
(
dest
.
length
,
mReadBuffer
.
length
);
numBytesRead
=
mConnection
.
bulkTransfer
(
mReadEndpoint
,
mReadBuffer
,
readAmt
,
timeoutMillis
);
if
(
numBytesRead
<
0
)
{
// This sucks: we get -1 on timeout, not 0 as preferred.
// We *should* use UsbRequest, except it has a bug/api oversight
// where there is no way to determine the number of bytes read
// in response :\ -- http://b.android.com/28023
return
0
;
}
System
.
arraycopy
(
mReadBuffer
,
0
,
dest
,
0
,
numBytesRead
);
}
return
numBytesRead
;
}
@Override
public
int
write
(
byte
[]
src
,
int
timeoutMillis
)
throws
IOException
{
// TODO(mikey): Nearly identical to FtdiSerial write. Refactor.
int
offset
=
0
;
while
(
offset
<
src
.
length
)
{
final
int
writeLength
;
final
int
amtWritten
;
synchronized
(
mWriteBufferLock
)
{
final
byte
[]
writeBuffer
;
writeLength
=
Math
.
min
(
src
.
length
-
offset
,
mWriteBuffer
.
length
);
if
(
offset
==
0
)
{
writeBuffer
=
src
;
}
else
{
// bulkTransfer does not support offsets, make a copy.
System
.
arraycopy
(
src
,
offset
,
mWriteBuffer
,
0
,
writeLength
);
writeBuffer
=
mWriteBuffer
;
}
amtWritten
=
mConnection
.
bulkTransfer
(
mWriteEndpoint
,
writeBuffer
,
writeLength
,
timeoutMillis
);
}
if
(
amtWritten
<=
0
)
{
throw
new
IOException
(
"Error writing "
+
writeLength
+
" bytes at offset "
+
offset
+
" length="
+
src
.
length
);
}
//Log.d(TAG, "Wrote amt=" + amtWritten + " attempted=" + writeLength);
offset
+=
amtWritten
;
}
return
offset
;
}
@Override
public
void
setParameters
(
int
baudRate
,
int
dataBits
,
int
stopBits
,
int
parity
)
{
byte
stopBitsByte
;
switch
(
stopBits
)
{
case
STOPBITS_1:
stopBitsByte
=
0
;
break
;
case
STOPBITS_1_5:
stopBitsByte
=
1
;
break
;
case
STOPBITS_2:
stopBitsByte
=
2
;
break
;
default
:
throw
new
IllegalArgumentException
(
"Bad value for stopBits: "
+
stopBits
);
}
byte
parityBitesByte
;
switch
(
parity
)
{
case
PARITY_NONE:
parityBitesByte
=
0
;
break
;
case
PARITY_ODD:
parityBitesByte
=
1
;
break
;
case
PARITY_EVEN:
parityBitesByte
=
2
;
break
;
case
PARITY_MARK:
parityBitesByte
=
3
;
break
;
case
PARITY_SPACE:
parityBitesByte
=
4
;
break
;
default
:
throw
new
IllegalArgumentException
(
"Bad value for parity: "
+
parity
);
}
byte
[]
msg
=
{
(
byte
)
(
baudRate
&
0xff
),
(
byte
)
((
baudRate
>>
8
)
&
0xff
),
(
byte
)
((
baudRate
>>
16
)
&
0xff
),
(
byte
)
((
baudRate
>>
24
)
&
0xff
),
stopBitsByte
,
parityBitesByte
,
(
byte
)
dataBits
};
sendAcmControlMessage
(
SET_LINE_CODING
,
0
,
msg
);
}
@Override
public
boolean
getCD
()
throws
IOException
{
return
false
;
// TODO
}
@Override
public
boolean
getCTS
()
throws
IOException
{
return
false
;
// TODO
}
@Override
public
boolean
getDSR
()
throws
IOException
{
return
false
;
// TODO
}
@Override
public
boolean
getDTR
()
throws
IOException
{
return
mDtr
;
}
@Override
public
void
setDTR
(
boolean
value
)
throws
IOException
{
mDtr
=
value
;
setDtrRts
();
}
@Override
public
boolean
getRI
()
throws
IOException
{
return
false
;
// TODO
}
@Override
public
boolean
getRTS
()
throws
IOException
{
return
mRts
;
}
@Override
public
void
setRTS
(
boolean
value
)
throws
IOException
{
mRts
=
value
;
setDtrRts
();
}
private
void
setDtrRts
()
{
int
value
=
(
mRts
?
0x2
:
0
)
|
(
mDtr
?
0x1
:
0
);
sendAcmControlMessage
(
SET_CONTROL_LINE_STATE
,
value
,
null
);
}
public
static
Map
<
Integer
,
int
[]>
getSupportedDevices
()
{
final
Map
<
Integer
,
int
[]>
supportedDevices
=
new
LinkedHashMap
<
Integer
,
int
[]>();
supportedDevices
.
put
(
Integer
.
valueOf
(
UsbId
.
VENDOR_ARDUINO
),
new
int
[]
{
UsbId
.
ARDUINO_UNO
,
UsbId
.
ARDUINO_UNO_R3
,
UsbId
.
ARDUINO_MEGA_2560
,
UsbId
.
ARDUINO_MEGA_2560_R3
,
UsbId
.
ARDUINO_SERIAL_ADAPTER
,
UsbId
.
ARDUINO_SERIAL_ADAPTER_R3
,
UsbId
.
ARDUINO_MEGA_ADK
,
UsbId
.
ARDUINO_MEGA_ADK_R3
,
UsbId
.
ARDUINO_LEONARDO
,
});
supportedDevices
.
put
(
Integer
.
valueOf
(
UsbId
.
VENDOR_VAN_OOIJEN_TECH
),
new
int
[]
{
UsbId
.
VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL
,
});
supportedDevices
.
put
(
Integer
.
valueOf
(
UsbId
.
VENDOR_ATMEL
),
new
int
[]
{
UsbId
.
ATMEL_LUFA_CDC_DEMO_APP
,
});
supportedDevices
.
put
(
Integer
.
valueOf
(
UsbId
.
VENDOR_LEAFLABS
),
new
int
[]
{
UsbId
.
LEAFLABS_MAPLE
,
});
supportedDevices
.
put
(
Integer
.
valueOf
(
UsbId
.
VENDOR_PX4
),
new
int
[]
{
UsbId
.
DEVICE_PX4FMU
,
});
return
supportedDevices
;
}
}
android/src/com/hoho/android/usbserial/driver/CommonUsbSerialDriver.java
0 → 100644
View file @
59ad9be7
/* Copyright 2013 Google Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* Project home page: http://code.google.com/p/usb-serial-for-android/
*/
package
com
.
hoho
.
android
.
usbserial
.
driver
;
import
android.hardware.usb.UsbDevice
;
import
android.hardware.usb.UsbDeviceConnection
;
import
java.io.IOException
;
/**
* A base class shared by several driver implementations.
*
* @author mike wakerly (opensource@hoho.com)
*/
abstract
class
CommonUsbSerialDriver
implements
UsbSerialDriver
{
public
static
final
int
DEFAULT_READ_BUFFER_SIZE
=
16
*
1024
;
public
static
final
int
DEFAULT_WRITE_BUFFER_SIZE
=
16
*
1024
;
protected
final
UsbDevice
mDevice
;
protected
final
UsbDeviceConnection
mConnection
;
protected
final
Object
mReadBufferLock
=
new
Object
();
protected
final
Object
mWriteBufferLock
=
new
Object
();
/** Internal read buffer. Guarded by {@link #mReadBufferLock}. */
protected
byte
[]
mReadBuffer
;
/** Internal write buffer. Guarded by {@link #mWriteBufferLock}. */
protected
byte
[]
mWriteBuffer
;
public
CommonUsbSerialDriver
(
UsbDevice
device
,
UsbDeviceConnection
connection
)
{
mDevice
=
device
;
mConnection
=
connection
;
mReadBuffer
=
new
byte
[
DEFAULT_READ_BUFFER_SIZE
];
mWriteBuffer
=
new
byte
[
DEFAULT_WRITE_BUFFER_SIZE
];
}
/**
* Returns the currently-bound USB device.
*
* @return the device
*/
@Override
public
final
UsbDevice
getDevice
()
{
return
mDevice
;
}
/**
* Returns the currently-bound USB device connection.
*
* @return the device connection
*/
@Override
public
final
UsbDeviceConnection
getDeviceConnection
()
{
return
mConnection
;
}
/**
* Sets the size of the internal buffer used to exchange data with the USB
* stack for read operations. Most users should not need to change this.
*
* @param bufferSize the size in bytes
*/
public
final
void
setReadBufferSize
(
int
bufferSize
)
{
synchronized
(
mReadBufferLock
)
{
if
(
bufferSize
==
mReadBuffer
.
length
)
{
return
;
}
mReadBuffer
=
new
byte
[
bufferSize
];
}
}
/**
* Sets the size of the internal buffer used to exchange data with the USB
* stack for write operations. Most users should not need to change this.
*
* @param bufferSize the size in bytes
*/