From 3617e6eecac94965554487afc50d39b0584324fb Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期二, 16 三月 2021 10:34:01 +0800
Subject: [PATCH] 2021-03-16 1.备份
---
app/src/main/res/drawable/my_seekbar_thumb_normal.xml | 18
app/src/main/java/android/serialport/api/sample/KNX.java | 25
app/src/main/java/android/serialport/api/sample/SerialPortPreferences.java | 66
app/src/main/java/android/serialport/api/sample/Global.java | 35
app/src/main/jni/Android.mk | 13
app/src/main/res/drawable/btn_rounded.xml | 26
app/src/main/res/drawable-mdpi/ic_launcher.png | 0
app/src/main/java/android/serialport/api/sample/ReceiveAndSend.java | 400 +++
app/src/main/jni/android_serialport_api_sample_KNX.c | 244 ++
app/src/main/res/drawable/light.png | 0
app/src/main/res/drawable/track.xml | 9
app/src/main/jni/sun8iw6p_display.h | 429 +++
gradlew.bat | 84
.idea/misc.xml | 9
app/src/main/res/drawable/gray_track.xml | 15
app/src/main/res/drawable-hdpi/selected.png | 0
app/src/main/jni/android_serialport_api_sample_KNX.h | 27
app/src/main/java/sendData/Commands.java | 34
app/src/main/java/android/serialport/api/sample/KNX_Serialport.java | 30
app/src/main/res/drawable-hdpi/poweroff.png | 0
app/src/main/res/drawable/line_white.xml | 22
app/src/main/res/layout/activity_main.xml | 43
app/src/main/java/android/serialport/api/sample/ConsoleActivity.java | 694 +++++
app/src/main/libs/android-support-v4.jar | 0
app/src/main/res/drawable-hdpi/unselected.png | 0
app/src/main/res/layout/fragment_upgrade.xml | 51
.settings/org.eclipse.buildship.core.prefs | 2
app/src/main/res/drawable/green_thumb.xml | 21
app/src/main/assets/.idea/misc.xml | 5
app/build.gradle | 39
app/src/main/res/drawable-ldpi/setting.png | 0
gradlew | 172 +
app/src/main/java/android/serialport/api/sample/MyService.java | 40
app/src/main/res/values/strings.xml | 11
app/src/main/res/drawable/green_track.xml | 13
.project | 17
app/src/main/assets/.idea/compiler.xml | 23
app/src/main/res/layout/console.xml | 403 +++
app/src/main/assets/.idea/modules.xml | 9
app/src/main/java/android/serialport/api/sample/SPDataSet.java | 89
app/src/main/java/android/serialport/api/sample/MainActivity.java | 244 ++
app/src/main/assets/.idea/workspace.xml | 233 +
app/src/main/res/layout/fragment_knx.xml | 395 +++
app/src/main/res/drawable/light_def.png | 0
app/src/main/java/android/serialport/api/sample/Fragment_Update.java | 521 ++++
app/src/main/java/android/serialport/api/sample/Application.java | 46
app/src/main/res/layout/dialog_pro.xml | 23
.gitignore | 71
app/src/main/jni/android_serialport_api_SerialPort.c | 244 ++
app/src/main/res/values/styles.xml | 39
app/src/main/java/android/serialport/api/sample/Fragment_BUS.java | 500 ++++
app/src/main/res/drawable/seekbar_color_style.xml | 21
app/src/main/jni/android_serialport_api_SerialPort.h | 41
gradle/wrapper/gradle-wrapper.jar | 0
app/src/main/java/android/serialport/api/sample/Fragment_KNX.java | 333 ++
gradle/wrapper/gradle-wrapper.properties | 6
app/src/main/java/android/serialport/api/SerialPort.java | 90
app/src/main/res/drawable-hdpi/ic_launcher.png | 0
app/src/main/java/android/serialport/api/SerialPortFinder.java | 127 +
app/src/main/java/android/serialport/api/sample/Inductor.java | 42
app/src/main/res/drawable-ldpi/ic_launcher.png | 0
app/src/main/res/values/colors.xml | 7
app/.project | 23
import-summary.txt | 61
app/src/main/res/layout/tab.xml | 40
app/src/main/res/drawable/my_seekbar_thumb_pressed.xml | 18
app/src/main/java/sendData/SendDatas.java | 80
app/src/main/res/drawable-hdpi/off.png | 0
app/src/main/java/android/serialport/api/sample/MyFragmentAdapter.java | 28
app/src/main/java/sendData/CRC.java | 95
app/src/main/assets/.idea/encodings.xml | 5
build.gradle | 20
app/src/main/java/android/serialport/api/sample/KNX_ReceiveAndSend.java | 124 +
app/.settings/org.eclipse.buildship.core.prefs | 2
app/src/main/res/drawable/thumb.xml | 8
app/src/main/assets/.idea/copyright/profiles_settings.xml | 3
app/.classpath | 6
app/src/main/res/drawable/line.xml | 22
settings.gradle | 1
app/src/main/res/layout/fragment_navigation.xml | 99
app/src/main/res/drawable-hdpi/on.png | 0
app/src/main/res/xml/serial_port_preferences.xml | 18
app/src/main/AndroidManifest.xml | 31
app/src/main/libs/armeabi/libserial_port.so | 0
app/src/main/res/drawable-hdpi/poweron.png | 0
app/src/main/res/values/baudrates.xml | 15
app/src/main/assets/.idea/.name | 1
app/src/main/res/drawable/my_seekbar_normal.xml | 16
app/src/main/res/drawable/my_seekbar_pressed.xml | 16
app/src/main/java/android/serialport/api/sample/NavigationDrawerFragment.java | 174 +
app/src/main/res/drawable/gray_thumb.xml | 21
app/src/main/assets/.idea/scopes/scope_settings.xml | 5
92 files changed, 7,031 insertions(+), 2 deletions(-)
diff --git a/.gitignore b/.gitignore
index 3a36c6e..cce944c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,14 @@
+
+# Created by https://www.gitignore.io/api/android
+# Edit at https://www.gitignore.io/?templates=android
+
+### Android ###
# Built application files
*.apk
*.ap_
+*.aab
-# Files for the Dalvik VM
+# Files for the ART/Dalvik VM
*.dex
# Java class files
@@ -11,6 +17,8 @@
# Generated files
bin/
gen/
+out/
+release/
# Gradle files
.gradle/
@@ -22,5 +30,64 @@
# Proguard folder generated by Eclipse
proguard/
-#Log Files
+# Log Files
*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+### Android Patch ###
+gen-external-apklibs
+output.json
+
+# End of https://www.gitignore.io/api/android
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..f797995
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <output url="file://$PROJECT_DIR$/build/classes" />
+ </component>
+ <component name="ProjectType">
+ <option name="id" value="Android" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/.project b/.project
new file mode 100644
index 0000000..6ca2d08
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>TTL</name>
+ <comment>Project TTL created by Buildship.</comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.buildship.core.gradleprojectbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.buildship.core.gradleprojectnature</nature>
+ </natures>
+</projectDescription>
diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs
new file mode 100644
index 0000000..408b507
--- /dev/null
+++ b/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,2 @@
+connection.project.dir=
+eclipse.preferences.version=1
diff --git a/app/.classpath b/app/.classpath
new file mode 100644
index 0000000..4f3f504
--- /dev/null
+++ b/app/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
+ <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
+ <classpathentry kind="output" path="bin/default"/>
+</classpath>
diff --git a/app/.project b/app/.project
new file mode 100644
index 0000000..d1eb8cb
--- /dev/null
+++ b/app/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>app</name>
+ <comment>Project app created by Buildship.</comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.buildship.core.gradleprojectbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.buildship.core.gradleprojectnature</nature>
+ </natures>
+</projectDescription>
diff --git a/app/.settings/org.eclipse.buildship.core.prefs b/app/.settings/org.eclipse.buildship.core.prefs
new file mode 100644
index 0000000..a7b84d9
--- /dev/null
+++ b/app/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,2 @@
+connection.project.dir=..
+eclipse.preferences.version=1
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..da6d5ef
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,39 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 27
+
+ defaultConfig {
+ applicationId "android.serialport.api.sample"
+ minSdkVersion 17
+ targetSdkVersion 27
+
+ ndk {
+ moduleName "serial_port"
+ abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ }
+
+ sourceSets{
+ main {
+// jni.srcDirs = []
+ jni.srcDirs = []
+ jniLibs.srcDirs = ['src/main/jniLibs']
+ jniLibs.srcDirs = ['libs']
+ }
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(include: ['*.jar','*.so'], dir: 'libs')
+ implementation 'com.android.support:appcompat-v7:27.1.1'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.0'
+ testImplementation 'junit:junit:4.12'
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cd12a52
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.serialport.api.sample"
+ android:versionCode="4"
+ android:versionName="18.2.5" >
+
+ <supports-screens android:anyDensity="true" />
+
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+ <application
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+ <activity
+ android:name="android.serialport.api.sample.MainActivity"
+ android:label="@string/app_name"
+ android:screenOrientation="landscape"
+ android:windowSoftInputMode="stateHidden" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name="SerialPortPreferences" />
+ <activity android:name="SendingActivity" />
+
+ <service android:name="android.serialport.api.sample.MyService" />
+ </application>
+
+</manifest>
\ No newline at end of file
diff --git a/app/src/main/assets/.idea/.name b/app/src/main/assets/.idea/.name
new file mode 100644
index 0000000..f40fe05
--- /dev/null
+++ b/app/src/main/assets/.idea/.name
@@ -0,0 +1 @@
+assets
\ No newline at end of file
diff --git a/app/src/main/assets/.idea/compiler.xml b/app/src/main/assets/.idea/compiler.xml
new file mode 100644
index 0000000..217af47
--- /dev/null
+++ b/app/src/main/assets/.idea/compiler.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="CompilerConfiguration">
+ <option name="DEFAULT_COMPILER" value="Javac" />
+ <resourceExtensions />
+ <wildcardResourcePatterns>
+ <entry name="!?*.java" />
+ <entry name="!?*.form" />
+ <entry name="!?*.class" />
+ <entry name="!?*.groovy" />
+ <entry name="!?*.scala" />
+ <entry name="!?*.flex" />
+ <entry name="!?*.kt" />
+ <entry name="!?*.clj" />
+ </wildcardResourcePatterns>
+ <annotationProcessing>
+ <profile default="true" name="Default" enabled="false">
+ <processorPath useClasspath="true" />
+ </profile>
+ </annotationProcessing>
+ </component>
+</project>
+
diff --git a/app/src/main/assets/.idea/copyright/profiles_settings.xml b/app/src/main/assets/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..e7bedf3
--- /dev/null
+++ b/app/src/main/assets/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+<component name="CopyrightManager">
+ <settings default="" />
+</component>
\ No newline at end of file
diff --git a/app/src/main/assets/.idea/encodings.xml b/app/src/main/assets/.idea/encodings.xml
new file mode 100644
index 0000000..e206d70
--- /dev/null
+++ b/app/src/main/assets/.idea/encodings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
+</project>
+
diff --git a/app/src/main/assets/.idea/misc.xml b/app/src/main/assets/.idea/misc.xml
new file mode 100644
index 0000000..28b71f5
--- /dev/null
+++ b/app/src/main/assets/.idea/misc.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" />
+</project>
+
diff --git a/app/src/main/assets/.idea/modules.xml b/app/src/main/assets/.idea/modules.xml
new file mode 100644
index 0000000..4fc9afb
--- /dev/null
+++ b/app/src/main/assets/.idea/modules.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/assets.iml" filepath="$PROJECT_DIR$/.idea/assets.iml" />
+ </modules>
+ </component>
+</project>
+
diff --git a/app/src/main/assets/.idea/scopes/scope_settings.xml b/app/src/main/assets/.idea/scopes/scope_settings.xml
new file mode 100644
index 0000000..922003b
--- /dev/null
+++ b/app/src/main/assets/.idea/scopes/scope_settings.xml
@@ -0,0 +1,5 @@
+<component name="DependencyValidationManager">
+ <state>
+ <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+ </state>
+</component>
\ No newline at end of file
diff --git a/app/src/main/assets/.idea/workspace.xml b/app/src/main/assets/.idea/workspace.xml
new file mode 100644
index 0000000..3224714
--- /dev/null
+++ b/app/src/main/assets/.idea/workspace.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ChangeListManager">
+ <list default="true" id="adeba4c9-7cf4-4d05-a43f-f46103178e18" name="Default" comment="" />
+ <ignored path="assets.iws" />
+ <ignored path=".idea/workspace.xml" />
+ <option name="TRACKING_ENABLED" value="true" />
+ <option name="SHOW_DIALOG" value="false" />
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+ <option name="LAST_RESOLUTION" value="IGNORE" />
+ </component>
+ <component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
+ <component name="CreatePatchCommitExecutor">
+ <option name="PATCH_PATH" value="" />
+ </component>
+ <component name="DaemonCodeAnalyzer">
+ <disable_hints />
+ </component>
+ <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
+ <component name="FavoritesManager">
+ <favorites_list name="assets" />
+ </component>
+ <component name="ProjectFrameBounds">
+ <option name="x" value="188" />
+ <option name="y" value="77" />
+ <option name="width" value="1260" />
+ <option name="height" value="760" />
+ </component>
+ <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+ <OptionsSetting value="true" id="Add" />
+ <OptionsSetting value="true" id="Remove" />
+ <OptionsSetting value="true" id="Checkout" />
+ <OptionsSetting value="true" id="Update" />
+ <OptionsSetting value="true" id="Status" />
+ <OptionsSetting value="true" id="Edit" />
+ <ConfirmationsSetting value="0" id="Add" />
+ <ConfirmationsSetting value="0" id="Remove" />
+ </component>
+ <component name="ProjectReloadState">
+ <option name="STATE" value="0" />
+ </component>
+ <component name="ProjectView">
+ <navigator currentView="ProjectPane" proportions="" version="1">
+ <flattenPackages />
+ <showMembers />
+ <showModules />
+ <showLibraryContents />
+ <hideEmptyPackages />
+ <abbreviatePackageNames />
+ <autoscrollToSource />
+ <autoscrollFromSource />
+ <sortByType />
+ </navigator>
+ <panes>
+ <pane id="PackagesPane" />
+ <pane id="Scope" />
+ <pane id="AndroidView">
+ <subPane />
+ </pane>
+ <pane id="ProjectPane">
+ <subPane>
+ <PATH>
+ <PATH_ELEMENT>
+ <option name="myItemId" value="assets" />
+ <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+ </PATH_ELEMENT>
+ </PATH>
+ </subPane>
+ </pane>
+ </panes>
+ </component>
+ <component name="PropertiesComponent">
+ <property name="GoToClass.includeLibraries" value="false" />
+ <property name="GoToClass.toSaveIncludeLibraries" value="false" />
+ <property name="GoToFile.includeJavaFiles" value="false" />
+ <property name="MemberChooser.sorted" value="false" />
+ <property name="MemberChooser.showClasses" value="true" />
+ <property name="MemberChooser.copyJavadoc" value="false" />
+ <property name="options.lastSelected" value="copyright" />
+ <property name="options.splitter.main.proportions" value="0.3" />
+ <property name="options.splitter.details.proportions" value="0.2" />
+ <property name="options.searchVisible" value="true" />
+ <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+ </component>
+ <component name="RunManager">
+ <configuration default="true" type="Remote" factoryName="Remote">
+ <option name="USE_SOCKET_TRANSPORT" value="true" />
+ <option name="SERVER_MODE" value="false" />
+ <option name="SHMEM_ADDRESS" value="javadebug" />
+ <option name="HOST" value="localhost" />
+ <option name="PORT" value="5005" />
+ <method />
+ </configuration>
+ <configuration default="true" type="TestNG" factoryName="TestNG">
+ <module name="" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" />
+ <option name="SUITE_NAME" />
+ <option name="PACKAGE_NAME" />
+ <option name="MAIN_CLASS_NAME" />
+ <option name="METHOD_NAME" />
+ <option name="GROUP_NAME" />
+ <option name="TEST_OBJECT" value="CLASS" />
+ <option name="VM_PARAMETERS" value="-ea" />
+ <option name="PARAMETERS" />
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+ <option name="OUTPUT_DIRECTORY" />
+ <option name="ANNOTATION_TYPE" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <option name="TEST_SEARCH_SCOPE">
+ <value defaultName="moduleWithDependencies" />
+ </option>
+ <option name="USE_DEFAULT_REPORTERS" value="false" />
+ <option name="PROPERTIES_FILE" />
+ <envs />
+ <properties />
+ <listeners />
+ <method />
+ </configuration>
+ <configuration default="true" type="Application" factoryName="Application">
+ <option name="MAIN_CLASS_NAME" />
+ <option name="VM_PARAMETERS" />
+ <option name="PROGRAM_PARAMETERS" />
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" />
+ <option name="ENABLE_SWING_INSPECTOR" value="false" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <module name="" />
+ <envs />
+ <method />
+ </configuration>
+ <configuration default="true" type="JUnit" factoryName="JUnit">
+ <module name="" />
+ <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
+ <option name="ALTERNATIVE_JRE_PATH" />
+ <option name="PACKAGE_NAME" />
+ <option name="MAIN_CLASS_NAME" />
+ <option name="METHOD_NAME" />
+ <option name="TEST_OBJECT" value="class" />
+ <option name="VM_PARAMETERS" value="-ea" />
+ <option name="PARAMETERS" />
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+ <option name="ENV_VARIABLES" />
+ <option name="PASS_PARENT_ENVS" value="true" />
+ <option name="TEST_SEARCH_SCOPE">
+ <value defaultName="moduleWithDependencies" />
+ </option>
+ <envs />
+ <patterns />
+ <method />
+ </configuration>
+ <list size="0" />
+ <configuration name="<template>" type="Applet" default="true" selected="false">
+ <option name="MAIN_CLASS_NAME" />
+ <option name="HTML_FILE_NAME" />
+ <option name="HTML_USED" value="false" />
+ <option name="WIDTH" value="400" />
+ <option name="HEIGHT" value="300" />
+ <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
+ <option name="VM_PARAMETERS" />
+ </configuration>
+ <configuration name="<template>" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" default="true" selected="false">
+ <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
+ </configuration>
+ <configuration name="<template>" type="WebApp" default="true" selected="false">
+ <Host>localhost</Host>
+ <Port>5050</Port>
+ </configuration>
+ </component>
+ <component name="ShelveChangesManager" show_recycled="false" />
+ <component name="TaskManager">
+ <task active="true" id="Default" summary="Default task">
+ <changelist id="adeba4c9-7cf4-4d05-a43f-f46103178e18" name="Default" comment="" />
+ <created>1447815009584</created>
+ <updated>1447815009584</updated>
+ </task>
+ <servers />
+ </component>
+ <component name="ToolWindowManager">
+ <frame x="188" y="77" width="1260" height="760" extended-state="0" />
+ <editor active="false" />
+ <layout>
+ <window_info id="Palette	" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Designer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+ <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+ <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+ <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+ <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+ <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24958949" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+ <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+ <window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+ <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.24958949" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+ <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+ <window_info id="Memory Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+ <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+ <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+ <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+ <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+ <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+ </layout>
+ </component>
+ <component name="Vcs.Log.UiProperties">
+ <option name="RECENTLY_FILTERED_USER_GROUPS">
+ <collection />
+ </option>
+ <option name="RECENTLY_FILTERED_BRANCH_GROUPS">
+ <collection />
+ </option>
+ </component>
+ <component name="VcsContentAnnotationSettings">
+ <option name="myLimit" value="2678400000" />
+ </component>
+ <component name="VcsManagerConfiguration">
+ <option name="myTodoPanelSettings">
+ <TodoPanelSettings />
+ </option>
+ </component>
+ <component name="XDebuggerManager">
+ <breakpoint-manager />
+ </component>
+</project>
+
diff --git a/app/src/main/java/android/serialport/api/SerialPort.java b/app/src/main/java/android/serialport/api/SerialPort.java
new file mode 100644
index 0000000..c5cf7aa
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/SerialPort.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2009 Cedric Priscal
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+package android.serialport.api;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import android.util.Log;
+
+public class SerialPort {
+
+ private static final String TAG = "SerialPort";
+
+ /*
+ * Do not remove or rename the field mFd: it is used by native method
+ * close();
+ */
+ private FileDescriptor mFd;
+ private FileInputStream mFileInputStream;
+ private FileOutputStream mFileOutputStream;
+
+ public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {
+
+ /* Check access permission */
+ if (!device.canRead() || !device.canWrite()) {
+ try {
+ /* Missing read/write permission, trying to chmod the file */
+ Process su;
+ su = Runtime.getRuntime().exec("/system/bin/su");
+ String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n";
+ su.getOutputStream().write(cmd.getBytes());
+ if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {
+ throw new SecurityException();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new SecurityException();
+ }
+ }
+
+ mFd = open(device.getAbsolutePath(), baudrate, flags);
+ if (mFd == null) {
+ Log.e(TAG, "native open returns null");
+ throw new IOException();
+ }
+ mFileInputStream = new FileInputStream(mFd);
+ mFileOutputStream = new FileOutputStream(mFd);
+ }
+
+ // Getters and setters
+ public InputStream getInputStream() {
+ return mFileInputStream;
+ }
+
+ public OutputStream getOutputStream() {
+ return mFileOutputStream;
+ }
+
+ // JNI
+ private native static FileDescriptor open(String path, int baudrate, int flags);
+
+ public native void close();
+
+ public static native int BackLight_ON();
+
+ public static native int BackLight_OFF();
+
+ static {
+ System.loadLibrary("serial_port");
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/SerialPortFinder.java b/app/src/main/java/android/serialport/api/SerialPortFinder.java
new file mode 100644
index 0000000..0d80d1a
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/SerialPortFinder.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2009 Cedric Priscal
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+package android.serialport.api;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.util.Iterator;
+import java.util.Vector;
+
+import android.util.Log;
+
+public class SerialPortFinder {
+
+ public class Driver {
+ public Driver(String name, String root) {
+ mDriverName = name;
+ mDeviceRoot = root;
+ }
+
+ private String mDriverName;
+ private String mDeviceRoot;
+ Vector<File> mDevices = null;
+
+ public Vector<File> getDevices() {
+ if (mDevices == null) {
+ mDevices = new Vector<File>();
+ File dev = new File("/dev");
+ File[] files = dev.listFiles();
+ int i;
+ for (i = 0; i < files.length; i++) {
+ if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
+ Log.d(TAG, "Found new device: " + files[i]);
+ mDevices.add(files[i]);
+ }
+ }
+ }
+ return mDevices;
+ }
+
+ public String getName() {
+ return mDriverName;
+ }
+ }
+
+ private static final String TAG = "SerialPort";
+
+ private Vector<Driver> mDrivers = null;
+
+ Vector<Driver> getDrivers() throws IOException {
+ if (mDrivers == null) {
+ mDrivers = new Vector<Driver>();
+ LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
+ String l;
+ while ((l = r.readLine()) != null) {
+ // Issue 3:
+ // Since driver name may contain spaces, we do not extract
+ // driver name with split()
+ String drivername = l.substring(0, 0x15).trim();
+ String[] w = l.split(" +");
+ if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) {
+ Log.d(TAG, "Found new driver " + drivername + " on " + w[w.length - 4]);
+ // mDrivers.add(new Driver(drivername, w[w.length-4]));
+ mDrivers.add(new Driver(drivername, w[w.length - 4]));
+ }
+ }
+ r.close();
+ }
+ return mDrivers;
+ }
+
+ public String[] getAllDevices() {
+ Vector<String> devices = new Vector<String>();
+ // Parse each driver
+ Iterator<Driver> itdriv;
+ try {
+ itdriv = getDrivers().iterator();
+ while (itdriv.hasNext()) {
+ Driver driver = itdriv.next();
+ Iterator<File> itdev = driver.getDevices().iterator();
+ while (itdev.hasNext()) {
+ String device = itdev.next().getName();
+ String value = String.format("%s (%s)", device, driver.getName());
+ devices.add(value);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return devices.toArray(new String[devices.size()]);
+ }
+
+ public String[] getAllDevicesPath() {
+ Vector<String> devices = new Vector<String>();
+ // Parse each driver
+ Iterator<Driver> itdriv;
+ try {
+ itdriv = getDrivers().iterator();
+ while (itdriv.hasNext()) {
+ Driver driver = itdriv.next();
+ Iterator<File> itdev = driver.getDevices().iterator();
+ while (itdev.hasNext()) {
+ String device = itdev.next().getAbsolutePath();
+ devices.add(device);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return devices.toArray(new String[devices.size()]);
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/Application.java b/app/src/main/java/android/serialport/api/sample/Application.java
new file mode 100644
index 0000000..39eded0
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/Application.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009 Cedric Priscal
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+package android.serialport.api.sample;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.InvalidParameterException;
+
+import android.serialport.api.SerialPort;
+import android.serialport.api.SerialPortFinder;
+
+public class Application {
+
+ public SerialPortFinder mSerialPortFinder = new SerialPortFinder();
+ private SerialPort mSerialPort = null;
+
+ public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException {
+
+ if (mSerialPort == null) {
+
+ mSerialPort = new SerialPort(new File("/dev/ttyS1"), 115200, 0);
+ }
+ return mSerialPort;
+ }
+
+ public void closeSerialPort() {
+ if (mSerialPort != null) {
+ mSerialPort.close();
+ mSerialPort = null;
+ }
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/ConsoleActivity.java b/app/src/main/java/android/serialport/api/sample/ConsoleActivity.java
new file mode 100644
index 0000000..8dc4b9c
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/ConsoleActivity.java
@@ -0,0 +1,694 @@
+/*
+ * Copyright 2009 Cedric Priscal
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+package android.serialport.api.sample;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import sendData.Commands;
+import sendData.SendDatas;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.content.DialogInterface.OnClickListener;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.serialport.api.SerialPort;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.serialport.api.sample.R;
+import android.util.Log;
+import android.widget.Switch;
+
+public class ConsoleActivity extends Activity {
+
+ public static final int INDUCTOR_LEAVE = 1;
+
+ private List<byte[]> SendDatasList = new ArrayList<byte[]>();
+
+ private TextView Seekbar_value;
+
+ private EditText T_TextView;
+ private EditText key_state;
+ private EditText c_value;
+
+ private Switch loop1Button;
+ private Switch loop2Button;
+ private Switch loop3Button;
+ private Switch loop4Button;
+ private Switch powerButton;
+ private Switch openBackLight;
+
+ private RadioButton radioButton1;
+ private RadioButton radioButton2;
+ private RadioButton radioButton3;
+ private RadioButton radioButton4;
+ private RadioButton radioButton5;
+ private RadioButton radioButton6;
+
+ private SeekBar SSeekbar;
+ private static Button Btn_state;
+ private Button C_Btn;
+
+ protected Application mApplication;
+ protected SerialPort mSerialPort;
+ protected OutputStream mOutputStream;
+ private InputStream mInputStream;
+ private ReadThread mReadThread;
+
+ int id = -1;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.console);
+
+ iniView();
+ iniData();
+ }
+
+ private void iniView() {
+
+ c_value = (EditText) findViewById(R.id.c_value);
+ T_TextView = (EditText) findViewById(R.id.Temperature);
+ key_state = (EditText) findViewById(R.id.key_status);
+ Seekbar_value = (TextView) findViewById(R.id.seekbar_value);
+
+ loop1Button = (Switch) findViewById(R.id.loopId1);
+ loop1Button.setTag("0");
+ loop1Button.setOnClickListener(onClick);
+
+ loop2Button = (Switch) findViewById(R.id.loopId2);
+ loop2Button.setTag("0");
+ loop2Button.setOnClickListener(onClick);
+
+ loop3Button = (Switch) findViewById(R.id.loopId3);
+ loop3Button.setTag("0");
+ loop3Button.setOnClickListener(onClick);
+
+ loop4Button = (Switch) findViewById(R.id.loopId4);
+ loop4Button.setTag("0");
+ loop4Button.setOnClickListener(onClick);
+
+ powerButton = (Switch) findViewById(R.id.powerButton);
+ powerButton.setTag("Off");
+ powerButton.setOnClickListener(powerOnClick);
+
+ radioButton1 = (RadioButton) findViewById(R.id.radioButton1);
+ radioButton2 = (RadioButton) findViewById(R.id.radioButton2);
+ radioButton3 = (RadioButton) findViewById(R.id.radioButton3);
+ radioButton4 = (RadioButton) findViewById(R.id.radioButton4);
+ radioButton5 = (RadioButton) findViewById(R.id.radioButton5);
+ radioButton6 = (RadioButton) findViewById(R.id.radioButton6);
+
+ openBackLight = (Switch) findViewById(R.id.openbacklight);
+ openBackLight.setTag("1");
+ openBackLight.setChecked(true);
+ openBackLight.setOnClickListener(backLightOnClick);
+
+ Btn_state = (Button) findViewById(R.id.btn_state);
+ Btn_state.setTag(new Inductor());
+ Btn_state.setBackground(null);
+
+ C_Btn = (Button) findViewById(R.id.c_btn);
+ C_Btn.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ // 璁剧疆琛ュ伩鍊�
+ try {
+ int _value = Integer.parseInt(c_value.getText().toString());
+ byte[] sendBytes = SendDatas.AddSendData(Commands.SET_TEMP_COMPENSATE_VALUE.getCommand(), 250, 250,
+ new byte[] { (byte) 1, (byte) 0, (byte) (_value + 10) });
+ SendDatasList.add(sendBytes);
+
+ SharedPreferences SP = ConsoleActivity.this.getSharedPreferences("Serialport",
+ ConsoleActivity.this.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.putInt("c_value", _value);
+ editor.commit();
+ editor.apply();
+
+ InputMethodManager imm = (InputMethodManager) getSystemService(
+ ConsoleActivity.this.INPUT_METHOD_SERVICE);
+ // 寰楀埌InputMethodManager鐨勫疄渚�
+ if (imm.isActive()) {
+ // 濡傛灉寮�鍚�
+ imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS);
+ // 鍏抽棴杞敭鐩橈紝寮�鍚柟娉曠浉鍚岋紝杩欎釜鏂规硶鏄垏鎹㈠紑鍚笌鍏抽棴鐘舵�佺殑
+ }
+ } catch (Exception e) {
+
+ }
+ }
+ });
+
+ SSeekbar = (SeekBar) findViewById(R.id.set_sensitivity);
+ SSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ // 鍐�
+ int _value = seekBar.getProgress();
+ byte[] sendBytes = SendDatas.AddSendData(Commands.Sensor.getCommand(), 250, 250,
+ new byte[] { 1, (byte) _value });
+ SendDatasList.add(sendBytes);
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ Seekbar_value.setText(progress + "");
+ }
+ });
+ }
+
+ private int getC_value() {
+
+ SharedPreferences SP = this.getSharedPreferences("Serialport", this.MODE_PRIVATE);
+ int _value = SP.getInt("c_value", 0);
+ return _value;
+ }
+
+ private void iniData() {
+
+ getSerialPort();
+ SendDatasList.clear();
+
+ // 璇诲彇娓╁害 1绉掗挓璇诲彇涓�娆�
+ new SendThread().start();
+ new SendDatasThread().start();
+ ReadSensitivity();
+
+ c_value.setText(getC_value() + "");
+ }
+
+ private void ReadSensitivity() {
+ byte[] sendBytes = SendDatas.AddSendData(Commands.Sensor.getCommand(), 250, 250, new byte[] { 0 });
+ SendDatasList.add(sendBytes);
+ }
+
+ private android.view.View.OnClickListener onClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ Switch view = (Switch) v;
+ if (mOutputStream == null) {
+ Toast.makeText(ConsoleActivity.this, "Please Open Serial Port", android.widget.Toast.LENGTH_SHORT)
+ .show();
+ view.setChecked(false);
+ return;
+ }
+ int tag = Integer.parseInt(view.getTag().toString());
+
+ if (tag == 0) {
+ view.setTag("100");
+ view.setChecked(true);
+ } else {
+ view.setTag("0");
+ view.setChecked(false);
+ }
+ tag = Integer.parseInt(view.getTag().toString());
+ if (view.equals(loop1Button)) {
+ setData(1, tag);
+ } else if (view.equals(loop2Button)) {
+ setData(2, tag);
+ } else if (view.equals(loop3Button)) {
+ setData(3, tag);
+ } else if (view.equals(loop4Button)) {
+ setData(4, tag);
+ }
+ }
+ };
+
+ private android.view.View.OnClickListener powerOnClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+
+ if (view.getTag().toString().equals("On")) {
+ view.setTag("Off");
+ mApplication.closeSerialPort();
+ try {
+ mOutputStream.close();
+ mOutputStream = null;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+ powerButton.setChecked(false);
+ } else if (view.getTag().toString().equals("Off")) {
+ getSerialPort();
+ }
+ }
+ };
+
+ private android.view.View.OnClickListener backLightOnClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ Switch view = (Switch) v;
+ if (view.isChecked()) {
+ // sendBackLight(1);
+ if (0 < SerialPort.BackLight_ON()) {
+ Toast.makeText(ConsoleActivity.this, "-1", Toast.LENGTH_SHORT).show();
+ }
+
+ } else {
+ // sendBackLight(0);
+ if (0 < SerialPort.BackLight_OFF()) {
+ Toast.makeText(ConsoleActivity.this, "-1", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ };
+
+ private android.view.View.OnTouchListener onTouch = new android.view.View.OnTouchListener() {
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+
+ if (MotionEvent.ACTION_DOWN == event.getAction()) {
+ v.setBackgroundResource(R.drawable.selected);
+ if (mOutputStream == null) {
+ Toast.makeText(ConsoleActivity.this, "Please Open Serial Port", android.widget.Toast.LENGTH_SHORT)
+ .show();
+ } else {
+ setBuzzerData();
+ }
+
+ } else if (MotionEvent.ACTION_UP == event.getAction()) {
+ v.setBackgroundResource(R.drawable.unselected);
+ }
+ return false;
+ }
+ };
+
+ /**
+ * Open the serial port, input and output streams
+ */
+ private void getSerialPort() {
+
+ mApplication = new Application();
+
+ try {
+
+ mSerialPort = mApplication.getSerialPort();
+ mOutputStream = mSerialPort.getOutputStream();
+ mInputStream = mSerialPort.getInputStream();
+
+ mReadThread = new ReadThread();
+ mReadThread.start();
+
+ if (powerButton != null) {
+ powerButton.setChecked(true);
+ powerButton.setTag("On");
+ }
+
+ } catch (SecurityException e) {
+ if (powerButton != null) {
+ powerButton.setChecked(false);
+ powerButton.setTag("Off");
+ }
+ DisplayError(R.string.error_security);
+ } catch (IOException e) {
+ if (powerButton != null) {
+ powerButton.setChecked(false);
+ powerButton.setTag("Off");
+ }
+ DisplayError(R.string.error_unknown);
+ } catch (InvalidParameterException e) {
+ if (powerButton != null) {
+ powerButton.setChecked(false);
+ powerButton.setTag("Off");
+ }
+ DisplayError(R.string.error_configuration);
+ }
+ }
+
+ /**
+ * send buzzer
+ */
+ private void setBuzzerData() {
+ byte[] sendBytes = SendDatas.AddSendData(Commands.buzzer.getCommand(), 250, 250,
+ new byte[] { (byte) 2, (byte) 5, (byte) 1 });
+ this.SendDatasList.add(sendBytes);
+ /**
+ * 2017.12.17 try { mOutputStream.flush();
+ * mOutputStream.write(sendBytes);
+ *
+ * } catch (IOException e) { e.printStackTrace(); }
+ */
+ }
+
+ private void readDateTime() {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.ReadTime.getCommand(), 250, 250, new byte[] {});
+ this.SendDatasList.add(sendBytes);
+ }
+
+ private byte[] sendData(int loopId, int linght) {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.regulationControl.getCommand(), 250, 250,
+ new byte[] { (byte) loopId, (byte) linght });
+ return sendBytes;
+ }
+
+ private void setData(int loopId, int linght) {
+
+ byte[] sendBytes = sendData(loopId, linght);
+ this.SendDatasList.add(sendBytes);
+ }
+
+ /**
+ * 2015.12.10 璇诲彇娓╁害
+ */
+ private class SendThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+ while (true) {
+ try {
+ byte[] sendBytes = SendDatas.AddSendData(Commands.READ_TEMP_WITH_DRY1.getCommand(), 250, 250,
+ new byte[] {});
+ mOutputStream.flush();
+ mOutputStream.write(sendBytes);
+ sleep(1000);
+ } catch (Exception e) {
+ //
+ continue;
+ }
+ }
+ }
+ }
+
+ private class SendDatasThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (true) {
+
+ try {
+ Thread.sleep(10);
+ } catch (Exception e) {
+ e.getMessage();
+ }
+
+ for (int i = 0; i < SendDatasList.size(); i++) {
+
+ try {
+ byte[] sendBytes = SendDatasList.get(i);
+ try {
+ mOutputStream.flush();
+ mOutputStream.write(sendBytes);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ SendDatasList.remove(i);
+ i--;
+ } catch (Exception ex) {
+ ex.getMessage();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Read data thread
+ *
+ * @author 2017骞�12鏈�19鏃�
+ */
+ private class ReadThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (!isInterrupted()) {
+ int size = 0;
+
+ try {
+ byte[] buffer = new byte[64];
+ if (mInputStream == null) {
+ return;
+ }
+ size = mInputStream.read(buffer);
+
+ for (int i = 0; i < size - 1; i++) {
+
+ if (i != 0) {
+ if ((buffer[i] & 0xFF) == 0xAA && (buffer[i + 1] & 0xFF) == 0xAA) {
+ //
+ byte[] _bf = new byte[i];
+ System.arraycopy(buffer, 0, _bf, 0, i);
+
+ if (_bf.length >= 13) {
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+ if (command == Commands.ReadTimeFeedback.getCommand()
+ || command == Commands.DryContactInitiativeToSend.getCommand()
+ || command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()
+ || command == Commands.InductorState.getCommand()
+ || command == Commands.SensorBack.getCommand()
+ || command == Commands.ClickState.getCommand()) {
+ onDataReceived(buffer, size);
+ }
+ }
+
+ byte[] _bf2 = new byte[size - i];
+ System.arraycopy(buffer, i, _bf2, 0, size - i);
+ if (_bf2.length >= 13) {
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+ if (command == Commands.ReadTimeFeedback.getCommand()
+ || command == Commands.DryContactInitiativeToSend.getCommand()
+ || command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()
+ || command == Commands.InductorState.getCommand()
+ || command == Commands.SensorBack.getCommand()
+ || command == Commands.ClickState.getCommand()) {
+ onDataReceived(buffer, size);
+ }
+ }
+ }
+ } else {
+ if (size >= 13) {
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+ if (command == Commands.ReadTimeFeedback.getCommand()
+ || command == Commands.DryContactInitiativeToSend.getCommand()
+ || command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()
+ || command == Commands.InductorState.getCommand()
+ || command == Commands.SensorBack.getCommand()
+ || command == Commands.ClickState.getCommand()) {
+ onDataReceived(buffer, size);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+ }
+ }
+ }
+
+ protected void onDataReceived(final byte[] buffer, final int size) {
+
+ runOnUiThread(new Runnable() {
+ public void run() {
+
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+
+ if (command == Commands.ReadTimeFeedback.getCommand()) {
+ // ReadDateTimeTextView.setText(
+ // (buffer[12] & 0xFF) + "\\" + (buffer[13] & 0xFF) + "\\20"
+ // + (buffer[11] & 0xFF) + " "
+ // + (buffer[14] & 0xFF) + ":" + (buffer[15] & 0xFF) + ":" +
+ // (buffer[16] & 0xFF));
+ } else if (command == Commands.DryContactInitiativeToSend.getCommand()) {
+
+ try {
+ mOutputStream
+ .write(SendDatas.AddSendData(Commands.DryContactInitiativeToSendFeedback.getCommand(),
+ 250, 250, new byte[] { (byte) 0xf8 }));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ if ((buffer[11] & 0xFF) == 1)
+ radioButton1.setChecked(true);
+ else
+ radioButton1.setChecked(false);
+
+ if ((buffer[12] & 0xFF) == 1)
+ radioButton2.setChecked(true);
+ else
+ radioButton2.setChecked(false);
+
+ if ((buffer[13] & 0xFF) == 1)
+ radioButton3.setChecked(true);
+ else
+ radioButton3.setChecked(false);
+
+ if ((buffer[14] & 0xFF) == 1)
+ radioButton4.setChecked(true);
+ else
+ radioButton4.setChecked(false);
+
+ if ((buffer[15] & 0xFF) == 1)
+ radioButton5.setChecked(true);
+ else
+ radioButton5.setChecked(false);
+
+ if ((buffer[16] & 0xFF) == 1)
+ radioButton6.setChecked(true);
+ else
+ radioButton6.setChecked(false);
+
+ } else if (command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()) {// 璇诲彇娓╁害
+ if ((buffer[13] & 0xFF) == 0) {
+ // 鍗曚綅鎽勬皬搴�
+ T_TextView.setText((buffer[11] & 0xFF) + "鈩�");
+ } else {
+ // 鍗庢皬搴�
+ T_TextView.setText((buffer[11] & 0xFF) + "鈩�");
+ }
+
+ } else if (command == Commands.SensorBack.getCommand()) {
+ // 浼犳劅鍣ㄧ伒鏁忓害
+ SSeekbar.setProgress(buffer[12] & 0xFF);
+ Seekbar_value.setText((buffer[12] & 0xFF) + "");
+ } else if (command == Commands.InductorState.getCommand()) {
+ try {
+ Btn_state.setBackgroundColor(Color.RED);
+ ((Inductor) Btn_state.getTag()).LastTime = Calendar.getInstance();
+ } catch (Exception e) {
+
+ }
+ } else if (command == Commands.ClickState.getCommand()) {
+ int key = buffer[12] & 0xFF;
+ switch (key) {
+ case 0:// 寮硅捣
+ key_state.setText("KEY_UP");
+ Log.i("adf", "KEY_UP");
+ break;
+ case 1:// 鎸変笅
+ key_state.setText("KEY_DOWN");
+ Log.i("adf", "KEY_DOWN");
+ break;
+ case 2:// 闀挎寜
+ key_state.setText("KEY_LONGPRESS");
+ Log.i("adf", "KEY_LONGPRESS");
+ break;
+ }
+ } else if (command == Commands.SET_TEMP_COMPENSATE_VALUE_ACK.getCommand()) {
+ if ((buffer[11] & 0xFF) == 0xF5) {
+ Toast.makeText(ConsoleActivity.this, "set compensate value failed", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Error message
+ *
+ * @param resourceId
+ */
+ private void DisplayError(int resourceId) {
+ AlertDialog.Builder b = new AlertDialog.Builder(this);
+ b.setTitle("Error");
+ b.setMessage(resourceId);
+ b.setPositiveButton("OK", new OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ // ConsoleActivity.this.finish();
+ }
+ });
+ b.show();
+ }
+
+ @Override
+ protected void onDestroy() {
+ if (mReadThread != null)
+ mReadThread.interrupt();
+ mApplication.closeSerialPort();
+ mSerialPort = null;
+ super.onDestroy();
+ }
+
+ private android.view.View.OnTouchListener ReadTimeButtonOnTouch = new android.view.View.OnTouchListener() {
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ // TODO Auto-generated method stub
+ if (MotionEvent.ACTION_DOWN == event.getAction()) {
+ v.setBackgroundResource(R.drawable.selected);
+ if (mOutputStream == null) {
+ Toast.makeText(ConsoleActivity.this, "Please Open Serial Port", android.widget.Toast.LENGTH_SHORT)
+ .show();
+ } else {
+ readDateTime();
+ }
+
+ } else if (MotionEvent.ACTION_UP == event.getAction()) {
+ v.setBackgroundResource(R.drawable.unselected);
+ }
+ return false;
+ }
+ };
+
+ public static Handler MainHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+
+ switch (msg.what) {
+ case INDUCTOR_LEAVE:
+ Btn_state.setBackground(null);
+ break;
+ default:
+ break;
+ }
+ }
+
+ };
+}
diff --git a/app/src/main/java/android/serialport/api/sample/Fragment_BUS.java b/app/src/main/java/android/serialport/api/sample/Fragment_BUS.java
new file mode 100644
index 0000000..f6d184b
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/Fragment_BUS.java
@@ -0,0 +1,500 @@
+package android.serialport.api.sample;
+
+import java.util.Calendar;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.serialport.api.SerialPort;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.SeekBar;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.widget.Toast;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import sendData.Commands;
+import sendData.SendDatas;
+
+public class Fragment_BUS extends Fragment {
+
+ private static Context mContext;
+
+ private View mView;
+
+ public static final int INDUCTOR_LEAVE = 1;
+
+ private static TextView Seekbar_value;
+
+ private static EditText T_TextView;
+ private static EditText key_state;
+ private static EditText c_value;
+
+ private static Switch loop1Button;
+ private static Switch loop2Button;
+ private static Switch loop3Button;
+ private static Switch loop4Button;
+ private static Switch powerButton;
+ public static Switch openBackLight;
+
+ private static RadioButton radioButton1;
+ private static RadioButton radioButton2;
+ private static RadioButton radioButton3;
+ private static RadioButton radioButton4;
+ private static RadioButton radioButton5;
+ private static RadioButton radioButton6;
+
+ private static SeekBar SSeekbar;
+ private static Button Btn_state;
+ private static Button C_Btn;
+
+ int id = -1;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ mView = inflater.inflate(R.layout.console, container, false);
+
+ iniView();
+
+ iniData();
+
+ return mView;
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+
+ private void iniView() {
+
+ c_value = (EditText) mView.findViewById(R.id.c_value);
+ T_TextView = (EditText) mView.findViewById(R.id.Temperature);
+ key_state = (EditText) mView.findViewById(R.id.key_status);
+ Seekbar_value = (TextView) mView.findViewById(R.id.seekbar_value);
+
+ loop1Button = (Switch) mView.findViewById(R.id.loopId1);
+ loop1Button.setTag("0");
+ loop1Button.setOnClickListener(onClick);
+
+ loop2Button = (Switch) mView.findViewById(R.id.loopId2);
+ loop2Button.setTag("0");
+ loop2Button.setOnClickListener(onClick);
+
+ loop3Button = (Switch) mView.findViewById(R.id.loopId3);
+ loop3Button.setTag("0");
+ loop3Button.setOnClickListener(onClick);
+
+ loop4Button = (Switch) mView.findViewById(R.id.loopId4);
+ loop4Button.setTag("0");
+ loop4Button.setOnClickListener(onClick);
+
+ powerButton = (Switch) mView.findViewById(R.id.powerButton);
+ powerButton.setTag("Off");
+ powerButton.setOnClickListener(powerOnClick);
+
+ radioButton1 = (RadioButton) mView.findViewById(R.id.radioButton1);
+ radioButton2 = (RadioButton) mView.findViewById(R.id.radioButton2);
+ radioButton3 = (RadioButton) mView.findViewById(R.id.radioButton3);
+ radioButton4 = (RadioButton) mView.findViewById(R.id.radioButton4);
+ radioButton5 = (RadioButton) mView.findViewById(R.id.radioButton5);
+ radioButton6 = (RadioButton) mView.findViewById(R.id.radioButton6);
+
+ openBackLight = (Switch) mView.findViewById(R.id.openbacklight);
+ openBackLight.setTag("1");
+ openBackLight.setChecked(true);
+ openBackLight.setOnClickListener(backLightOnClick);
+
+ Btn_state = (Button) mView.findViewById(R.id.btn_state);
+ Btn_state.setTag(new Inductor());
+ Btn_state.setBackground(null);
+
+ C_Btn = (Button) mView.findViewById(R.id.c_btn);
+ C_Btn.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ // 璁剧疆琛ュ伩鍊�
+ try {
+ int _value = Integer.parseInt(c_value.getText().toString());
+ byte[] sendBytes = SendDatas.AddSendData(Commands.SET_TEMP_COMPENSATE_VALUE.getCommand(),
+ Global.SubNet_Id, Global.Device_Id,
+ new byte[] { (byte) 1, (byte) 0, (byte) (_value + 10) });
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences("Serialport",
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.putInt("c_value", _value);
+ editor.commit();
+ editor.apply();
+
+ InputMethodManager imm = (InputMethodManager) MainActivity.CuttentActivity
+ .getSystemService(MainActivity.CuttentActivity.INPUT_METHOD_SERVICE);
+ // 寰楀埌InputMethodManager鐨勫疄渚�
+ if (imm.isActive()) {
+ // 濡傛灉寮�鍚�
+ imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS);
+ // 鍏抽棴杞敭鐩橈紝寮�鍚柟娉曠浉鍚岋紝杩欎釜鏂规硶鏄垏鎹㈠紑鍚笌鍏抽棴鐘舵�佺殑
+ }
+ } catch (Exception e) {
+
+ }
+ }
+ });
+
+ SSeekbar = (SeekBar) mView.findViewById(R.id.set_sensitivity);
+ SSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ // 鍐�
+ int _value = seekBar.getProgress();
+ byte[] sendBytes = SendDatas.AddSendData(Commands.Sensor.getCommand(), Global.SubNet_Id,
+ Global.Device_Id, new byte[] { 1, (byte) _value });
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ Seekbar_value.setText(progress + "");
+ }
+ });
+ }
+
+ private int getC_value() {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences("Serialport",
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ int _value = SP.getInt("c_value", 0);
+ return _value;
+ }
+
+ private void iniData() {
+
+ mContext = getContext();
+
+ ReceiveAndSend.SendDatasList.clear();
+
+ ReadSensitivity();
+
+ c_value.setText(getC_value() + "");
+ }
+
+ private void ReadSensitivity() {
+ byte[] sendBytes = SendDatas.AddSendData(Commands.Sensor.getCommand(), Global.SubNet_Id, Global.Device_Id,
+ new byte[] { 0 });
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+ public static Handler mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ Global.BUS bus;
+ try {
+ bus = (Global.BUS) msg.obj;
+ } catch (Exception e) {
+ bus = null;
+ }
+
+ if (bus == null)
+ return;
+
+ switch (bus.index) {
+ case -1:
+ Toast.makeText(mContext, bus.str, Toast.LENGTH_LONG).show();
+ break;
+ case 1: {
+ if (bus.contact1 == 0) {
+ radioButton1.setChecked(true);
+ } else {
+ radioButton1.setChecked(false);
+ }
+
+ if (bus.contact2 == 0) {
+ radioButton2.setChecked(true);
+ } else {
+ radioButton2.setChecked(false);
+ }
+
+ if (bus.contact3 == 0) {
+ radioButton3.setChecked(true);
+ } else {
+ radioButton3.setChecked(false);
+ }
+
+ if (bus.contact4 == 0) {
+ radioButton4.setChecked(true);
+ } else {
+ radioButton4.setChecked(false);
+ }
+
+ if (bus.contact5 == 0) {
+ radioButton5.setChecked(true);
+ } else {
+ radioButton5.setChecked(false);
+ }
+
+ if (bus.contact6 == 0) {
+ radioButton6.setChecked(true);
+ } else {
+ radioButton6.setChecked(false);
+ }
+ }
+ break;
+ case 2: {
+
+ }
+ break;
+ case 3: {
+
+ }
+ break;
+ case 4: {
+
+ }
+ break;
+ case 5: {
+
+ }
+ break;
+ case 6: {
+
+ }
+ break;
+ case 7: {
+ // 娓╁害
+ if (bus.value == 0)// 鎽勬皬搴�
+ T_TextView.setText(bus.value2 + "鈩�");
+ else
+ T_TextView.setText(bus.value2 + "鈩�");
+ }
+ break;
+ case 8: {
+ // 浼犳劅鍣ㄧ伒鏁忓害
+ SSeekbar.setProgress(bus.value);
+ Seekbar_value.setText(bus.value + "");
+ }
+ break;
+ case 9: {// 浼犳劅鍣ㄦ帰娴�
+ Btn_state.setBackgroundColor(Color.RED);
+ ((Inductor) Btn_state.getTag()).LastTime = Calendar.getInstance();
+ }
+ break;
+ case 10: {// 鎸夐敭妫�娴�
+ if (bus.value == 0) {
+ key_state.setText("KEY_UP");
+ } else if (bus.value == 1) {
+ key_state.setText("KEY_DOWN");
+ } else if (bus.value == 2) {
+ key_state.setText("KEY_LONGPRESS");
+ }
+ }
+ break;
+ case 11:
+ try {
+ if (bus.value == 1) {
+ powerButton.setChecked(true);
+ powerButton.setTag("On");
+ } else {
+ powerButton.setChecked(false);
+ powerButton.setTag("Off");
+ }
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ break;
+ case 12:
+ break;
+ case 13:
+ break;
+ case 14:
+ break;
+ case 15:
+ break;
+ case 16:
+ break;
+ case 17:
+ break;
+ case 18:
+ break;
+ case 19:
+ break;
+ }
+ }
+
+ };
+
+ public static Handler MainHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+
+ switch (msg.what) {
+ case INDUCTOR_LEAVE:
+ Btn_state.setBackground(null);
+ break;
+ default:
+ break;
+ }
+ }
+
+ };
+
+ private android.view.View.OnClickListener onClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ Switch view = (Switch) v;
+ if (Global.mOutputStream == null) {
+ Toast.makeText(getActivity(), "Please Open Serial Port", android.widget.Toast.LENGTH_SHORT).show();
+ view.setChecked(false);
+ return;
+ }
+ int tag = Integer.parseInt(view.getTag().toString());
+
+ if (tag == 0) {
+ view.setTag("100");
+ view.setChecked(true);
+ } else {
+ view.setTag("0");
+ view.setChecked(false);
+ }
+ tag = Integer.parseInt(view.getTag().toString());
+ if (view.equals(loop1Button)) {
+ setData(1, tag);
+ } else if (view.equals(loop2Button)) {
+ setData(2, tag);
+ } else if (view.equals(loop3Button)) {
+ setData(3, tag);
+ } else if (view.equals(loop4Button)) {
+ setData(4, tag);
+ }
+ }
+ };
+
+ private android.view.View.OnClickListener powerOnClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View view) {
+
+ if (view.getTag().toString().equals("On")) {
+ view.setTag("Off");
+ Global.mApplication.closeSerialPort();
+ try {
+ Global.mOutputStream.close();
+ Global.mOutputStream = null;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+ powerButton.setChecked(false);
+ } else if (view.getTag().toString().equals("Off")) {
+ ReceiveAndSend.getSerialPort();
+ }
+ }
+ };
+
+ private android.view.View.OnClickListener backLightOnClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ Switch view = (Switch) v;
+ if (view.isChecked()) {
+ // sendBackLight(1);
+ if (0 < SerialPort.BackLight_ON()) {
+ Toast.makeText(getActivity(), "-1", Toast.LENGTH_SHORT).show();
+ }
+
+ } else {
+ // sendBackLight(0);
+ if (0 < SerialPort.BackLight_OFF()) {
+ Toast.makeText(getActivity(), "-1", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ };
+
+ private android.view.View.OnTouchListener onTouch = new android.view.View.OnTouchListener() {
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+
+ if (MotionEvent.ACTION_DOWN == event.getAction()) {
+ v.setBackgroundResource(R.drawable.selected);
+ if (Global.mOutputStream == null) {
+ Toast.makeText(getActivity(), "Please Open Serial Port", android.widget.Toast.LENGTH_SHORT).show();
+ } else {
+ setBuzzerData();
+ }
+
+ } else if (MotionEvent.ACTION_UP == event.getAction()) {
+ v.setBackgroundResource(R.drawable.unselected);
+ }
+ return false;
+ }
+ };
+
+ /** send buzzer */
+ private void setBuzzerData() {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.buzzer.getCommand(), Global.SubNet_Id, Global.Device_Id,
+ new byte[] { (byte) 2, (byte) 5, (byte) 1 });
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+ private void readDateTime() {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.ReadTime.getCommand(), Global.SubNet_Id, Global.Device_Id,
+ new byte[] {});
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+ private byte[] sendData(int loopId, int linght) {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.regulationControl.getCommand(), Global.SubNet_Id,
+ Global.Device_Id, new byte[] { (byte) loopId, (byte) linght });
+ return sendBytes;
+ }
+
+ private void setData(int loopId, int linght) {
+
+ byte[] sendBytes = sendData(loopId, linght);
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+
+}
diff --git a/app/src/main/java/android/serialport/api/sample/Fragment_KNX.java b/app/src/main/java/android/serialport/api/sample/Fragment_KNX.java
new file mode 100644
index 0000000..a2a8548
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/Fragment_KNX.java
@@ -0,0 +1,333 @@
+package android.serialport.api.sample;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.serialport.api.SerialPort;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+public class Fragment_KNX extends Fragment {
+
+ private static Activity CurentActivity;
+ private OutputStream mOutputStream;
+ private InputStream mInputStream;
+ private KNX_Serialport mKNX_SerialPort;
+ private SerialPort mSerialPort;
+
+ private View mView;
+ private static Button mSwitchButton_1;
+ private static Button mLight_1;
+ private static EditText mObjectEditText1_1;
+ private static EditText mObjectEditText1_2;
+
+ private static Button mSwitchButton_2;
+ private static Button mLight_2;
+ private static EditText mObjectEditText2_1;
+ private static EditText mObjectEditText2_2;
+
+ private static Button mSwitchButton_3;
+ private static Button mLight_3;
+ private static EditText mObjectEditText3_1;
+ private static EditText mObjectEditText3_2;
+
+ private static Button mSwitchButton_4;
+ private static Button mLight_4;
+ private static EditText mObjectEditText4_1;
+ private static EditText mObjectEditText4_2;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ mView = inflater.inflate(R.layout.fragment_knx, container, false);
+
+ iniView();
+
+ iniData();
+
+ return mView;
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ }
+
+ private void iniView() {
+
+ mSwitchButton_1 = (Button) mView.findViewById(R.id.switch_btn1);
+ mLight_1 = (Button) mView.findViewById(R.id.light1_1);
+ mSwitchButton_1.setOnClickListener(OnClick);
+ mLight_1.setOnClickListener(OnClickLight);
+ mLight_1.setTag((int) 0);
+ mLight_1.setBackground(getResources().getDrawable(R.drawable.light_def));
+
+ mSwitchButton_2 = (Button) mView.findViewById(R.id.switch_btn2);
+ mLight_2 = (Button) mView.findViewById(R.id.light_2);
+ mSwitchButton_2.setOnClickListener(OnClick);
+ mLight_2.setOnClickListener(OnClickLight);
+ mLight_2.setTag((int) 0);
+ mLight_2.setBackground(getResources().getDrawable(R.drawable.light_def));
+
+ mSwitchButton_3 = (Button) mView.findViewById(R.id.switch_btn3);
+ mLight_3 = (Button) mView.findViewById(R.id.light_3);
+ mSwitchButton_3.setOnClickListener(OnClick);
+ mLight_3.setOnClickListener(OnClickLight);
+ mLight_3.setTag((int) 0);
+ mLight_3.setBackground(getResources().getDrawable(R.drawable.light_def));
+
+ mSwitchButton_4 = (Button) mView.findViewById(R.id.switch_btn4);
+ mLight_4 = (Button) mView.findViewById(R.id.light_4);
+ mSwitchButton_4.setOnClickListener(OnClick);
+ mLight_4.setOnClickListener(OnClickLight);
+ mLight_4.setTag((int) 0);
+ mLight_4.setBackground(getResources().getDrawable(R.drawable.light_def));
+
+ mObjectEditText1_1 = (EditText) mView.findViewById(R.id.edit_obj1_1);
+ mObjectEditText1_2 = (EditText) mView.findViewById(R.id.edit_obj1_2);
+ mObjectEditText1_2.setTag("");
+
+ mObjectEditText2_1 = (EditText) mView.findViewById(R.id.edit_obj2_1);
+ mObjectEditText2_2 = (EditText) mView.findViewById(R.id.edit_obj2_2);
+ mObjectEditText2_2.setTag("");
+
+ mObjectEditText3_1 = (EditText) mView.findViewById(R.id.edit_obj3_1);
+ mObjectEditText3_2 = (EditText) mView.findViewById(R.id.edit_obj3_2);
+ mObjectEditText3_2.setTag("");
+
+ mObjectEditText4_1 = (EditText) mView.findViewById(R.id.edit_obj4_1);
+ mObjectEditText4_2 = (EditText) mView.findViewById(R.id.edit_obj4_2);
+ mObjectEditText4_2.setTag("");
+ }
+
+ private void iniData() {
+
+ CurentActivity = getActivity();
+
+ SetControlData(mObjectEditText1_2, mObjectEditText1_2.getText().toString());
+
+ SetControlData(mObjectEditText2_2, mObjectEditText2_2.getText().toString());
+ //
+ SetControlData(mObjectEditText3_2, mObjectEditText3_2.getText().toString());
+ //
+ SetControlData(mObjectEditText4_2, mObjectEditText4_2.getText().toString());
+
+ getSerialPort();
+
+ KNX_ReceiveAndSend.Start(mKNX_SerialPort, mOutputStream, mInputStream);
+ }
+
+ /**
+ * Open the serial port, input and output streams
+ */
+ private void getSerialPort() {
+
+ mKNX_SerialPort = new KNX_Serialport();
+
+ try {
+
+ mSerialPort = mKNX_SerialPort.getSerialPort();
+ mOutputStream = mSerialPort.getOutputStream();
+ mInputStream = mSerialPort.getInputStream();
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ }
+
+ private static void SetLightState(Button btn, int _state) {
+
+ if (_state == 0) {
+ btn.setBackground(CurentActivity.getResources().getDrawable(R.drawable.light_def));
+ btn.setTag(0);
+ } else {
+ btn.setBackground(CurentActivity.getResources().getDrawable(R.drawable.light));
+ btn.setTag(1);
+ }
+ }
+
+ private static void SetControlData(View v, String str) {
+
+ if (str.equals(""))
+ return;
+ try {
+ int obj1 = Integer.parseInt(str.split("/")[0].trim());
+ int obj2 = Integer.parseInt(str.split("/")[1].trim());
+ int obj3 = Integer.parseInt(str.split("/")[2].trim());
+ v.setTag(KNX.set_Group_addr(obj1, obj2, obj3));
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ }
+
+ public static Handler mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+
+ String str = Integer.toString(msg.arg1);
+ if (str.equals(mObjectEditText1_2.getTag().toString())) {
+ SetLightState(mLight_1, msg.arg2);
+
+ } else if (str.equals(mObjectEditText2_2.getTag().toString())) {
+ SetLightState(mLight_2, msg.arg2);
+
+ } else if (str.equals(mObjectEditText3_2.getTag().toString())) {
+ SetLightState(mLight_3, msg.arg2);
+
+ } else if (str.equals(mObjectEditText4_2.getTag().toString())) {
+ SetLightState(mLight_4, msg.arg2);
+
+ }
+ }
+
+ };
+
+ private android.view.View.OnClickListener OnClickLight = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ if (mObjectEditText1_1.getText().toString() == "" || mObjectEditText2_1.getText().toString() == ""
+ || mObjectEditText3_1.getText().toString() == "" || mObjectEditText4_1.getText().toString() == ""
+ || mObjectEditText2_2.getText().toString() == "" || mObjectEditText2_2.getText().toString() == ""
+ || mObjectEditText3_2.getText().toString() == "" || mObjectEditText4_2.getText().toString() == "") {
+ Toast.makeText(CurentActivity, "Group_addr can not be empty", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (v.equals(mLight_1)) {
+
+ try {
+ String str = mObjectEditText1_1.getText().toString();
+ int obj1 = Integer.parseInt(str.split("/")[0].trim());
+ int obj2 = Integer.parseInt(str.split("/")[1].trim());
+ int obj3 = Integer.parseInt(str.split("/")[2].trim());
+ int state = Integer.parseInt(mLight_1.getTag().toString());
+ state = state == 0 ? 1 : 0;
+ byte[] sendBytes = KNX.get_SendBuffer(12345, obj1, obj2, obj3, state);
+ String[] tmp = new String[sendBytes.length];
+ for (int i = 0; i < sendBytes.length; i++) {
+ tmp[i] = Integer.toHexString(sendBytes[i] & 0xFF);
+ }
+
+ mOutputStream.write(sendBytes, 0, sendBytes[1] & 0xFF);
+ // 鏍规嵁闀垮害鎴彇鏁版嵁鍙戦��
+ mOutputStream.flush();
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ } else if (v.equals(mLight_2)) {
+ try {
+ String str = mObjectEditText2_1.getText().toString();
+ int obj1 = Integer.parseInt(str.split("/")[0].trim());
+ int obj2 = Integer.parseInt(str.split("/")[1].trim());
+ int obj3 = Integer.parseInt(str.split("/")[2].trim());
+ int state = Integer.parseInt(mLight_2.getTag().toString());
+ state = state == 0 ? 1 : 0;
+ byte[] sendBytes = KNX.get_SendBuffer(12345, obj1, obj2, obj3, state);
+ String[] tmp = new String[sendBytes.length];
+ for (int i = 0; i < sendBytes.length; i++) {
+ tmp[i] = Integer.toHexString(sendBytes[i] & 0xFF);
+ }
+
+ mOutputStream.write(sendBytes, 0, sendBytes[1] & 0xFF);
+ // 鏍规嵁闀垮害鎴彇鏁版嵁鍙戦��
+ mOutputStream.flush();
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ } else if (v.equals(mLight_3)) {
+ try {
+ String str = mObjectEditText3_1.getText().toString();
+ int obj1 = Integer.parseInt(str.split("/")[0].trim());
+ int obj2 = Integer.parseInt(str.split("/")[1].trim());
+ int obj3 = Integer.parseInt(str.split("/")[2].trim());
+ int state = Integer.parseInt(mLight_3.getTag().toString());
+ state = state == 0 ? 1 : 0;
+ byte[] sendBytes = KNX.get_SendBuffer(12345, obj1, obj2, obj3, state);
+ String[] tmp = new String[sendBytes.length];
+ for (int i = 0; i < sendBytes.length; i++) {
+ tmp[i] = Integer.toHexString(sendBytes[i] & 0xFF);
+ }
+
+ mOutputStream.write(sendBytes, 0, sendBytes[1] & 0xFF);
+ // 鏍规嵁闀垮害鎴彇鏁版嵁鍙戦��
+ mOutputStream.flush();
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ } else if (v.equals(mLight_4)) {
+ try {
+ String str = mObjectEditText4_1.getText().toString();
+ int obj1 = Integer.parseInt(str.split("/")[0].trim());
+ int obj2 = Integer.parseInt(str.split("/")[1].trim());
+ int obj3 = Integer.parseInt(str.split("/")[2].trim());
+ int state = Integer.parseInt(mLight_4.getTag().toString());
+ state = state == 0 ? 1 : 0;
+ byte[] sendBytes = KNX.get_SendBuffer(12345, obj1, obj2, obj3, state);
+ String[] tmp = new String[sendBytes.length];
+ for (int i = 0; i < sendBytes.length; i++) {
+ tmp[i] = Integer.toHexString(sendBytes[i] & 0xFF);
+ }
+
+ mOutputStream.write(sendBytes, 0, sendBytes[1] & 0xFF);
+ // 鏍规嵁闀垮害鎴彇鏁版嵁鍙戦��
+ mOutputStream.flush();
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ }
+ }
+ };
+
+ private android.view.View.OnClickListener OnClick = new android.view.View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ if (v.equals(mSwitchButton_1)) {
+
+ SetControlData(mObjectEditText1_2, mObjectEditText1_2.getText().toString());
+ } else if (v.equals(mSwitchButton_2)) {
+ //
+ SetControlData(mObjectEditText2_2, mObjectEditText2_2.getText().toString());
+ } else if (v.equals(mSwitchButton_3)) {
+ //
+ SetControlData(mObjectEditText3_2, mObjectEditText3_2.getText().toString());
+ } else if (v.equals(mSwitchButton_4)) {
+ //
+ SetControlData(mObjectEditText4_2, mObjectEditText4_2.getText().toString());
+ }
+ }
+ };
+}
diff --git a/app/src/main/java/android/serialport/api/sample/Fragment_Update.java b/app/src/main/java/android/serialport/api/sample/Fragment_Update.java
new file mode 100644
index 0000000..f114db5
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/Fragment_Update.java
@@ -0,0 +1,521 @@
+package android.serialport.api.sample;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
+import android.support.v4.app.Fragment;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+import sendData.Commands;
+import sendData.SendDatas;
+
+public class Fragment_Update extends Fragment implements OnClickListener {
+
+ public static Fragment_Update mFragment_Update;
+ private byte[] mBuffer;
+ private UpgradeThread mThread;
+ private static boolean mFlag = false;
+
+ private View mView;
+ private Button Btn_Path;
+ private Button Btn_Upgrade;
+ private EditText EditText_Path;
+
+ private AlertDialog ProDialog;
+ private ProgressBar Pro;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ mView = inflater.inflate(R.layout.fragment_upgrade, container, false);
+
+ iniView();
+
+ iniData();
+
+ return mView;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ String mPath = "";
+
+ if (resultCode == Activity.RESULT_OK) {
+
+ Uri uri = data.getData();
+
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
+ // 澶т簬 android 4.4
+ mPath = getPath(getActivity(), uri);
+ } else {
+ // 灏忎簬 android 4.4
+ mPath = getRealPathFromURI(uri);
+ }
+ }
+
+ EditText_Path.setText(mPath + "");
+ }
+
+ private String getRealPathFromURI(Uri contentUri) {
+
+ String res = null;
+ String[] proj = { MediaStore.Images.Media.DATA };
+ Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
+ if (null != cursor && cursor.moveToFirst()) {
+ ;
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ res = cursor.getString(column_index);
+ cursor.close();
+ }
+ return res;
+ }
+
+ /**
+ * 涓撲负Android4.4璁捐鐨勪粠Uri鑾峰彇鏂囦欢缁濆璺緞锛屼互鍓嶇殑鏂规硶宸蹭笉濂戒娇
+ */
+ @SuppressLint("NewApi")
+ private String getPath(final Context context, final Uri uri) {
+
+ final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+
+ // DocumentProvider
+ if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
+ // ExternalStorageProvider
+ if (isExternalStorageDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ if ("primary".equalsIgnoreCase(type)) {
+ return Environment.getExternalStorageDirectory() + "/" + split[1];
+ }
+ }
+ // DownloadsProvider
+ else if (isDownloadsDocument(uri)) {
+
+ final String id = DocumentsContract.getDocumentId(uri);
+ final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
+ Long.valueOf(id));
+
+ return getDataColumn(context, contentUri, null, null);
+ }
+ // MediaProvider
+ else if (isMediaDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ Uri contentUri = null;
+ if ("image".equals(type)) {
+ contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+ } else if ("video".equals(type)) {
+ contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
+ } else if ("audio".equals(type)) {
+ contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+ }
+
+ final String selection = "_id=?";
+ final String[] selectionArgs = new String[] { split[1] };
+
+ return getDataColumn(context, contentUri, selection, selectionArgs);
+ }
+ }
+ // MediaStore (and general)
+ else if ("content".equalsIgnoreCase(uri.getScheme())) {
+ return getDataColumn(context, uri, null, null);
+ }
+ // File
+ else if ("file".equalsIgnoreCase(uri.getScheme())) {
+ return uri.getPath();
+ }
+ return null;
+ }
+
+ /**
+ * Get the value of the data column for this Uri. This is useful for
+ * MediaStore Uris, and other file-based ContentProviders.
+ *
+ * @param context
+ * The context.
+ * @param uri
+ * The Uri to query.
+ * @param selection
+ * (Optional) Filter used in the query.
+ * @param selectionArgs
+ * (Optional) Selection arguments used in the query.
+ * @return The value of the _data column, which is typically a file path.
+ */
+ private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
+
+ Cursor cursor = null;
+ final String column = "_data";
+ final String[] projection = { column };
+
+ try {
+ cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ final int column_index = cursor.getColumnIndexOrThrow(column);
+ return cursor.getString(column_index);
+ }
+ } finally {
+ if (cursor != null)
+ cursor.close();
+ }
+ return null;
+ }
+
+ /**
+ * @param uri
+ * The Uri to check.
+ * @return Whether the Uri authority is ExternalStorageProvider.
+ */
+ private boolean isExternalStorageDocument(Uri uri) {
+ return "com.android.externalstorage.documents".equals(uri.getAuthority());
+ }
+
+ /**
+ * @param uri
+ * The Uri to check.
+ * @return Whether the Uri authority is DownloadsProvider.
+ */
+ private boolean isDownloadsDocument(Uri uri) {
+ return "com.android.providers.downloads.documents".equals(uri.getAuthority());
+ }
+
+ /**
+ * @param uri
+ * The Uri to check.
+ * @return Whether the Uri authority is MediaProvider.
+ */
+ private boolean isMediaDocument(Uri uri) {
+ return "com.android.providers.media.documents".equals(uri.getAuthority());
+ }
+
+ private void iniView() {
+ //
+ Btn_Path = (Button) mView.findViewById(R.id.Btn_path);
+ Btn_Path.setOnClickListener(this);
+ Btn_Upgrade = (Button) mView.findViewById(R.id.Btn_Upgrade);
+ Btn_Upgrade.setOnClickListener(this);
+ EditText_Path = (EditText) mView.findViewById(R.id.EditText_Path);
+
+ ProDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_Transparent).create();
+
+ LayoutInflater inflater = LayoutInflater.from(getActivity());
+ final View tmpickerview = inflater.inflate(R.layout.dialog_pro, null);
+ ProDialog.setView(tmpickerview);
+ Pro = (ProgressBar) tmpickerview.findViewById(R.id.pro);
+ }
+
+ private void iniData() {
+ mFlag = false;
+ mFragment_Update = this;
+ }
+
+ private void showPro() {
+
+ Pro.setProgress(0);
+ ProDialog.show();
+ ProDialog.setTitle("upgrading, please do not operate it.");
+ WindowManager.LayoutParams lp = ProDialog.getWindow().getAttributes();
+ lp.width = 700;
+ lp.height = 80;
+ ProDialog.getWindow().setAttributes(lp);
+ }
+
+ private void hidePro() {
+ ProDialog.dismiss();
+ }
+
+ private void NoticeDialog(String str) {
+ //
+ new AlertDialog.Builder(getActivity(), R.style.Theme_Transparent_NoTitle).setMessage(str)
+ .setPositiveButton("OK", new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ }).create().show();
+ }
+
+ private byte[] getBytes(int index) {
+
+ // try {
+
+ int count = mBuffer.length / 64;
+ int b = mBuffer.length % 64;
+ if (b != 0) {
+ count = count + 1;
+ }
+
+ //
+ // int count = (mBuffer.length / 64) + (mBuffer.length % 64 == 0 ? 0
+ // : 1);
+
+ byte[] _bytes;
+
+ if (index > count) {
+ // 褰搃ndex澶т簬count鐨勬椂鍊欙紝浠h〃鍗囩骇鎴愬姛
+ mFragment_Update.mUpdataHandler.sendEmptyMessage(2);
+ return null;
+ }
+
+ if (index == count) {
+ // 鏈�鍚庝竴鏉�
+ _bytes = new byte[(mBuffer.length - (index - 1) * 64) + 2];
+
+ } else {
+
+ _bytes = new byte[64 + 2];
+ }
+
+ _bytes[0] = (byte) (index / 256);
+ _bytes[1] = (byte) (index % 256);
+
+ System.arraycopy(mBuffer, (index - 1) * 64, _bytes, 2, _bytes.length - 2);
+
+ Message msg = new Message();
+ msg.arg1 = (index * 100) / count;
+ msg.what = 0;
+ mFragment_Update.mUpdataHandler.sendMessage(msg);
+
+ return _bytes;
+
+ // } catch (Exception e) {
+ // mFragment_Update.mUpdataHandler.sendEmptyMessage(1);
+ // Log.e("asdf", e.getMessage().toString());
+ // return null;
+ // }
+ }
+
+ private void SendUpgradeData(final int index) {
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+
+ try {
+
+ byte[] _bytes = getBytes(index);
+
+ if (_bytes == null) {
+ //
+ return;
+ }
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.DataRequest_ACK.getCommand(), Global.SubNet_Id,
+ Global.Device_Id, _bytes);
+
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+
+ Log.i("asd", "鍙戦�佺" + index + "鏉℃暟鎹寘" + _bytes.length);
+
+ } catch (Exception e) {
+ mFragment_Update.mUpdataHandler.sendEmptyMessage(1);
+ e.getMessage();
+ }
+ }
+ }).start();
+ }
+
+ private void SendUpgradeDataLength() {
+
+ try {
+
+ int count = (mBuffer.length / 64) + (mBuffer.length % 64 == 0 ? 0 : 1);
+
+ byte[] _byte = new byte[4];
+ _byte[0] = 0;
+ _byte[1] = 0;
+ _byte[2] = (byte) (count / 256);
+ _byte[3] = (byte) (count % 256);
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.DataRequest_ACK.getCommand(), Global.SubNet_Id,
+ Global.Device_Id, _byte);
+ Global.mOutputStream.flush();
+ Global.mOutputStream.write(sendBytes);
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ if (v.equals(Btn_Path)) {
+ // 鏌ユ壘鏂囦欢璺緞
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("*/*");
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ startActivityForResult(intent, 1);
+
+ } else if (v.equals(Btn_Upgrade)) {
+ // 鍗囩骇
+ if (EditText_Path.getText().toString().equals("")) {
+ NoticeDialog("The path cannot be empty.");
+ return;
+ }
+ File file = new File(EditText_Path.getText().toString());
+ String name = file.getName();
+ String prefix = name.substring(name.lastIndexOf(".") + 1).toUpperCase();
+
+ if (!prefix.equals("BIN")) {
+ new AlertDialog.Builder(getActivity()).setMessage("File type error !").create().show();
+ return;
+ }
+
+ // 璇诲彇鏂囦欢
+ try {
+
+ FileInputStream fis = new FileInputStream(file);
+ int length = fis.available();
+ mBuffer = new byte[length];
+ fis.read(mBuffer);
+
+ if (mBuffer.length > 256 * 1024) {
+ new AlertDialog.Builder(getActivity()).setMessage("File Error !").create().show();
+ return;
+ }
+
+ mFlag = true;
+ mThread = new UpgradeThread();
+ mThread.start();
+
+ showPro();
+
+ } catch (IOException e) {
+ mFlag = false;
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public Handler mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ if (mBuffer == null)
+ return;
+
+ if (msg.what == 0) {
+ // 鎺ユ敹鍒扮殑鏄娉紝鍥炲鏁版嵁鍖呴暱搴�
+ Log.i("asd", "鎺ユ敹鍒扮殑鏄娉紝鍥炲鏁版嵁鍖呴暱搴�");
+ SendUpgradeDataLength();
+ } else {
+ // 鍙戦�佸搴旂殑鏁版嵁
+ Log.i("asd", "鍙戦�佸搴旂殑鏁版嵁");
+ SendUpgradeData(msg.what);
+ }
+ }
+ };
+
+ private Handler mUpdataHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ switch (msg.what) {
+ case 0:
+ Pro.setProgress(msg.arg1);
+ break;
+ case 1:
+ hidePro();
+ NoticeDialog("Upgrade Failed !");
+ break;
+ case 2:
+ hidePro();
+ NoticeDialog("Upgrade Succeed !");
+ break;
+ default:
+ break;
+ }
+ }
+
+ };
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+
+ private class UpgradeThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ int i = 0;
+
+ while (mFlag) {
+
+ try {
+ if (i > 20) {
+ // 鍙戦��20娆℃病鏈夋垚鍔熷氨鐩存帴閫�鍑轰簡
+ mFlag = false;
+ Log.i("asdf", "鍙戦�亀an浜嗚鍙栧娉ㄥ懡浠�");
+ return;
+ }
+
+ i++;
+ byte[] sendBytes = SendDatas.AddSendData(Commands.readRemark.getCommand(), Global.SubNet_Id,
+ Global.Device_Id, new byte[] {});
+ Global.mOutputStream.flush();
+ Global.mOutputStream.write(sendBytes);
+
+ Log.i("asdf", "鍙戦�佷簡璇诲彇澶囨敞鍛戒护");
+ sleep(30);
+
+ } catch (Exception e) {
+ e.getMessage();
+ continue;
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/Global.java b/app/src/main/java/android/serialport/api/sample/Global.java
new file mode 100644
index 0000000..e98f6d9
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/Global.java
@@ -0,0 +1,35 @@
+package android.serialport.api.sample;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.serialport.api.SerialPort;
+
+public class Global {
+
+ public static class BUS {
+
+ public int index;
+ public int value;
+ public int value2;
+ public String str;
+ public byte[] bytes;
+ public long length;
+
+ public int contact1;
+ public int contact2;
+ public int contact3;
+ public int contact4;
+ public int contact5;
+ public int contact6;
+ }
+
+ public static int SubNet_Id;
+ public static int Device_Id;
+ public static Application mApplication;
+ public static SerialPort mSerialPort;
+ public static OutputStream mOutputStream;
+ public static InputStream mInputStream;
+}
diff --git a/app/src/main/java/android/serialport/api/sample/Inductor.java b/app/src/main/java/android/serialport/api/sample/Inductor.java
new file mode 100644
index 0000000..1df7a17
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/Inductor.java
@@ -0,0 +1,42 @@
+package android.serialport.api.sample;
+
+import java.util.Calendar;
+
+import android.os.Handler;
+import android.os.Message;
+
+public class Inductor {
+
+ public Calendar LastTime = null;
+
+ public Inductor() {
+ new thread().start();
+ }
+
+ class thread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (true) {
+ try {
+ Thread.sleep(50);
+
+ if (LastTime == null)
+ continue;
+
+ if (Calendar.getInstance().getTimeInMillis() - LastTime.getTimeInMillis() > 10 * 1000) {
+ // 鍙戦�乭andler閫氱煡
+ Message msg = new Message();
+ msg.what = ConsoleActivity.INDUCTOR_LEAVE;
+ Fragment_BUS.MainHandler.handleMessage(msg);
+ LastTime = null;
+ }
+ } catch (Exception e) {
+ //
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/KNX.java b/app/src/main/java/android/serialport/api/sample/KNX.java
new file mode 100644
index 0000000..5fa958e
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/KNX.java
@@ -0,0 +1,25 @@
+package android.serialport.api.sample;
+
+public class KNX {
+
+ static {
+ System.loadLibrary("serial_port");
+ }
+
+ /**
+ *
+ * */
+ public static native byte[] get_SendBuffer(int _individual_addr, int obj1, int obj2n, int obj3, int on_off);
+
+ public static native boolean UART_Receive(byte[] bytes);
+
+ public static native boolean Parity_Data(byte[] buffer);
+
+ public static native int get_Individual_addr();
+
+ public static native int get_Group_addr();
+
+ public static native int set_Group_addr(int obj1,int boj2,int obj3);
+
+ public static native int get_State();
+}
diff --git a/app/src/main/java/android/serialport/api/sample/KNX_ReceiveAndSend.java b/app/src/main/java/android/serialport/api/sample/KNX_ReceiveAndSend.java
new file mode 100644
index 0000000..be3aa9d
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/KNX_ReceiveAndSend.java
@@ -0,0 +1,124 @@
+package android.serialport.api.sample;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.os.Message;
+
+public class KNX_ReceiveAndSend {
+
+ public static List<byte[]> SendDatasList = new ArrayList<byte[]>();
+ private static KNX_Serialport mKNX_SerialPort;
+ private static OutputStream mOutputStream;
+ private static InputStream mInputStream;
+
+ public static void Start(KNX_Serialport _KNX_SerialPort, OutputStream _OutputStream, InputStream _InputStream) {
+
+ mInputStream = _InputStream;
+ mKNX_SerialPort = _KNX_SerialPort;
+ mOutputStream = _OutputStream;
+
+ // 鍙戦�佹暟鎹嚎绋�
+ // new SendThread().start();
+
+ new ReceiveThread().start();
+ }
+
+ private static class SendThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (true) {
+
+ try {
+
+ Thread.sleep(100);
+
+ for (int i = 0; i < SendDatasList.size(); i++) {
+
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+
+ }
+ try {
+ byte[] sendBytes = SendDatasList.get(i);
+ try {
+
+ mOutputStream.flush();
+ mOutputStream.write(sendBytes);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ SendDatasList.remove(i);
+ i--;
+ } catch (Exception ex) {
+ ex.getMessage();
+ }
+ }
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ }
+ }
+ }
+
+ private static class ReceiveThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (!isInterrupted()) {
+
+ int size = 0;
+
+ try {
+
+ byte[] buffer = new byte[64];
+
+ if (mInputStream == null) {
+ return;
+ }
+
+ size = mInputStream.read(buffer);
+
+ for (int i = 0; i < size - 1; i++) {
+
+ if ((buffer[i] & 0xFF) == 0xAA) {
+
+ byte bytes[] = new byte[(int) buffer[i + 1]];
+
+ System.arraycopy(buffer, i, bytes, 0, bytes.length);
+
+ // String str = "";
+ // for (int j = 0; j < bytes.length; j++) {
+ // str += Integer.toHexString(bytes[j] & 0xFF)+".";
+ // }
+
+ if (KNX.UART_Receive(bytes)) {
+
+ // 鐗╃悊鍦板潃涓嶅鐞�
+ // int individual_addr =
+ // KNX.get_Individual_addr();
+ Message msg = new Message();
+ msg.arg1 = KNX.get_Group_addr();
+ msg.arg2 = KNX.get_State();
+
+ Fragment_KNX.mHandler.sendMessage(msg);
+ }
+ }
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/KNX_Serialport.java b/app/src/main/java/android/serialport/api/sample/KNX_Serialport.java
new file mode 100644
index 0000000..98367ab
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/KNX_Serialport.java
@@ -0,0 +1,30 @@
+package android.serialport.api.sample;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.InvalidParameterException;
+
+import android.serialport.api.SerialPort;
+import android.serialport.api.SerialPortFinder;
+
+public class KNX_Serialport {
+
+ public SerialPortFinder mSerialPortFinder = new SerialPortFinder();
+ private SerialPort mSerialPort = null;
+
+ public SerialPort getSerialPort() throws SecurityException, IOException, InvalidParameterException {
+
+ if (mSerialPort == null) {
+
+ mSerialPort = new SerialPort(new File("/dev/ttyS2"), 19200, 0);
+ }
+ return mSerialPort;
+ }
+
+ public void closeSerialPort() {
+ if (mSerialPort != null) {
+ mSerialPort.close();
+ mSerialPort = null;
+ }
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/MainActivity.java b/app/src/main/java/android/serialport/api/sample/MainActivity.java
new file mode 100644
index 0000000..885d82c
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/MainActivity.java
@@ -0,0 +1,244 @@
+package android.serialport.api.sample;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.animation.ObjectAnimator;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.serialport.api.SerialPort;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.ViewPager;
+import android.support.v4.view.ViewPager.OnPageChangeListener;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.HorizontalScrollView;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+public class MainActivity extends FragmentActivity implements OnClickListener, OnPageChangeListener {
+
+ public static MainActivity CuttentActivity;
+ public Fragment_BUS mFragment_BUS;
+ public Fragment_KNX mFragment_KNX;
+ public Fragment_Update mFragment_Update;
+ private ViewPager mViewPager;
+ private TextView TabTextView_BUS, TabTextView_KNX, TabTextView_Upgrade;
+ private ImageView Tab_Line;
+ private List<Fragment> mFragmentList;
+ private int moveOne = 0;
+ private boolean isScrolling = false;// 鎵嬫寚鏄惁鍦ㄧЩ鍔�
+ /** 鎵嬫寚绂诲紑鍚庣殑鍥炲脊 */
+ private boolean isBackScrolling = false;// 鎵嬫寚绂诲紑鍚庣殑鍥炲脊
+ private long startTime = 0;
+ private long currentTime = 0;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ CuttentActivity = this;
+
+ setContentView(R.layout.activity_main);
+
+ iniView();
+ iniData();
+ SetImageLineWidth();
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+
+ Intent intent = new Intent(this, MyService.class);
+ startService(intent);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+
+ Intent intent = new Intent(this, MyService.class);
+ stopService(intent);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ android.os.Process.killProcess(android.os.Process.myPid());
+ }
+
+ private void iniView() {
+
+ mFragmentList = new ArrayList<Fragment>();
+
+ mFragment_BUS = new Fragment_BUS();
+ mFragment_KNX = new Fragment_KNX();
+ mFragment_Update = new Fragment_Update();
+
+ mFragmentList.add(mFragment_BUS);
+ mFragmentList.add(mFragment_KNX);
+ mFragmentList.add(mFragment_Update);
+
+ TabTextView_BUS = (TextView) findViewById(R.id.textView_bus);
+ TabTextView_BUS.setTextColor(Color.RED);
+ TabTextView_KNX = (TextView) findViewById(R.id.textView_knx);
+ TabTextView_Upgrade = (TextView) findViewById(R.id.textView_upgrade);
+ TabTextView_BUS.setOnClickListener(this);
+ TabTextView_KNX.setOnClickListener(this);
+ TabTextView_Upgrade.setOnClickListener(this);
+
+ mViewPager = (ViewPager) findViewById(R.id.mViewPager);
+ mViewPager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), mFragmentList));
+
+ mViewPager.setCurrentItem(0);
+ mViewPager.addOnPageChangeListener(this);
+ Tab_Line = (ImageView) findViewById(R.id.tab_image);
+ }
+
+ private void iniData() {
+
+ CuttentActivity = this;
+ SerialPort.BackLight_ON();
+ }
+
+ // 涓嬪垝绾胯窡闅忔墜鎸囩殑婊戝姩鑰屾粦鍔�
+ private void movePositionX(int toPosition, float positionOffsetPixels) {
+
+ float curTranslationX = Tab_Line.getTranslationX();
+ float toPositionX = moveOne * toPosition + positionOffsetPixels;
+ ObjectAnimator animator = ObjectAnimator.ofFloat(Tab_Line, "TranslationX", curTranslationX, toPositionX);
+ animator.setDuration(1000);
+ animator.start();
+ }
+
+ // 涓嬪垝绾挎粦鍔ㄥ埌鏂扮殑閫夐」涓�
+ private void movePositionX(int toPosition) {
+ movePositionX(toPosition, 0);
+ }
+
+ /** 璁剧疆绾挎潯鐨勫搴� */
+ private void SetImageLineWidth() {
+
+ DisplayMetrics dm = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(dm);
+ int screew = dm.widthPixels;// 鑾峰彇灞忓箷鐨勫
+
+ // 閲嶆柊璁剧疆鍒掔嚎瀹�
+ LayoutParams lp = Tab_Line.getLayoutParams();
+ lp.width = screew / 3;
+ Tab_Line.setLayoutParams(lp);
+
+ moveOne = lp.width;// 璁板綍璺濈
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+ currentTime = System.currentTimeMillis();
+
+ if (isScrolling && (currentTime - startTime > 200)) {
+ movePositionX(position, moveOne * positionOffset);
+ startTime = currentTime;
+ }
+
+ if (isBackScrolling) {
+ movePositionX(position);
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+
+ switch (position) {
+ case 0:
+ TabTextView_BUS.setTextColor(Color.RED);
+ TabTextView_KNX.setTextColor(Color.BLACK);
+ TabTextView_Upgrade.setTextColor(Color.BLACK);
+ break;
+ case 1:
+ TabTextView_BUS.setTextColor(Color.BLACK);
+ TabTextView_KNX.setTextColor(Color.RED);
+ TabTextView_Upgrade.setTextColor(Color.BLACK);
+ break;
+ case 2:
+ TabTextView_BUS.setTextColor(Color.BLACK);
+ TabTextView_KNX.setTextColor(Color.BLACK);
+ TabTextView_Upgrade.setTextColor(Color.RED);
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+
+ switch (state) {
+ case 1:// 鎵嬫寚鎷栧姩
+ isScrolling = true;
+ isBackScrolling = false;
+ break;
+ case 2:// 鎵嬫寚寮硅捣
+ isScrolling = false;
+ isBackScrolling = true;
+ break;
+ default:// 0 鍔ㄤ綔瀹屾垚
+ isScrolling = false;
+ isBackScrolling = false;
+ break;
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ if (v.equals(TabTextView_BUS)) {
+ //
+ mViewPager.setCurrentItem(0);
+ // ReadViewLocation(v);
+
+ } else if (v.equals(TabTextView_KNX)) {
+ //
+ mViewPager.setCurrentItem(1);
+ // ReadViewLocation(v);
+
+ } else if (v.equals(TabTextView_Upgrade)) {
+ //
+ mViewPager.setCurrentItem(2);
+ // ReadViewLocation(v);
+
+ } else {
+ //
+ }
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+
+ try {
+ if (Fragment_BUS.openBackLight != null) {
+ if (!Fragment_BUS.openBackLight.isChecked()) {
+ SerialPort.BackLight_ON();
+ Fragment_BUS.openBackLight.setChecked(true);
+ }
+ }
+ } catch (Exception e) {
+ //
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+
+}
diff --git a/app/src/main/java/android/serialport/api/sample/MyFragmentAdapter.java b/app/src/main/java/android/serialport/api/sample/MyFragmentAdapter.java
new file mode 100644
index 0000000..6995df4
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/MyFragmentAdapter.java
@@ -0,0 +1,28 @@
+package android.serialport.api.sample;
+
+import java.util.List;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+
+public class MyFragmentAdapter extends FragmentPagerAdapter {
+
+ private List<Fragment> fragmentList;
+
+ public MyFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList) {
+ super(fm);
+ this.fragmentList = fragmentList;
+ }
+
+ @Override
+ public Fragment getItem(int arg) {
+ return fragmentList.get(arg);
+ }
+
+ @Override
+ public int getCount() {
+ return fragmentList.size();
+ }
+
+}
diff --git a/app/src/main/java/android/serialport/api/sample/MyService.java b/app/src/main/java/android/serialport/api/sample/MyService.java
new file mode 100644
index 0000000..6eb9840
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/MyService.java
@@ -0,0 +1,40 @@
+package android.serialport.api.sample;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class MyService extends Service {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ new Thread() {
+
+ @Override
+ public void run() {
+ ReceiveAndSend.Start();
+ super.run();
+ }
+
+ }.start();
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ return super.onStartCommand(intent, flags, startId);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/app/src/main/java/android/serialport/api/sample/NavigationDrawerFragment.java b/app/src/main/java/android/serialport/api/sample/NavigationDrawerFragment.java
new file mode 100644
index 0000000..eedad94
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/NavigationDrawerFragment.java
@@ -0,0 +1,174 @@
+package android.serialport.api.sample;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+import sendData.Commands;
+import sendData.SendDatas;
+
+public class NavigationDrawerFragment extends Fragment implements OnClickListener {
+
+ public static NavigationDrawerFragment mNavigationDrawerFragment;
+ private View mView;
+ private static Button SaveBtn;
+ private static EditText mSubNetEditText;
+ private static EditText mDeviceEditText;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ Log.i("asf", " onCreateView()");
+
+ mView = (View) inflater.inflate(R.layout.fragment_navigation, container, false);
+
+ iniView();
+
+ iniData();
+
+ return mView;
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ Log.i("asf", " onDestroy()");
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ Log.i("asf", " onStart()");
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+
+ Log.i("asf", " onStop()");
+ }
+
+ private void iniView() {
+
+ mSubNetEditText = (EditText) mView.findViewById(R.id.editText_SubNet);
+ mDeviceEditText = (EditText) mView.findViewById(R.id.editText_Device);
+ SaveBtn = (Button) mView.findViewById(R.id.save_btn);
+ SaveBtn.setOnClickListener(this);
+ }
+
+ private void iniData() {
+
+ mNavigationDrawerFragment = this;
+ mSubNetEditText.setText(ReadSubNetID() + "");
+ mDeviceEditText.setText(ReadDeviceID() + "");
+ Global.SubNet_Id = ReadSubNetID();
+ Global.Device_Id = ReadDeviceID();
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(1500);
+ } catch (Exception e) {
+
+ }
+ ReadLocation();// 璇诲彇瀛愮綉鍙� 璁惧鍙�
+ }
+ }).start();
+
+ }
+
+ private void ReadLocation() {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.ReadID.getCommand(), 255, 255, new byte[] {});
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+ private void WriteLocation(int subnet_id, int device_id) {
+
+ byte[] sendBytes = SendDatas.AddSendData(Commands.WriteID.getCommand(), (byte) Global.SubNet_Id,
+ (byte) Global.Device_Id, new byte[] { (byte) subnet_id, (byte) device_id });
+ ReceiveAndSend.SendDatasList.add(sendBytes);
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ if (v.equals(SaveBtn)) {
+ // 璁剧疆瀛愮綉鍙疯澶囧彿
+
+ WriteLocation(Integer.parseInt(mSubNetEditText.getText().toString()),
+ Integer.parseInt(mDeviceEditText.getText().toString()));
+ }
+ }
+
+ private void SaveID(int subNet_id, int device_id) {
+ //
+ SPDataSet.SaveSPData("DevicesID", "SubNetID", subNet_id);
+ SPDataSet.SaveSPData("DevicesID", "DeviceID", device_id);
+ }
+
+ private int ReadSubNetID() {
+ return SPDataSet.ReadSPData_Int("DevicesID", "SubNetID");
+ }
+
+ private int ReadDeviceID() {
+ return SPDataSet.ReadSPData_Int("DevicesID", "DeviceID");
+ }
+
+ public Handler mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ switch (msg.what) {
+ case 0:
+ Toast.makeText(getActivity(), "failed!", Toast.LENGTH_SHORT).show();
+ break;
+ case 1:
+ Toast.makeText(getActivity(), "succeed!", Toast.LENGTH_SHORT).show();
+ ReadLocation();
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ public Handler mHandler_Data = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+
+ Global.BUS data = (Global.BUS) msg.obj;
+
+ if (data == null)
+ return;
+
+ Global.SubNet_Id = data.value;
+ Global.Device_Id = data.value2;
+
+ mSubNetEditText.setText(data.value + "");
+ mDeviceEditText.setText(data.value2 + "");
+
+ SaveID(data.value, data.value2);
+ }
+ };
+
+}
diff --git a/app/src/main/java/android/serialport/api/sample/ReceiveAndSend.java b/app/src/main/java/android/serialport/api/sample/ReceiveAndSend.java
new file mode 100644
index 0000000..d3823a3
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/ReceiveAndSend.java
@@ -0,0 +1,400 @@
+package android.serialport.api.sample;
+
+import java.util.List;
+import java.io.IOException;
+import java.util.ArrayList;
+import android.os.Message;
+import android.widget.Toast;
+import sendData.Commands;
+import sendData.SendDatas;
+
+import java.security.InvalidParameterException;
+
+public class ReceiveAndSend {
+
+ public static List<byte[]> SendDatasList = new ArrayList<byte[]>();
+
+ public static void Start() {
+
+ getSerialPort();
+
+ new SendThread().start();
+
+ new SendDatasThread().start();
+
+ new ReadThread().start();
+ }
+
+ /**
+ * Open the serial port, input and output streams
+ */
+ public static void getSerialPort() {
+
+ Global.mApplication = new Application();
+
+ try {
+
+ Global.mSerialPort = Global.mApplication.getSerialPort();
+ Global.mOutputStream = Global.mSerialPort.getOutputStream();
+ Global.mInputStream = Global.mSerialPort.getInputStream();
+ if (MainActivity.CuttentActivity.mFragment_BUS != null) {
+ Global.BUS bus = new Global.BUS();
+ Message msg = new Message();
+ msg.obj = bus;
+
+ bus.index = 11;
+ bus.value = 1;
+ bus.value2 = 1;
+
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ }
+ } catch (SecurityException e) {
+ if (MainActivity.CuttentActivity.mFragment_BUS != null) {
+ Global.BUS bus = new Global.BUS();
+ Message msg = new Message();
+ msg.obj = bus;
+
+ bus.index = 11;
+ bus.value = 0;
+ bus.value2 = 0;
+
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ msg = new Message();
+ bus.index = -1;
+ bus.str = "You do not have read/write permission to the serial port.";
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ }
+ } catch (IOException e) {
+
+ if (MainActivity.CuttentActivity.mFragment_BUS != null) {
+ Global.BUS bus = new Global.BUS();
+ Message msg = new Message();
+ msg.obj = bus;
+
+ bus.index = 11;
+ bus.value = 0;
+ bus.value2 = 0;
+
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ msg = new Message();
+ bus.index = -1;
+ bus.str = "The serial port can not be opened for an unknown reason.";
+
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ }
+ } catch (InvalidParameterException e) {
+
+ if (MainActivity.CuttentActivity.mFragment_BUS != null) {
+ Global.BUS bus = new Global.BUS();
+ Message msg = new Message();
+ msg.obj = bus;
+
+ bus.index = 11;
+ bus.value = 0;
+ bus.value2 = 0;
+
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ msg = new Message();
+ bus.index = -1;
+ bus.str = "error_configuration";
+
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ }
+ }
+ }
+
+ /**
+ * Read data thread
+ *
+ * @author 2017骞�12鏈�19鏃�
+ */
+ private static class ReadThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (!isInterrupted()) {
+ int size = 0;
+
+ try {
+ byte[] buffer = new byte[64];
+ if (Global.mInputStream == null) {
+ return;
+ }
+ size = Global.mInputStream.read(buffer);
+
+ // Log.i("asdfg", Integer.toHexString(((buffer[7] & 0xFF) *
+ // 256) + (buffer[8] & 0xFF)) + "");
+
+ for (int i = 0; i < size - 1; i++) {
+
+ if (i != 0) {
+ if ((buffer[i] & 0xFF) == 0xAA && (buffer[i + 1] & 0xFF) == 0xAA) {
+ //
+ byte[] _bf = new byte[i];
+ System.arraycopy(buffer, 0, _bf, 0, i);
+
+ if (_bf.length >= 13) {
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+ if (command == Commands.ReadTimeFeedback.getCommand()
+ || command == Commands.DryContactInitiativeToSend.getCommand()
+ || command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()
+ || command == Commands.InductorState.getCommand()
+ || command == Commands.SensorBack.getCommand()
+ || command == Commands.ClickState.getCommand()
+ || command == Commands.ReadID_ACK.getCommand()
+ || command == Commands.WriteID_ACK.getCommand()
+ || command == Commands.DataRequest.getCommand()
+ || command == Commands.readRemark_ACK.getCommand()) {
+ onDataReceived(buffer, size);
+ }
+ }
+
+ byte[] _bf2 = new byte[size - i];
+ System.arraycopy(buffer, i, _bf2, 0, size - i);
+ if (_bf2.length >= 13) {
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+ if (command == Commands.ReadTimeFeedback.getCommand()
+ || command == Commands.DryContactInitiativeToSend.getCommand()
+ || command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()
+ || command == Commands.InductorState.getCommand()
+ || command == Commands.SensorBack.getCommand()
+ || command == Commands.ClickState.getCommand()
+ || command == Commands.ReadID_ACK.getCommand()
+ || command == Commands.WriteID_ACK.getCommand()
+ || command == Commands.DataRequest.getCommand()
+ || command == Commands.readRemark_ACK.getCommand()) {
+ onDataReceived(buffer, size);
+ }
+ }
+ }
+ } else {
+ if (size >= 13) {
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+ if (command == Commands.ReadTimeFeedback.getCommand()
+ || command == Commands.DryContactInitiativeToSend.getCommand()
+ || command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()
+ || command == Commands.InductorState.getCommand()
+ || command == Commands.SensorBack.getCommand()
+ || command == Commands.ClickState.getCommand()
+ || command == Commands.ReadID_ACK.getCommand()
+ || command == Commands.WriteID_ACK.getCommand()
+ || command == Commands.DataRequest.getCommand()
+ || command == Commands.readRemark_ACK.getCommand()) {
+ onDataReceived(buffer, size);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+ }
+ }
+ }
+
+ private static void onDataReceived(final byte[] buffer, final int size) {
+
+ if (MainActivity.CuttentActivity.mFragment_BUS == null)
+ return;
+
+ Global.BUS bus = new Global.BUS();
+ Message msg = new Message();
+ try {
+
+ int command = (buffer[7] & 0xFF) * 256 + (buffer[8] & 0xFF);
+
+ if (command == Commands.ReadTimeFeedback.getCommand()) {
+ //
+ } else if (command == Commands.DryContactInitiativeToSend.getCommand()) {
+
+ try {
+ Global.mOutputStream
+ .write(SendDatas.AddSendData(Commands.DryContactInitiativeToSendFeedback.getCommand(),
+ Global.SubNet_Id, Global.Device_Id, new byte[] { (byte) 0xf8 }));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ bus.index = 1;
+ bus.contact1 = buffer[11] & 0xFF;
+ bus.contact2 = buffer[12] & 0xFF;
+ bus.contact3 = buffer[13] & 0xFF;
+ bus.contact4 = buffer[14] & 0xFF;
+ bus.contact5 = buffer[15] & 0xFF;
+ bus.contact6 = buffer[16] & 0xFF;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ } else if (command == Commands.READ_TEMP_WITH_DRY1_ACK.getCommand()) {// 璇诲彇娓╁害
+
+ int value = (int) (buffer[11] & 0xFF);
+
+ if ((buffer[13] & 0xFF) == 0) {
+ // 鍗曚綅鎽勬皬搴�
+ bus.index = 7;
+ bus.value = 0;
+ bus.value2 = value;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ } else {
+ // 鍗庢皬搴�
+ bus.index = 7;
+ bus.value = 1;
+ bus.value2 = value;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ }
+
+ } else if (command == Commands.SensorBack.getCommand()) {
+ // 浼犳劅鍣ㄧ伒鏁忓害
+ bus.index = 8;
+ bus.value = (int) (buffer[12] & 0xFF);
+ bus.value2 = (int) (buffer[12] & 0xFF);
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ } else if (command == Commands.InductorState.getCommand()) {
+
+ bus.index = 9;
+ bus.value = 0;
+ bus.value2 = 0;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+
+ } else if (command == Commands.ClickState.getCommand()) {
+ int key = buffer[12] & 0xFF;
+ switch (key) {
+ case 0:// 寮硅捣
+ bus.index = 109;
+ bus.value = 0;
+ bus.value2 = 0;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ break;
+ case 1:// 鎸変笅
+ bus.index = 10;
+ bus.value = 1;
+ bus.value2 = 0;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ break;
+ case 2:// 闀挎寜
+ bus.index = 10;
+ bus.value = 2;
+ bus.value2 = 0;
+
+ msg.obj = bus;
+ MainActivity.CuttentActivity.mFragment_BUS.mHandler.sendMessage(msg);
+ break;
+ }
+ } else if (command == Commands.SET_TEMP_COMPENSATE_VALUE_ACK.getCommand()) {
+ if ((buffer[11] & 0xFF) == 0xF5) {
+ Toast.makeText(MainActivity.CuttentActivity, "set compensate value failed", Toast.LENGTH_SHORT)
+ .show();
+ }
+ } else if (command == Commands.WriteID_ACK.getCommand()) {
+ // 鍐欏叆ID杩斿洖
+ if ((buffer[11] & 0xFF) == 0xF5) {
+ NavigationDrawerFragment.mNavigationDrawerFragment.mHandler.sendEmptyMessage(0);
+ } else if ((buffer[11] & 0xFF) == 0xF8) {
+ NavigationDrawerFragment.mNavigationDrawerFragment.mHandler.sendEmptyMessage(1);
+ }
+
+ } else if (command == Commands.ReadID_ACK.getCommand()) {
+ // 璇诲彇杩斿洖
+ bus.value = buffer[11] & 0xFF;
+ bus.value2 = buffer[12] & 0xFF;
+
+ msg.obj = bus;
+ NavigationDrawerFragment.mNavigationDrawerFragment.mHandler_Data.sendMessage(msg);
+ } else if (command == Commands.DataRequest.getCommand()) {
+ // 璇诲彇澶囨敞杩斿洖 / 璁惧鍗囩骇 0x15FE buffer[11] buffer[12] 閮戒负0鐨勮瘽锛屽氨鏄娉�
+ // Log.i("asdfg", "璁惧鍗囩骇 0x15FE");
+ int index = (buffer[11] & 0xFF) * 256 + (buffer[12] & 0xFF);// 璇锋眰鐨勬槸绗嚑鏉″寘
+ Fragment_Update.mFragment_Update.mHandler.sendEmptyMessage(index);
+ }
+
+ } catch (Exception e) {
+ e.getMessage();
+ }
+ }
+
+ /**
+ * 2015.12.10 璇诲彇娓╁害
+ */
+ private static class SendThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+ while (true) {
+ try {
+ byte[] sendBytes = SendDatas.AddSendData(Commands.READ_TEMP_WITH_DRY1.getCommand(),
+ Global.SubNet_Id, Global.Device_Id, new byte[] {});
+ Global.mOutputStream.flush();
+ Global.mOutputStream.write(sendBytes);
+ sleep(1000);
+ } catch (Exception e) {
+ //
+ continue;
+ }
+ }
+ }
+ }
+
+ private static class SendDatasThread extends Thread {
+
+ @Override
+ public void run() {
+ super.run();
+
+ while (true) {
+
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ e.getMessage();
+ }
+
+ for (int i = 0; i < SendDatasList.size(); i++) {
+
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+
+ }
+ try {
+ byte[] sendBytes = SendDatasList.get(i);
+ try {
+
+ Global.mOutputStream.flush();
+ Global.mOutputStream.write(sendBytes);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ SendDatasList.remove(i);
+ i--;
+ } catch (Exception ex) {
+ ex.getMessage();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/android/serialport/api/sample/SPDataSet.java b/app/src/main/java/android/serialport/api/sample/SPDataSet.java
new file mode 100644
index 0000000..5e2a8ce
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/SPDataSet.java
@@ -0,0 +1,89 @@
+package android.serialport.api.sample;
+
+import java.util.Map;
+import android.content.SharedPreferences;
+
+public class SPDataSet {
+
+ public static void SaveSPData(String fileName, String key, boolean value) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.putBoolean(key, value);
+ editor.commit();
+ editor.apply();
+ }
+
+ public static void SaveSPData(String fileName, String key, String value) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.putString(key, value);
+ editor.commit();
+ editor.apply();
+ }
+
+ public static void SaveSPData(String fileName, String key, int value) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.putInt(key, value);
+ editor.commit();
+ editor.apply();
+ }
+
+ public static void SaveSPData(String fileName, String key, long value) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.putLong(key, value);
+ editor.commit();
+ editor.apply();
+ }
+
+ public static String ReadSPData_String(String fileName, String key) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ return SP.getString(key, "");
+ }
+
+ public static boolean ReadSPData_boolean(String fileName, String key) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ return SP.getBoolean(key, false);
+ }
+
+ public static int ReadSPData_Int(String fileName, String key) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ return SP.getInt(key, 0);
+ }
+
+ public static long ReadSPData_Long(String fileName, String key) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ return SP.getLong(key, 0);
+ }
+
+ public static Map<String, ?> ReadAll(String fileName) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ return (Map<String, ?>) SP.getAll();
+ }
+
+ public static void DelItem(String fileName, String key) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.remove(key);
+ editor.commit();
+ }
+
+ public static void Clear(String fileName) {
+ SharedPreferences SP = MainActivity.CuttentActivity.getSharedPreferences(fileName,
+ MainActivity.CuttentActivity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = SP.edit();
+ editor.clear();
+ editor.commit();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/android/serialport/api/sample/SerialPortPreferences.java b/app/src/main/java/android/serialport/api/sample/SerialPortPreferences.java
new file mode 100644
index 0000000..a5999cf
--- /dev/null
+++ b/app/src/main/java/android/serialport/api/sample/SerialPortPreferences.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 Cedric Priscal
+ *
+ * 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
+ *
+ * http://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.
+ */
+
+package android.serialport.api.sample;
+
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.serialport.api.SerialPortFinder;
+import android.serialport.api.sample.R;
+import android.preference.PreferenceActivity;
+
+public class SerialPortPreferences extends PreferenceActivity {
+
+ private Application mApplication;
+ private SerialPortFinder mSerialPortFinder;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ //mApplication = (Application) getApplication();
+ mApplication = new Application();
+ mSerialPortFinder = mApplication.mSerialPortFinder;
+
+ addPreferencesFromResource(R.xml.serial_port_preferences);
+
+ // Devices
+ final ListPreference devices = (ListPreference)findPreference("DEVICE");
+ String[] entries = mSerialPortFinder.getAllDevices();
+ String[] entryValues = mSerialPortFinder.getAllDevicesPath();
+ devices.setEntries(entries);
+ devices.setEntryValues(entryValues);
+ devices.setSummary(devices.getValue());
+ devices.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ preference.setSummary((String)newValue);
+ return true;
+ }
+ });
+
+ // Baud rates
+ final ListPreference baudrates = (ListPreference)findPreference("BAUDRATE");
+ baudrates.setSummary(baudrates.getValue());
+ baudrates.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ preference.setSummary((String)newValue);
+ return true;
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/sendData/CRC.java b/app/src/main/java/sendData/CRC.java
new file mode 100644
index 0000000..c62f76a
--- /dev/null
+++ b/app/src/main/java/sendData/CRC.java
@@ -0,0 +1,95 @@
+package sendData;
+
+/// <summary>
+/// CRC 锟斤拷摘要说锟斤拷锟斤拷
+/// </summary>
+public class CRC
+{
+ public CRC()
+ {
+ //
+ // TODO: 锟节此达拷锟斤拷庸锟斤拷旌拷锟斤拷呒锟?
+ //
+ }
+
+
+ private static int[] crctab = new int[]
+ {
+ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
+ 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
+ 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
+ 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
+ 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
+ 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
+ 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
+ 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
+ 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
+ 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
+ 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
+ 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
+ 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
+ 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
+ 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
+ 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
+ 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
+ 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
+ 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
+ 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
+ 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
+ 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+ 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
+ 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
+ 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
+ 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
+ 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
+ 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
+ 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
+ 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
+ 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
+ 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
+ };
+
+ private static int xcrc(int crc, byte cp)
+ {
+ int t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0;
+ t1 = (int)(crc >> 8);
+ t2 = (int)(t1 & 0xff);
+ t3 = (int)(cp & 0xff);
+ t4 = (int)(crc << 8);
+ t5 = (int)(t2 ^ t3);
+ t6 = (int)(crctab[t5] ^ t4);
+ return t6;
+ }
+
+
+ public static void ConCRC(byte[] bufin, int n)
+ {
+ int crc16 = 0;
+ byte i;
+ //n锟斤拷锟斤拷莸锟紺RC校锟斤拷
+ for (i = 0; i < n; i++)
+ {
+ crc16 = xcrc(crc16, bufin[i]);
+ }
+ bufin[i] = (byte)(crc16 >> 8);
+ bufin[i + 1] = (byte)(crc16 & 0xff);
+ }
+
+
+ public static boolean DataCRC( byte[] bufout, int count)
+ {
+ int crc16 = 0;
+ byte i;
+ for (i = 0; i < (count - 2); i++)
+ crc16 = xcrc(crc16, bufout[i]);
+
+ if ((bufout[count - 2] == (byte)(crc16 >> 8)) && (bufout[count - 1] == (byte)(crc16 & 0xff)))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/sendData/Commands.java b/app/src/main/java/sendData/Commands.java
new file mode 100644
index 0000000..2c473dd
--- /dev/null
+++ b/app/src/main/java/sendData/Commands.java
@@ -0,0 +1,34 @@
+package sendData;
+
+public enum Commands {
+
+ /** 寰尝浼犳劅鍣ㄨ鍙傛暟閰嶇疆 1鏍囪锛�0:璇� 1锛氬啓+鍊硷紙0-10锛�0琛ㄧず绂佺敤1-10涓瓑绾� 1鏈�浣� 10鏈�楂橈級 */
+ Sensor(0xEF22), SensorBack(0xEF23), InductorState(0xEF24), ClickState(0xEF25),
+
+ regulationControl(0x0031), ReadID(0XEF32), ReadID_ACK(0XEF33),
+
+ buzzer(0XEF08), WriteID(0XEF34), WriteID_ACK(0XEF35), DataRequest(0x15FE),DataRequest_ACK(0x15FF),
+
+ ReadTime(0xEF04), ReadTimeFeedback(0xEF05), readRemark(0xF81A), readRemark_ACK(0xF81B),
+
+ DryContactInitiativeToSend(0xEF00), DryContactInitiativeToSendFeedback(0xEF01),
+
+ WriteTime(0xEF06), WriteTimeFeedback(0xEF07),
+
+ BackLight(0xEF10), BackLightback(0xEF11),
+
+ /** 闄勫姞涓�瀛楄妭鐨勬俯搴� +鎽勬皬搴�0銆佸崕姘忓害1 + 娓╁害琛ュ皾 5-15 榛樿10 */
+ READ_TEMP_WITH_DRY1(0xEF12), READ_TEMP_WITH_DRY1_ACK(0XEF13),
+
+ SET_TEMP_COMPENSATE_VALUE(0XEF14), SET_TEMP_COMPENSATE_VALUE_ACK(0XEF15);
+
+ private int command;
+
+ private Commands(int value) {
+ this.command = value;
+ }
+
+ public int getCommand() {
+ return command;
+ }
+}
diff --git a/app/src/main/java/sendData/SendDatas.java b/app/src/main/java/sendData/SendDatas.java
new file mode 100644
index 0000000..8a8332f
--- /dev/null
+++ b/app/src/main/java/sendData/SendDatas.java
@@ -0,0 +1,80 @@
+package sendData;
+
+
+public class SendDatas {
+
+ //SubnetID
+ public int DesSubnetID;
+ //DeviceID
+ public int DesDeviceID;
+ //Send additional data
+ public byte[] AddBytes =new byte[]{};
+
+ //Source subnet addresses 0-254
+ public static int LocalSubnetID = 250;
+
+ //source device address 0-254
+ public static int LocalDeviceID = 251;
+
+ // Device type
+ public static int DeviceType = 424;
+
+ //opcode
+ public int Command;
+
+ public byte []GetSendBytes(){
+
+ //Data and to compute the CRC of CRC two bytes
+ byte []crcBytes = new byte[9+this.AddBytes.length+2];
+
+ //Send out the data
+ byte []sendBytes = new byte[2+crcBytes.length];
+
+ //Boot code
+ sendBytes[0]=(byte)0xAA;
+ sendBytes[1]=(byte)0xAA;
+
+ //16 The length of the packet 11-78
+ crcBytes[0]=(byte)crcBytes.length;
+ //17 Source subnet addresses 0-254
+ crcBytes[1]=(byte)LocalSubnetID;
+ //18 source device address 0-254
+ crcBytes[2]=(byte)LocalDeviceID;
+ //19 High source device type
+ crcBytes[3]=(byte)(DeviceType/256);
+ //20 The source device type low
+ crcBytes[4]=(byte)(DeviceType%256);
+ //21 Opcode high
+ crcBytes[5]=(byte)(this.Command/256);
+ //22 Opcode low
+ crcBytes[6]=(byte)(this.Command%256);
+ //23 The target subnet addresses 0-254
+ crcBytes[7]=(byte)this.DesSubnetID;
+ //24 The destination address 0-254
+ crcBytes[8]=(byte)this.DesDeviceID;
+ //25~n Additional data
+ System.arraycopy(this.AddBytes, 0, crcBytes, 9, this.AddBytes.length);
+ //Check CRC
+ CRC.ConCRC(crcBytes, crcBytes.length-2);
+
+ //Copy the CRC data to send data
+ System.arraycopy(crcBytes, 0,sendBytes, 2, crcBytes.length);
+
+ return sendBytes;
+
+ }
+
+ //send data
+ public static byte []AddSendData(int command,int desSubnetID,int desDeviceID,byte []addBytes){
+ SendDatas sendDatas = new SendDatas();
+ sendDatas.Command=command;
+ sendDatas.DesSubnetID=desSubnetID;
+ sendDatas.DesDeviceID=desDeviceID;
+ sendDatas.AddBytes=addBytes;
+
+ byte []sendBytes = sendDatas.GetSendBytes();
+
+ return sendBytes;
+ }
+}
+
diff --git a/app/src/main/jni/Android.mk b/app/src/main/jni/Android.mk
new file mode 100644
index 0000000..73bbcea
--- /dev/null
+++ b/app/src/main/jni/Android.mk
@@ -0,0 +1,13 @@
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := serial_port
+LOCAL_SRC_FILES := \
+android_serialport_api_SerialPort.c\
+android_serialport_api_sample_KNX.c\
+
+LOCAL_LDLIBS := -llog
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/app/src/main/jni/android_serialport_api_SerialPort.c b/app/src/main/jni/android_serialport_api_SerialPort.c
new file mode 100644
index 0000000..dbf72ec
--- /dev/null
+++ b/app/src/main/jni/android_serialport_api_SerialPort.c
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2009-2011 Cedric Priscal
+ *
+ * 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
+ *
+ * http://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.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <jni.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <err.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <linux/input.h>
+#include "sun8iw6p_display.h"
+#include <errno.h>
+#include <termios.h>
+#include <string.h>
+#include "android/log.h"
+
+#define POWER_KEY_PATH "/dev/input/event2"
+#define DEVICE_DISP_PATH "/dev/disp"
+
+static const char *TAG = "serial_port";
+unsigned long args[3];
+
+#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
+#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
+#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
+
+static speed_t getBaudrate(jint baudrate) {
+ switch (baudrate) {
+ case 0:
+ return B0;
+ case 50:
+ return B50;
+ case 75:
+ return B75;
+ case 110:
+ return B110;
+ case 134:
+ return B134;
+ case 150:
+ return B150;
+ case 200:
+ return B200;
+ case 300:
+ return B300;
+ case 600:
+ return B600;
+ case 1200:
+ return B1200;
+ case 1800:
+ return B1800;
+ case 2400:
+ return B2400;
+ case 4800:
+ return B4800;
+ case 9600:
+ return B9600;
+ case 19200:
+ return B19200;
+ case 38400:
+ return B38400;
+ case 57600:
+ return B57600;
+ case 115200:
+ return B115200;
+ case 230400:
+ return B230400;
+ case 460800:
+ return B460800;
+ case 500000:
+ return B500000;
+ case 576000:
+ return B576000;
+ case 921600:
+ return B921600;
+ case 1000000:
+ return B1000000;
+ case 1152000:
+ return B1152000;
+ case 1500000:
+ return B1500000;
+ case 2000000:
+ return B2000000;
+ case 2500000:
+ return B2500000;
+ case 3000000:
+ return B3000000;
+ case 3500000:
+ return B3500000;
+ case 4000000:
+ return B4000000;
+ default:
+ return -1;
+ }
+}
+
+/*
+ * Class: android_serialport_api_SerialPort
+ * Method: BackLight_ON
+ * Signature: ()V
+ */JNIEXPORT jint JNICALL Java_android_serialport_api_SerialPort_BackLight_1ON(
+ JNIEnv *evn, jobject obj) {
+
+ int blanklight_id = open(DEVICE_DISP_PATH, O_RDWR);
+ if (blanklight_id < 0) {
+ return -1;
+ }
+
+ args[0] = 0;
+ args[1] = 0;
+ LOGI("Open");
+ return (jint) ioctl(blanklight_id, DISP_BLANK, args);
+}
+
+/*
+ * Class: android_serialport_api_SerialPort
+ * Method: BackLight_OFF
+ * Signature: ()V
+ */JNIEXPORT jint JNICALL Java_android_serialport_api_SerialPort_BackLight_1OFF(
+ JNIEnv *evn, jobject obj) {
+
+ int blanklight_id = open(DEVICE_DISP_PATH, O_RDWR);
+ if (blanklight_id < 0) {
+ return -1;
+ }
+
+ args[0] = 0;
+ args[1] = 1;
+ LOGI("Close");
+ return (jint) ioctl(blanklight_id, DISP_BLANK, args);
+}
+
+/*
+ * Class: android_serialport_SerialPort
+ * Method: open
+ * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor;
+ */JNIEXPORT jobject JNICALL Java_android_serialport_api_SerialPort_open(
+ JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags) {
+ int fd;
+ speed_t speed;
+ jobject mFileDescriptor;
+
+ /* Check arguments */
+ {
+ speed = getBaudrate(baudrate);
+ if (speed == -1) {
+ /* TODO: throw an exception */
+ LOGE("Invalid baudrate");
+ return NULL;
+ }
+ }
+
+ /* Opening device */
+ {
+ jboolean iscopy;
+ const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy);
+ LOGD("Opening serial port %s with flags 0x%x",
+ path_utf, O_RDWR | flags);
+ fd = open(path_utf, O_RDWR | flags);
+ LOGD("open() fd = %d", fd);
+ (*env)->ReleaseStringUTFChars(env, path, path_utf);
+ if (fd == -1) {
+ /* Throw an exception */
+ LOGE("Cannot open port");
+
+ return NULL;
+ }
+ }
+
+ /* Configure device */
+ {
+ struct termios cfg;
+ LOGD("Configuring serial port");
+ if (tcgetattr(fd, &cfg)) {
+ LOGE("tcgetattr() failed");
+ close(fd);
+ return NULL;
+ }
+
+ cfmakeraw(&cfg);
+ cfsetispeed(&cfg, speed);
+ cfsetospeed(&cfg, speed);
+
+ if (tcsetattr(fd, TCSANOW, &cfg)) {
+ LOGE("tcsetattr() failed");
+ close(fd);
+ return NULL;
+ }
+ }
+
+ /* Create a corresponding file descriptor */
+ {
+ jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor");
+ jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "<init>", "()V");
+ jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I");
+ mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor);
+ (*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint) fd);
+ }
+
+ return mFileDescriptor;
+}
+
+/*
+ * Class: cedric_serial_SerialPort
+ * Method: close
+ * Signature: ()V
+ */JNIEXPORT void JNICALL Java_android_serialport_api_SerialPort_close(
+ JNIEnv *env, jobject thiz) {
+ jclass SerialPortClass = (*env)->GetObjectClass(env, thiz);
+ jclass FileDescriptorClass = (*env)->FindClass(env,
+ "java/io/FileDescriptor");
+
+ jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd",
+ "Ljava/io/FileDescriptor;");
+ jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass,
+ "descriptor", "I");
+
+ jobject mFd = (*env)->GetObjectField(env, thiz, mFdID);
+ jint descriptor = (*env)->GetIntField(env, mFd, descriptorID);
+
+ LOGD("close(fd = %d)", descriptor);
+ close(descriptor);
+}
+
diff --git a/app/src/main/jni/android_serialport_api_SerialPort.h b/app/src/main/jni/android_serialport_api_SerialPort.h
new file mode 100644
index 0000000..300cf3b
--- /dev/null
+++ b/app/src/main/jni/android_serialport_api_SerialPort.h
@@ -0,0 +1,41 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_serialport_api_SerialPort */
+
+#ifndef _Included_android_serialport_api_SerialPort
+#define _Included_android_serialport_api_SerialPort
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: android_serialport_api_SerialPort
+ * Method: open
+ * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor;
+ */
+JNIEXPORT jobject JNICALL Java_android_serialport_api_SerialPort_open(JNIEnv *, jclass, jstring, jint, jint);
+
+/*
+ * Class: android_serialport_api_SerialPort
+ * Method: close
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_android_serialport_api_SerialPort_close(JNIEnv *, jobject);
+
+/*
+ * Class: android_serialport_api_SerialPort
+ * Method: BackLight_ON
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_android_serialport_api_SerialPort_BackLight_1ON(JNIEnv *, jobject);
+
+/*
+ * Class: android_serialport_api_SerialPort
+ * Method: BackLight_OFF
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_android_serialport_api_SerialPort_BackLight_1OFF(JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/app/src/main/jni/android_serialport_api_sample_KNX.c b/app/src/main/jni/android_serialport_api_sample_KNX.c
new file mode 100644
index 0000000..4ca202a
--- /dev/null
+++ b/app/src/main/jni/android_serialport_api_sample_KNX.c
@@ -0,0 +1,244 @@
+#include <jni.h>
+#include "android/log.h"
+
+#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args)
+#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
+#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
+
+#define unchar unsigned char
+#define unint unsigned short
+#define A_Preamble_OFFSET 0
+#define A_Size_OFFSET 1
+#define A_Service_ID_OFFSET 2
+#define A_Service_Frame_OFFSET 3
+
+unsigned short Get_CRC_CCITT(unsigned short u_crc_val, unsigned char btVal) {
+ u_crc_val = ((unsigned char) (u_crc_val >> 8)) | (u_crc_val << 8);
+ u_crc_val ^= btVal;
+ u_crc_val ^= ((unsigned char) (u_crc_val & 0xFF)) >> 4;
+ u_crc_val ^= u_crc_val << 12;
+ u_crc_val ^= (u_crc_val & 0xFF) << 5;
+ return u_crc_val;
+}
+
+unsigned short Calc_CRC_CCITT(unsigned char* pBuf, unsigned short uLength) {
+ unsigned short u_crc_ccitt;
+ for (u_crc_ccitt = 0xFFFF; uLength--; pBuf++) {
+ u_crc_ccitt = Get_CRC_CCITT(u_crc_ccitt, *pBuf);
+ }
+ return u_crc_ccitt;
+}
+
+#define false 0
+#define true 1
+//Android UART protocol define
+#define UART_Preamble_OFFSET 0
+#define UART_Size_OFFSET 1
+#define UART_Service_ID_OFFSET 2
+#define UART_Service_Frame_OFFSET 3
+//L_Data_Standard Frame size
+const unsigned char DataSize_TAB[16] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 1,
+ 1, 2, 3, 4, 6, 8, 10, 14, 14 };
+#define DATA_Type_1BIT 0
+#define DATA_Type_2BIT 1
+#define DATA_Type_3BIT 2
+#define DATA_Type_4BIT 3
+#define DATA_Type_5BIT 4
+#define DATA_Type_6BIT 5
+#define DATA_Type_7BIT 6
+#define DATA_Type_8BIT 7
+#define DATA_Type_2byte 8
+#define DATA_Type_3byte 9
+#define DATA_Type_4byte 10
+#define DATA_Type_6byte 11
+#define DATA_Type_8byte 12
+#define DATA_Type_10byte 13
+#define DATA_Type_14byte 14
+//get short group address from main, middle, sub
+#define EIB_Group_Addr3(main, middle, sub) ((main&0x0f)<<11|(middle&0x07)<<8|(sub&0x0ff))
+// frame service
+#define A_SERVICE_NO 0
+#define A_SERVICE_L_Data_Frame_req 1
+#define A_SERVICE_L_Data_Frame_ind 3
+//----------------------------------------------------------------------------------------------------//
+//this function encode group telegram to *p_suart_buf.
+//source_addr:Individual address
+//dest_addr:Group address
+//*p_data:data for send
+//data_type:data type 1 bit..14 bytes
+//*p_suart_buf: send this buf to uart
+//this function return send size
+//----------------------------------------------------------------------------------------------------//
+unsigned char UART_EncodeGroupTelegram(unsigned short source_addr,
+ unsigned short dest_addr, unsigned char *p_data,
+ unsigned char data_type, unsigned char *p_suart_buf) {
+ unsigned char crc_h, crc_l, count, data_size, l_data_len, uart_size;
+ unsigned short crc;
+ p_suart_buf[UART_Service_Frame_OFFSET + 0] = 0xBC;
+ p_suart_buf[UART_Service_Frame_OFFSET + 1] = (unsigned char) ((source_addr
+ >> 8) & 0x00ff);
+ p_suart_buf[UART_Service_Frame_OFFSET + 2] = (unsigned char) (source_addr
+ & 0x00ff);
+ p_suart_buf[UART_Service_Frame_OFFSET + 3] = (unsigned char) ((dest_addr
+ >> 8) & 0x00ff);
+ p_suart_buf[UART_Service_Frame_OFFSET + 4] = (unsigned char) (dest_addr
+ & 0x00ff);
+ p_suart_buf[UART_Service_Frame_OFFSET + 5] = 0xE0;
+ p_suart_buf[UART_Service_Frame_OFFSET + 6] = 0x00;
+ p_suart_buf[UART_Service_Frame_OFFSET + 7] = 0x80;
+ if (data_type < 6) {
+ p_suart_buf[UART_Service_Frame_OFFSET + 5] |= 0x01;
+ p_suart_buf[UART_Service_Frame_OFFSET + 7] |= p_data[0]
+ & DataSize_TAB[data_type];
+ } else {
+ data_size = DataSize_TAB[data_type];
+ p_suart_buf[UART_Service_Frame_OFFSET + 5] |= data_size + 1;
+ for (count = 0; count < data_size; count++)
+ p_suart_buf[UART_Service_Frame_OFFSET + 8 + count] = p_data[count];
+ }
+ l_data_len = (p_suart_buf[UART_Service_Frame_OFFSET + 5] & 0x0f) + 7;
+ uart_size = l_data_len + 5;
+ p_suart_buf[UART_Preamble_OFFSET] = 0xAA;
+ p_suart_buf[UART_Size_OFFSET] = uart_size;
+ p_suart_buf[UART_Service_ID_OFFSET] = A_SERVICE_L_Data_Frame_req;
+ crc = Calc_CRC_CCITT(p_suart_buf, uart_size - 2);
+ crc_h = (unchar) ((crc >> 8) & 0x00ff);
+ crc_l = (unchar) (crc & 0x00ff);
+ p_suart_buf[A_Service_Frame_OFFSET + l_data_len] = crc_h;
+ p_suart_buf[A_Service_Frame_OFFSET + l_data_len + 1] = crc_l;
+ return uart_size;
+}
+//----------------------------------------------------------------------------------------------------//
+//this function decode the *p_ruart_buf telegram to:
+//*p_source_addr,*p_dest_addr,*p_data,*p_data_size
+//return true: decoding success
+//return false: decoding failure
+//----------------------------------------------------------------------------------------------------//
+unsigned char UART_DecodeGroupTelegram(unsigned short *p_source_addr,
+ unsigned short *p_dest_addr, unsigned char *p_data,
+ unsigned char *p_data_size, unsigned char *p_ruart_buf) {
+ unchar crc_h, crc_l, count, data_size, uart_size;
+ unint crc;
+ uart_size = p_ruart_buf[UART_Size_OFFSET];
+ if (uart_size < 13)
+ return false;
+ crc = Calc_CRC_CCITT(p_ruart_buf, uart_size - 2);
+ crc_h = (unchar) ((crc >> 8) & 0x00ff);
+ crc_l = (unchar) (crc & 0x00ff);
+ if ((crc_h != p_ruart_buf[uart_size - 2])
+ || (crc_l != p_ruart_buf[uart_size - 1]))
+ return false; //check CRC
+ if (p_ruart_buf[UART_Service_ID_OFFSET] != A_SERVICE_L_Data_Frame_ind)
+ return false; //ind frame
+ if ((p_ruart_buf[UART_Service_Frame_OFFSET] & 0xd3) != 0x90)
+ return false;
+ if ((p_ruart_buf[UART_Service_Frame_OFFSET + 5] & 0x80) != 0x80)
+ return false; //not group telegram
+ *p_source_addr = p_ruart_buf[UART_Service_Frame_OFFSET + 1];
+ *p_source_addr <<= 8;
+ *p_source_addr |= p_ruart_buf[UART_Service_Frame_OFFSET + 2];
+ *p_dest_addr = p_ruart_buf[UART_Service_Frame_OFFSET + 3];
+ *p_dest_addr <<= 8;
+ *p_dest_addr |= p_ruart_buf[UART_Service_Frame_OFFSET + 4];
+ data_size = p_ruart_buf[UART_Service_Frame_OFFSET + 5] & 0x0f;
+ if (data_size == 1) {
+ p_data[0] = p_ruart_buf[UART_Service_Frame_OFFSET + 7] & 0x3f;
+ } else {
+ for (count = 0; count < (data_size - 1); count++)
+ p_data[count] = p_ruart_buf[UART_Service_Frame_OFFSET + 8 + count];
+ data_size -= 1;
+ }
+ *p_data_size = data_size;
+ return true;
+}
+
+void UART_Send(void) {
+ unsigned short individual_addr = 0x1101; //1.1.1
+ unsigned short group_addr = EIB_Group_Addr3(1,0,1); //1/0/1
+ unsigned char data_buf[2], suart_buf[22 + 5];
+ unsigned char uart_size;
+ data_buf[0] = 0x01; //ON (unsigned char)int
+ uart_size = UART_EncodeGroupTelegram(individual_addr, group_addr, data_buf,
+ DATA_Type_1BIT, suart_buf);
+}
+
+JNIEXPORT jbyteArray JNICALL Java_android_serialport_api_sample_KNX_get_1SendBuffer(
+ JNIEnv *env, jclass thiz, jint _individual_addr, jint obj1, jint obj2,
+ jint obj3, jint on_off) {
+
+ unsigned short individual_addr = (unsigned short) _individual_addr;
+
+ unsigned short group_addr =
+ EIB_Group_Addr3((unsigned char)obj1,(unsigned char)obj2,(unsigned char)obj3); //1/0/1
+ unsigned char data_buf[2], suart_buf[22 + 5];
+ unsigned char uart_size;
+ data_buf[0] = (unsigned char) on_off; //0x01; //ON (unsigned char)int
+ uart_size = UART_EncodeGroupTelegram(individual_addr, group_addr, data_buf,
+ DATA_Type_1BIT, suart_buf);
+
+ jbyteArray array = (*env)->NewByteArray(env, 27);
+
+ (*env)->SetByteArrayRegion(env, array, 0, 27, suart_buf);
+
+ return array;
+}
+
+JNIEXPORT jboolean JNICALL Java_android_serialport_api_sample_KNX_Parity_1Data(
+ JNIEnv *env, jclass thiz, jbyteArray buffer) {
+
+ unchar *p_ruart_buf = (unchar *) buffer;
+ unsigned short individual_addr, group_addr;
+ unsigned char data_buf[14];
+ unsigned char data_size;
+ if (!UART_DecodeGroupTelegram(&individual_addr, &group_addr, data_buf,
+ &data_size, p_ruart_buf))
+ return false;
+ return true;
+}
+
+unsigned short Individual_addr, Group_addr;
+unsigned char Data_buf[14];
+
+JNIEXPORT jboolean JNICALL Java_android_serialport_api_sample_KNX_UART_1Receive(
+ JNIEnv *env, jclass thiz, jbyteArray array) {
+
+ jint len = (*env)->GetArrayLength(env, array);
+
+ unchar p_ruart_buf[len];
+
+ (*env)->GetByteArrayRegion(env, array, 0, len, p_ruart_buf);
+
+ unsigned char data_size;
+
+ if (!UART_DecodeGroupTelegram(&Individual_addr, &Group_addr, Data_buf,
+ &data_size, p_ruart_buf))
+ return false;
+
+ return true;
+}
+
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_get_1Individual_1addr(
+ JNIEnv *env, jclass thiz) {
+
+ return (jint) Individual_addr;
+}
+
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_get_1Group_1addr(
+ JNIEnv *env, jclass thiz) {
+
+ return (jint) Group_addr;
+
+}
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_set_1Group_1addr(
+ JNIEnv *env, jclass thiz, jint obj1, jint obj2, jint obj3) {
+ unsigned short group_addr =
+ EIB_Group_Addr3((unsigned char)obj1,(unsigned char)obj2,(unsigned char)obj3);
+
+ return (jint) group_addr;
+}
+
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_get_1State(
+ JNIEnv *env, jclass thiz) {
+
+ return (jint) Data_buf[0];
+}
diff --git a/app/src/main/jni/android_serialport_api_sample_KNX.h b/app/src/main/jni/android_serialport_api_sample_KNX.h
new file mode 100644
index 0000000..cd8c16e
--- /dev/null
+++ b/app/src/main/jni/android_serialport_api_sample_KNX.h
@@ -0,0 +1,27 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class android_serialport_api_SerialPort */
+
+#ifndef _Included_android_serialport_api_sample_KNX
+#define _Included_android_serialport_api_sample_KNX
+#ifdef __cplusplus
+extern "C" {
+#endif
+JNIEXPORT jbyteArray JNICALL Java_android_serialport_api_sample_KNX_get_1SendBuffer(JNIEnv *, jclass, jbyte, jint, jint, jint, jint);
+
+JNIEXPORT jboolean JNICALL Java_android_serialport_api_sample_KNX_Parity_1Data(JNIEnv *, jclass, jbyteArray);
+
+JNIEXPORT jbyteArray JNICALL Java_android_serialport_api_sample_KNX_get_1Individual_1addr(JNIEnv *, jclass);
+
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_get_1Group_1addr(JNIEnv *, jclass);
+
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_set_1Group_1addr(JNIEnv *, jclass, jint, jint, jint);
+
+JNIEXPORT jint JNICALL Java_android_serialport_api_sample_KNX_get_1State(JNIEnv *, jclass);
+
+JNIEXPORT jboolean JNICALL Java_android_serialport_api_sample_KNX_UART_1Receive(JNIEnv *, jclass, jbyteArray);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/app/src/main/jni/sun8iw6p_display.h b/app/src/main/jni/sun8iw6p_display.h
new file mode 100644
index 0000000..6889009
--- /dev/null
+++ b/app/src/main/jni/sun8iw6p_display.h
@@ -0,0 +1,429 @@
+#ifndef __SUN8XI6P_DISPLAY_H__
+#define __SUN8XI6P_DISPLAY_H__
+
+#define bool signed char
+
+typedef signed char __s8;
+typedef unsigned char __u8;
+typedef signed short __s16;
+typedef unsigned short __u16;
+typedef signed int __s32;
+typedef unsigned int __u32;
+typedef unsigned int u32;
+typedef signed long long __s64;
+typedef unsigned long long __u64;
+typedef struct {unsigned char alpha;unsigned char red;unsigned char green; unsigned char blue; }disp_color;
+typedef struct {int x; int y; unsigned int width; unsigned int height;}disp_rect;
+typedef struct {unsigned int width;unsigned int height; }disp_rectsz;
+typedef struct {int x; int y; }disp_position;
+
+typedef enum
+{
+ DISP_FORMAT_ARGB_8888 = 0x00,//MSB A-R-G-B LSB
+ DISP_FORMAT_ABGR_8888 = 0x01,
+ DISP_FORMAT_RGBA_8888 = 0x02,
+ DISP_FORMAT_BGRA_8888 = 0x03,
+ DISP_FORMAT_XRGB_8888 = 0x04,
+ DISP_FORMAT_XBGR_8888 = 0x05,
+ DISP_FORMAT_RGBX_8888 = 0x06,
+ DISP_FORMAT_BGRX_8888 = 0x07,
+ DISP_FORMAT_RGB_888 = 0x08,
+ DISP_FORMAT_BGR_888 = 0x09,
+ DISP_FORMAT_RGB_565 = 0x0a,
+ DISP_FORMAT_BGR_565 = 0x0b,
+ DISP_FORMAT_ARGB_4444 = 0x0c,
+ DISP_FORMAT_ABGR_4444 = 0x0d,
+ DISP_FORMAT_RGBA_4444 = 0x0e,
+ DISP_FORMAT_BGRA_4444 = 0x0f,
+ DISP_FORMAT_ARGB_1555 = 0x10,
+ DISP_FORMAT_ABGR_1555 = 0x11,
+ DISP_FORMAT_RGBA_5551 = 0x12,
+ DISP_FORMAT_BGRA_5551 = 0x13,
+
+ /* SP: semi-planar, P:planar, I:interleaved
+ * UVUV: U in the LSBs; VUVU: V in the LSBs */
+ DISP_FORMAT_YUV444_I_AYUV = 0x40,//MSB A-Y-U-V LSB, reserved
+ DISP_FORMAT_YUV444_I_VUYA = 0x41,//MSB V-U-Y-A LSB
+ DISP_FORMAT_YUV422_I_YVYU = 0x42,//MSB Y-V-Y-U LSB
+ DISP_FORMAT_YUV422_I_YUYV = 0x43,//MSB Y-U-Y-V LSB
+ DISP_FORMAT_YUV422_I_UYVY = 0x44,//MSB U-Y-V-Y LSB
+ DISP_FORMAT_YUV422_I_VYUY = 0x45,//MSB V-Y-U-Y LSB
+ DISP_FORMAT_YUV444_P = 0x46,//MSB P3-2-1-0 LSB, YYYY UUUU VVVV, reserved
+ DISP_FORMAT_YUV422_P = 0x47,//MSB P3-2-1-0 LSB YYYY UU VV
+ DISP_FORMAT_YUV420_P = 0x48,//MSB P3-2-1-0 LSB YYYY U V
+ DISP_FORMAT_YUV411_P = 0x49,//MSB P3-2-1-0 LSB YYYY U V
+ DISP_FORMAT_YUV422_SP_UVUV = 0x4a,//MSB V-U-V-U LSB
+ DISP_FORMAT_YUV422_SP_VUVU = 0x4b,//MSB U-V-U-V LSB
+ DISP_FORMAT_YUV420_SP_UVUV = 0x4c,
+ DISP_FORMAT_YUV420_SP_VUVU = 0x4d,
+ DISP_FORMAT_YUV411_SP_UVUV = 0x4e,
+ DISP_FORMAT_YUV411_SP_VUVU = 0x4f,
+}disp_pixel_format;
+
+typedef enum
+{
+ DISP_3D_OUT_MODE_CI_1 = 0x5,//column interlaved 1
+ DISP_3D_OUT_MODE_CI_2 = 0x6,//column interlaved 2
+ DISP_3D_OUT_MODE_CI_3 = 0x7,//column interlaved 3
+ DISP_3D_OUT_MODE_CI_4 = 0x8,//column interlaved 4
+ DISP_3D_OUT_MODE_LIRGB = 0x9,//line interleaved rgb
+
+ DISP_3D_OUT_MODE_TB = 0x0,//top bottom
+ DISP_3D_OUT_MODE_FP = 0x1,//frame packing
+ DISP_3D_OUT_MODE_SSF = 0x2,//side by side full
+ DISP_3D_OUT_MODE_SSH = 0x3,//side by side half
+ DISP_3D_OUT_MODE_LI = 0x4,//line interleaved
+ DISP_3D_OUT_MODE_FA = 0xa,//field alternative
+}disp_3d_out_mode;
+
+typedef enum
+{
+ DISP_BT601 = 0,
+ DISP_BT709 = 1,
+ DISP_YCC = 2,
+}disp_color_space;
+
+typedef enum
+{
+ DISP_CSC_TYPE_RGB = 0,
+ DISP_CSC_TYPE_YUV1 = 1,//HDMI
+ DISP_CSC_TYPE_YUV2 = 2,//TV
+}disp_csc_type;
+
+typedef enum
+{
+ DISP_COLOR_RANGE_16_255 = 0,
+ DISP_COLOR_RANGE_0_255 = 1,
+ DISP_COLOR_RANGE_16_235 = 2,
+}disp_color_range;
+
+typedef enum
+{
+ DISP_OUTPUT_TYPE_NONE = 0,
+ DISP_OUTPUT_TYPE_LCD = 1,
+ DISP_OUTPUT_TYPE_TV = 2,
+ DISP_OUTPUT_TYPE_HDMI = 4,
+ DISP_OUTPUT_TYPE_VGA = 8,
+}disp_output_type;
+
+typedef enum
+{
+ DISP_TV_MOD_480I = 0,
+ DISP_TV_MOD_576I = 1,
+ DISP_TV_MOD_480P = 2,
+ DISP_TV_MOD_576P = 3,
+ DISP_TV_MOD_720P_50HZ = 4,
+ DISP_TV_MOD_720P_60HZ = 5,
+ DISP_TV_MOD_1080I_50HZ = 6,
+ DISP_TV_MOD_1080I_60HZ = 7,
+ DISP_TV_MOD_1080P_24HZ = 8,
+ DISP_TV_MOD_1080P_50HZ = 9,
+ DISP_TV_MOD_1080P_60HZ = 0xa,
+ DISP_TV_MOD_1080P_24HZ_3D_FP = 0x17,
+ DISP_TV_MOD_720P_50HZ_3D_FP = 0x18,
+ DISP_TV_MOD_720P_60HZ_3D_FP = 0x19,
+ DISP_TV_MOD_1080P_25HZ = 0x1a,
+ DISP_TV_MOD_1080P_30HZ = 0x1b,
+ DISP_TV_MOD_PAL = 0xb,
+ DISP_TV_MOD_PAL_SVIDEO = 0xc,
+ DISP_TV_MOD_NTSC = 0xe,
+ DISP_TV_MOD_NTSC_SVIDEO = 0xf,
+ DISP_TV_MOD_PAL_M = 0x11,
+ DISP_TV_MOD_PAL_M_SVIDEO = 0x12,
+ DISP_TV_MOD_PAL_NC = 0x14,
+ DISP_TV_MOD_PAL_NC_SVIDEO = 0x15,
+ DISP_TV_MOD_3840_2160P_30HZ = 0x1c,
+ DISP_TV_MOD_3840_2160P_25HZ = 0x1d,
+ DISP_TV_MOD_3840_2160P_24HZ = 0x1e,
+ DISP_TV_MODE_NUM = 0x1f,
+}disp_tv_mode;
+
+
+//FIXME:still need?
+typedef enum
+{
+ DISP_EXIT_MODE_CLEAN_ALL = 0,
+ DISP_EXIT_MODE_CLEAN_PARTLY = 1,//only clean interrupt temply
+}disp_exit_mode;
+
+typedef enum
+{
+ DISP_TRANSFORM_ROT_0 = 0,
+ DISP_TRANSFORM_ROT_90 = 1,
+ DISP_TRANSFORM_ROT_180 = 2,
+ DISP_TRANSFORM_ROT_270 = 3,
+}disp_transform_type;
+
+typedef enum
+{
+ DISP_BF_NORMAL = 0,//non-stereo
+ DISP_BF_STEREO_TB = 1 << 0,//stereo top-bottom
+ DISP_BF_STEREO_FP = 1 << 1,//stereo frame packing
+ DISP_BF_STEREO_SSH = 1 << 2,//stereo side by side half
+ DISP_BF_STEREO_SSF = 1 << 3,//stereo side by side full
+ DISP_BF_STEREO_LI = 1 << 4,//stereo line interlace
+}disp_buffer_flags;
+
+typedef enum
+{
+ LAYER_MODE_BUFFER = 0,
+ LAYER_MODE_COLOR = 1,
+}disp_layer_mode;
+
+typedef enum
+{
+ DISP_SCAN_PROGRESSIVE = 0,//non interlace
+ DISP_SCAN_INTERLACED_ODD_FLD_FIRST = 1 << 0,//interlace ,odd field first
+ DISP_SCAN_INTERLACED_EVEN_FLD_FIRST = 1 << 1,//interlace,even field first
+}disp_scan_flags;
+
+typedef struct
+{
+ long long x;
+ long long y;
+ long long width;
+ long long height;
+}disp_rect64;
+
+typedef struct
+{
+ unsigned long long addr[3]; /* address of frame buffer,
+ single addr for interleaved fomart,
+ double addr for semi-planar fomart
+ triple addr for planar format */
+ disp_rectsz size[3]; //size for 3 component,unit: pixels
+ unsigned int align[3]; //align for 3 comonent,unit: bits(align=2^n,i.e. 1/2/4/8/16/32..)
+ disp_pixel_format format;
+ disp_color_space color_space; //color space
+ unsigned int trd_right_addr[3];/* right address of 3d fb,
+ used when in frame packing 3d mode */
+ bool pre_multiply; //true: pre-multiply fb
+ disp_rect64 crop; //crop rectangle boundaries
+ disp_buffer_flags flags; //indicate stereo or non-stereo buffer
+ disp_scan_flags scan; //scan type & scan order
+}disp_fb_info;
+
+typedef struct
+{
+ disp_layer_mode mode;
+ unsigned char zorder; /*specifies the front-to-back ordering of the layers on the screen,
+ the top layer having the highest Z value
+ can't set zorder, but can get */
+ unsigned char alpha_mode; //0: pixel alpha; 1: global alpha; 2: global pixel alpha
+ unsigned char alpha_value; //global alpha value
+ disp_rect screen_win; //display window on the screen
+ bool b_trd_out; //3d display
+ disp_3d_out_mode out_trd_mode;//3d display mode
+ union {
+ unsigned int color; //valid when LAYER_MODE_COLOR
+ disp_fb_info fb; //framebuffer, valid when LAYER_MODE_BUFFER
+ };
+
+ unsigned int id; /* frame id, can get the id of frame display currently
+ by DISP_LAYER_GET_FRAME_ID */
+}disp_layer_info;
+
+typedef struct
+{
+ disp_layer_info info;
+ bool enable;
+ unsigned int channel;
+ unsigned int layer_id;
+}disp_layer_config;
+
+typedef struct
+{
+ disp_color ck_max;
+ disp_color ck_min;
+ unsigned int red_match_rule;//0/1:always match; 2:match if min<=color<=max; 3:match if color>max or color<min
+ unsigned int green_match_rule;//0/1:always match; 2:match if min<=color<=max; 3:match if color>max or color<min
+ unsigned int blue_match_rule;//0/1:always match; 2:match if min<=color<=max; 3:match if color>max or color<min
+}disp_colorkey;
+
+typedef struct
+{
+ disp_pixel_format format;
+ disp_rectsz size[3];
+ disp_rect crop;
+ unsigned long long addr[3];
+}disp_s_frame;
+
+typedef struct
+{
+ disp_rect window; // capture window, rectangle of screen to be captured
+ //capture the whole screen if window eq ZERO
+ disp_s_frame out_frame;
+}disp_capture_info;
+
+typedef struct
+{
+ disp_s_frame s_frame;
+ disp_s_frame d_frame;
+ disp_transform_type tr;
+}disp_transform_info;
+
+typedef struct
+{
+ unsigned int vic; //video infomation code
+ unsigned int pixel_clk;//khz
+ unsigned int pixel_repeat;//pixel repeat (pixel_repeat+1) times
+ unsigned int x_res;
+ unsigned int y_res;
+ unsigned int hor_total_time;
+ unsigned int hor_back_porch;
+ unsigned int hor_front_porch;
+ unsigned int hor_sync_time;
+ unsigned int ver_total_time;
+ unsigned int ver_back_porch;
+ unsigned int ver_front_porch;
+ unsigned int ver_sync_time;
+ unsigned int hor_sync_polarity;//0: negative, 1: positive
+ unsigned int ver_sync_polarity;//0: negative, 1: positive
+ bool b_interlace;
+ unsigned int vactive_space;
+ unsigned int trd_mode;
+}disp_video_timings;
+
+typedef enum
+{
+ FB_MODE_SCREEN0 = 0,
+ FB_MODE_SCREEN1 = 1,
+ FB_MODE_SCREEN2 = 2,
+ FB_MODE_DUAL_SAME_SCREEN_TB = 3,//two screen, top buffer for screen0, bottom buffer for screen1
+ FB_MODE_DUAL_DIFF_SCREEN_SAME_CONTENTS = 4,//two screen, they have same contents;
+}disp_fb_mode;
+
+typedef struct
+{
+ disp_fb_mode fb_mode;
+ disp_layer_mode mode;
+ unsigned int buffer_num;
+ unsigned int width;
+ unsigned int height;
+
+ unsigned int output_width;//used when scaler mode
+ unsigned int output_height;//used when scaler mode
+}disp_fb_create_info;
+
+typedef enum
+{
+ DISP_INIT_MODE_SCREEN0 = 0,//fb0 for screen0
+ DISP_INIT_MODE_SCREEN1 = 1,//fb0 for screen1
+ DISP_INIT_MODE_SCREEN2 = 2,//fb0 for screen1
+ DISP_INIT_MODE_TWO_DIFF_SCREEN = 3,//fb0 for screen0 and fb1 for screen1
+ DISP_INIT_MODE_TWO_SAME_SCREEN = 4,//fb0(up buffer for screen0, down buffer for screen1)
+ DISP_INIT_MODE_TWO_DIFF_SCREEN_SAME_CONTENTS = 5,//fb0 for two different screen(screen0 layer is normal layer, screen1 layer is scaler layer);
+}disp_init_mode;
+
+typedef struct
+{
+ int (*hdmi_open)(void);
+ int (*hdmi_close)(void);
+ int (*hdmi_set_mode)(disp_tv_mode mode);
+ int (*hdmi_mode_support)(disp_tv_mode mode);
+ int (*hdmi_get_HPD_status)(void);
+ int (*hdmi_set_pll)(unsigned int pll, unsigned int clk);
+ int (*hdmi_dvi_enable)(unsigned int mode);
+ int (*hdmi_dvi_support)(void);
+ int (*hdmi_get_input_csc)(void);
+ int (*hdmi_get_hdcp_enable)(void);
+ int (*hdmi_get_video_timing_info)(disp_video_timings **video_info);
+ int (*hdmi_suspend)(void);
+ int (*hdmi_resume)(void);
+ int (*hdmi_early_suspend)(void);
+ int (*hdmi_late_resume)(void);
+}disp_hdmi_func;
+
+typedef enum tag_DISP_CMD
+{
+ //----disp global----
+ DISP_RESERVE0 = 0x00,
+ DISP_RESERVE1 = 0x01,
+ DISP_SET_BKCOLOR = 0x03,
+ DISP_GET_BKCOLOR = 0x04,
+ DISP_SET_COLORKEY = 0x05,
+ DISP_GET_COLORKEY = 0x06,
+ DISP_GET_SCN_WIDTH = 0x07,
+ DISP_GET_SCN_HEIGHT = 0x08,
+ DISP_GET_OUTPUT_TYPE = 0x09,
+ DISP_SET_EXIT_MODE = 0x0A,
+ DISP_VSYNC_EVENT_EN = 0x0B,
+ DISP_BLANK = 0x0C,
+ DISP_SHADOW_PROTECT = 0x0D,
+ DISP_HWC_COMMIT = 0x0E,
+ DISP_DEVICE_SWITCH = 0x0F,
+
+ //----layer----
+ DISP_LAYER_ENABLE = 0x40,
+ DISP_LAYER_DISABLE = 0x41,
+ DISP_LAYER_SET_INFO = 0x42,
+ DISP_LAYER_GET_INFO = 0x43,
+ DISP_LAYER_TOP = 0x44,
+ DISP_LAYER_BOTTOM = 0x45,
+ DISP_LAYER_GET_FRAME_ID = 0x46,
+ DISP_LAYER_SET_CONFIG = 0x47,
+ DISP_LAYER_GET_CONFIG = 0x48,
+
+ //----hdmi----
+ DISP_HDMI_ENABLE = 0xc0,
+ DISP_HDMI_DISABLE = 0xc1,
+ DISP_HDMI_SET_MODE = 0xc2,
+ DISP_HDMI_GET_MODE = 0xc3,
+ DISP_HDMI_SUPPORT_MODE = 0xc4,
+ DISP_HDMI_GET_HPD_STATUS = 0xc5,
+ DISP_HDMI_SET_SRC = 0xc6,
+
+ //----lcd----
+ DISP_LCD_ENABLE = 0x100,
+ DISP_LCD_DISABLE = 0x101,
+ DISP_LCD_SET_BRIGHTNESS = 0x102,
+ DISP_LCD_GET_BRIGHTNESS = 0x103,
+ DISP_LCD_BACKLIGHT_ENABLE = 0x104,
+ DISP_LCD_BACKLIGHT_DISABLE = 0x105,
+ DISP_LCD_SET_SRC = 0x106,
+ DISP_LCD_SET_FPS = 0x107,
+ DISP_LCD_GET_FPS = 0x108,
+ DISP_LCD_GET_SIZE = 0x109,
+ DISP_LCD_GET_MODEL_NAME = 0x10a,
+ DISP_LCD_SET_GAMMA_TABLE = 0x10b,
+ DISP_LCD_GAMMA_CORRECTION_ENABLE = 0x10c,
+ DISP_LCD_GAMMA_CORRECTION_DISABLE = 0x10d,
+ DISP_LCD_USER_DEFINED_FUNC = 0x10e,
+ DISP_LCD_CHECK_OPEN_FINISH = 0x10f,
+ DISP_LCD_CHECK_CLOSE_FINISH = 0x110,
+
+ //---- capture ---
+ DISP_CAPTURE_START = 0x140,//caputre screen and scaler to dram
+ DISP_CAPTURE_STOP = 0x141,
+ DISP_CAPTURE_COMMIT = 0x142,
+
+ //---enhance ---
+ DISP_ENHANCE_ENABLE = 0x180,
+ DISP_ENHANCE_DISABLE = 0x181,
+ DISP_ENHANCE_GET_EN = 0x182,
+ DISP_ENHANCE_SET_WINDOW = 0x183,
+ DISP_ENHANCE_GET_WINDOW = 0x184,
+ DISP_ENHANCE_SET_MODE = 0x185,
+ DISP_ENHANCE_GET_MODE = 0x186,
+
+ //---smart backlight ---
+ DISP_SMBL_ENABLE = 0x200,
+ DISP_SMBL_DISABLE = 0x201,
+ DISP_SMBL_GET_EN = 0x202,
+ DISP_SMBL_SET_WINDOW = 0x203,
+ DISP_SMBL_GET_WINDOW = 0x204,
+
+ //---- for test
+ DISP_FB_REQUEST = 0x280,
+ DISP_FB_RELEASE = 0x281,
+
+ DISP_MEM_REQUEST = 0x2c0,
+ DISP_MEM_RELEASE = 0x2c1,
+ DISP_MEM_GETADR = 0x2c2,
+}__DISP_t;
+
+#define FBIOGET_LAYER_HDL_0 0x4700
+#define FBIOGET_LAYER_HDL_1 0x4701
+
+#endif
+
diff --git a/app/src/main/libs/android-support-v4.jar b/app/src/main/libs/android-support-v4.jar
new file mode 100644
index 0000000..2ff47f4
--- /dev/null
+++ b/app/src/main/libs/android-support-v4.jar
Binary files differ
diff --git a/app/src/main/libs/armeabi/libserial_port.so b/app/src/main/libs/armeabi/libserial_port.so
new file mode 100644
index 0000000..49f178f
--- /dev/null
+++ b/app/src/main/libs/armeabi/libserial_port.so
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..8074c4c
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/off.png b/app/src/main/res/drawable-hdpi/off.png
new file mode 100644
index 0000000..2625549
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/off.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/on.png b/app/src/main/res/drawable-hdpi/on.png
new file mode 100644
index 0000000..f3467f6
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/on.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/poweroff.png b/app/src/main/res/drawable-hdpi/poweroff.png
new file mode 100644
index 0000000..deeeeab
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/poweroff.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/poweron.png b/app/src/main/res/drawable-hdpi/poweron.png
new file mode 100644
index 0000000..d6758a4
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/poweron.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/selected.png b/app/src/main/res/drawable-hdpi/selected.png
new file mode 100644
index 0000000..5736141
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/selected.png
Binary files differ
diff --git a/app/src/main/res/drawable-hdpi/unselected.png b/app/src/main/res/drawable-hdpi/unselected.png
new file mode 100644
index 0000000..2073459
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/unselected.png
Binary files differ
diff --git a/app/src/main/res/drawable-ldpi/ic_launcher.png b/app/src/main/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..1095584
--- /dev/null
+++ b/app/src/main/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/drawable-ldpi/setting.png b/app/src/main/res/drawable-ldpi/setting.png
new file mode 100644
index 0000000..6624f71
--- /dev/null
+++ b/app/src/main/res/drawable-ldpi/setting.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..a07c69f
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/app/src/main/res/drawable/btn_rounded.xml b/app/src/main/res/drawable/btn_rounded.xml
new file mode 100644
index 0000000..bc1602a
--- /dev/null
+++ b/app/src/main/res/drawable/btn_rounded.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:state_focused="true"><shape>
+ <corners android:radius="15dip" />
+
+ <solid android:color="#FF9DD7EE" />
+
+ <padding android:bottom="8dp" android:left="55dp" android:right="55dp" android:top="8dp" />
+ </shape></item>
+ <item android:state_pressed="true"><shape>
+ <corners android:radius="15dip" />
+
+ <solid android:color="#FFFF9600" />
+
+ <padding android:bottom="8dp" android:left="55dp" android:right="55dp" android:top="8dp" />
+ </shape></item>
+ <item><shape>
+ <corners android:radius="15dip" />
+
+ <solid android:color="#FF9DD7EE" />
+
+ <padding android:bottom="8dp" android:left="55dp" android:right="55dp" android:top="8dp" />
+ </shape></item>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/gray_thumb.xml b/app/src/main/res/drawable/gray_thumb.xml
new file mode 100644
index 0000000..ab0b24c
--- /dev/null
+++ b/app/src/main/res/drawable/gray_thumb.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+
+ <!-- 楂樺害40 -->
+ <size
+ android:height="60dp"
+ android:width="60dp" />
+ <!-- 鍦嗚寮у害 20 -->
+ <corners android:radius="30dp" />
+
+ <!-- 鍙樺寲鐜� -->
+ <gradient
+ android:endColor="#eeeeee"
+ android:startColor="#eeeeee" />
+
+ <stroke
+ android:width="1dp"
+ android:color="#BABABA" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/gray_track.xml b/app/src/main/res/drawable/gray_track.xml
new file mode 100644
index 0000000..ba5675f
--- /dev/null
+++ b/app/src/main/res/drawable/gray_track.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+
+ <!-- 楂樺害30 姝ゅ璁剧疆瀹藉害鏃犳晥 -->
+ <size android:height="60dp" />
+ <!-- 鍦嗚寮у害 15 -->
+ <corners android:radius="30dp" />
+
+ <!-- 鍙樺寲鐜� 瀹氫箟浠庡乏鍒板彸鐨勯鑹蹭笉鍙� -->
+ <gradient
+ android:endColor="#BABABA"
+ android:startColor="#BABABA" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/green_thumb.xml b/app/src/main/res/drawable/green_thumb.xml
new file mode 100644
index 0000000..ec0fdca
--- /dev/null
+++ b/app/src/main/res/drawable/green_thumb.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle" >
+
+ <!-- 楂樺害40 -->
+ <size
+ android:height="60dp"
+ android:width="60dp" />
+ <!-- 鍦嗚寮у害 20 -->
+ <corners android:radius="30dp" />
+
+ <!-- 鍙樺寲鐜� -->
+ <gradient
+ android:endColor="#eeeeee"
+ android:startColor="#eeeeee" />
+
+ <stroke
+ android:width="1dp"
+ android:color="#50C1E9" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/green_track.xml b/app/src/main/res/drawable/green_track.xml
new file mode 100644
index 0000000..a9d5d7b
--- /dev/null
+++ b/app/src/main/res/drawable/green_track.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <!-- 楂樺害40 -->
+ <size android:height="60dp" />
+ <!-- 鍦嗚寮у害 20 -->
+ <corners android:radius="30dp" />
+ <!-- 鍙樺寲鐜� -->
+ <gradient
+ android:endColor="#CC50C1E9"
+ android:startColor="#CC50C1E9" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/light.png b/app/src/main/res/drawable/light.png
new file mode 100644
index 0000000..17f86a8
--- /dev/null
+++ b/app/src/main/res/drawable/light.png
Binary files differ
diff --git a/app/src/main/res/drawable/light_def.png b/app/src/main/res/drawable/light_def.png
new file mode 100644
index 0000000..6918043
--- /dev/null
+++ b/app/src/main/res/drawable/light_def.png
Binary files differ
diff --git a/app/src/main/res/drawable/line.xml b/app/src/main/res/drawable/line.xml
new file mode 100644
index 0000000..0938bb2
--- /dev/null
+++ b/app/src/main/res/drawable/line.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="line" >
+
+ <!-- 鏄剧ず涓�鏉¤櫄绾匡紝鐮存姌绾跨殑瀹藉害涓� dashWith锛岀牬鎶樼嚎涔嬮棿鐨勭┖闅欑殑瀹藉害涓� dashGap锛屽綋 dashGap=0dp 鏃讹紝涓哄疄绾� -->
+
+ <item
+ android:left="-2dp"
+ android:right="-2dp"
+ android:top="-2dp">
+ <shape>
+ <stroke
+ android:dashGap="0dp"
+ android:dashWidth="1dp"
+ android:width="1dp"
+ android:color="#A9A9A9" />
+
+ <size android:height="1px" />
+ </shape>
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/line_white.xml b/app/src/main/res/drawable/line_white.xml
new file mode 100644
index 0000000..1fea5cd
--- /dev/null
+++ b/app/src/main/res/drawable/line_white.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="line" >
+
+ <!-- 鏄剧ず涓�鏉¤櫄绾匡紝鐮存姌绾跨殑瀹藉害涓� dashWith锛岀牬鎶樼嚎涔嬮棿鐨勭┖闅欑殑瀹藉害涓� dashGap锛屽綋 dashGap=0dp 鏃讹紝涓哄疄绾� -->
+
+ <item
+ android:left="-2dp"
+ android:right="-2dp"
+ android:top="-2dp">
+ <shape>
+ <stroke
+ android:dashGap="0dp"
+ android:dashWidth="1dp"
+ android:width="1dp"
+ android:color="#ffffff" />
+
+ <size android:height="1px" />
+ </shape>
+ </item>
+
+</layer-list>
diff --git a/app/src/main/res/drawable/my_seekbar_normal.xml b/app/src/main/res/drawable/my_seekbar_normal.xml
new file mode 100644
index 0000000..40327c5
--- /dev/null
+++ b/app/src/main/res/drawable/my_seekbar_normal.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="line" >
+
+ <!-- 鏄剧ず涓�鏉¤櫄绾匡紝鐮存姌绾跨殑瀹藉害涓� dashWith锛岀牬鎶樼嚎涔嬮棿鐨勭┖闅欑殑瀹藉害涓� dashGap锛屽綋 dashGap=0dp 鏃讹紝涓哄疄绾� -->
+ <solid android:color="#eeeeee" />
+
+ <size android:height="2dp" />
+
+ <stroke
+ android:dashGap="0dp"
+ android:dashWidth="2dp"
+ android:width="2dp"
+ android:color="#eeeeee" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/my_seekbar_pressed.xml b/app/src/main/res/drawable/my_seekbar_pressed.xml
new file mode 100644
index 0000000..7b6b896
--- /dev/null
+++ b/app/src/main/res/drawable/my_seekbar_pressed.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="line" >
+
+ <!-- 鏄剧ず涓�鏉¤櫄绾匡紝鐮存姌绾跨殑瀹藉害涓� dashWith锛岀牬鎶樼嚎涔嬮棿鐨勭┖闅欑殑瀹藉害涓� dashGap锛屽綋 dashGap=0dp 鏃讹紝涓哄疄绾� -->
+ <solid android:color="#eeeeee" />
+
+ <size android:height="4dp" />
+
+ <stroke
+ android:dashGap="0dp"
+ android:dashWidth="2dp"
+ android:width="2dp"
+ android:color="#4CAF50" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/my_seekbar_thumb_normal.xml b/app/src/main/res/drawable/my_seekbar_thumb_normal.xml
new file mode 100644
index 0000000..55d47de
--- /dev/null
+++ b/app/src/main/res/drawable/my_seekbar_thumb_normal.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval"
+ android:useLevel="false" >
+
+ <stroke
+ android:dashGap="0dp"
+ android:dashWidth="1px"
+ android:width="1px"
+ android:color="#DADADA" />
+
+ <solid android:color="#DADADA" />
+
+ <size
+ android:height="20dp"
+ android:width="20dp" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/my_seekbar_thumb_pressed.xml b/app/src/main/res/drawable/my_seekbar_thumb_pressed.xml
new file mode 100644
index 0000000..9e9f9bc
--- /dev/null
+++ b/app/src/main/res/drawable/my_seekbar_thumb_pressed.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval"
+ android:useLevel="false" >
+
+ <stroke
+ android:dashGap="0dp"
+ android:dashWidth="1px"
+ android:width="1px"
+ android:color="#888888" />
+
+ <solid android:color="#888888" />
+
+ <size
+ android:height="40dp"
+ android:width="40dp" />
+
+</shape>
diff --git a/app/src/main/res/drawable/seekbar_color_style.xml b/app/src/main/res/drawable/seekbar_color_style.xml
new file mode 100644
index 0000000..970df49
--- /dev/null
+++ b/app/src/main/res/drawable/seekbar_color_style.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <item android:id="@android:id/background">
+ <shape>
+ <corners android:radius="8dp" />
+
+ <solid android:color="#DADADA" />
+ </shape>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape>
+ <corners android:radius="8dp" />
+
+ <solid android:color="#CC50C1E9" />
+ </shape>
+ </clip>
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/thumb.xml b/app/src/main/res/drawable/thumb.xml
new file mode 100644
index 0000000..6270bdc
--- /dev/null
+++ b/app/src/main/res/drawable/thumb.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 鎸夐挳鐨勯�夋嫨鍣紝鍙互璁剧疆鎸夐挳鍦ㄤ笉鍚岀姸鎬佷笅鐨勬椂鍊欙紝鎸夐挳涓嶅悓鐨勯鑹� -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:drawable="@drawable/green_thumb" android:state_checked="true"/>
+ <item android:drawable="@drawable/gray_thumb"/>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/track.xml b/app/src/main/res/drawable/track.xml
new file mode 100644
index 0000000..5d08bc7
--- /dev/null
+++ b/app/src/main/res/drawable/track.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 搴曞眰涓嬫粦鏉$殑鏍峰紡閫夋嫨鍣紝鍙帶鍒禨witch鍦ㄤ笉鍚岀姸鎬佷笅锛屽簳涓嬩笅婊戞潯鐨勯鑹� -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:drawable="@drawable/green_track" android:state_checked="true"/>
+ <item android:drawable="@drawable/gray_track"/>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..6ff088a
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ tools:context="android.serialport.api.sample.MainActivity" >
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <include
+ android:id="@+id/TabLayout"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ layout="@layout/tab" />
+
+ <ImageView
+ android:id="@+id/tab_image"
+ android:layout_width="100dp"
+ android:layout_height="3dp"
+ android:layout_below="@id/TabLayout"
+ android:background="#FF000000" />
+
+ <android.support.v4.view.ViewPager
+ android:id="@+id/mViewPager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@id/tab_image" />
+
+ </RelativeLayout>
+
+ <fragment
+ android:id="@+id/navigation_drawer"
+ android:name="android.serialport.api.sample.NavigationDrawerFragment"
+ android:layout_width="400dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ tools:layout="@layout/fragment_navigation" />
+
+</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/console.xml b/app/src/main/res/layout/console.xml
new file mode 100644
index 0000000..056e807
--- /dev/null
+++ b/app/src/main/res/layout/console.xml
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:keepScreenOn="true"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:background="#BB50C1E9"
+ android:orientation="horizontal" >
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="30dp"
+ android:gravity="center" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="10dp"
+ android:text="Dry Contact:"
+ android:textColor="#ffffff"
+ android:textSize="20sp" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="center|left" >
+
+ <RadioButton
+ android:id="@+id/radioButton1"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:enabled="false"
+ android:text="1"
+ android:textColor="#ffffff" />
+
+ <RadioButton
+ android:id="@+id/radioButton2"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:enabled="false"
+ android:text="2"
+ android:textColor="#ffffff" />
+
+ <RadioButton
+ android:id="@+id/radioButton3"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:enabled="false"
+ android:text="3"
+ android:textColor="#ffffff" />
+
+ <RadioButton
+ android:id="@+id/radioButton4"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:enabled="false"
+ android:text="4"
+ android:textColor="#ffffff" />
+
+ <RadioButton
+ android:id="@+id/radioButton5"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:enabled="false"
+ android:text="5"
+ android:textColor="#ffffff" />
+
+ <RadioButton
+ android:id="@+id/radioButton6"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginRight="6dp"
+ android:enabled="false"
+ android:text="6"
+ android:textColor="#ffffff" />
+ </LinearLayout>
+
+ <Button
+ android:id="@+id/btn_state"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:layout_marginBottom="20dp"
+ android:layout_marginRight="20dp"
+ android:layout_marginTop="20dp"
+ android:background="@null"
+ android:gravity="center|right"
+ android:minWidth="80dp" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="9"
+ android:orientation="horizontal" >
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:layout_marginTop="30dp"
+ android:text="Relay:"
+ android:textSize="20sp" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:layout_weight="1"
+ android:gravity="center" >
+
+ <Switch
+ android:id="@+id/loopId1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:switchTextAppearance="@style/MySwitch"
+ android:textOff="OFF"
+ android:textOn="ON"
+ android:thumb="@drawable/thumb"
+ android:track="@drawable/track" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:layout_weight="1"
+ android:gravity="center" >
+
+ <Switch
+ android:id="@+id/loopId2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:switchTextAppearance="@style/MySwitch"
+ android:textOff="OFF"
+ android:textOn="ON"
+ android:thumb="@drawable/thumb"
+ android:track="@drawable/track" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:layout_weight="1"
+ android:gravity="center" >
+
+ <Switch
+ android:id="@+id/loopId3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:switchTextAppearance="@style/MySwitch"
+ android:textOff="OFF"
+ android:textOn="ON"
+ android:thumb="@drawable/thumb"
+ android:track="@drawable/track" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:layout_weight="1"
+ android:gravity="center" >
+
+ <Switch
+ android:id="@+id/loopId4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:switchTextAppearance="@style/MySwitch"
+ android:textOff="OFF"
+ android:textOn="ON"
+ android:thumb="@drawable/thumb"
+ android:track="@drawable/track" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="1dp"
+ android:layout_height="match_parent"
+ android:background="#8BD5EE" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center|left"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:layout_marginRight="10dp"
+ android:text="Compensation:"
+ android:textSize="20dp" />
+
+ <EditText
+ android:id="@+id/c_value"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="@drawable/line"
+ android:digits="-0123456789"
+ android:gravity="center"
+ android:minWidth="40dp"
+ android:text="0"
+ android:textColor="#FF0000" />
+
+ <Button
+ android:id="@+id/c_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="20dp"
+ android:layout_marginRight="10dp"
+ android:text="Save" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center|left"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:text="Temperature:"
+ android:textSize="20dp" />
+
+ <EditText
+ android:id="@+id/Temperature"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="20dp"
+ android:layout_weight="1"
+ android:background="@drawable/line"
+ android:enabled="false"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ android:gravity="center"
+ android:textColor="#FF0000" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center|left"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:text="Key Status:"
+ android:textSize="20dp" />
+
+ <EditText
+ android:id="@+id/key_status"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="20dp"
+ android:layout_weight="1"
+ android:background="@drawable/line"
+ android:enabled="false"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ android:gravity="center"
+ android:textColor="#FF0000" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center|left"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:text="Sensitivity:"
+ android:textSize="20sp" />
+
+ <SeekBar
+ android:id="@+id/set_sensitivity"
+ style="@android:attr/progressBarStyleHorizontal"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:layout_weight="1"
+ android:max="10"
+ android:maxHeight="5dp"
+ android:minHeight="5dp"
+ android:progressDrawable="@drawable/seekbar_color_style"
+ android:thumb="@drawable/my_seekbar_thumb_pressed"
+ android:thumbOffset="0dip" />
+
+ <TextView
+ android:id="@+id/seekbar_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="5dp"
+ android:layout_marginRight="20dp"
+ android:minWidth="20dp" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center|left"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:text="SerialPort:"
+ android:textSize="20sp" />
+
+ <Switch
+ android:id="@+id/powerButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:switchTextAppearance="@style/MySwitch"
+ android:textOff="OFF"
+ android:textOn="ON"
+ android:thumb="@drawable/thumb"
+ android:track="@drawable/track" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center|left" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="30dp"
+ android:text="BackLight"
+ android:textSize="20sp" />
+
+ <Switch
+ android:id="@+id/openbacklight"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dp"
+ android:switchTextAppearance="@style/MySwitch"
+ android:textOff="OFF"
+ android:textOn="ON"
+ android:thumb="@drawable/thumb"
+ android:track="@drawable/track" />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_pro.xml b/app/src/main/res/layout/dialog_pro.xml
new file mode 100644
index 0000000..88c7729
--- /dev/null
+++ b/app/src/main/res/layout/dialog_pro.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="姝e湪鍗囩骇鍥轰欢锛岃鍕胯繘琛屽叾浠栨搷浣滐紒锛侊紒"
+ android:textSize="30dp"
+ android:textColor="@color/red"
+ />
+ <ProgressBar
+ android:id="@+id/pro"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:max="100"
+ android:progress="30" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_knx.xml b/app/src/main/res/layout/fragment_knx.xml
new file mode 100644
index 0000000..79eebf4
--- /dev/null
+++ b/app/src/main/res/layout/fragment_knx.xml
@@ -0,0 +1,395 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="20dp"
+ android:layout_marginRight="10dp"
+ android:text="individual_addr:" />
+
+ <EditText
+ android:layout_width="90dp"
+ android:layout_height="wrap_content"
+ android:hint="1101"
+ android:text="1101" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:orientation="horizontal" >
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="40dp"
+ android:layout_marginRight="40dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="5dp"
+ android:layout_marginBottom="5dp"
+ android:text="Channel 1:" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_marginTop="5dp"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/light1_1"
+ android:layout_width="90dp"
+ android:layout_height="90dp"
+ android:layout_marginBottom="10dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:background="@drawable/light_def" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="120dp"
+ android:layout_weight="1"
+ android:layout_marginTop="5dp"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Switch:" />
+
+ <EditText
+ android:id="@+id/edit_obj1_1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/1"
+ android:text="1/0/1" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Status:" />
+
+ <EditText
+ android:id="@+id/edit_obj1_2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/2"
+ android:text="1/0/2" />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center" >
+
+ <Button
+ android:id="@+id/switch_btn1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Save" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="40dp"
+ android:layout_marginRight="40dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="5dp"
+ android:layout_marginBottom="5dp"
+ android:text="Channel 2:" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_marginTop="5dp"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/light_2"
+ android:layout_width="90dp"
+ android:layout_height="90dp"
+ android:layout_marginBottom="10dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:background="@drawable/light_def" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="120dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Switch:" />
+
+ <EditText
+ android:id="@+id/edit_obj2_1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/1"
+ android:text="1/0/3" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Status:" />
+
+ <EditText
+ android:id="@+id/edit_obj2_2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/2"
+ android:text="1/0/4" />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center" >
+
+ <Button
+ android:id="@+id/switch_btn2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Save" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="40dp"
+ android:layout_marginRight="40dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="5dp"
+ android:layout_marginBottom="5dp"
+ android:text="Channel 3:" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_marginTop="5dp"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/light_3"
+ android:layout_width="90dp"
+ android:layout_height="90dp"
+ android:layout_marginBottom="10dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:background="@drawable/light_def" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="120dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Switch:" />
+
+ <EditText
+ android:id="@+id/edit_obj3_1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/1"
+ android:text="1/0/5" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Status:" />
+
+ <EditText
+ android:id="@+id/edit_obj3_2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/2"
+ android:text="1/0/6" />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center" >
+
+ <Button
+ android:id="@+id/switch_btn3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Save" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="40dp"
+ android:layout_marginRight="40dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="5dp"
+ android:layout_marginTop="5dp"
+ android:text="Channel 4:" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_marginTop="5dp"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/light_4"
+ android:layout_width="90dp"
+ android:layout_height="90dp"
+ android:layout_marginBottom="10dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:background="@drawable/light_def" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="120dp"
+ android:layout_weight="1"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Switch:" />
+
+ <EditText
+ android:id="@+id/edit_obj4_1"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/1"
+ android:text="1/0/7" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Status:" />
+
+ <EditText
+ android:id="@+id/edit_obj4_2"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:hint="1/0/2"
+ android:text="1/0/8" />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center" >
+
+ <Button
+ android:id="@+id/switch_btn4"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Save" />
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_navigation.xml b/app/src/main/res/layout/fragment_navigation.xml
new file mode 100644
index 0000000..9b22d7c
--- /dev/null
+++ b/app/src/main/res/layout/fragment_navigation.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#50C1E9"
+ android:orientation="vertical" >
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_marginTop="50dp"
+ android:background="@drawable/setting" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_marginBottom="30dp"
+ android:layout_marginTop="5dp"
+ android:text="Setting"
+ android:textColor="#ffffff"
+ android:textSize="30sp" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="40dp"
+ android:layout_marginRight="40dp"
+ android:layout_marginTop="15dp"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="SubNetID:"
+ android:textColor="#ffffff" />
+
+ <EditText
+ android:id="@+id/editText_SubNet"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="4dp"
+ android:layout_weight="1"
+ android:background="@drawable/line_white"
+ android:digits="0123456789"
+ android:gravity="center"
+ android:minWidth="40dp"
+ android:text="250"
+ android:textColor="#ffffff" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="40dp"
+ android:layout_marginRight="40dp"
+ android:layout_marginTop="55dp"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="SubNetID:"
+ android:textColor="#ffffff" />
+
+ <EditText
+ android:id="@+id/editText_Device"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="4dp"
+ android:layout_weight="1"
+ android:background="@drawable/line_white"
+ android:digits="0123456789"
+ android:gravity="center"
+ android:minWidth="40dp"
+ android:text="250"
+ android:textColor="#ffffff" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="20dp"
+ android:layout_marginTop="65dp"
+ android:gravity="center"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/save_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/btn_rounded"
+ android:textColor="#ffffff"
+ android:text="Save"
+ android:textSize="25sp" />
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_upgrade.xml b/app/src/main/res/layout/fragment_upgrade.xml
new file mode 100644
index 0000000..8b608ea
--- /dev/null
+++ b/app/src/main/res/layout/fragment_upgrade.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:orientation="horizontal" >
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="2"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Root Directory:" />
+
+ <EditText
+ android:id="@+id/EditText_Path"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:enabled="false" />
+
+ <Button
+ android:id="@+id/Btn_path"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="5dp"
+ android:layout_marginRight="5dp"
+ android:text="鈥�" />
+
+ <Button
+ android:id="@+id/Btn_Upgrade"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Upgrade" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/tab.xml b/app/src/main/res/layout/tab.xml
new file mode 100644
index 0000000..eb2e080
--- /dev/null
+++ b/app/src/main/res/layout/tab.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:orientation="vertical" >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/textView_bus"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:text="BUS"
+ android:textSize="20dp" />
+
+ <TextView
+ android:id="@+id/textView_knx"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:text="KNX"
+ android:textSize="20dp" />
+
+ <TextView
+ android:id="@+id/textView_upgrade"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:text="Upgrade"
+ android:textSize="20dp" />
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/baudrates.xml b/app/src/main/res/values/baudrates.xml
new file mode 100644
index 0000000..1437699
--- /dev/null
+++ b/app/src/main/res/values/baudrates.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string-array name="baudrates_name">
+ <item>4800</item>
+ <item>9600</item>
+ <item>19200</item>
+ </string-array>
+ <string-array name="baudrates_value">
+ <item>4800</item>
+ <item>9600</item>
+ <item>19200</item>
+ </string-array>
+
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..3fdb028
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <color name="transparent">#00000000</color>
+ <color name="red">#FFFF0000</color>
+
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..c74fa88
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_name">Serial Port Demo</string>
+ <string name="error_configuration">Please configure your serial port first.</string>
+ <string name="error_security">You do not have read/write permission to the serial
+ port.</string>
+ <string name="error_unknown">The serial port can not be opened for an unknown
+ reason.</string>
+
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..b8c4ca7
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,39 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Light">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="android:Theme.Light.NoTitleBar.Fullscreen">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+ <style name="MySwitch" parent="android:Theme.Light">
+ <item name="android:textSize">20sp</item>
+ <item name="android:textColor">#000</item>
+ </style>
+
+ <style name="Theme_Transparent" parent="@android:Theme.DeviceDefault.Light.Dialog">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowNoTitle">true</item>
+ </style>
+
+ <style name="Theme_Transparent_NoTitle" parent="@android:Theme.DeviceDefault.Light.Dialog">
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/white</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowNoTitle">true</item>
+ </style>
+
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/xml/serial_port_preferences.xml b/app/src/main/res/xml/serial_port_preferences.xml
new file mode 100644
index 0000000..b23dfe6
--- /dev/null
+++ b/app/src/main/res/xml/serial_port_preferences.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="Serial port setup" >
+
+ <ListPreference
+ android:key="DEVICE"
+ android:persistent="true"
+ android:title="Device" >
+ </ListPreference>
+ <ListPreference
+ android:entries="@array/baudrates_name"
+ android:entryValues="@array/baudrates_value"
+ android:key="BAUDRATE"
+ android:persistent="true"
+ android:title="Baud rate" >
+ </ListPreference>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..c73f568
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,20 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.3.0'
+// classpath 'com.novoda:bintray-release:+'
+
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..8eb349c
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 25 09:40:34 GMT+08:00 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# 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
+ ;;
+ 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"
+ which java >/dev/null 2>&1 || 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
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@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=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@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=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+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 init
+
+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
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+: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 %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="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!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/import-summary.txt b/import-summary.txt
new file mode 100644
index 0000000..dff6cc9
--- /dev/null
+++ b/import-summary.txt
@@ -0,0 +1,61 @@
+ECLIPSE ANDROID PROJECT IMPORT SUMMARY
+======================================
+
+Ignored Files:
+--------------
+The following files were *not* copied into the new Gradle project; you
+should evaluate whether these are still needed in your project and if
+so manually move them:
+
+* .idea\
+* .idea\.name
+* .idea\compiler.xml
+* .idea\copyright\
+* .idea\copyright\profiles_settings.xml
+* .idea\encodings.xml
+* .idea\misc.xml
+* .idea\modules.xml
+* .idea\myserial.iml
+* .idea\scopes\
+* .idea\scopes\scope_settings.xml
+* .idea\vcs.xml
+* .idea\workspace.xml
+* proguard.cfg
+
+Replaced Jars with Dependencies:
+--------------------------------
+The importer recognized the following .jar files as third party
+libraries and replaced them with Gradle dependencies instead. This has
+the advantage that more explicit version information is known, and the
+libraries can be updated automatically. However, it is possible that
+the .jar file in your project was of an older version than the
+dependency we picked, which could render the project not compileable.
+You can disable the jar replacement in the import wizard and try again:
+
+android-support-v4.jar => com.android.support:support-v4:22.2.1
+
+Moved Files:
+------------
+Android Gradle projects use a different directory structure than ADT
+Eclipse projects. Here's how the projects were restructured:
+
+* AndroidManifest.xml => app\src\main\AndroidManifest.xml
+* assets\ => app\src\main\assets\
+* jni\ => app\src\main\jni\
+* res\ => app\src\main\res\
+* src\ => app\src\main\java\
+
+Next Steps:
+-----------
+You can now build the project. The Gradle project needs network
+connectivity to download dependencies.
+
+Bugs:
+-----
+If for some reason your project does not build, and you determine that
+it is due to a bug or limitation of the Eclipse to Gradle importer,
+please file a bug at http://b.android.com with category
+Component-Tools.
+
+(This import summary is for your information only, and can be deleted
+after import once you are satisfied with the results.)
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..d3db109
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'
--
Gitblit v1.8.0