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