diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml deleted file mode 100644 index a23521a..0000000 --- a/android/AndroidManifest.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 34c0843..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,82 +0,0 @@ -buildscript { - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.4.1' - } -} - -repositories { - google() - mavenCentral() -} - -apply plugin: 'com.android.application' - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) - implementation 'androidx.core:core:1.10.1' -} - -android { - /******************************************************* - * The following variables: - * - androidBuildToolsVersion, - * - androidCompileSdkVersion - * - qtAndroidDir - holds the path to qt android files - * needed to build any Qt application - * on Android. - * - * are defined in gradle.properties file. This file is - * updated by QtCreator and androiddeployqt tools. - * Changing them manually might break the compilation! - *******************************************************/ - - compileSdkVersion androidCompileSdkVersion - buildToolsVersion androidBuildToolsVersion - ndkVersion androidNdkVersion - - // Extract native libraries from the APK - packagingOptions.jniLibs.useLegacyPackaging true - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = [qtAndroidDir + '/src', 'src', 'java'] - aidl.srcDirs = [qtAndroidDir + '/src', 'src', 'aidl'] - res.srcDirs = [qtAndroidDir + '/res', 'res'] - resources.srcDirs = ['resources'] - renderscript.srcDirs = ['src'] - assets.srcDirs = ['assets'] - jniLibs.srcDirs = ['libs'] - } - } - - tasks.withType(JavaCompile) { - options.incremental = true - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - lintOptions { - abortOnError false - } - - // Do not compress Qt binary resources file - aaptOptions { - noCompress 'rcc' - } - - defaultConfig { - resConfig "en" - minSdkVersion qtMinSdkVersion - targetSdkVersion qtTargetSdkVersion - ndk.abiFilters = qtTargetAbiList.split(",") - } -} diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 82e3f93..0000000 --- a/android/gradle.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Project-wide Gradle settings. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# Enable building projects in parallel -org.gradle.parallel=true - -# Gradle caching allows reusing the build artifacts from a previous -# build with the same inputs. However, over time, the cache size will -# grow. Uncomment the following line to enable it. -#org.gradle.caching=true -#org.gradle.configuration-cache=true - -# Allow AndroidX usage -android.useAndroidX=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7f93135..0000000 Binary files a/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 1237eca..0000000 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew deleted file mode 100644 index c22a517..0000000 --- a/android/gradlew +++ /dev/null @@ -1,249 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat deleted file mode 100644 index 3624bce..0000000 --- a/android/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/android/local.properties b/android/local.properties deleted file mode 100644 index bf04e2f..0000000 --- a/android/local.properties +++ /dev/null @@ -1,8 +0,0 @@ -## This file must *NOT* be checked into Version Control Systems, -# as it contains information specific to your local configuration. -# -# Location of the SDK. This is only used by Gradle. -# For customization when using a Version Control System, please read the -# header note. -#Sat Aug 17 23:29:40 IST 2024 -sdk.dir=C\:\\Users\\rohith\\AppData\\Local\\Android\\Sdk diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png deleted file mode 100644 index 8667b6a..0000000 Binary files a/android/res/drawable-hdpi/icon.png and /dev/null differ diff --git a/android/res/drawable-hdpi/logo.png b/android/res/drawable-hdpi/logo.png deleted file mode 100644 index 261be34..0000000 Binary files a/android/res/drawable-hdpi/logo.png and /dev/null differ diff --git a/android/res/drawable-hdpi/logo_land.png b/android/res/drawable-hdpi/logo_land.png deleted file mode 100644 index 261be34..0000000 Binary files a/android/res/drawable-hdpi/logo_land.png and /dev/null differ diff --git a/android/res/drawable-hdpi/logo_port.png b/android/res/drawable-hdpi/logo_port.png deleted file mode 100644 index 261be34..0000000 Binary files a/android/res/drawable-hdpi/logo_port.png and /dev/null differ diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png deleted file mode 100644 index a3b6c10..0000000 Binary files a/android/res/drawable-ldpi/icon.png and /dev/null differ diff --git a/android/res/drawable-ldpi/logo.png b/android/res/drawable-ldpi/logo.png deleted file mode 100644 index 6ac3924..0000000 Binary files a/android/res/drawable-ldpi/logo.png and /dev/null differ diff --git a/android/res/drawable-ldpi/logo_land.png b/android/res/drawable-ldpi/logo_land.png deleted file mode 100644 index 6ac3924..0000000 Binary files a/android/res/drawable-ldpi/logo_land.png and /dev/null differ diff --git a/android/res/drawable-ldpi/logo_port.png b/android/res/drawable-ldpi/logo_port.png deleted file mode 100644 index 6ac3924..0000000 Binary files a/android/res/drawable-ldpi/logo_port.png and /dev/null differ diff --git a/android/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png deleted file mode 100644 index f258bd7..0000000 Binary files a/android/res/drawable-mdpi/icon.png and /dev/null differ diff --git a/android/res/drawable-mdpi/logo.png b/android/res/drawable-mdpi/logo.png deleted file mode 100644 index e2b4fc5..0000000 Binary files a/android/res/drawable-mdpi/logo.png and /dev/null differ diff --git a/android/res/drawable-mdpi/logo_land.png b/android/res/drawable-mdpi/logo_land.png deleted file mode 100644 index e2b4fc5..0000000 Binary files a/android/res/drawable-mdpi/logo_land.png and /dev/null differ diff --git a/android/res/drawable-mdpi/logo_port.png b/android/res/drawable-mdpi/logo_port.png deleted file mode 100644 index e2b4fc5..0000000 Binary files a/android/res/drawable-mdpi/logo_port.png and /dev/null differ diff --git a/android/res/drawable-xhdpi/icon.png b/android/res/drawable-xhdpi/icon.png deleted file mode 100644 index 154b3e7..0000000 Binary files a/android/res/drawable-xhdpi/icon.png and /dev/null differ diff --git a/android/res/drawable-xhdpi/logo.png b/android/res/drawable-xhdpi/logo.png deleted file mode 100644 index c2f6b2b..0000000 Binary files a/android/res/drawable-xhdpi/logo.png and /dev/null differ diff --git a/android/res/drawable-xhdpi/logo_land.png b/android/res/drawable-xhdpi/logo_land.png deleted file mode 100644 index c2f6b2b..0000000 Binary files a/android/res/drawable-xhdpi/logo_land.png and /dev/null differ diff --git a/android/res/drawable-xhdpi/logo_port.png b/android/res/drawable-xhdpi/logo_port.png deleted file mode 100644 index c2f6b2b..0000000 Binary files a/android/res/drawable-xhdpi/logo_port.png and /dev/null differ diff --git a/android/res/drawable-xxhdpi/icon.png b/android/res/drawable-xxhdpi/icon.png deleted file mode 100644 index 0684e98..0000000 Binary files a/android/res/drawable-xxhdpi/icon.png and /dev/null differ diff --git a/android/res/drawable-xxhdpi/logo.png b/android/res/drawable-xxhdpi/logo.png deleted file mode 100644 index 013c097..0000000 Binary files a/android/res/drawable-xxhdpi/logo.png and /dev/null differ diff --git a/android/res/drawable-xxhdpi/logo_land.png b/android/res/drawable-xxhdpi/logo_land.png deleted file mode 100644 index 013c097..0000000 Binary files a/android/res/drawable-xxhdpi/logo_land.png and /dev/null differ diff --git a/android/res/drawable-xxhdpi/logo_port.png b/android/res/drawable-xxhdpi/logo_port.png deleted file mode 100644 index 013c097..0000000 Binary files a/android/res/drawable-xxhdpi/logo_port.png and /dev/null differ diff --git a/android/res/drawable-xxxhdpi/icon.png b/android/res/drawable-xxxhdpi/icon.png deleted file mode 100644 index 4766877..0000000 Binary files a/android/res/drawable-xxxhdpi/icon.png and /dev/null differ diff --git a/android/res/drawable-xxxhdpi/logo.png b/android/res/drawable-xxxhdpi/logo.png deleted file mode 100644 index 20a9b22..0000000 Binary files a/android/res/drawable-xxxhdpi/logo.png and /dev/null differ diff --git a/android/res/drawable-xxxhdpi/logo_land.png b/android/res/drawable-xxxhdpi/logo_land.png deleted file mode 100644 index 20a9b22..0000000 Binary files a/android/res/drawable-xxxhdpi/logo_land.png and /dev/null differ diff --git a/android/res/drawable-xxxhdpi/logo_port.png b/android/res/drawable-xxxhdpi/logo_port.png deleted file mode 100644 index 20a9b22..0000000 Binary files a/android/res/drawable-xxxhdpi/logo_port.png and /dev/null differ diff --git a/android/res/drawable/splashscreen.xml b/android/res/drawable/splashscreen.xml deleted file mode 100644 index c358344..0000000 --- a/android/res/drawable/splashscreen.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/android/res/drawable/splashscreen_land.xml b/android/res/drawable/splashscreen_land.xml deleted file mode 100644 index 0ec7108..0000000 --- a/android/res/drawable/splashscreen_land.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/android/res/drawable/splashscreen_port.xml b/android/res/drawable/splashscreen_port.xml deleted file mode 100644 index ac70dcc..0000000 --- a/android/res/drawable/splashscreen_port.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/android/res/values-land/splashscreentheme.xml b/android/res/values-land/splashscreentheme.xml deleted file mode 100644 index 800b923..0000000 --- a/android/res/values-land/splashscreentheme.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/android/res/values-port/splashscreentheme.xml b/android/res/values-port/splashscreentheme.xml deleted file mode 100644 index a20302e..0000000 --- a/android/res/values-port/splashscreentheme.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/android/res/values/libs.xml b/android/res/values/libs.xml deleted file mode 100644 index b10112d..0000000 --- a/android/res/values/libs.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/android/res/values/splashscreentheme.xml b/android/res/values/splashscreentheme.xml deleted file mode 100644 index 53b3673..0000000 --- a/android/res/values/splashscreentheme.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/android/res/xml/network_security_config.xml b/android/res/xml/network_security_config.xml deleted file mode 100644 index c6c7964..0000000 --- a/android/res/xml/network_security_config.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - radioid.net - - diff --git a/android/res/xml/qtprovider_paths.xml b/android/res/xml/qtprovider_paths.xml deleted file mode 100644 index 8c6991d..0000000 --- a/android/res/xml/qtprovider_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/android/src/main/java/ShareUtils.java b/android/src/main/java/ShareUtils.java deleted file mode 100644 index 04beda5..0000000 --- a/android/src/main/java/ShareUtils.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - Original Copyright (C) 2019-2021 Doug McLain - Modification Copyright (C) 2024 Rohith Namboothiri - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -package com.dmr.droidstardmr; - -import android.content.Intent; -import android.net.Uri; -import android.content.Context; -import androidx.core.content.FileProvider; - -import java.io.File; - -public class ShareUtils { - - public static void shareFile(Context context, String filePath) { - File file = new File(filePath); - if (file.exists()) { - // Use the hardcoded authority string - Uri fileUri = FileProvider.getUriForFile(context, "com.dmr.droidstardmr.fileprovider", file); - - // Create an intent to share the file - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("text/csv"); // Adjust MIME type as needed - shareIntent.putExtra(Intent.EXTRA_STREAM, fileUri); - shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - - // Start the share intent - context.startActivity(Intent.createChooser(shareIntent, "Share File")); - } - } -} diff --git a/android/src/main/java/USBSerialWrapper.java b/android/src/main/java/USBSerialWrapper.java deleted file mode 100644 index 06811e6..0000000 --- a/android/src/main/java/USBSerialWrapper.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - Copyright (C) 2019-2021 Doug McLain - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -package DroidStar; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import android.content.BroadcastReceiver; -import android.content.Intent; -import android.content.IntentFilter; -import android.app.PendingIntent; -import android.content.Context; -import android.hardware.usb.UsbManager; -import android.hardware.usb.UsbDeviceConnection; -import com.hoho.android.usbserial.driver.UsbSerialDriver; -import com.hoho.android.usbserial.driver.UsbSerialPort; -import com.hoho.android.usbserial.driver.UsbSerialProber; -import com.hoho.android.usbserial.util.SerialInputOutputManagerTest; - -public class USBSerialWrapper implements SerialInputOutputManagerTest.Listener { - public static int counter = 0; - public int id; - public Context m_context; - public int m_baudrate = 115200; - public int m_databits = 8; - public int m_stopbits = 1; - public int m_parity = 0; - public int m_flowcontrol = 0; - public int m_rts = 0; - public String m_devicename; - - UsbSerialPort m_port; - SerialInputOutputManagerTest usbIoManager; - private static final String ACTION_USB_PERMISSION = "org.dudetronics.droidstar.USB_PERMISSION"; - IntentFilter m_filter = new IntentFilter(ACTION_USB_PERMISSION); - - UsbManager m_manager; - UsbSerialDriver m_driver; - - public BroadcastReceiver m_usbReceiver = new BroadcastReceiver() { - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - System.out.println("BroadcastReceiver() onReceive() action == " + action); - if (ACTION_USB_PERMISSION.equals(action)) { - if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { - System.out.println("USB Permission Granted"); - if(open_device() > 0) device_open(); - } - else { - System.out.println("USB Permission Denied"); - device_denied(); - } - } - if ( (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) || (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) ) { - devices_changed(); - System.out.println("USB devices changed"); - } - } - }; - - public USBSerialWrapper() { - this.id = counter; - System.out.println("Created USBSerialWrapper object with id: " + this.id); - counter++; - m_filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); - m_filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); - } - - public void set_port_name(String d) - { - m_devicename = d; - System.out.println("Java Devicename: " + m_devicename); - } - - public void set_baud_rate(int br) - { - m_baudrate = br; - System.out.println("Java Baudrate: " + br); - } - - public void set_data_bits(int db) - { - m_databits = db; - System.out.println("Java DataBits: " + db); - } - - public void set_stop_bits(int sb) - { - m_stopbits = sb; - System.out.println("Java StopBits: " + sb); - } - - public void set_parity(int p) - { - m_parity = p; - System.out.println("Java Parity: " + p); - } - - public void set_flow_control(int fc) - { - m_flowcontrol = fc; - System.out.println("Java FlowControl: " + fc); - } - - public void set_rts(int rts) - { - m_rts = rts; - System.out.println("Java RTS: " + rts); - } - - public String[] discover_devices(Context c) - { - System.out.println("Java: discover_devices()"); - m_manager = (UsbManager) c.getSystemService(Context.USB_SERVICE); - List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(m_manager); - String[] devices = new String[availableDrivers.size()]; - - if (availableDrivers.isEmpty()) { - System.out.println("No drivers found"); - } - else { - System.out.println(availableDrivers.size() + " found"); - - for(int i = 0; i < availableDrivers.size(); ++i){ - devices[i] = availableDrivers.get(i).getDevice().getProductName() + ":" + availableDrivers.get(i).getDevice().getDeviceName(); - System.out.println("USB device getDeviceName() == " + availableDrivers.get(i).getDevice().getDeviceName()); - System.out.println("USB device getProductName() == " + availableDrivers.get(i).getDevice().getProductName()); - System.out.println("USB device getProductId() == " + availableDrivers.get(i).getDevice().getProductId()); - System.out.println("USB device getVendorId() == " + availableDrivers.get(i).getDevice().getVendorId()); - } - } - c.registerReceiver(m_usbReceiver, m_filter, Context.RECEIVER_EXPORTED); - return devices; - } - - public String setup_serial(Context c) - { - m_context = c; - int devicenum = 0; - List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(m_manager); - - if (availableDrivers.isEmpty()) { - System.out.println("No drivers found"); - return "returning..."; - } - else { - System.out.println(availableDrivers.size() + " found"); - for(int i = 0; i < availableDrivers.size(); ++i){ - System.out.println("USB device getDeviceName() == " + availableDrivers.get(i).getDevice().getDeviceName()); - System.out.println("USB device getProductName() == " + availableDrivers.get(i).getDevice().getProductName()); - System.out.println("USB device getProductId() == " + availableDrivers.get(i).getDevice().getProductId()); - System.out.println("USB device getVendorId() == " + availableDrivers.get(i).getDevice().getVendorId()); - - if(m_devicename.equals(availableDrivers.get(i).getDevice().getDeviceName())){ - devicenum = i; - System.out.println("Found device == " + devicenum); - - } - } - } - - m_driver = availableDrivers.get(devicenum); - PendingIntent mPendingIntent = PendingIntent.getBroadcast(c, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT); - m_manager.requestPermission(m_driver.getDevice(), mPendingIntent); - System.out.println("setup_serial() finished"); - return "Yipee!"; - } - - public int open_device() - { - UsbDeviceConnection connection = m_manager.openDevice(m_driver.getDevice()); - - if (connection == null) { - return 0; - } - - m_port = m_driver.getPorts().get(0); // Most devices have just one port (port 0) - - try { - m_port.open(connection); - m_port.setParameters(m_baudrate, m_databits, m_stopbits, m_parity); - m_port.setRTS(true); - - } catch (Exception e) { - System.out.println("Exception: " + e.getMessage()); - } - - System.out.println("Created UsbManager"); - - usbIoManager = new SerialInputOutputManagerTest(m_port, this); - usbIoManager.start(); - return 1; - } - - public void write(byte[] data) - { - try { - m_port.write(data, 0); - } catch (Exception e) { - System.out.println("Exception: " + e.getMessage()); - } - } - - public byte[] read() - { - byte[] buffer = new byte[1024]; - int r = 0; - - try { - r = m_port.read(buffer, 0); - } catch (Exception e) { - System.out.println("Exception: " + e.getMessage()); - } - - byte[] returnbytes = Arrays.copyOf(buffer, r); - return returnbytes; - } - - public void close(int c) - { - if(usbIoManager != null) { - usbIoManager.setListener(null); - usbIoManager.stop(); - } - usbIoManager = null; - try { - m_port.close(); - } catch (IOException ignored) {} - m_port = null; - } - - @Override - public void onNewData(byte[] data) { - data_received(data); - } - - @Override - public void onRunError(Exception e) { - System.out.println("Exception: " + e.getMessage()); - } - - private static native void data_received(byte[] data); - private static native void device_open(); - private static native void device_denied(); - private static native void devices_changed(); -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java b/android/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java deleted file mode 100644 index 87eb73c..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java +++ /dev/null @@ -1,327 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -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.ArrayList; -import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - * USB CDC/ACM serial driver implementation. - * - * @author mike wakerly (opensource@hoho.com) - * @see Universal - * Serial Bus Class Definitions for Communication Devices, v1.1 - */ -public class CdcAcmSerialDriver implements UsbSerialDriver { - - private final String TAG = CdcAcmSerialDriver.class.getSimpleName(); - - private final UsbDevice mDevice; - private final List mPorts; - - public CdcAcmSerialDriver(UsbDevice device) { - mDevice = device; - mPorts = new ArrayList<>(); - - int controlInterfaceCount = 0; - int dataInterfaceCount = 0; - for( int i = 0; i < device.getInterfaceCount(); i++) { - if(device.getInterface(i).getInterfaceClass() == UsbConstants.USB_CLASS_COMM) - controlInterfaceCount++; - if(device.getInterface(i).getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) - dataInterfaceCount++; - } - for( int port = 0; port < Math.min(controlInterfaceCount, dataInterfaceCount); port++) { - mPorts.add(new CdcAcmSerialPort(mDevice, port)); - } - if(mPorts.size() == 0) { - mPorts.add(new CdcAcmSerialPort(mDevice, -1)); - } - } - - @Override - public UsbDevice getDevice() { - return mDevice; - } - - @Override - public List getPorts() { - return mPorts; - } - - public class CdcAcmSerialPort extends CommonUsbSerialPort { - - private UsbInterface mControlInterface; - private UsbInterface mDataInterface; - - private UsbEndpoint mControlEndpoint; - - private int mControlIndex; - - 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 CdcAcmSerialPort(UsbDevice device, int portNumber) { - super(device, portNumber); - } - - @Override - public UsbSerialDriver getDriver() { - return CdcAcmSerialDriver.this; - } - - @Override - protected void openInt(UsbDeviceConnection connection) throws IOException { - if (mPortNumber == -1) { - Log.d(TAG,"device might be castrated ACM device, trying single interface logic"); - openSingleInterface(); - } else { - Log.d(TAG,"trying default interface logic"); - openInterface(); - } - } - - private void openSingleInterface() throws IOException { - // the following code is inspired by the cdc-acm driver in the linux kernel - - mControlIndex = 0; - mControlInterface = mDevice.getInterface(0); - mDataInterface = mDevice.getInterface(0); - if (!mConnection.claimInterface(mControlInterface, true)) { - throw new IOException("Could not claim shared control/data interface"); - } - - for (int i = 0; i < mControlInterface.getEndpointCount(); ++i) { - UsbEndpoint ep = mControlInterface.getEndpoint(i); - if ((ep.getDirection() == UsbConstants.USB_DIR_IN) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT)) { - mControlEndpoint = ep; - } else if ((ep.getDirection() == UsbConstants.USB_DIR_IN) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)) { - mReadEndpoint = ep; - } else if ((ep.getDirection() == UsbConstants.USB_DIR_OUT) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)) { - mWriteEndpoint = ep; - } - } - if (mControlEndpoint == null) { - throw new IOException("No control endpoint"); - } - } - - private void openInterface() throws IOException { - Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount()); - - int controlInterfaceCount = 0; - int dataInterfaceCount = 0; - mControlInterface = null; - mDataInterface = null; - for (int i = 0; i < mDevice.getInterfaceCount(); i++) { - UsbInterface usbInterface = mDevice.getInterface(i); - if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_COMM) { - if(controlInterfaceCount == mPortNumber) { - mControlIndex = i; - mControlInterface = usbInterface; - } - controlInterfaceCount++; - } - if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) { - if(dataInterfaceCount == mPortNumber) { - mDataInterface = usbInterface; - } - dataInterfaceCount++; - } - } - - if(mControlInterface == null) { - throw new IOException("No control interface"); - } - Log.d(TAG, "Control iface=" + mControlInterface); - - if (!mConnection.claimInterface(mControlInterface, true)) { - throw new IOException("Could not claim control interface"); - } - - mControlEndpoint = mControlInterface.getEndpoint(0); - if (mControlEndpoint.getDirection() != UsbConstants.USB_DIR_IN || mControlEndpoint.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) { - throw new IOException("Invalid control endpoint"); - } - - if(mDataInterface == null) { - throw new IOException("No data interface"); - } - Log.d(TAG, "data iface=" + mDataInterface); - - if (!mConnection.claimInterface(mDataInterface, true)) { - throw new IOException("Could not claim data interface"); - } - - for (int i = 0; i < mDataInterface.getEndpointCount(); i++) { - UsbEndpoint ep = mDataInterface.getEndpoint(i); - if (ep.getDirection() == UsbConstants.USB_DIR_IN && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) - mReadEndpoint = ep; - if (ep.getDirection() == UsbConstants.USB_DIR_OUT && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) - mWriteEndpoint = ep; - } - } - - private int sendAcmControlMessage(int request, int value, byte[] buf) throws IOException { - int len = mConnection.controlTransfer( - USB_RT_ACM, request, value, mControlIndex, buf, buf != null ? buf.length : 0, 5000); - if(len < 0) { - throw new IOException("controlTransfer failed"); - } - return len; - } - - @Override - protected void closeInt() { - try { - mConnection.releaseInterface(mControlInterface); - mConnection.releaseInterface(mDataInterface); - } catch(Exception ignored) {} - } - - @Override - public void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException { - if(baudRate <= 0) { - throw new IllegalArgumentException("Invalid baud rate: " + baudRate); - } - if(dataBits < DATABITS_5 || dataBits > DATABITS_8) { - throw new IllegalArgumentException("Invalid data bits: " + dataBits); - } - 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("Invalid stop bits: " + stopBits); - } - - byte parityBitesByte; - switch (parity) { - case 0: parityBitesByte = 0; break; - case 1: parityBitesByte = 1; break; - case 2: parityBitesByte = 2; break; - case 3: parityBitesByte = 3; break; - case 4: parityBitesByte = 4; break; - default: throw new IllegalArgumentException("Invalid 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 getDTR() throws IOException { - return mDtr; - } - - @Override - public void setDTR(boolean value) throws IOException { - mDtr = value; - setDtrRts(); - } - - @Override - public boolean getRTS() throws IOException { - return mRts; - } - - @Override - public void setRTS(boolean value) throws IOException { - mRts = value; - setDtrRts(); - } - - private void setDtrRts() throws IOException { - int value = (mRts ? 0x2 : 0) | (mDtr ? 0x1 : 0); - sendAcmControlMessage(SET_CONTROL_LINE_STATE, value, null); - } - - @Override - public EnumSet getControlLines() throws IOException { - EnumSet set = EnumSet.noneOf(ControlLine.class); - if(mRts) set.add(ControlLine.RTS); - if(mDtr) set.add(ControlLine.DTR); - return set; - } - - @Override - public EnumSet getSupportedControlLines() throws IOException { - return EnumSet.of(ControlLine.RTS, ControlLine.DTR); - } - - @Override - public void setBreak(boolean value) throws IOException { - sendAcmControlMessage(SEND_BREAK, value ? 0xffff : 0, null); - } - - } - - public static Map getSupportedDevices() { - final Map supportedDevices = new LinkedHashMap<>(); - supportedDevices.put(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, - UsbId.ARDUINO_MICRO, - }); - supportedDevices.put(UsbId.VENDOR_VAN_OOIJEN_TECH, - new int[] { - UsbId.VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL, - }); - supportedDevices.put(UsbId.VENDOR_ATMEL, - new int[] { - UsbId.ATMEL_LUFA_CDC_DEMO_APP, - }); - supportedDevices.put(UsbId.VENDOR_LEAFLABS, - new int[] { - UsbId.LEAFLABS_MAPLE, - }); - supportedDevices.put(UsbId.VENDOR_ARM, - new int[] { - UsbId.ARM_MBED, - }); - supportedDevices.put(UsbId.VENDOR_ST, - new int[] { - UsbId.ST_CDC, - }); - return supportedDevices; - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java b/android/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java deleted file mode 100644 index 9ef08a4..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java +++ /dev/null @@ -1,301 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.hardware.usb.UsbEndpoint; -import android.hardware.usb.UsbRequest; -import android.util.Log; - -import com.hoho.android.usbserial.util.MonotonicClock; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.EnumSet; - -/** - * A base class shared by several driver implementations. - * - * @author mike wakerly (opensource@hoho.com) - */ -public abstract class CommonUsbSerialPort implements UsbSerialPort { - - private static final String TAG = CommonUsbSerialPort.class.getSimpleName(); - private static final int DEFAULT_WRITE_BUFFER_SIZE = 16 * 1024; - private static final int MAX_READ_SIZE = 16 * 1024; // = old bulkTransfer limit - - protected final UsbDevice mDevice; - protected final int mPortNumber; - - // non-null when open() - protected UsbDeviceConnection mConnection = null; - protected UsbEndpoint mReadEndpoint; - protected UsbEndpoint mWriteEndpoint; - protected UsbRequest mUsbRequest; - - protected final Object mWriteBufferLock = new Object(); - /** Internal write buffer. Guarded by {@link #mWriteBufferLock}. */ - protected byte[] mWriteBuffer; - - public CommonUsbSerialPort(UsbDevice device, int portNumber) { - mDevice = device; - mPortNumber = portNumber; - - mWriteBuffer = new byte[DEFAULT_WRITE_BUFFER_SIZE]; - } - - @Override - public String toString() { - return String.format("<%s device_name=%s device_id=%s port_number=%s>", - getClass().getSimpleName(), mDevice.getDeviceName(), - mDevice.getDeviceId(), mPortNumber); - } - - @Override - public UsbDevice getDevice() { - return mDevice; - } - - @Override - public int getPortNumber() { - return mPortNumber; - } - - @Override - public UsbEndpoint getWriteEndpoint() { return mWriteEndpoint; } - - @Override - public UsbEndpoint getReadEndpoint() { return mReadEndpoint; } - - /** - * Returns the device serial number - * @return serial number - */ - @Override - public String getSerial() { - return mConnection.getSerial(); - } - - /** - * 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 - */ - public final void setWriteBufferSize(int bufferSize) { - synchronized (mWriteBufferLock) { - if (bufferSize == mWriteBuffer.length) { - return; - } - mWriteBuffer = new byte[bufferSize]; - } - } - - @Override - public void open(UsbDeviceConnection connection) throws IOException { - if (mConnection != null) { - throw new IOException("Already open"); - } - if(connection == null) { - throw new IllegalArgumentException("Connection is null"); - } - mConnection = connection; - try { - openInt(connection); - if (mReadEndpoint == null || mWriteEndpoint == null) { - throw new IOException("Could not get read & write endpoints"); - } - mUsbRequest = new UsbRequest(); - mUsbRequest.initialize(mConnection, mReadEndpoint); - } catch(Exception e) { - try { - close(); - } catch(Exception ignored) {} - throw e; - } - } - - protected abstract void openInt(UsbDeviceConnection connection) throws IOException; - - @Override - public void close() throws IOException { - if (mConnection == null) { - throw new IOException("Already closed"); - } - try { - mUsbRequest.cancel(); - } catch(Exception ignored) {} - mUsbRequest = null; - try { - closeInt(); - } catch(Exception ignored) {} - try { - mConnection.close(); - } catch(Exception ignored) {} - mConnection = null; - } - - protected abstract void closeInt(); - - /** - * use simple USB request supported by all devices to test if connection is still valid - */ - protected void testConnection() throws IOException { - byte[] buf = new byte[2]; - int len = mConnection.controlTransfer(0x80 /*DEVICE*/, 0 /*GET_STATUS*/, 0, 0, buf, buf.length, 200); - if(len < 0) - throw new IOException("USB get_status request failed"); - } - - @Override - public int read(final byte[] dest, final int timeout) throws IOException { - return read(dest, timeout, true); - } - - protected int read(final byte[] dest, final int timeout, boolean testConnection) throws IOException { - if(mConnection == null) { - throw new IOException("Connection closed"); - } - if(dest.length <= 0) { - throw new IllegalArgumentException("Read buffer to small"); - } - final int nread; - if (timeout != 0) { - // bulkTransfer will cause data loss with short timeout + high baud rates + continuous transfer - // https://stackoverflow.com/questions/9108548/android-usb-host-bulktransfer-is-losing-data - // but mConnection.requestWait(timeout) available since Android 8.0 es even worse, - // as it crashes with short timeout, e.g. - // A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x276a in tid 29846 (pool-2-thread-1), pid 29618 (.usbserial.test) - // /system/lib64/libusbhost.so (usb_request_wait+192) - // /system/lib64/libandroid_runtime.so (android_hardware_UsbDeviceConnection_request_wait(_JNIEnv*, _jobject*, long)+84) - // data loss / crashes were observed with timeout up to 200 msec - long endTime = testConnection ? MonotonicClock.millis() + timeout : 0; - int readMax = Math.min(dest.length, MAX_READ_SIZE); - nread = mConnection.bulkTransfer(mReadEndpoint, dest, readMax, timeout); - // Android error propagation is improvable: - // nread == -1 can be: timeout, connection lost, buffer to small, ??? - if(nread == -1 && testConnection && MonotonicClock.millis() < endTime) - testConnection(); - - } else { - final ByteBuffer buf = ByteBuffer.wrap(dest); - if (!mUsbRequest.queue(buf, dest.length)) { - throw new IOException("Queueing USB request failed"); - } - final UsbRequest response = mConnection.requestWait(); - if (response == null) { - throw new IOException("Waiting for USB request failed"); - } - nread = buf.position(); - // Android error propagation is improvable: - // response != null & nread == 0 can be: connection lost, buffer to small, ??? - if(nread == 0) { - testConnection(); - } - } - return Math.max(nread, 0); - } - - @Override - public void write(final byte[] src, final int timeout) throws IOException { - int offset = 0; - final long endTime = (timeout == 0) ? 0 : (MonotonicClock.millis() + timeout); - - if(mConnection == null) { - throw new IOException("Connection closed"); - } - while (offset < src.length) { - int requestTimeout; - final int requestLength; - final int actualLength; - - synchronized (mWriteBufferLock) { - final byte[] writeBuffer; - - requestLength = 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, requestLength); - writeBuffer = mWriteBuffer; - } - if (timeout == 0 || offset == 0) { - requestTimeout = timeout; - } else { - requestTimeout = (int)(endTime - MonotonicClock.millis()); - if(requestTimeout == 0) - requestTimeout = -1; - } - if (requestTimeout < 0) { - actualLength = -2; - } else { - actualLength = mConnection.bulkTransfer(mWriteEndpoint, writeBuffer, requestLength, requestTimeout); - } - } - Log.d(TAG, "Wrote " + actualLength + "/" + requestLength + " offset " + offset + "/" + src.length + " timeout " + requestTimeout); - if (actualLength <= 0) { - if (timeout != 0 && MonotonicClock.millis() >= endTime) { - SerialTimeoutException ex = new SerialTimeoutException("Error writing " + requestLength + " bytes at offset " + offset + " of total " + src.length + ", rc=" + actualLength); - ex.bytesTransferred = offset; - throw ex; - } else { - throw new IOException("Error writing " + requestLength + " bytes at offset " + offset + " of total " + src.length); - } - } - offset += actualLength; - } - } - - @Override - public boolean isOpen() { - return mConnection != null; - } - - @Override - public abstract void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException; - - @Override - public boolean getCD() throws IOException { throw new UnsupportedOperationException(); } - - @Override - public boolean getCTS() throws IOException { throw new UnsupportedOperationException(); } - - @Override - public boolean getDSR() throws IOException { throw new UnsupportedOperationException(); } - - @Override - public boolean getDTR() throws IOException { throw new UnsupportedOperationException(); } - - @Override - public void setDTR(boolean value) throws IOException { throw new UnsupportedOperationException(); } - - @Override - public boolean getRI() throws IOException { throw new UnsupportedOperationException(); } - - @Override - public boolean getRTS() throws IOException { throw new UnsupportedOperationException(); } - - @Override - public void setRTS(boolean value) throws IOException { throw new UnsupportedOperationException(); } - - @Override - public abstract EnumSet getControlLines() throws IOException; - - @Override - public abstract EnumSet getSupportedControlLines() throws IOException; - - @Override - public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public void setBreak(boolean value) throws IOException { throw new UnsupportedOperationException(); } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java b/android/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java deleted file mode 100644 index 99d7257..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java +++ /dev/null @@ -1,335 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -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 java.io.IOException; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class Cp21xxSerialDriver implements UsbSerialDriver { - - private static final String TAG = Cp21xxSerialDriver.class.getSimpleName(); - - private final UsbDevice mDevice; - private final List mPorts; - - public Cp21xxSerialDriver(UsbDevice device) { - mDevice = device; - mPorts = new ArrayList<>(); - for( int port = 0; port < device.getInterfaceCount(); port++) { - mPorts.add(new Cp21xxSerialPort(mDevice, port)); - } - } - - @Override - public UsbDevice getDevice() { - return mDevice; - } - - @Override - public List getPorts() { - return mPorts; - } - - public class Cp21xxSerialPort extends CommonUsbSerialPort { - - private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; - - /* - * Configuration Request Types - */ - private static final int REQTYPE_HOST_TO_DEVICE = 0x41; - private static final int REQTYPE_DEVICE_TO_HOST = 0xc1; - - /* - * Configuration Request Codes - */ - private static final int SILABSER_IFC_ENABLE_REQUEST_CODE = 0x00; - private static final int SILABSER_SET_LINE_CTL_REQUEST_CODE = 0x03; - private static final int SILABSER_SET_BREAK_REQUEST_CODE = 0x05; - private static final int SILABSER_SET_MHS_REQUEST_CODE = 0x07; - private static final int SILABSER_SET_BAUDRATE = 0x1E; - private static final int SILABSER_FLUSH_REQUEST_CODE = 0x12; - private static final int SILABSER_GET_MDMSTS_REQUEST_CODE = 0x08; - - private static final int FLUSH_READ_CODE = 0x0a; - private static final int FLUSH_WRITE_CODE = 0x05; - - /* - * SILABSER_IFC_ENABLE_REQUEST_CODE - */ - private static final int UART_ENABLE = 0x0001; - private static final int UART_DISABLE = 0x0000; - - /* - * SILABSER_SET_MHS_REQUEST_CODE - */ - private static final int DTR_ENABLE = 0x101; - private static final int DTR_DISABLE = 0x100; - private static final int RTS_ENABLE = 0x202; - private static final int RTS_DISABLE = 0x200; - - /* - * SILABSER_GET_MDMSTS_REQUEST_CODE - */ - private static final int STATUS_CTS = 0x10; - private static final int STATUS_DSR = 0x20; - private static final int STATUS_RI = 0x40; - private static final int STATUS_CD = 0x80; - - - private boolean dtr = false; - private boolean rts = false; - - // second port of Cp2105 has limited baudRate, dataBits, stopBits, parity - // unsupported baudrate returns error at controlTransfer(), other parameters are silently ignored - private boolean mIsRestrictedPort; - - public Cp21xxSerialPort(UsbDevice device, int portNumber) { - super(device, portNumber); - } - - @Override - public UsbSerialDriver getDriver() { - return Cp21xxSerialDriver.this; - } - - private void setConfigSingle(int request, int value) throws IOException { - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, request, value, - mPortNumber, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Control transfer failed: " + request + " / " + value + " -> " + result); - } - } - - private byte getStatus() throws IOException { - byte[] buffer = new byte[1]; - int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, SILABSER_GET_MDMSTS_REQUEST_CODE, 0, - mPortNumber, buffer, buffer.length, USB_WRITE_TIMEOUT_MILLIS); - if (result != 1) { - throw new IOException("Control transfer failed: " + SILABSER_GET_MDMSTS_REQUEST_CODE + " / " + 0 + " -> " + result); - } - return buffer[0]; - } - - @Override - protected void openInt(UsbDeviceConnection connection) throws IOException { - mIsRestrictedPort = mDevice.getInterfaceCount() == 2 && mPortNumber == 1; - if(mPortNumber >= mDevice.getInterfaceCount()) { - throw new IOException("Unknown port number"); - } - UsbInterface dataIface = mDevice.getInterface(mPortNumber); - if (!mConnection.claimInterface(dataIface, true)) { - throw new IOException("Could not claim interface " + mPortNumber); - } - for (int i = 0; i < dataIface.getEndpointCount(); i++) { - UsbEndpoint ep = dataIface.getEndpoint(i); - if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { - if (ep.getDirection() == UsbConstants.USB_DIR_IN) { - mReadEndpoint = ep; - } else { - mWriteEndpoint = ep; - } - } - } - - setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_ENABLE); - setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, (dtr ? DTR_ENABLE : DTR_DISABLE) | (rts ? RTS_ENABLE : RTS_DISABLE)); - } - - @Override - protected void closeInt() { - try { - setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_DISABLE); - } catch (Exception ignored) {} - try { - mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); - } catch(Exception ignored) {} - } - - private void setBaudRate(int baudRate) throws IOException { - byte[] data = new byte[] { - (byte) ( baudRate & 0xff), - (byte) ((baudRate >> 8 ) & 0xff), - (byte) ((baudRate >> 16) & 0xff), - (byte) ((baudRate >> 24) & 0xff) - }; - int ret = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SILABSER_SET_BAUDRATE, - 0, mPortNumber, data, 4, USB_WRITE_TIMEOUT_MILLIS); - if (ret < 0) { - throw new IOException("Error setting baud rate"); - } - } - - @Override - public void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException { - if(baudRate <= 0) { - throw new IllegalArgumentException("Invalid baud rate: " + baudRate); - } - setBaudRate(baudRate); - - int configDataBits = 0; - switch (dataBits) { - case DATABITS_5: - if(mIsRestrictedPort) - throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); - configDataBits |= 0x0500; - break; - case DATABITS_6: - if(mIsRestrictedPort) - throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); - configDataBits |= 0x0600; - break; - case DATABITS_7: - if(mIsRestrictedPort) - throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); - configDataBits |= 0x0700; - break; - case DATABITS_8: - configDataBits |= 0x0800; - break; - default: - throw new IllegalArgumentException("Invalid data bits: " + dataBits); - } - - switch (parity) { - case 0: - break; - case 1: - configDataBits |= 0x0010; - break; - case 2: - configDataBits |= 0x0020; - break; - case 3: - if(mIsRestrictedPort) - throw new UnsupportedOperationException("Unsupported parity: mark"); - configDataBits |= 0x0030; - break; - case 4: - if(mIsRestrictedPort) - throw new UnsupportedOperationException("Unsupported parity: space"); - configDataBits |= 0x0040; - break; - default: - throw new IllegalArgumentException("Invalid parity: " + parity); - } - - switch (stopBits) { - case STOPBITS_1: - break; - case STOPBITS_1_5: - throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); - case STOPBITS_2: - if(mIsRestrictedPort) - throw new UnsupportedOperationException("Unsupported stop bits: 2"); - configDataBits |= 2; - break; - default: - throw new IllegalArgumentException("Invalid stop bits: " + stopBits); - } - setConfigSingle(SILABSER_SET_LINE_CTL_REQUEST_CODE, configDataBits); - } - - @Override - public boolean getCD() throws IOException { - return (getStatus() & STATUS_CD) != 0; - } - - @Override - public boolean getCTS() throws IOException { - return (getStatus() & STATUS_CTS) != 0; - } - - @Override - public boolean getDSR() throws IOException { - return (getStatus() & STATUS_DSR) != 0; - } - - @Override - public boolean getDTR() throws IOException { - return dtr; - } - - @Override - public void setDTR(boolean value) throws IOException { - dtr = value; - setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, dtr ? DTR_ENABLE : DTR_DISABLE); - } - - @Override - public boolean getRI() throws IOException { - return (getStatus() & STATUS_RI) != 0; - } - - @Override - public boolean getRTS() throws IOException { - return rts; - } - - @Override - public void setRTS(boolean value) throws IOException { - rts = value; - setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, rts ? RTS_ENABLE : RTS_DISABLE); - } - - @Override - public EnumSet getControlLines() throws IOException { - byte status = getStatus(); - EnumSet set = EnumSet.noneOf(ControlLine.class); - if(rts) set.add(ControlLine.RTS); - if((status & STATUS_CTS) != 0) set.add(ControlLine.CTS); - if(dtr) set.add(ControlLine.DTR); - if((status & STATUS_DSR) != 0) set.add(ControlLine.DSR); - if((status & STATUS_CD) != 0) set.add(ControlLine.CD); - if((status & STATUS_RI) != 0) set.add(ControlLine.RI); - return set; - } - - @Override - public EnumSet getSupportedControlLines() throws IOException { - return EnumSet.allOf(ControlLine.class); - } - - @Override - // note: only working on some devices, on other devices ignored w/o error - public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { - int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0) - | (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0); - - if (value != 0) { - setConfigSingle(SILABSER_FLUSH_REQUEST_CODE, value); - } - } - - @Override - public void setBreak(boolean value) throws IOException { - setConfigSingle(SILABSER_SET_BREAK_REQUEST_CODE, value ? 1 : 0); - } - } - - public static Map getSupportedDevices() { - final Map supportedDevices = new LinkedHashMap<>(); - supportedDevices.put(UsbId.VENDOR_SILABS, - new int[] { - UsbId.SILABS_CP2102, // same ID for CP2101, CP2103, CP2104, CP2109 - UsbId.SILABS_CP2105, - UsbId.SILABS_CP2108, - }); - return supportedDevices; - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/android/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java deleted file mode 100644 index 5d1fa9c..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ /dev/null @@ -1,431 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * Copyright 2020 kai morich - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -import android.hardware.usb.UsbConstants; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.util.Log; - -import com.hoho.android.usbserial.util.MonotonicClock; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/* - * driver is implemented from various information scattered over FTDI documentation - * - * baud rate calculation https://www.ftdichip.com/Support/Documents/AppNotes/AN232B-05_BaudRates.pdf - * control bits https://www.ftdichip.com/Firmware/Precompiled/UM_VinculumFirmware_V205.pdf - * device type https://www.ftdichip.com/Support/Documents/AppNotes/AN_233_Java_D2XX_for_Android_API_User_Manual.pdf -> bvdDevice - * - */ - -public class FtdiSerialDriver implements UsbSerialDriver { - - private static final String TAG = FtdiSerialPort.class.getSimpleName(); - - private final UsbDevice mDevice; - private final List mPorts; - - public FtdiSerialDriver(UsbDevice device) { - mDevice = device; - mPorts = new ArrayList<>(); - for( int port = 0; port < device.getInterfaceCount(); port++) { - mPorts.add(new FtdiSerialPort(mDevice, port)); - } - } - - @Override - public UsbDevice getDevice() { - return mDevice; - } - - @Override - public List getPorts() { - return mPorts; - } - - public class FtdiSerialPort extends CommonUsbSerialPort { - - private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; - private static final int READ_HEADER_LENGTH = 2; // contains MODEM_STATUS - - private static final int REQTYPE_HOST_TO_DEVICE = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT; - private static final int REQTYPE_DEVICE_TO_HOST = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN; - - private static final int RESET_REQUEST = 0; - private static final int MODEM_CONTROL_REQUEST = 1; - private static final int SET_BAUD_RATE_REQUEST = 3; - private static final int SET_DATA_REQUEST = 4; - private static final int GET_MODEM_STATUS_REQUEST = 5; - private static final int SET_LATENCY_TIMER_REQUEST = 9; - private static final int GET_LATENCY_TIMER_REQUEST = 10; - - private static final int MODEM_CONTROL_DTR_ENABLE = 0x0101; - private static final int MODEM_CONTROL_DTR_DISABLE = 0x0100; - private static final int MODEM_CONTROL_RTS_ENABLE = 0x0202; - private static final int MODEM_CONTROL_RTS_DISABLE = 0x0200; - private static final int MODEM_STATUS_CTS = 0x10; - private static final int MODEM_STATUS_DSR = 0x20; - private static final int MODEM_STATUS_RI = 0x40; - private static final int MODEM_STATUS_CD = 0x80; - private static final int RESET_ALL = 0; - private static final int RESET_PURGE_RX = 1; - private static final int RESET_PURGE_TX = 2; - - private boolean baudRateWithPort = false; - private boolean dtr = false; - private boolean rts = false; - private int breakConfig = 0; - - public FtdiSerialPort(UsbDevice device, int portNumber) { - super(device, portNumber); - } - - @Override - public UsbSerialDriver getDriver() { - return FtdiSerialDriver.this; - } - - - @Override - protected void openInt(UsbDeviceConnection connection) throws IOException { - if (!connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { - throw new IOException("Could not claim interface " + mPortNumber); - } - if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { - throw new IOException("Not enough endpoints"); - } - mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); - mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); - - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, - RESET_ALL, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Reset failed: result=" + result); - } - result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, - (dtr ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE) | - (rts ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE), - mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Init RTS,DTR failed: result=" + result); - } - - // mDevice.getVersion() would require API 23 - byte[] rawDescriptors = connection.getRawDescriptors(); - if(rawDescriptors == null || rawDescriptors.length < 14) { - throw new IOException("Could not get device descriptors"); - } - int deviceType = rawDescriptors[13]; - baudRateWithPort = deviceType == 7 || deviceType == 8 || deviceType == 9 // ...H devices - || mDevice.getInterfaceCount() > 1; // FT2232C - } - - @Override - protected void closeInt() { - try { - mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); - } catch(Exception ignored) {} - } - - @Override - public int read(final byte[] dest, final int timeout) throws IOException { - if(dest.length <= READ_HEADER_LENGTH) { - throw new IllegalArgumentException("Read buffer to small"); - // could allocate larger buffer, including space for 2 header bytes, but this would - // result in buffers not being 64 byte aligned any more, causing data loss at continuous - // data transfer at high baud rates when buffers are fully filled. - } - int nread; - if (timeout != 0) { - long endTime = MonotonicClock.millis() + timeout; - do { - nread = super.read(dest, Math.max(1, (int)(endTime - MonotonicClock.millis())), false); - } while (nread == READ_HEADER_LENGTH && MonotonicClock.millis() < endTime); - if(nread <= 0 && MonotonicClock.millis() < endTime) - testConnection(); - } else { - do { - nread = super.read(dest, timeout, false); - } while (nread == READ_HEADER_LENGTH); - } - return readFilter(dest, nread); - } - - protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { - final int maxPacketSize = mReadEndpoint.getMaxPacketSize(); - int destPos = 0; - for(int srcPos = 0; srcPos < totalBytesRead; srcPos += maxPacketSize) { - int length = Math.min(srcPos + maxPacketSize, totalBytesRead) - (srcPos + READ_HEADER_LENGTH); - if (length < 0) - throw new IOException("Expected at least " + READ_HEADER_LENGTH + " bytes"); - System.arraycopy(buffer, srcPos + READ_HEADER_LENGTH, buffer, destPos, length); - destPos += length; - } - //Log.d(TAG, "read filter " + totalBytesRead + " -> " + destPos); - return destPos; - } - - private void setBaudrate(int baudRate) throws IOException { - int divisor, subdivisor, effectiveBaudRate; - if (baudRate > 3500000) { - throw new UnsupportedOperationException("Baud rate to high"); - } else if(baudRate >= 2500000) { - divisor = 0; - subdivisor = 0; - effectiveBaudRate = 3000000; - } else if(baudRate >= 1750000) { - divisor = 1; - subdivisor = 0; - effectiveBaudRate = 2000000; - } else { - divisor = (24000000 << 1) / baudRate; - divisor = (divisor + 1) >> 1; // round - subdivisor = divisor & 0x07; - divisor >>= 3; - if (divisor > 0x3fff) // exceeds bit 13 at 183 baud - throw new UnsupportedOperationException("Baud rate to low"); - effectiveBaudRate = (24000000 << 1) / ((divisor << 3) + subdivisor); - effectiveBaudRate = (effectiveBaudRate +1) >> 1; - } - double baudRateError = Math.abs(1.0 - (effectiveBaudRate / (double)baudRate)); - if(baudRateError >= 0.031) // can happen only > 1.5Mbaud - throw new UnsupportedOperationException(String.format("Baud rate deviation %.1f%% is higher than allowed 3%%", baudRateError*100)); - int value = divisor; - int index = 0; - switch(subdivisor) { - case 0: break; // 16,15,14 = 000 - sub-integer divisor = 0 - case 4: value |= 0x4000; break; // 16,15,14 = 001 - sub-integer divisor = 0.5 - case 2: value |= 0x8000; break; // 16,15,14 = 010 - sub-integer divisor = 0.25 - case 1: value |= 0xc000; break; // 16,15,14 = 011 - sub-integer divisor = 0.125 - case 3: value |= 0x0000; index |= 1; break; // 16,15,14 = 100 - sub-integer divisor = 0.375 - case 5: value |= 0x4000; index |= 1; break; // 16,15,14 = 101 - sub-integer divisor = 0.625 - case 6: value |= 0x8000; index |= 1; break; // 16,15,14 = 110 - sub-integer divisor = 0.75 - case 7: value |= 0xc000; index |= 1; break; // 16,15,14 = 111 - sub-integer divisor = 0.875 - } - if(baudRateWithPort) { - index <<= 8; - index |= mPortNumber+1; - } - Log.d(TAG, String.format("baud rate=%d, effective=%d, error=%.1f%%, value=0x%04x, index=0x%04x, divisor=%d, subdivisor=%d", - baudRate, effectiveBaudRate, baudRateError*100, value, index, divisor, subdivisor)); - - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_BAUD_RATE_REQUEST, - value, index, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Setting baudrate failed: result=" + result); - } - } - - @Override - public void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException { - if(baudRate <= 0) { - throw new IllegalArgumentException("Invalid baud rate: " + baudRate); - } - setBaudrate(baudRate); - - int config = 0; - switch (dataBits) { - case DATABITS_5: - case DATABITS_6: - throw new UnsupportedOperationException("Unsupported data bits: " + dataBits); - case DATABITS_7: - case DATABITS_8: - config |= dataBits; - break; - default: - throw new IllegalArgumentException("Invalid data bits: " + dataBits); - } - - switch (parity) { - case 0: - break; - case 1: - config |= 0x100; - break; - case 2: - config |= 0x200; - break; - case 3: - config |= 0x300; - break; - case 4: - config |= 0x400; - break; - default: - throw new IllegalArgumentException("Invalid parity: " + parity); - } - - switch (stopBits) { - case STOPBITS_1: - break; - case STOPBITS_1_5: - throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); - case STOPBITS_2: - config |= 0x1000; - break; - default: - throw new IllegalArgumentException("Invalid stop bits: " + stopBits); - } - - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, - config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Setting parameters failed: result=" + result); - } - breakConfig = config; - } - - private int getStatus() throws IOException { - byte[] data = new byte[2]; - int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_MODEM_STATUS_REQUEST, - 0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); - if (result != 2) { - throw new IOException("Get modem status failed: result=" + result); - } - return data[0]; - } - - @Override - public boolean getCD() throws IOException { - return (getStatus() & MODEM_STATUS_CD) != 0; - } - - @Override - public boolean getCTS() throws IOException { - return (getStatus() & MODEM_STATUS_CTS) != 0; - } - - @Override - public boolean getDSR() throws IOException { - return (getStatus() & MODEM_STATUS_DSR) != 0; - } - - @Override - public boolean getDTR() throws IOException { - return dtr; - } - - @Override - public void setDTR(boolean value) throws IOException { - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, - value ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Set DTR failed: result=" + result); - } - dtr = value; - } - - @Override - public boolean getRI() throws IOException { - return (getStatus() & MODEM_STATUS_RI) != 0; - } - - @Override - public boolean getRTS() throws IOException { - return rts; - } - - @Override - public void setRTS(boolean value) throws IOException { - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, - value ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Set DTR failed: result=" + result); - } - rts = value; - } - - @Override - public EnumSet getControlLines() throws IOException { - int status = getStatus(); - EnumSet set = EnumSet.noneOf(ControlLine.class); - if(rts) set.add(ControlLine.RTS); - if((status & MODEM_STATUS_CTS) != 0) set.add(ControlLine.CTS); - if(dtr) set.add(ControlLine.DTR); - if((status & MODEM_STATUS_DSR) != 0) set.add(ControlLine.DSR); - if((status & MODEM_STATUS_CD) != 0) set.add(ControlLine.CD); - if((status & MODEM_STATUS_RI) != 0) set.add(ControlLine.RI); - return set; - } - - @Override - public EnumSet getSupportedControlLines() throws IOException { - return EnumSet.allOf(ControlLine.class); - } - - @Override - public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { - if (purgeWriteBuffers) { - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, - RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Purge write buffer failed: result=" + result); - } - } - - if (purgeReadBuffers) { - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, - RESET_PURGE_TX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Purge read buffer failed: result=" + result); - } - } - } - - @Override - public void setBreak(boolean value) throws IOException { - int config = breakConfig; - if(value) config |= 0x4000; - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, - config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Setting BREAK failed: result=" + result); - } - } - - public void setLatencyTimer(int latencyTime) throws IOException { - int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_LATENCY_TIMER_REQUEST, - latencyTime, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Set latency timer failed: result=" + result); - } - } - - public int getLatencyTimer() throws IOException { - byte[] data = new byte[1]; - int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_LATENCY_TIMER_REQUEST, - 0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); - if (result != 1) { - throw new IOException("Get latency timer failed: result=" + result); - } - return data[0]; - } - - } - - public static Map getSupportedDevices() { - final Map supportedDevices = new LinkedHashMap<>(); - supportedDevices.put(UsbId.VENDOR_FTDI, - new int[] { - UsbId.FTDI_FT232R, - UsbId.FTDI_FT232H, - UsbId.FTDI_FT2232H, - UsbId.FTDI_FT4232H, - UsbId.FTDI_FT231X, // same ID for FT230X, FT231X, FT234XD - }); - return supportedDevices; - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java b/android/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java deleted file mode 100644 index 615e046..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -import android.util.Pair; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Maps (vendor id, product id) pairs to the corresponding serial driver. - * - * @author mike wakerly (opensource@hoho.com) - */ -public class ProbeTable { - - private final Map, Class> mProbeTable = - new LinkedHashMap<>(); - - /** - * Adds or updates a (vendor, product) pair in the table. - * - * @param vendorId the USB vendor id - * @param productId the USB product id - * @param driverClass the driver class responsible for this pair - * @return {@code this}, for chaining - */ - public ProbeTable addProduct(int vendorId, int productId, - Class driverClass) { - mProbeTable.put(Pair.create(vendorId, productId), driverClass); - return this; - } - - /** - * Internal method to add all supported products from - * {@code getSupportedProducts} static method. - * - * @param driverClass - * @return - */ - @SuppressWarnings("unchecked") - ProbeTable addDriver(Class driverClass) { - final Method method; - - try { - method = driverClass.getMethod("getSupportedDevices"); - } catch (SecurityException | NoSuchMethodException e) { - throw new RuntimeException(e); - } - - final Map devices; - try { - devices = (Map) method.invoke(null); - } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - - for (Map.Entry entry : devices.entrySet()) { - final int vendorId = entry.getKey(); - for (int productId : entry.getValue()) { - addProduct(vendorId, productId, driverClass); - } - } - - return this; - } - - /** - * Returns the driver for the given (vendor, product) pair, or {@code null} - * if no match. - * - * @param vendorId the USB vendor id - * @param productId the USB product id - * @return the driver class matching this pair, or {@code null} - */ - public Class findDriver(int vendorId, int productId) { - final Pair pair = Pair.create(vendorId, productId); - return mProbeTable.get(pair); - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java b/android/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java deleted file mode 100644 index 12fc0ec..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.hoho.android.usbserial.driver; - -import java.io.InterruptedIOException; - -/** - * Signals that a timeout has occurred on serial write. - * Similar to SocketTimeoutException. - * - * {@see InterruptedIOException#bytesTransferred} may contain bytes transferred - */ -public class SerialTimeoutException extends InterruptedIOException { - public SerialTimeoutException(String s) { - super(s); - } -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/UsbId.java b/android/src/main/java/com/hoho/android/usbserial/driver/UsbId.java deleted file mode 100644 index c67e92a..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/UsbId.java +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -/** - * Registry of USB vendor/product ID constants. - * - * Culled from various sources; see - * usb.ids for one listing. - * - * @author mike wakerly (opensource@hoho.com) - */ -public final class UsbId { - - public static final int VENDOR_FTDI = 0x0403; - public static final int FTDI_FT232R = 0x6001; - public static final int FTDI_FT2232H = 0x6010; - public static final int FTDI_FT4232H = 0x6011; - public static final int FTDI_FT232H = 0x6014; - public static final int FTDI_FT231X = 0x6015; // same ID for FT230X, FT231X, FT234XD - - public static final int VENDOR_ATMEL = 0x03EB; - public static final int ATMEL_LUFA_CDC_DEMO_APP = 0x2044; - - public static final int VENDOR_ARDUINO = 0x2341; - public static final int ARDUINO_UNO = 0x0001; - public static final int ARDUINO_MEGA_2560 = 0x0010; - public static final int ARDUINO_SERIAL_ADAPTER = 0x003b; - public static final int ARDUINO_MEGA_ADK = 0x003f; - public static final int ARDUINO_MEGA_2560_R3 = 0x0042; - public static final int ARDUINO_UNO_R3 = 0x0043; - public static final int ARDUINO_MEGA_ADK_R3 = 0x0044; - public static final int ARDUINO_SERIAL_ADAPTER_R3 = 0x0044; - public static final int ARDUINO_LEONARDO = 0x8036; - public static final int ARDUINO_MICRO = 0x8037; - - public static final int VENDOR_VAN_OOIJEN_TECH = 0x16c0; - public static final int VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL = 0x0483; - - public static final int VENDOR_LEAFLABS = 0x1eaf; - public static final int LEAFLABS_MAPLE = 0x0004; - - public static final int VENDOR_SILABS = 0x10c4; - public static final int SILABS_CP2102 = 0xea60; // same ID for CP2101, CP2103, CP2104, CP2109 - public static final int SILABS_CP2105 = 0xea70; - public static final int SILABS_CP2108 = 0xea71; - - public static final int VENDOR_PROLIFIC = 0x067b; - public static final int PROLIFIC_PL2303 = 0x2303; // device type 01, T, HX - public static final int PROLIFIC_PL2303GC = 0x23a3; // device type HXN - public static final int PROLIFIC_PL2303GB = 0x23b3; // " - public static final int PROLIFIC_PL2303GT = 0x23c3; // " - public static final int PROLIFIC_PL2303GL = 0x23d3; // " - public static final int PROLIFIC_PL2303GE = 0x23e3; // " - public static final int PROLIFIC_PL2303GS = 0x23f3; // " - - public static final int VENDOR_QINHENG = 0x1a86; - public static final int QINHENG_CH340 = 0x7523; - public static final int QINHENG_CH341A = 0x5523; - - // at www.linux-usb.org/usb.ids listed for NXP/LPC1768, but all processors supported by ARM mbed DAPLink firmware report these ids - public static final int VENDOR_ARM = 0x0d28; - public static final int ARM_MBED = 0x0204; - - public static final int VENDOR_ST = 0x0483; - public static final int ST_CDC = 0x5740; - - private UsbId() { - throw new IllegalAccessError("Non-instantiable class"); - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java b/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java deleted file mode 100644 index d6539b2..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -import android.hardware.usb.UsbDevice; - -import java.util.List; - -/** - * - * @author mike wakerly (opensource@hoho.com) - */ -public interface UsbSerialDriver { - - /** - * Returns the raw {@link UsbDevice} backing this port. - * - * @return the device - */ - UsbDevice getDevice(); - - /** - * Returns all available ports for this device. This list must have at least - * one entry. - * - * @return the ports - */ - List getPorts(); -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java b/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java deleted file mode 100644 index 6741a17..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java +++ /dev/null @@ -1,261 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.hardware.usb.UsbEndpoint; -import android.hardware.usb.UsbManager; - -//import androidx.annotation.IntDef; - -import java.io.Closeable; -import java.io.IOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.EnumSet; - -/** - * Interface for a single serial port. - * - * @author mike wakerly (opensource@hoho.com) - */ -public interface UsbSerialPort extends Closeable { - - /** 5 data bits. */ - int DATABITS_5 = 5; - /** 6 data bits. */ - int DATABITS_6 = 6; - /** 7 data bits. */ - int DATABITS_7 = 7; - /** 8 data bits. */ - int DATABITS_8 = 8; - - /** Values for setParameters(..., parity) */ - //@Retention(RetentionPolicy.SOURCE) - //@IntDef({PARITY_NONE, PARITY_ODD, PARITY_EVEN, PARITY_MARK, PARITY_SPACE}) - //@interface Parity {} - /** No parity. */ - int PARITY_NONE = 0; - /** Odd parity. */ - int PARITY_ODD = 1; - /** Even parity. */ - int PARITY_EVEN = 2; - /** Mark parity. */ - int PARITY_MARK = 3; - /** Space parity. */ - int PARITY_SPACE = 4; - - /** 1 stop bit. */ - int STOPBITS_1 = 1; - /** 1.5 stop bits. */ - int STOPBITS_1_5 = 3; - /** 2 stop bits. */ - int STOPBITS_2 = 2; - - /** Values for get[Supported]ControlLines() */ - enum ControlLine { RTS, CTS, DTR, DSR, CD, RI } - - /** - * Returns the driver used by this port. - */ - UsbSerialDriver getDriver(); - - /** - * Returns the currently-bound USB device. - */ - UsbDevice getDevice(); - - /** - * Port number within driver. - */ - int getPortNumber(); - - /** - * Returns the write endpoint. - * @return write endpoint - */ - UsbEndpoint getWriteEndpoint(); - - /** - * Returns the read endpoint. - * @return read endpoint - */ - UsbEndpoint getReadEndpoint(); - - /** - * The serial number of the underlying UsbDeviceConnection, or {@code null}. - * - * @return value from {@link UsbDeviceConnection#getSerial()} - * @throws SecurityException starting with target SDK 29 (Android 10) if permission for USB device is not granted - */ - String getSerial(); - - /** - * Opens and initializes the port. Upon success, caller must ensure that - * {@link #close()} is eventually called. - * - * @param connection an open device connection, acquired with - * {@link UsbManager#openDevice(android.hardware.usb.UsbDevice)} - * @throws IOException on error opening or initializing the port. - */ - void open(UsbDeviceConnection connection) throws IOException; - - /** - * Closes the port and {@link UsbDeviceConnection} - * - * @throws IOException on error closing the port. - */ - void close() throws IOException; - - /** - * Reads as many bytes as possible into the destination buffer. - * - * @param dest the destination byte buffer - * @param timeout the timeout for reading in milliseconds, 0 is infinite - * @return the actual number of bytes read - * @throws IOException if an error occurred during reading - */ - int read(final byte[] dest, final int timeout) throws IOException; - - /** - * Writes as many bytes as possible from the source buffer. - * - * @param src the source byte buffer - * @param timeout the timeout for writing in milliseconds, 0 is infinite - * @throws SerialTimeoutException if timeout reached before sending all data. - * ex.bytesTransferred may contain bytes transferred - * @throws IOException if an error occurred during writing - */ - void write(final byte[] src, final int timeout) throws IOException; - - /** - * Sets various serial port parameters. - * - * @param baudRate baud rate as an integer, for example {@code 115200}. - * @param dataBits one of {@link #DATABITS_5}, {@link #DATABITS_6}, - * {@link #DATABITS_7}, or {@link #DATABITS_8}. - * @param stopBits one of {@link #STOPBITS_1}, {@link #STOPBITS_1_5}, or {@link #STOPBITS_2}. - * @param parity one of {@link #PARITY_NONE}, {@link #PARITY_ODD}, - * {@link #PARITY_EVEN}, {@link #PARITY_MARK}, or {@link #PARITY_SPACE}. - * @throws IOException on error setting the port parameters - * @throws UnsupportedOperationException if values are not supported by a specific device - */ - void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException; - - /** - * Gets the CD (Carrier Detect) bit from the underlying UART. - * - * @return the current state - * @throws IOException if an error occurred during reading - * @throws UnsupportedOperationException if not supported - */ - boolean getCD() throws IOException; - - /** - * Gets the CTS (Clear To Send) bit from the underlying UART. - * - * @return the current state - * @throws IOException if an error occurred during reading - * @throws UnsupportedOperationException if not supported - */ - boolean getCTS() throws IOException; - - /** - * Gets the DSR (Data Set Ready) bit from the underlying UART. - * - * @return the current state - * @throws IOException if an error occurred during reading - * @throws UnsupportedOperationException if not supported - */ - boolean getDSR() throws IOException; - - /** - * Gets the DTR (Data Terminal Ready) bit from the underlying UART. - * - * @return the current state - * @throws IOException if an error occurred during reading - * @throws UnsupportedOperationException if not supported - */ - boolean getDTR() throws IOException; - - /** - * Sets the DTR (Data Terminal Ready) bit on the underlying UART, if supported. - * - * @param value the value to set - * @throws IOException if an error occurred during writing - * @throws UnsupportedOperationException if not supported - */ - void setDTR(boolean value) throws IOException; - - /** - * Gets the RI (Ring Indicator) bit from the underlying UART. - * - * @return the current state - * @throws IOException if an error occurred during reading - * @throws UnsupportedOperationException if not supported - */ - boolean getRI() throws IOException; - - /** - * Gets the RTS (Request To Send) bit from the underlying UART. - * - * @return the current state - * @throws IOException if an error occurred during reading - * @throws UnsupportedOperationException if not supported - */ - boolean getRTS() throws IOException; - - /** - * Sets the RTS (Request To Send) bit on the underlying UART, if supported. - * - * @param value the value to set - * @throws IOException if an error occurred during writing - * @throws UnsupportedOperationException if not supported - */ - void setRTS(boolean value) throws IOException; - - /** - * Gets all control line values from the underlying UART, if supported. - * Requires less USB calls than calling getRTS() + ... + getRI() individually. - * - * @return EnumSet.contains(...) is {@code true} if set, else {@code false} - * @throws IOException if an error occurred during reading - */ - EnumSet getControlLines() throws IOException; - - /** - * Gets all control line supported flags. - * - * @return EnumSet.contains(...) is {@code true} if supported, else {@code false} - * @throws IOException if an error occurred during reading - */ - EnumSet getSupportedControlLines() throws IOException; - - /** - * Purge non-transmitted output data and / or non-read input data. - * - * @param purgeWriteBuffers {@code true} to discard non-transmitted output data - * @param purgeReadBuffers {@code true} to discard non-read input data - * @throws IOException if an error occurred during flush - * @throws UnsupportedOperationException if not supported - */ - void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; - - /** - * send BREAK condition. - * - * @param value set/reset - */ - void setBreak(boolean value) throws IOException; - - /** - * Returns the current state of the connection. - */ - boolean isOpen(); - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java b/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java deleted file mode 100644 index 1ff8ecb..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.driver; - -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; - -/** - * - * @author mike wakerly (opensource@hoho.com) - */ -public class UsbSerialProber { - - private final ProbeTable mProbeTable; - - public UsbSerialProber(ProbeTable probeTable) { - mProbeTable = probeTable; - } - - public static UsbSerialProber getDefaultProber() { - return new UsbSerialProber(getDefaultProbeTable()); - } - - public static ProbeTable getDefaultProbeTable() { - final ProbeTable probeTable = new ProbeTable(); - probeTable.addDriver(CdcAcmSerialDriver.class); - probeTable.addDriver(Cp21xxSerialDriver.class); - probeTable.addDriver(FtdiSerialDriver.class); - //probeTable.addDriver(ProlificSerialDriver.class); - //probeTable.addDriver(Ch34xSerialDriver.class); - return probeTable; - } - - /** - * Finds and builds all possible {@link UsbSerialDriver UsbSerialDrivers} - * from the currently-attached {@link UsbDevice} hierarchy. This method does - * not require permission from the Android USB system, since it does not - * open any of the devices. - * - * @param usbManager usb manager - * @return a list, possibly empty, of all compatible drivers - */ - public List findAllDrivers(final UsbManager usbManager) { - final List result = new ArrayList<>(); - - for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) { - final UsbSerialDriver driver = probeDevice(usbDevice); - if (driver != null) { - result.add(driver); - } - } - return result; - } - - /** - * Probes a single device for a compatible driver. - * - * @param usbDevice the usb device to probe - * @return a new {@link UsbSerialDriver} compatible with this device, or - * {@code null} if none available. - */ - public UsbSerialDriver probeDevice(final UsbDevice usbDevice) { - final int vendorId = usbDevice.getVendorId(); - final int productId = usbDevice.getProductId(); - - final Class driverClass = - mProbeTable.findDriver(vendorId, productId); - if (driverClass != null) { - final UsbSerialDriver driver; - try { - final Constructor ctor = - driverClass.getConstructor(UsbDevice.class); - driver = ctor.newInstance(usbDevice); - } catch (NoSuchMethodException | IllegalArgumentException | InstantiationException | - IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - return driver; - } - return null; - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/util/MonotonicClock.java b/android/src/main/java/com/hoho/android/usbserial/util/MonotonicClock.java deleted file mode 100644 index befc3dc..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/util/MonotonicClock.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hoho.android.usbserial.util; - -public final class MonotonicClock { - - private static final long NS_PER_MS = 1_000_000; - - private MonotonicClock() { - } - - public static long millis() { - return System.nanoTime() / NS_PER_MS; - } - -} diff --git a/android/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManagerTest.java b/android/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManagerTest.java deleted file mode 100644 index 8a46ac0..0000000 --- a/android/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManagerTest.java +++ /dev/null @@ -1,254 +0,0 @@ -/* Copyright 2011-2013 Google Inc. - * Copyright 2013 mike wakerly - * - * Project home page: https://github.com/mik3y/usb-serial-for-android - */ - -package com.hoho.android.usbserial.util; - -import android.os.Process; -import android.util.Log; - -import com.hoho.android.usbserial.driver.UsbSerialPort; - -import java.io.IOException; -import java.nio.ByteBuffer; - -/** - * Utility class which services a {@link UsbSerialPort} in its {@link #run()} method. - * - * @author mike wakerly (opensource@hoho.com) - */ -public class SerialInputOutputManagerTest implements Runnable { - - private static final String TAG = SerialInputOutputManagerTest.class.getSimpleName(); - public static boolean DEBUG = false; - private static final int BUFSIZ = 8192; - - /** - * default read timeout is infinite, to avoid data loss with bulkTransfer API - */ - private int mReadTimeout = 0; - private int mWriteTimeout = 0; - - private final Object mReadBufferLock = new Object(); - private final Object mWriteBufferLock = new Object(); - - private ByteBuffer mReadBuffer; // default size = getReadEndpoint().getMaxPacketSize() - private ByteBuffer mWriteBuffer = ByteBuffer.allocate(BUFSIZ); - - public enum State { - STOPPED, - RUNNING, - STOPPING - } - - private int mThreadPriority = Process.THREAD_PRIORITY_URGENT_AUDIO; - private State mState = State.STOPPED; // Synchronized by 'this' - private Listener mListener; // Synchronized by 'this' - private final UsbSerialPort mSerialPort; - - public interface Listener { - /** - * Called when new incoming data is available. - */ - void onNewData(byte[] data); - - /** - * Called when {@link SerialInputOutputManager#run()} aborts due to an error. - */ - void onRunError(Exception e); - } - - public SerialInputOutputManagerTest(UsbSerialPort serialPort) { - mSerialPort = serialPort; - mReadBuffer = ByteBuffer.allocate(serialPort.getReadEndpoint().getMaxPacketSize()); - } - - public SerialInputOutputManagerTest(UsbSerialPort serialPort, Listener listener) { - mSerialPort = serialPort; - mListener = listener; - mReadBuffer = ByteBuffer.allocate(serialPort.getReadEndpoint().getMaxPacketSize()); - } - - public synchronized void setListener(Listener listener) { - mListener = listener; - } - - public synchronized Listener getListener() { - return mListener; - } - - /** - * setThreadPriority. By default a higher priority than UI thread is used to prevent data loss - * - * @param threadPriority see {@link Process#setThreadPriority(int)} - * */ - public void setThreadPriority(int threadPriority) { - if (mState != State.STOPPED) - throw new IllegalStateException("threadPriority only configurable before SerialInputOutputManager is started"); - mThreadPriority = threadPriority; - } - - /** - * read/write timeout - */ - public void setReadTimeout(int timeout) { - // when set if already running, read already blocks and the new value will not become effective now - if(mReadTimeout == 0 && timeout != 0 && mState != State.STOPPED) - throw new IllegalStateException("readTimeout only configurable before SerialInputOutputManager is started"); - mReadTimeout = timeout; - } - - public int getReadTimeout() { - return mReadTimeout; - } - - public void setWriteTimeout(int timeout) { - mWriteTimeout = timeout; - } - - public int getWriteTimeout() { - return mWriteTimeout; - } - - /** - * read/write buffer size - */ - public void setReadBufferSize(int bufferSize) { - if (getReadBufferSize() == bufferSize) - return; - synchronized (mReadBufferLock) { - mReadBuffer = ByteBuffer.allocate(bufferSize); - } - } - - public int getReadBufferSize() { - return mReadBuffer.capacity(); - } - - public void setWriteBufferSize(int bufferSize) { - if(getWriteBufferSize() == bufferSize) - return; - synchronized (mWriteBufferLock) { - ByteBuffer newWriteBuffer = ByteBuffer.allocate(bufferSize); - if(mWriteBuffer.position() > 0) - newWriteBuffer.put(mWriteBuffer.array(), 0, mWriteBuffer.position()); - mWriteBuffer = newWriteBuffer; - } - } - - public int getWriteBufferSize() { - return mWriteBuffer.capacity(); - } - - /** - * when using writeAsync, it is recommended to use readTimeout != 0, - * else the write will be delayed until read data is available - */ - public void writeAsync(byte[] data) { - synchronized (mWriteBufferLock) { - mWriteBuffer.put(data); - } - } - - /** - * start SerialInputOutputManager in separate thread - */ - public void start() { - if(mState != State.STOPPED) - throw new IllegalStateException("already started"); - new Thread(this, this.getClass().getSimpleName()).start(); - } - - /** - * stop SerialInputOutputManager thread - * - * when using readTimeout == 0 (default), additionally use usbSerialPort.close() to - * interrupt blocking read - */ - public synchronized void stop() { - if (getState() == State.RUNNING) { - Log.i(TAG, "Stop requested"); - mState = State.STOPPING; - } - } - - public synchronized State getState() { - return mState; - } - - /** - * Continuously services the read and write buffers until {@link #stop()} is - * called, or until a driver exception is raised. - */ - @Override - public void run() { - synchronized (this) { - if (getState() != State.STOPPED) { - throw new IllegalStateException("Already running"); - } - mState = State.RUNNING; - } - Log.i(TAG, "Running ..."); - try { - if(mThreadPriority != Process.THREAD_PRIORITY_DEFAULT) - Process.setThreadPriority(mThreadPriority); - while (true) { - if (getState() != State.RUNNING) { - Log.i(TAG, "Stopping mState=" + getState()); - break; - } - step(); - } - } catch (Exception e) { - Log.w(TAG, "Run ending due to exception: " + e.getMessage(), e); - final Listener listener = getListener(); - if (listener != null) { - listener.onRunError(e); - } - } finally { - synchronized (this) { - mState = State.STOPPED; - Log.i(TAG, "Stopped"); - } - } - } - - private void step() throws IOException { - // Handle incoming data. - byte[] buffer; - synchronized (mReadBufferLock) { - buffer = mReadBuffer.array(); - } - int len = mSerialPort.read(buffer, mReadTimeout); - if (len > 0) { - if (DEBUG) Log.d(TAG, "Read data len=" + len); - final Listener listener = getListener(); - if (listener != null) { - final byte[] data = new byte[len]; - System.arraycopy(buffer, 0, data, 0, len); - listener.onNewData(data); - } - } - - // Handle outgoing data. - buffer = null; - synchronized (mWriteBufferLock) { - len = mWriteBuffer.position(); - if (len > 0) { - buffer = new byte[len]; - mWriteBuffer.rewind(); - mWriteBuffer.get(buffer, 0, len); - mWriteBuffer.clear(); - } - } - if (buffer != null) { - if (DEBUG) { - Log.d(TAG, "Writing data len=" + len); - } - mSerialPort.write(buffer, mWriteTimeout); - } - } - -}