diff --git a/RemoveMarineAnimals/.gitignore b/RemoveMarineAnimals/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/RemoveMarineAnimals/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/RemoveMarineAnimals/.idea/.gitignore b/RemoveMarineAnimals/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/RemoveMarineAnimals/.idea/compiler.xml b/RemoveMarineAnimals/.idea/compiler.xml
new file mode 100644
index 0000000..b86273d
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/deploymentTargetDropDown.xml b/RemoveMarineAnimals/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..0c0c338
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/deploymentTargetSelector.xml b/RemoveMarineAnimals/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/gradle.xml b/RemoveMarineAnimals/.idea/gradle.xml
new file mode 100644
index 0000000..7b3006b
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/gradle.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/migrations.xml b/RemoveMarineAnimals/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/misc.xml b/RemoveMarineAnimals/.idea/misc.xml
new file mode 100644
index 0000000..b2c751a
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/render.experimental.xml b/RemoveMarineAnimals/.idea/render.experimental.xml
new file mode 100644
index 0000000..8ec256a
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/render.experimental.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/.idea/runConfigurations.xml b/RemoveMarineAnimals/.idea/runConfigurations.xml
new file mode 100644
index 0000000..16660f1
--- /dev/null
+++ b/RemoveMarineAnimals/.idea/runConfigurations.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/.gitignore b/RemoveMarineAnimals/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/RemoveMarineAnimals/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/build.gradle b/RemoveMarineAnimals/app/build.gradle
new file mode 100644
index 0000000..5bc7bbf
--- /dev/null
+++ b/RemoveMarineAnimals/app/build.gradle
@@ -0,0 +1,59 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ namespace 'com.example.removemarineanimals'
+ compileSdk 34
+ // //add this feature
+ viewBinding
+ {
+ enabled true
+ }
+ // //add this feature
+ dataBinding
+ {
+ enabled true
+ }
+ defaultConfig {
+ applicationId "com.example.removemarineanimals"
+ minSdk 24
+ targetSdk 34
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+
+
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ //add this feature
+ buildFeatures{
+ buildConfig true
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.9.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
+ implementation 'com.github.mik3y:usb-serial-for-android:3.7.0'
+ implementation 'com.google.protobuf:protobuf-java:4.27.2'
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20")
+ implementation 'com.github.nodemedia:nodemediaclient-android:2.9.20'
+}
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/proguard-rules.pro b/RemoveMarineAnimals/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/RemoveMarineAnimals/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/androidTest/java/com/example/removemarineanimals/ExampleInstrumentedTest.java b/RemoveMarineAnimals/app/src/androidTest/java/com/example/removemarineanimals/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..6a26675
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/androidTest/java/com/example/removemarineanimals/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.removemarineanimals;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.removemarineanimals", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/AndroidManifest.xml b/RemoveMarineAnimals/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..9855f77
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/AndroidManifest.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/demo.css b/RemoveMarineAnimals/app/src/main/assets/iconfront/demo.css
new file mode 100644
index 0000000..a67054a
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/assets/iconfront/demo.css
@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+ font-family: "iconfont logo";
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+ src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+ url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+ font-family: "iconfont logo";
+ font-size: 160px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+ position: relative;
+}
+
+.nav-tabs .nav-more {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ height: 42px;
+ line-height: 42px;
+ color: #666;
+}
+
+#tabs {
+ border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+ cursor: pointer;
+ width: 100px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ font-size: 16px;
+ border-bottom: 2px solid transparent;
+ position: relative;
+ z-index: 1;
+ margin-bottom: -1px;
+ color: #666;
+}
+
+
+#tabs .active {
+ border-bottom-color: #f00;
+ color: #222;
+}
+
+.tab-container .content {
+ display: none;
+}
+
+/* 页面布局 */
+.main {
+ padding: 30px 100px;
+ width: 960px;
+ margin: 0 auto;
+}
+
+.main .logo {
+ color: #333;
+ text-align: left;
+ margin-bottom: 30px;
+ line-height: 1;
+ height: 110px;
+ margin-top: -50px;
+ overflow: hidden;
+ *zoom: 1;
+}
+
+.main .logo a {
+ font-size: 160px;
+ color: #333;
+}
+
+.helps {
+ margin-top: 40px;
+}
+
+.helps pre {
+ padding: 20px;
+ margin: 10px 0;
+ border: solid 1px #e7e1cd;
+ background-color: #fffdef;
+ overflow: auto;
+}
+
+.icon_lists {
+ width: 100% !important;
+ overflow: hidden;
+ *zoom: 1;
+}
+
+.icon_lists li {
+ width: 100px;
+ margin-bottom: 10px;
+ margin-right: 20px;
+ text-align: center;
+ list-style: none !important;
+ cursor: default;
+}
+
+.icon_lists li .code-name {
+ line-height: 1.2;
+}
+
+.icon_lists .icon {
+ display: block;
+ height: 100px;
+ line-height: 100px;
+ font-size: 42px;
+ margin: 10px auto;
+ color: #333;
+ -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+ -moz-transition: font-size 0.25s linear, width 0.25s linear;
+ transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+ font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+ /* 通过设置 font-size 来改变图标大小 */
+ width: 1em;
+ /* 图标和文字相邻时,垂直对齐 */
+ vertical-align: -0.15em;
+ /* 通过设置 color 来改变 SVG 的颜色/fill */
+ fill: currentColor;
+ /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+ normalize.css 中也包含这行 */
+ overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+ color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+ color: #666;
+ font-size: 14px;
+ line-height: 1.8;
+}
+
+.highlight {
+ line-height: 1.5;
+}
+
+.markdown img {
+ vertical-align: middle;
+ max-width: 100%;
+}
+
+.markdown h1 {
+ color: #404040;
+ font-weight: 500;
+ line-height: 40px;
+ margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+ color: #404040;
+ margin: 1.6em 0 0.6em 0;
+ font-weight: 500;
+ clear: both;
+}
+
+.markdown h1 {
+ font-size: 28px;
+}
+
+.markdown h2 {
+ font-size: 22px;
+}
+
+.markdown h3 {
+ font-size: 16px;
+}
+
+.markdown h4 {
+ font-size: 14px;
+}
+
+.markdown h5 {
+ font-size: 12px;
+}
+
+.markdown h6 {
+ font-size: 12px;
+}
+
+.markdown hr {
+ height: 1px;
+ border: 0;
+ background: #e9e9e9;
+ margin: 16px 0;
+ clear: both;
+}
+
+.markdown p {
+ margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+ width: 80%;
+}
+
+.markdown ul>li {
+ list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+ margin: 0.6em 0;
+}
+
+.markdown ol>li {
+ list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown code {
+ margin: 0 3px;
+ padding: 0 5px;
+ background: #eee;
+ border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+ font-weight: 600;
+}
+
+.markdown>table {
+ border-collapse: collapse;
+ border-spacing: 0px;
+ empty-cells: show;
+ border: 1px solid #e9e9e9;
+ width: 95%;
+ margin-bottom: 24px;
+}
+
+.markdown>table th {
+ white-space: nowrap;
+ color: #333;
+ font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+ border: 1px solid #e9e9e9;
+ padding: 8px 16px;
+ text-align: left;
+}
+
+.markdown>table th {
+ background: #F7F7F7;
+}
+
+.markdown blockquote {
+ font-size: 90%;
+ color: #999;
+ border-left: 4px solid #e9e9e9;
+ padding-left: 0.8em;
+ margin: 1em 0;
+}
+
+.markdown blockquote p {
+ margin: 0;
+}
+
+.markdown .anchor {
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ margin-left: 8px;
+}
+
+.markdown .waiting {
+ color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+ opacity: 1;
+ display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+ clear: both;
+}
+
+
+.hljs {
+ display: block;
+ background: white;
+ padding: 0.5em;
+ color: #333333;
+ overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+ color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+ color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+ color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+ color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+ color: #63a35c;
+}
+
+.hljs-tag {
+ color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #795da3;
+}
+
+.hljs-addition {
+ color: #55a532;
+ background-color: #eaffea;
+}
+
+.hljs-deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+}
+
+.hljs-link {
+ text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+@media print {
+
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: .5em 0;
+ overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+ padding: .1em;
+ border-radius: .3em;
+ white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+
+.token.punctuation {
+ color: #999;
+}
+
+.namespace {
+ opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+
+.token.italic {
+ font-style: italic;
+}
+
+.token.entity {
+ cursor: help;
+}
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/demo_index.html b/RemoveMarineAnimals/app/src/main/assets/iconfront/demo_index.html
new file mode 100644
index 0000000..2347919
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/assets/iconfront/demo_index.html
@@ -0,0 +1,4236 @@
+
+
+
+
+ iconfont Demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - Unicode
+ - Font class
+ - Symbol
+
+
+
查看项目
+
+
+
+
+
+
+ -
+
+
answer
+ 
+
+
+ -
+
+
app
+ 
+
+
+ -
+
+
browser
+ 
+
+
+ -
+
+
camera
+ 
+
+
+ -
+
+
cart
+ 
+
+
+ -
+
+
check
+ 
+
+
+ -
+
+
code
+ 
+
+
+ -
+
+
computer
+ 
+
+
+ -
+
+
delete
+ 
+
+
+ -
+
+
deliver
+ 
+
+
+ -
+
+
display
+ 
+
+
+ -
+
+
down
+ 
+
+
+ -
+
+
download
+ 
+
+
+ -
+
+
edit
+ 
+
+
+ -
+
+
favor
+ 
+
+
+ -
+
+
file
+ 
+
+
+ -
+
+
fill
+ 
+
+
+ -
+
+
fold
+ 
+
+
+ -
+
+
folder
+ 
+
+
+ -
+
+
hide
+ 
+
+
+ -
+
+
home
+ 
+
+
+ -
+
+
information
+ 
+
+
+ -
+
+
link
+ 
+
+
+ -
+
+
报警
+ 
+
+
+ -
+
+
任务
+ 
+
+
+ -
+
+
用户
+ 
+
+
+ -
+
+
详情
+ 
+
+
+ -
+
+
柱状图
+ 
+
+
+ -
+
+
授信管理
+ 
+
+
+ -
+
+
服务器
+ 
+
+
+ -
+
+
任务
+ 
+
+
+ -
+
+
物品箱
+ 
+
+
+ -
+
+
详情
+ 
+
+
+ -
+
+
折线图
+ 
+
+
+ -
+
+
结构
+ 
+
+
+ -
+
+
工作台
+ 
+
+
+ -
+
+
设置
+ 
+
+
+ -
+
+
产品
+ 
+
+
+ -
+
+
流程
+ 
+
+
+ -
+
+
用户
+ 
+
+
+ -
+
+
借款申请
+ 
+
+
+ -
+
+
最大化
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
最大化
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
最小化
+ 
+
+
+ -
+
+
304错误、关闭、取消
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
最小化
+ 
+
+
+ -
+
+
关闭
+ 
+
+
+ -
+
+
退出
+ 
+
+
+ -
+
+
退出
+ 
+
+
+ -
+
+
退出
+ 
+
+
+ -
+
+
配置管理
+ 
+
+
+ -
+
+
测试,实验
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
智能科技-icon-柔性自动化线
+ 
+
+
+ -
+
+
agora_面向用例的解决方案
+ 
+
+
+ -
+
+
配置-运维配置
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
编辑
+ 
+
+
+ -
+
+
车型
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
产品压力测试
+ 
+
+
+ -
+
+
2-1配置管理
+ 
+
+
+ -
+
+
小胖车查车型
+ 
+
+
+ -
+
+
自动化
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
任务 管理
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
节点事 件测试
+ 
+
+
+ -
+
+
日志管理
+ 
+
+
+ -
+
+
系统日志
+ 
+
+
+ -
+
+
网络
+ 
+
+
+ -
+
+
网络自动化
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
车型-线性3-0
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
工业自动化
+ 
+
+
+ -
+
+
iServer数据接入测试
+ 
+
+
+ -
+
+
倾斜入库测试
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
配置管理
+ 
+
+
+ -
+
+
车型管理
+ 
+
+
+ -
+
+
网段
+ 
+
+
+ -
+
+
部门管理
+ 
+
+
+ -
+
+
配置管理
+ 
+
+
+ -
+
+
配置管理
+ 
+
+
+ -
+
+
自动化运维
+ 
+
+
+ -
+
+
文件夹、文件
+ 
+
+
+ -
+
+
文本
+ 
+
+
+ -
+
+
文本编辑_填充
+ 
+
+
+ -
+
+
日志管理
+ 
+
+
+ -
+
+
编辑
+ 
+
+
+ -
+
+
测试辅助
+ 
+
+
+ -
+
+
回归测试
+ 
+
+
+ -
+
+
用户
+ 
+
+
+ -
+
+
测试
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
部门管理
+ 
+
+
+ -
+
+
提交日志
+ 
+
+
+ -
+
+
编辑
+ 
+
+
+ -
+
+
编辑
+ 
+
+
+ -
+
+
网络
+ 
+
+
+ -
+
+
配置
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
文件
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
素材
+ 
+
+
+ -
+
+
日志管理
+ 
+
+
+ -
+
+
测试用例集
+ 
+
+
+ -
+
+
测试用例子集
+ 
+
+
+ -
+
+
测试用例库
+ 
+
+
+ -
+
+
文件
+ 
+
+
+ -
+
+
销售自动化
+ 
+
+
+ -
+
+
生产自动化
+ 
+
+
+ -
+
+
部门管理
+ 
+
+
+ -
+
+
文件
+ 
+
+
+ -
+
+
文件
+ 
+
+
+ -
+
+
部门
+ 
+
+
+ -
+
+
文件夹
+ 
+
+
+ -
+
+
自动化运维-1
+ 
+
+
+ -
+
+
自动化运维
+ 
+
+
+ -
+
+
品质检测
+ 
+
+
+ -
+
+
部门
+ 
+
+
+ -
+
+
供应商管理
+ 
+
+
+ -
+
+
编辑
+ 
+
+
+ -
+
+
编辑
+ 
+
+
+ -
+
+
部门管理
+ 
+
+
+ -
+
+
监控,测试
+ 
+
+
+ -
+
+
文件-文件夹
+ 
+
+
+ -
+
+
部门
+ 
+
+
+ -
+
+
日志
+ 
+
+
+ -
+
+
配置
+ 
+
+
+ -
+
+
操作日志
+ 
+
+
+ -
+
+
测试工具
+ 
+
+
+ -
+
+
24gl-portraitMalePlus4
+ 
+
+
+ -
+
+
24gl-portraitMalePlus6
+ 
+
+
+ -
+
+
配置/设置
+ 
+
+
+ -
+
+
配置:设置
+ 
+
+
+ -
+
+
配置
+ 
+
+
+ -
+
+
用户
+ 
+
+
+ -
+
+
财务自动化配置
+ 
+
+
+ -
+
+
HTSCIT_文件
+ 
+
+
+ -
+
+
系统日志
+ 
+
+
+ -
+
+
文件
+ 
+
+
+ -
+
+
用户-角色-用户名-单人_jurassic
+ 
+
+
+ -
+
+
供应商管理_ico@2x
+ 
+
+
+ -
+
+
自动化处理_line
+ 
+
+
+ -
+
+
自动化处理_fill
+ 
+
+
+ -
+
+
配置信息
+ 
+
+
+ -
+
+
27营销自动化
+ 
+
+
+ -
+
+
配置2
+ 
+
+
+ -
+
+
电气自动化
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
财务自动化配置
+ 
+
+
+ -
+
+
自动化测试
+ 
+
+
+ -
+
+
测试用例
+ 
+
+
+ -
+
+
测试报告
+ 
+
+
+ -
+
+
测试历史版本
+ 
+
+
+ -
+
+
节点配置
+ 
+
+
+ -
+
+
楼宇自动化
+ 
+
+
+ -
+
+
任务管理
+ 
+
+
+ -
+
+
测试
+ 
+
+
+
+
+
Unicode 引用
+
+
+
Unicode 是字体在网页端最原始的应用方式,特点是:
+
+ - 支持按字体的方式去动态调整图标大小,颜色等等。
+ - 默认情况下不支持多色,直接添加多色图标会自动去色。
+
+
+ 注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)
+
+
Unicode 使用步骤如下:
+
第一步:拷贝项目下面生成的 @font-face
+
@font-face {
+ font-family: 'iconfont';
+ src: url('iconfont.woff2?t=1719904676087') format('woff2'),
+ url('iconfont.woff?t=1719904676087') format('woff'),
+ url('iconfont.ttf?t=1719904676087') format('truetype');
+}
+
+
第二步:定义使用 iconfont 的样式
+
.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+
第三步:挑选相应图标并获取字体编码,应用于页面
+
+<span class="iconfont">3</span>
+
+
+ "iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
+
+
+
+
+
+
+ -
+
+
+ answer
+
+ .icon-answer
+
+
+
+ -
+
+
+ app
+
+ .icon-app
+
+
+
+ -
+
+
+ browser
+
+ .icon-browser
+
+
+
+ -
+
+
+ camera
+
+ .icon-camera
+
+
+
+ -
+
+
+ cart
+
+ .icon-cart
+
+
+
+ -
+
+
+ check
+
+ .icon-check
+
+
+
+ -
+
+
+ code
+
+ .icon-code
+
+
+
+ -
+
+
+ computer
+
+ .icon-computer
+
+
+
+ -
+
+
+ delete
+
+ .icon-delete
+
+
+
+ -
+
+
+ deliver
+
+ .icon-deliver
+
+
+
+ -
+
+
+ display
+
+ .icon-display
+
+
+
+ -
+
+
+ down
+
+ .icon-down
+
+
+
+ -
+
+
+ download
+
+ .icon-download
+
+
+
+ -
+
+
+ edit
+
+ .icon-edit
+
+
+
+ -
+
+
+ favor
+
+ .icon-favor
+
+
+
+ -
+
+
+ file
+
+ .icon-file
+
+
+
+ -
+
+
+ fill
+
+ .icon-fill
+
+
+
+ -
+
+
+ fold
+
+ .icon-fold
+
+
+
+ -
+
+
+ folder
+
+ .icon-folder
+
+
+
+ -
+
+
+ hide
+
+ .icon-hide
+
+
+
+ -
+
+
+ home
+
+ .icon-home
+
+
+
+ -
+
+
+ information
+
+ .icon-information
+
+
+
+ -
+
+
+ link
+
+ .icon-link
+
+
+
+ -
+
+
+ 报警
+
+ .icon-baojing
+
+
+
+ -
+
+
+ 任务
+
+ .icon-renwu
+
+
+
+ -
+
+
+ 用户
+
+ .icon-yonghu2
+
+
+
+ -
+
+
+ 详情
+
+ .icon-xiangqing
+
+
+
+ -
+
+
+ 柱状图
+
+ .icon-zhuzhuangtu
+
+
+
+ -
+
+
+ 授信管理
+
+ .icon-shouxinguanli
+
+
+
+ -
+
+
+ 服务器
+
+ .icon-fuwuqi
+
+
+
+ -
+
+
+ 任务
+
+ .icon-renwu1
+
+
+
+ -
+
+
+ 物品箱
+
+ .icon-wupinxiang
+
+
+
+ -
+
+
+ 详情
+
+ .icon-xiangqing1
+
+
+
+ -
+
+
+ 折线图
+
+ .icon-zhexiantu
+
+
+
+ -
+
+
+ 结构
+
+ .icon-jiegou
+
+
+
+ -
+
+
+ 工作台
+
+ .icon-gongzuotai
+
+
+
+ -
+
+
+ 设置
+
+ .icon-shezhi1
+
+
+
+ -
+
+
+ 产品
+
+ .icon-chanpin
+
+
+
+ -
+
+
+ 流程
+
+ .icon-liucheng
+
+
+
+ -
+
+
+ 用户
+
+ .icon-yonghu3
+
+
+
+ -
+
+
+ 借款申请
+
+ .icon-jiekuanshenqing
+
+
+
+ -
+
+
+ 最大化
+
+ .icon-zuidahua
+
+
+
+ -
+
+
+ 密码
+
+ .icon-mima
+
+
+
+ -
+
+
+ 密码
+
+ .icon-mima1
+
+
+
+ -
+
+
+ 最大化
+
+ .icon-zuidahua1
+
+
+
+ -
+
+
+ 密码
+
+ .icon-mima2
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi
+
+
+
+ -
+
+
+ 密码
+
+ .icon-mima3
+
+
+
+ -
+
+
+ 最小化
+
+ .icon-zuixiaohua
+
+
+
+ -
+
+
+ 304错误、关闭、取消
+
+ .icon-cuowuguanbiquxiao
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi1
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi2
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi3
+
+
+
+ -
+
+
+ 密码
+
+ .icon-mima4
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi4
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi5
+
+
+
+ -
+
+
+ 密码
+
+ .icon-mima5
+
+
+
+ -
+
+
+ 最小化
+
+ .icon-zuixiaohua1
+
+
+
+ -
+
+
+ 关闭
+
+ .icon-guanbi6
+
+
+
+ -
+
+
+ 退出
+
+ .icon-tuichu
+
+
+
+ -
+
+
+ 退出
+
+ .icon-tuichu1
+
+
+
+ -
+
+
+ 退出
+
+ .icon-tuichu2
+
+
+
+ -
+
+
+ 配置管理
+
+ .icon-configuration-management
+
+
+
+ -
+
+
+ 测试,实验
+
+ .icon-ziyuan120
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli3
+
+
+
+ -
+
+
+ 智能科技-icon-柔性自动化线
+
+ .icon-zhinengkeji-icon-8
+
+
+
+ -
+
+
+ agora_面向用例的解决方案
+
+ .icon-agora_mianxiangyonglidejiejuefangan
+
+
+
+ -
+
+
+ 配置-运维配置
+
+ .icon-peizhi-yunweipeizhi
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli4
+
+
+
+ -
+
+
+ 编辑
+
+ .icon-bianji5
+
+
+
+ -
+
+
+ 车型
+
+ .icon-chexing
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli5
+
+
+
+ -
+
+
+ 产品压力测试
+
+ .icon-chanpinyaliceshi
+
+
+
+ -
+
+
+ 2-1配置管理
+
+ .icon-2-1peizhiguanli
+
+
+
+ -
+
+
+ 小胖车查车型
+
+ .icon-xiaopangchechachexing
+
+
+
+ -
+
+
+ 自动化
+
+ .icon-zidonghua
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-gongyingshangguanli2
+
+
+
+ -
+
+
+ 任务 管理
+
+ .icon-renwuguanli6
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-gongyingshangguanli3
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-gongyingshangguanli4
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli7
+
+
+
+ -
+
+
+ 节点事 件测试
+
+ .icon-jiedianshijianceshi
+
+
+
+ -
+
+
+ 日志管理
+
+ .icon-rizhiguanli2
+
+
+
+ -
+
+
+ 系统日志
+
+ .icon-xitongrizhi1
+
+
+
+ -
+
+
+ 网络
+
+ .icon-wangluo1
+
+
+
+ -
+
+
+ 网络自动化
+
+ .icon-wangluozidonghuaguanli
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli8
+
+
+
+ -
+
+
+ 车型-线性3-0
+
+ .icon-chexing-xianxing3-0
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli9
+
+
+
+ -
+
+
+ 工业自动化
+
+ .icon-gongyezidonghua
+
+
+
+ -
+
+
+ iServer数据接入测试
+
+ .icon-iServershujujieruceshi
+
+
+
+ -
+
+
+ 倾斜入库测试
+
+ .icon-qingxierukuceshi
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli10
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-gongyingshangguanli5
+
+
+
+ -
+
+
+ 配置管理
+
+ .icon-peizhiguanli
+
+
+
+ -
+
+
+ 车型管理
+
+ .icon-chexingguanli
+
+
+
+ -
+
+
+ 网段
+
+ .icon-a-ziyuan114
+
+
+
+ -
+
+
+ 部门管理
+
+ .icon-bumenguanli2
+
+
+
+ -
+
+
+ 配置管理
+
+ .icon-peizhiguanli1
+
+
+
+ -
+
+
+ 配置管理
+
+ .icon-peizhiguanli2
+
+
+
+ -
+
+
+ 自动化运维
+
+ .icon-a-lianhe79
+
+
+
+ -
+
+
+ 文件夹、文件
+
+ .icon-a-wenjianjiawenjian
+
+
+
+ -
+
+
+ 文本
+
+ .icon-wenben
+
+
+
+ -
+
+
+ 文本编辑_填充
+
+ .icon-wenbenbianjitianchong
+
+
+
+ -
+
+
+ 日志管理
+
+ .icon-rizhiguanli
+
+
+
+ -
+
+
+ 编辑
+
+ .icon-bianji
+
+
+
+ -
+
+
+ 测试辅助
+
+ .icon-ceshifuzhu
+
+
+
+ -
+
+
+ 回归测试
+
+ .icon-huiguiceshi
+
+
+
+ -
+
+
+ 用户
+
+ .icon-yonghu
+
+
+
+ -
+
+
+ 测试
+
+ .icon-ceshi
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-icon-supplier
+
+
+
+ -
+
+
+ 部门管理
+
+ .icon-suyaniconchanpinleibufenzuodaohangbufen87
+
+
+
+ -
+
+
+ 提交日志
+
+ .icon-tijiaorizhi
+
+
+
+ -
+
+
+ 编辑
+
+ .icon-bianji1
+
+
+
+ -
+
+
+ 编辑
+
+ .icon-bianji2
+
+
+
+ -
+
+
+ 网络
+
+ .icon-wangluo
+
+
+
+ -
+
+
+ 配置
+
+ .icon-peizhi
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-gongyingshangguanli
+
+
+
+ -
+
+
+ 文件
+
+ .icon-wenjian
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli
+
+
+
+ -
+
+
+ 素材
+
+ .icon-sucai
+
+
+
+ -
+
+
+ 日志管理
+
+ .icon-rizhiguanli1
+
+
+
+ -
+
+
+ 测试用例集
+
+ .icon-test-case-group
+
+
+
+ -
+
+
+ 测试用例子集
+
+ .icon-test-case-secondary
+
+
+
+ -
+
+
+ 测试用例库
+
+ .icon-test-case-group2
+
+
+
+ -
+
+
+ 文件
+
+ .icon-wenjian1
+
+
+
+ -
+
+
+ 销售自动化
+
+ .icon-xiaoshouzidonghua
+
+
+
+ -
+
+
+ 生产自动化
+
+ .icon-kujialeqiyezhan_shengchanzidonghua
+
+
+
+ -
+
+
+ 部门管理
+
+ .icon-bumenguanli
+
+
+
+ -
+
+
+ 文件
+
+ .icon-noun__cc
+
+
+
+ -
+
+
+ 文件
+
+ .icon-wenjian2
+
+
+
+ -
+
+
+ 部门
+
+ .icon-bumen
+
+
+
+ -
+
+
+ 文件夹
+
+ .icon-wenjianjia
+
+
+
+ -
+
+
+ 自动化运维-1
+
+ .icon-oper-auto-1
+
+
+
+ -
+
+
+ 自动化运维
+
+ .icon-oper-auto
+
+
+
+ -
+
+
+ 品质检测
+
+ .icon-pinzhijiance
+
+
+
+ -
+
+
+ 部门
+
+ .icon-bumen1
+
+
+
+ -
+
+
+ 供应商管理
+
+ .icon-gongyingshangguanli1
+
+
+
+ -
+
+
+ 编辑
+
+ .icon-bianji3
+
+
+
+ -
+
+
+ 编辑
+
+ .icon-bianji4
+
+
+
+ -
+
+
+ 部门管理
+
+ .icon-bumenguanli1
+
+
+
+ -
+
+
+ 监控,测试
+
+ .icon-icon-
+
+
+
+ -
+
+
+ 文件-文件夹
+
+ .icon-wj-wjj
+
+
+
+ -
+
+
+ 部门
+
+ .icon-bumen2
+
+
+
+ -
+
+
+ 日志
+
+ .icon-rizhi
+
+
+
+ -
+
+
+ 配置
+
+ .icon-peizhi1
+
+
+
+ -
+
+
+ 操作日志
+
+ .icon-caozuorizhi
+
+
+
+ -
+
+
+ 测试工具
+
+ .icon-ceshigongju
+
+
+
+ -
+
+
+ 24gl-portraitMalePlus4
+
+ .icon-24gl-portraitMalePlus4
+
+
+
+ -
+
+
+ 24gl-portraitMalePlus6
+
+ .icon-24gl-portraitMalePlus6
+
+
+
+ -
+
+
+ 配置/设置
+
+ .icon-shezhi
+
+
+
+ -
+
+
+ 配置:设置
+
+ .icon-peizhishezhi
+
+
+
+ -
+
+
+ 配置
+
+ .icon-peizhi2
+
+
+
+ -
+
+
+ 用户
+
+ .icon-yonghu1
+
+
+
+ -
+
+
+ 财务自动化配置
+
+ .icon-caiwuzidonghuapeizhi
+
+
+
+ -
+
+
+ HTSCIT_文件
+
+ .icon-wenjian3
+
+
+
+ -
+
+
+ 系统日志
+
+ .icon-xitongrizhi
+
+
+
+ -
+
+
+ 文件
+
+ .icon-wenjian4
+
+
+
+ -
+
+
+ 用户-角色-用户名-单人_jurassic
+
+ .icon-jurassic_user
+
+
+
+ -
+
+
+ 供应商管理_ico@2x
+
+ .icon-gongyingshangguanli_icox
+
+
+
+ -
+
+
+ 自动化处理_line
+
+ .icon-automated-processing_line
+
+
+
+ -
+
+
+ 自动化处理_fill
+
+ .icon-automated-processing_fill
+
+
+
+ -
+
+
+ 配置信息
+
+ .icon-peizhixinxi
+
+
+
+ -
+
+
+ 27营销自动化
+
+ .icon-yingxiaozidonghua
+
+
+
+ -
+
+
+ 配置2
+
+ .icon-peizhi3
+
+
+
+ -
+
+
+ 电气自动化
+
+ .icon-dianqizidonghua
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli1
+
+
+
+ -
+
+
+ 财务自动化配置
+
+ .icon-caiwuzidonghuapeizhi1
+
+
+
+ -
+
+
+ 自动化测试
+
+ .icon-xinicon_huabanfuben
+
+
+
+ -
+
+
+ 测试用例
+
+ .icon-xinicon_huabanfuben1
+
+
+
+ -
+
+
+ 测试报告
+
+ .icon-xinicon_huabanfuben2
+
+
+
+ -
+
+
+ 测试历史版本
+
+ .icon-lishibanben
+
+
+
+ -
+
+
+ 节点配置
+
+ .icon-jiedianpeizhi
+
+
+
+ -
+
+
+ 楼宇自动化
+
+ .icon-louyuzidonghua
+
+
+
+ -
+
+
+ 任务管理
+
+ .icon-renwuguanli2
+
+
+
+ -
+
+
+ 测试
+
+ .icon-ceshi1
+
+
+
+
+
+
font-class 引用
+
+
+
font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。
+
与 Unicode 使用方式相比,具有如下特点:
+
+ - 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
+ - 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
+
+
使用步骤如下:
+
第一步:引入项目下面生成的 fontclass 代码:
+
<link rel="stylesheet" href="./iconfont.css">
+
+
第二步:挑选相应图标并获取类名,应用于页面:
+
<span class="iconfont icon-xxx"></span>
+
+
+ "
+ iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
+
+
+
+
+
+
+ -
+
+
answer
+ #icon-answer
+
+
+ -
+
+
app
+ #icon-app
+
+
+ -
+
+
browser
+ #icon-browser
+
+
+ -
+
+
camera
+ #icon-camera
+
+
+ -
+
+
cart
+ #icon-cart
+
+
+ -
+
+
check
+ #icon-check
+
+
+ -
+
+
code
+ #icon-code
+
+
+ -
+
+
computer
+ #icon-computer
+
+
+ -
+
+
delete
+ #icon-delete
+
+
+ -
+
+
deliver
+ #icon-deliver
+
+
+ -
+
+
display
+ #icon-display
+
+
+ -
+
+
down
+ #icon-down
+
+
+ -
+
+
download
+ #icon-download
+
+
+ -
+
+
edit
+ #icon-edit
+
+
+ -
+
+
favor
+ #icon-favor
+
+
+ -
+
+
file
+ #icon-file
+
+
+ -
+
+
fill
+ #icon-fill
+
+
+ -
+
+
fold
+ #icon-fold
+
+
+ -
+
+
folder
+ #icon-folder
+
+
+ -
+
+
hide
+ #icon-hide
+
+
+ -
+
+
home
+ #icon-home
+
+
+ -
+
+
information
+ #icon-information
+
+
+ -
+
+
link
+ #icon-link
+
+
+ -
+
+
报警
+ #icon-baojing
+
+
+ -
+
+
任务
+ #icon-renwu
+
+
+ -
+
+
用户
+ #icon-yonghu2
+
+
+ -
+
+
详情
+ #icon-xiangqing
+
+
+ -
+
+
柱状图
+ #icon-zhuzhuangtu
+
+
+ -
+
+
授信管理
+ #icon-shouxinguanli
+
+
+ -
+
+
服务器
+ #icon-fuwuqi
+
+
+ -
+
+
任务
+ #icon-renwu1
+
+
+ -
+
+
物品箱
+ #icon-wupinxiang
+
+
+ -
+
+
详情
+ #icon-xiangqing1
+
+
+ -
+
+
折线图
+ #icon-zhexiantu
+
+
+ -
+
+
结构
+ #icon-jiegou
+
+
+ -
+
+
工作台
+ #icon-gongzuotai
+
+
+ -
+
+
设置
+ #icon-shezhi1
+
+
+ -
+
+
产品
+ #icon-chanpin
+
+
+ -
+
+
流程
+ #icon-liucheng
+
+
+ -
+
+
用户
+ #icon-yonghu3
+
+
+ -
+
+
借款申请
+ #icon-jiekuanshenqing
+
+
+ -
+
+
最大化
+ #icon-zuidahua
+
+
+ -
+
+
密码
+ #icon-mima
+
+
+ -
+
+
密码
+ #icon-mima1
+
+
+ -
+
+
最大化
+ #icon-zuidahua1
+
+
+ -
+
+
密码
+ #icon-mima2
+
+
+ -
+
+
关闭
+ #icon-guanbi
+
+
+ -
+
+
密码
+ #icon-mima3
+
+
+ -
+
+
最小化
+ #icon-zuixiaohua
+
+
+ -
+
+
304错误、关闭、取消
+ #icon-cuowuguanbiquxiao
+
+
+ -
+
+
关闭
+ #icon-guanbi1
+
+
+ -
+
+
关闭
+ #icon-guanbi2
+
+
+ -
+
+
关闭
+ #icon-guanbi3
+
+
+ -
+
+
密码
+ #icon-mima4
+
+
+ -
+
+
关闭
+ #icon-guanbi4
+
+
+ -
+
+
关闭
+ #icon-guanbi5
+
+
+ -
+
+
密码
+ #icon-mima5
+
+
+ -
+
+
最小化
+ #icon-zuixiaohua1
+
+
+ -
+
+
关闭
+ #icon-guanbi6
+
+
+ -
+
+
退出
+ #icon-tuichu
+
+
+ -
+
+
退出
+ #icon-tuichu1
+
+
+ -
+
+
退出
+ #icon-tuichu2
+
+
+ -
+
+
配置管理
+ #icon-configuration-management
+
+
+ -
+
+
测试,实验
+ #icon-ziyuan120
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli3
+
+
+ -
+
+
智能科技-icon-柔性自动化线
+ #icon-zhinengkeji-icon-8
+
+
+ -
+
+
agora_面向用例的解决方案
+ #icon-agora_mianxiangyonglidejiejuefangan
+
+
+ -
+
+
配置-运维配置
+ #icon-peizhi-yunweipeizhi
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli4
+
+
+ -
+
+
编辑
+ #icon-bianji5
+
+
+ -
+
+
车型
+ #icon-chexing
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli5
+
+
+ -
+
+
产品压力测试
+ #icon-chanpinyaliceshi
+
+
+ -
+
+
2-1配置管理
+ #icon-2-1peizhiguanli
+
+
+ -
+
+
小胖车查车型
+ #icon-xiaopangchechachexing
+
+
+ -
+
+
自动化
+ #icon-zidonghua
+
+
+ -
+
+
供应商管理
+ #icon-gongyingshangguanli2
+
+
+ -
+
+
任务 管理
+ #icon-renwuguanli6
+
+
+ -
+
+
供应商管理
+ #icon-gongyingshangguanli3
+
+
+ -
+
+
供应商管理
+ #icon-gongyingshangguanli4
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli7
+
+
+ -
+
+
节点事 件测试
+ #icon-jiedianshijianceshi
+
+
+ -
+
+
日志管理
+ #icon-rizhiguanli2
+
+
+ -
+
+
系统日志
+ #icon-xitongrizhi1
+
+
+ -
+
+
网络
+ #icon-wangluo1
+
+
+ -
+
+
网络自动化
+ #icon-wangluozidonghuaguanli
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli8
+
+
+ -
+
+
车型-线性3-0
+ #icon-chexing-xianxing3-0
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli9
+
+
+ -
+
+
工业自动化
+ #icon-gongyezidonghua
+
+
+ -
+
+
iServer数据接入测试
+ #icon-iServershujujieruceshi
+
+
+ -
+
+
倾斜入库测试
+ #icon-qingxierukuceshi
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli10
+
+
+ -
+
+
供应商管理
+ #icon-gongyingshangguanli5
+
+
+ -
+
+
配置管理
+ #icon-peizhiguanli
+
+
+ -
+
+
车型管理
+ #icon-chexingguanli
+
+
+ -
+
+
网段
+ #icon-a-ziyuan114
+
+
+ -
+
+
部门管理
+ #icon-bumenguanli2
+
+
+ -
+
+
配置管理
+ #icon-peizhiguanli1
+
+
+ -
+
+
配置管理
+ #icon-peizhiguanli2
+
+
+ -
+
+
自动化运维
+ #icon-a-lianhe79
+
+
+ -
+
+
文件夹、文件
+ #icon-a-wenjianjiawenjian
+
+
+ -
+
+
文本
+ #icon-wenben
+
+
+ -
+
+
文本编辑_填充
+ #icon-wenbenbianjitianchong
+
+
+ -
+
+
日志管理
+ #icon-rizhiguanli
+
+
+ -
+
+
编辑
+ #icon-bianji
+
+
+ -
+
+
测试辅助
+ #icon-ceshifuzhu
+
+
+ -
+
+
回归测试
+ #icon-huiguiceshi
+
+
+ -
+
+
用户
+ #icon-yonghu
+
+
+ -
+
+
测试
+ #icon-ceshi
+
+
+ -
+
+
供应商管理
+ #icon-icon-supplier
+
+
+ -
+
+
部门管理
+ #icon-suyaniconchanpinleibufenzuodaohangbufen87
+
+
+ -
+
+
提交日志
+ #icon-tijiaorizhi
+
+
+ -
+
+
编辑
+ #icon-bianji1
+
+
+ -
+
+
编辑
+ #icon-bianji2
+
+
+ -
+
+
网络
+ #icon-wangluo
+
+
+ -
+
+
配置
+ #icon-peizhi
+
+
+ -
+
+
供应商管理
+ #icon-gongyingshangguanli
+
+
+ -
+
+
文件
+ #icon-wenjian
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli
+
+
+ -
+
+
素材
+ #icon-sucai
+
+
+ -
+
+
日志管理
+ #icon-rizhiguanli1
+
+
+ -
+
+
测试用例集
+ #icon-test-case-group
+
+
+ -
+
+
测试用例子集
+ #icon-test-case-secondary
+
+
+ -
+
+
测试用例库
+ #icon-test-case-group2
+
+
+ -
+
+
文件
+ #icon-wenjian1
+
+
+ -
+
+
销售自动化
+ #icon-xiaoshouzidonghua
+
+
+ -
+
+
生产自动化
+ #icon-kujialeqiyezhan_shengchanzidonghua
+
+
+ -
+
+
部门管理
+ #icon-bumenguanli
+
+
+ -
+
+
文件
+ #icon-noun__cc
+
+
+ -
+
+
文件
+ #icon-wenjian2
+
+
+ -
+
+
部门
+ #icon-bumen
+
+
+ -
+
+
文件夹
+ #icon-wenjianjia
+
+
+ -
+
+
自动化运维-1
+ #icon-oper-auto-1
+
+
+ -
+
+
自动化运维
+ #icon-oper-auto
+
+
+ -
+
+
品质检测
+ #icon-pinzhijiance
+
+
+ -
+
+
部门
+ #icon-bumen1
+
+
+ -
+
+
供应商管理
+ #icon-gongyingshangguanli1
+
+
+ -
+
+
编辑
+ #icon-bianji3
+
+
+ -
+
+
编辑
+ #icon-bianji4
+
+
+ -
+
+
部门管理
+ #icon-bumenguanli1
+
+
+ -
+
+
监控,测试
+ #icon-icon-
+
+
+ -
+
+
文件-文件夹
+ #icon-wj-wjj
+
+
+ -
+
+
部门
+ #icon-bumen2
+
+
+ -
+
+
日志
+ #icon-rizhi
+
+
+ -
+
+
配置
+ #icon-peizhi1
+
+
+ -
+
+
操作日志
+ #icon-caozuorizhi
+
+
+ -
+
+
测试工具
+ #icon-ceshigongju
+
+
+ -
+
+
24gl-portraitMalePlus4
+ #icon-24gl-portraitMalePlus4
+
+
+ -
+
+
24gl-portraitMalePlus6
+ #icon-24gl-portraitMalePlus6
+
+
+ -
+
+
配置/设置
+ #icon-shezhi
+
+
+ -
+
+
配置:设置
+ #icon-peizhishezhi
+
+
+ -
+
+
配置
+ #icon-peizhi2
+
+
+ -
+
+
用户
+ #icon-yonghu1
+
+
+ -
+
+
财务自动化配置
+ #icon-caiwuzidonghuapeizhi
+
+
+ -
+
+
HTSCIT_文件
+ #icon-wenjian3
+
+
+ -
+
+
系统日志
+ #icon-xitongrizhi
+
+
+ -
+
+
文件
+ #icon-wenjian4
+
+
+ -
+
+
用户-角色-用户名-单人_jurassic
+ #icon-jurassic_user
+
+
+ -
+
+
供应商管理_ico@2x
+ #icon-gongyingshangguanli_icox
+
+
+ -
+
+
自动化处理_line
+ #icon-automated-processing_line
+
+
+ -
+
+
自动化处理_fill
+ #icon-automated-processing_fill
+
+
+ -
+
+
配置信息
+ #icon-peizhixinxi
+
+
+ -
+
+
27营销自动化
+ #icon-yingxiaozidonghua
+
+
+ -
+
+
配置2
+ #icon-peizhi3
+
+
+ -
+
+
电气自动化
+ #icon-dianqizidonghua
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli1
+
+
+ -
+
+
财务自动化配置
+ #icon-caiwuzidonghuapeizhi1
+
+
+ -
+
+
自动化测试
+ #icon-xinicon_huabanfuben
+
+
+ -
+
+
测试用例
+ #icon-xinicon_huabanfuben1
+
+
+ -
+
+
测试报告
+ #icon-xinicon_huabanfuben2
+
+
+ -
+
+
测试历史版本
+ #icon-lishibanben
+
+
+ -
+
+
节点配置
+ #icon-jiedianpeizhi
+
+
+ -
+
+
楼宇自动化
+ #icon-louyuzidonghua
+
+
+ -
+
+
任务管理
+ #icon-renwuguanli2
+
+
+ -
+
+
测试
+ #icon-ceshi1
+
+
+
+
+
Symbol 引用
+
+
+
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
+ 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:
+
+ - 支持多色图标了,不再受单色限制。
+ - 通过一些技巧,支持像字体那样,通过
font-size, color 来调整样式。
+ - 兼容性较差,支持 IE9+,及现代浏览器。
+ - 浏览器渲染 SVG 的性能一般,还不如 png。
+
+
使用步骤如下:
+
第一步:引入项目下面生成的 symbol 代码:
+
<script src="./iconfont.js"></script>
+
+
第二步:加入通用 CSS 代码(引入一次就行):
+
<style>
+.icon {
+ width: 1em;
+ height: 1em;
+ vertical-align: -0.15em;
+ fill: currentColor;
+ overflow: hidden;
+}
+</style>
+
+
第三步:挑选相应图标并获取类名,应用于页面:
+
<svg class="icon" aria-hidden="true">
+ <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+
+
+
+
+
+
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.css b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.css
new file mode 100644
index 0000000..1a49382
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.css
@@ -0,0 +1,719 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 3005536 */
+ src: url('iconfont.woff2?t=1719904676087') format('woff2'),
+ url('iconfont.woff?t=1719904676087') format('woff'),
+ url('iconfont.ttf?t=1719904676087') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-answer:before {
+ content: "\e64a";
+}
+
+.icon-app:before {
+ content: "\e658";
+}
+
+.icon-browser:before {
+ content: "\e659";
+}
+
+.icon-camera:before {
+ content: "\e65a";
+}
+
+.icon-cart:before {
+ content: "\e65c";
+}
+
+.icon-check:before {
+ content: "\e65d";
+}
+
+.icon-code:before {
+ content: "\e65e";
+}
+
+.icon-computer:before {
+ content: "\e65f";
+}
+
+.icon-delete:before {
+ content: "\e661";
+}
+
+.icon-deliver:before {
+ content: "\e662";
+}
+
+.icon-display:before {
+ content: "\e663";
+}
+
+.icon-down:before {
+ content: "\e664";
+}
+
+.icon-download:before {
+ content: "\e669";
+}
+
+.icon-edit:before {
+ content: "\e66a";
+}
+
+.icon-favor:before {
+ content: "\e66b";
+}
+
+.icon-file:before {
+ content: "\e66c";
+}
+
+.icon-fill:before {
+ content: "\e66e";
+}
+
+.icon-fold:before {
+ content: "\e66f";
+}
+
+.icon-folder:before {
+ content: "\e670";
+}
+
+.icon-hide:before {
+ content: "\e671";
+}
+
+.icon-home:before {
+ content: "\e672";
+}
+
+.icon-information:before {
+ content: "\e673";
+}
+
+.icon-link:before {
+ content: "\e674";
+}
+
+.icon-baojing:before {
+ content: "\e675";
+}
+
+.icon-renwu:before {
+ content: "\e676";
+}
+
+.icon-yonghu2:before {
+ content: "\e678";
+}
+
+.icon-xiangqing:before {
+ content: "\e679";
+}
+
+.icon-zhuzhuangtu:before {
+ content: "\e67f";
+}
+
+.icon-shouxinguanli:before {
+ content: "\e680";
+}
+
+.icon-fuwuqi:before {
+ content: "\e681";
+}
+
+.icon-renwu1:before {
+ content: "\e682";
+}
+
+.icon-wupinxiang:before {
+ content: "\e683";
+}
+
+.icon-xiangqing1:before {
+ content: "\e684";
+}
+
+.icon-zhexiantu:before {
+ content: "\e685";
+}
+
+.icon-jiegou:before {
+ content: "\e686";
+}
+
+.icon-gongzuotai:before {
+ content: "\e687";
+}
+
+.icon-shezhi1:before {
+ content: "\e688";
+}
+
+.icon-chanpin:before {
+ content: "\e689";
+}
+
+.icon-liucheng:before {
+ content: "\e68a";
+}
+
+.icon-yonghu3:before {
+ content: "\e68b";
+}
+
+.icon-jiekuanshenqing:before {
+ content: "\e68c";
+}
+
+.icon-zuidahua:before {
+ content: "\e65b";
+}
+
+.icon-mima:before {
+ content: "\e634";
+}
+
+.icon-mima1:before {
+ content: "\e635";
+}
+
+.icon-zuidahua1:before {
+ content: "\e637";
+}
+
+.icon-mima2:before {
+ content: "\e665";
+}
+
+.icon-guanbi:before {
+ content: "\e63b";
+}
+
+.icon-mima3:before {
+ content: "\e660";
+}
+
+.icon-zuixiaohua:before {
+ content: "\e67e";
+}
+
+.icon-cuowuguanbiquxiao:before {
+ content: "\e8e7";
+}
+
+.icon-guanbi1:before {
+ content: "\e63d";
+}
+
+.icon-guanbi2:before {
+ content: "\e63f";
+}
+
+.icon-guanbi3:before {
+ content: "\eaf2";
+}
+
+.icon-mima4:before {
+ content: "\e642";
+}
+
+.icon-guanbi4:before {
+ content: "\e645";
+}
+
+.icon-guanbi5:before {
+ content: "\e6a5";
+}
+
+.icon-mima5:before {
+ content: "\e8b2";
+}
+
+.icon-zuixiaohua1:before {
+ content: "\e656";
+}
+
+.icon-guanbi6:before {
+ content: "\e646";
+}
+
+.icon-tuichu:before {
+ content: "\e655";
+}
+
+.icon-tuichu1:before {
+ content: "\e638";
+}
+
+.icon-tuichu2:before {
+ content: "\e7c8";
+}
+
+.icon-configuration-management:before {
+ content: "\e616";
+}
+
+.icon-ziyuan120:before {
+ content: "\e789";
+}
+
+.icon-renwuguanli3:before {
+ content: "\e781";
+}
+
+.icon-zhinengkeji-icon-8:before {
+ content: "\e617";
+}
+
+.icon-agora_mianxiangyonglidejiejuefangan:before {
+ content: "\e67c";
+}
+
+.icon-peizhi-yunweipeizhi:before {
+ content: "\e618";
+}
+
+.icon-renwuguanli4:before {
+ content: "\ec4c";
+}
+
+.icon-bianji5:before {
+ content: "\e816";
+}
+
+.icon-chexing:before {
+ content: "\e61b";
+}
+
+.icon-renwuguanli5:before {
+ content: "\e6e2";
+}
+
+.icon-chanpinyaliceshi:before {
+ content: "\e61f";
+}
+
+.icon-2-1peizhiguanli:before {
+ content: "\e632";
+}
+
+.icon-xiaopangchechachexing:before {
+ content: "\e621";
+}
+
+.icon-zidonghua:before {
+ content: "\e633";
+}
+
+.icon-gongyingshangguanli2:before {
+ content: "\e622";
+}
+
+.icon-renwuguanli6:before {
+ content: "\e625";
+}
+
+.icon-gongyingshangguanli3:before {
+ content: "\e67b";
+}
+
+.icon-gongyingshangguanli4:before {
+ content: "\e626";
+}
+
+.icon-renwuguanli7:before {
+ content: "\e627";
+}
+
+.icon-jiedianshijianceshi:before {
+ content: "\e63a";
+}
+
+.icon-rizhiguanli2:before {
+ content: "\e6a7";
+}
+
+.icon-xitongrizhi1:before {
+ content: "\e6a9";
+}
+
+.icon-wangluo1:before {
+ content: "\e628";
+}
+
+.icon-wangluozidonghuaguanli:before {
+ content: "\e6ab";
+}
+
+.icon-renwuguanli8:before {
+ content: "\e653";
+}
+
+.icon-chexing-xianxing3-0:before {
+ content: "\e694";
+}
+
+.icon-renwuguanli9:before {
+ content: "\e64f";
+}
+
+.icon-gongyezidonghua:before {
+ content: "\e654";
+}
+
+.icon-iServershujujieruceshi:before {
+ content: "\e629";
+}
+
+.icon-qingxierukuceshi:before {
+ content: "\e62a";
+}
+
+.icon-renwuguanli10:before {
+ content: "\e62b";
+}
+
+.icon-gongyingshangguanli5:before {
+ content: "\e62c";
+}
+
+.icon-peizhiguanli:before {
+ content: "\e67d";
+}
+
+.icon-chexingguanli:before {
+ content: "\e66d";
+}
+
+.icon-a-ziyuan114:before {
+ content: "\e62d";
+}
+
+.icon-bumenguanli2:before {
+ content: "\e636";
+}
+
+.icon-peizhiguanli1:before {
+ content: "\e641";
+}
+
+.icon-peizhiguanli2:before {
+ content: "\e643";
+}
+
+.icon-a-lianhe79:before {
+ content: "\e677";
+}
+
+.icon-a-wenjianjiawenjian:before {
+ content: "\e644";
+}
+
+.icon-wenben:before {
+ content: "\e600";
+}
+
+.icon-wenbenbianjitianchong:before {
+ content: "\e6d4";
+}
+
+.icon-rizhiguanli:before {
+ content: "\e639";
+}
+
+.icon-bianji:before {
+ content: "\e612";
+}
+
+.icon-ceshifuzhu:before {
+ content: "\e601";
+}
+
+.icon-huiguiceshi:before {
+ content: "\e608";
+}
+
+.icon-yonghu:before {
+ content: "\e788";
+}
+
+.icon-ceshi:before {
+ content: "\e6e1";
+}
+
+.icon-icon-supplier:before {
+ content: "\e63c";
+}
+
+.icon-suyaniconchanpinleibufenzuodaohangbufen87:before {
+ content: "\e730";
+}
+
+.icon-tijiaorizhi:before {
+ content: "\e650";
+}
+
+.icon-bianji1:before {
+ content: "\e62e";
+}
+
+.icon-bianji2:before {
+ content: "\e619";
+}
+
+.icon-wangluo:before {
+ content: "\e609";
+}
+
+.icon-peizhi:before {
+ content: "\e667";
+}
+
+.icon-gongyingshangguanli:before {
+ content: "\e611";
+}
+
+.icon-wenjian:before {
+ content: "\e67a";
+}
+
+.icon-renwuguanli:before {
+ content: "\e657";
+}
+
+.icon-sucai:before {
+ content: "\e602";
+}
+
+.icon-rizhiguanli1:before {
+ content: "\e62f";
+}
+
+.icon-test-case-group:before {
+ content: "\e606";
+}
+
+.icon-test-case-secondary:before {
+ content: "\e607";
+}
+
+.icon-test-case-group2:before {
+ content: "\e60a";
+}
+
+.icon-wenjian1:before {
+ content: "\e604";
+}
+
+.icon-xiaoshouzidonghua:before {
+ content: "\e6a0";
+}
+
+.icon-kujialeqiyezhan_shengchanzidonghua:before {
+ content: "\e64b";
+}
+
+.icon-bumenguanli:before {
+ content: "\e624";
+}
+
+.icon-noun__cc:before {
+ content: "\e610";
+}
+
+.icon-wenjian2:before {
+ content: "\e630";
+}
+
+.icon-bumen:before {
+ content: "\e758";
+}
+
+.icon-wenjianjia:before {
+ content: "\ec17";
+}
+
+.icon-oper-auto-1:before {
+ content: "\e7ca";
+}
+
+.icon-oper-auto:before {
+ content: "\e7cb";
+}
+
+.icon-pinzhijiance:before {
+ content: "\e620";
+}
+
+.icon-bumen1:before {
+ content: "\e64d";
+}
+
+.icon-gongyingshangguanli1:before {
+ content: "\e623";
+}
+
+.icon-bianji3:before {
+ content: "\e603";
+}
+
+.icon-bianji4:before {
+ content: "\e61c";
+}
+
+.icon-bumenguanli1:before {
+ content: "\e61d";
+}
+
+.icon-icon-:before {
+ content: "\e605";
+}
+
+.icon-wj-wjj:before {
+ content: "\e7b8";
+}
+
+.icon-bumen2:before {
+ content: "\e631";
+}
+
+.icon-rizhi:before {
+ content: "\e614";
+}
+
+.icon-peizhi1:before {
+ content: "\e60f";
+}
+
+.icon-caozuorizhi:before {
+ content: "\e60b";
+}
+
+.icon-ceshigongju:before {
+ content: "\e71a";
+}
+
+.icon-24gl-portraitMalePlus4:before {
+ content: "\eb25";
+}
+
+.icon-24gl-portraitMalePlus6:before {
+ content: "\eb27";
+}
+
+.icon-shezhi:before {
+ content: "\e61a";
+}
+
+.icon-peizhishezhi:before {
+ content: "\e64c";
+}
+
+.icon-peizhi2:before {
+ content: "\e6db";
+}
+
+.icon-yonghu1:before {
+ content: "\e668";
+}
+
+.icon-caiwuzidonghuapeizhi:before {
+ content: "\e60c";
+}
+
+.icon-wenjian3:before {
+ content: "\e64e";
+}
+
+.icon-xitongrizhi:before {
+ content: "\e60d";
+}
+
+.icon-wenjian4:before {
+ content: "\e695";
+}
+
+.icon-jurassic_user:before {
+ content: "\e6a4";
+}
+
+.icon-gongyingshangguanli_icox:before {
+ content: "\e6ce";
+}
+
+.icon-automated-processing_line:before {
+ content: "\e72f";
+}
+
+.icon-automated-processing_fill:before {
+ content: "\e731";
+}
+
+.icon-peizhixinxi:before {
+ content: "\e60e";
+}
+
+.icon-yingxiaozidonghua:before {
+ content: "\e666";
+}
+
+.icon-peizhi3:before {
+ content: "\e61e";
+}
+
+.icon-dianqizidonghua:before {
+ content: "\e613";
+}
+
+.icon-renwuguanli1:before {
+ content: "\e6de";
+}
+
+.icon-caiwuzidonghuapeizhi1:before {
+ content: "\e651";
+}
+
+.icon-xinicon_huabanfuben:before {
+ content: "\e647";
+}
+
+.icon-xinicon_huabanfuben1:before {
+ content: "\e648";
+}
+
+.icon-xinicon_huabanfuben2:before {
+ content: "\e649";
+}
+
+.icon-lishibanben:before {
+ content: "\e652";
+}
+
+.icon-jiedianpeizhi:before {
+ content: "\e63e";
+}
+
+.icon-louyuzidonghua:before {
+ content: "\e793";
+}
+
+.icon-renwuguanli2:before {
+ content: "\e615";
+}
+
+.icon-ceshi1:before {
+ content: "\e640";
+}
+
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.js b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.js
new file mode 100644
index 0000000..3728303
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.js
@@ -0,0 +1 @@
+window._iconfont_svg_string_3005536='',function(a){var c=(c=document.getElementsByTagName("script"))[c.length-1],l=c.getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var h,i,t,z,v,o=function(c,l){l.parentNode.insertBefore(c,l)};if(l&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}h=function(){var c,l=document.createElement("div");l.innerHTML=a._iconfont_svg_string_3005536,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?o(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(t=h,z=a.document,v=!1,m(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,p())})}function p(){v||(v=!0,t())}function m(){try{z.documentElement.doScroll("left")}catch(c){return void setTimeout(m,50)}p()}}(window);
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.json b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.json
new file mode 100644
index 0000000..c4a4218
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.json
@@ -0,0 +1,1241 @@
+{
+ "id": "3005536",
+ "name": "HandyNet",
+ "font_family": "iconfont",
+ "css_prefix_text": "icon-",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "109717",
+ "name": "answer",
+ "font_class": "answer",
+ "unicode": "e64a",
+ "unicode_decimal": 58954
+ },
+ {
+ "icon_id": "109718",
+ "name": "app",
+ "font_class": "app",
+ "unicode": "e658",
+ "unicode_decimal": 58968
+ },
+ {
+ "icon_id": "109719",
+ "name": "browser",
+ "font_class": "browser",
+ "unicode": "e659",
+ "unicode_decimal": 58969
+ },
+ {
+ "icon_id": "109721",
+ "name": "camera",
+ "font_class": "camera",
+ "unicode": "e65a",
+ "unicode_decimal": 58970
+ },
+ {
+ "icon_id": "109723",
+ "name": "cart",
+ "font_class": "cart",
+ "unicode": "e65c",
+ "unicode_decimal": 58972
+ },
+ {
+ "icon_id": "109724",
+ "name": "check",
+ "font_class": "check",
+ "unicode": "e65d",
+ "unicode_decimal": 58973
+ },
+ {
+ "icon_id": "109725",
+ "name": "code",
+ "font_class": "code",
+ "unicode": "e65e",
+ "unicode_decimal": 58974
+ },
+ {
+ "icon_id": "109726",
+ "name": "computer",
+ "font_class": "computer",
+ "unicode": "e65f",
+ "unicode_decimal": 58975
+ },
+ {
+ "icon_id": "109728",
+ "name": "delete",
+ "font_class": "delete",
+ "unicode": "e661",
+ "unicode_decimal": 58977
+ },
+ {
+ "icon_id": "109730",
+ "name": "deliver",
+ "font_class": "deliver",
+ "unicode": "e662",
+ "unicode_decimal": 58978
+ },
+ {
+ "icon_id": "109731",
+ "name": "display",
+ "font_class": "display",
+ "unicode": "e663",
+ "unicode_decimal": 58979
+ },
+ {
+ "icon_id": "109732",
+ "name": "down",
+ "font_class": "down",
+ "unicode": "e664",
+ "unicode_decimal": 58980
+ },
+ {
+ "icon_id": "109733",
+ "name": "download",
+ "font_class": "download",
+ "unicode": "e669",
+ "unicode_decimal": 58985
+ },
+ {
+ "icon_id": "109734",
+ "name": "edit",
+ "font_class": "edit",
+ "unicode": "e66a",
+ "unicode_decimal": 58986
+ },
+ {
+ "icon_id": "109738",
+ "name": "favor",
+ "font_class": "favor",
+ "unicode": "e66b",
+ "unicode_decimal": 58987
+ },
+ {
+ "icon_id": "109739",
+ "name": "file",
+ "font_class": "file",
+ "unicode": "e66c",
+ "unicode_decimal": 58988
+ },
+ {
+ "icon_id": "109741",
+ "name": "fill",
+ "font_class": "fill",
+ "unicode": "e66e",
+ "unicode_decimal": 58990
+ },
+ {
+ "icon_id": "109742",
+ "name": "fold",
+ "font_class": "fold",
+ "unicode": "e66f",
+ "unicode_decimal": 58991
+ },
+ {
+ "icon_id": "109744",
+ "name": "folder",
+ "font_class": "folder",
+ "unicode": "e670",
+ "unicode_decimal": 58992
+ },
+ {
+ "icon_id": "109749",
+ "name": "hide",
+ "font_class": "hide",
+ "unicode": "e671",
+ "unicode_decimal": 58993
+ },
+ {
+ "icon_id": "109751",
+ "name": "home",
+ "font_class": "home",
+ "unicode": "e672",
+ "unicode_decimal": 58994
+ },
+ {
+ "icon_id": "109752",
+ "name": "information",
+ "font_class": "information",
+ "unicode": "e673",
+ "unicode_decimal": 58995
+ },
+ {
+ "icon_id": "109755",
+ "name": "link",
+ "font_class": "link",
+ "unicode": "e674",
+ "unicode_decimal": 58996
+ },
+ {
+ "icon_id": "30783497",
+ "name": "报警",
+ "font_class": "baojing",
+ "unicode": "e675",
+ "unicode_decimal": 58997
+ },
+ {
+ "icon_id": "30787105",
+ "name": "任务",
+ "font_class": "renwu",
+ "unicode": "e676",
+ "unicode_decimal": 58998
+ },
+ {
+ "icon_id": "30787107",
+ "name": "用户",
+ "font_class": "yonghu2",
+ "unicode": "e678",
+ "unicode_decimal": 59000
+ },
+ {
+ "icon_id": "30787108",
+ "name": "详情",
+ "font_class": "xiangqing",
+ "unicode": "e679",
+ "unicode_decimal": 59001
+ },
+ {
+ "icon_id": "30787110",
+ "name": "柱状图",
+ "font_class": "zhuzhuangtu",
+ "unicode": "e67f",
+ "unicode_decimal": 59007
+ },
+ {
+ "icon_id": "30787113",
+ "name": "授信管理",
+ "font_class": "shouxinguanli",
+ "unicode": "e680",
+ "unicode_decimal": 59008
+ },
+ {
+ "icon_id": "30787179",
+ "name": "服务器",
+ "font_class": "fuwuqi",
+ "unicode": "e681",
+ "unicode_decimal": 59009
+ },
+ {
+ "icon_id": "30787180",
+ "name": "任务",
+ "font_class": "renwu1",
+ "unicode": "e682",
+ "unicode_decimal": 59010
+ },
+ {
+ "icon_id": "30787181",
+ "name": "物品箱",
+ "font_class": "wupinxiang",
+ "unicode": "e683",
+ "unicode_decimal": 59011
+ },
+ {
+ "icon_id": "30787182",
+ "name": "详情",
+ "font_class": "xiangqing1",
+ "unicode": "e684",
+ "unicode_decimal": 59012
+ },
+ {
+ "icon_id": "30787183",
+ "name": "折线图",
+ "font_class": "zhexiantu",
+ "unicode": "e685",
+ "unicode_decimal": 59013
+ },
+ {
+ "icon_id": "30787184",
+ "name": "结构",
+ "font_class": "jiegou",
+ "unicode": "e686",
+ "unicode_decimal": 59014
+ },
+ {
+ "icon_id": "30787185",
+ "name": "工作台",
+ "font_class": "gongzuotai",
+ "unicode": "e687",
+ "unicode_decimal": 59015
+ },
+ {
+ "icon_id": "30787186",
+ "name": "设置",
+ "font_class": "shezhi1",
+ "unicode": "e688",
+ "unicode_decimal": 59016
+ },
+ {
+ "icon_id": "30787187",
+ "name": "产品",
+ "font_class": "chanpin",
+ "unicode": "e689",
+ "unicode_decimal": 59017
+ },
+ {
+ "icon_id": "30787188",
+ "name": "流程",
+ "font_class": "liucheng",
+ "unicode": "e68a",
+ "unicode_decimal": 59018
+ },
+ {
+ "icon_id": "30787189",
+ "name": "用户",
+ "font_class": "yonghu3",
+ "unicode": "e68b",
+ "unicode_decimal": 59019
+ },
+ {
+ "icon_id": "30787190",
+ "name": "借款申请",
+ "font_class": "jiekuanshenqing",
+ "unicode": "e68c",
+ "unicode_decimal": 59020
+ },
+ {
+ "icon_id": "428403",
+ "name": "最大化",
+ "font_class": "zuidahua",
+ "unicode": "e65b",
+ "unicode_decimal": 58971
+ },
+ {
+ "icon_id": "508253",
+ "name": "密码",
+ "font_class": "mima",
+ "unicode": "e634",
+ "unicode_decimal": 58932
+ },
+ {
+ "icon_id": "677589",
+ "name": "密码",
+ "font_class": "mima1",
+ "unicode": "e635",
+ "unicode_decimal": 58933
+ },
+ {
+ "icon_id": "941658",
+ "name": "最大化",
+ "font_class": "zuidahua1",
+ "unicode": "e637",
+ "unicode_decimal": 58935
+ },
+ {
+ "icon_id": "1183037",
+ "name": "密码",
+ "font_class": "mima2",
+ "unicode": "e665",
+ "unicode_decimal": 58981
+ },
+ {
+ "icon_id": "1200198",
+ "name": "关闭",
+ "font_class": "guanbi",
+ "unicode": "e63b",
+ "unicode_decimal": 58939
+ },
+ {
+ "icon_id": "1279441",
+ "name": "密码",
+ "font_class": "mima3",
+ "unicode": "e660",
+ "unicode_decimal": 58976
+ },
+ {
+ "icon_id": "1649166",
+ "name": "最小化",
+ "font_class": "zuixiaohua",
+ "unicode": "e67e",
+ "unicode_decimal": 59006
+ },
+ {
+ "icon_id": "1727523",
+ "name": "304错误、关闭、取消",
+ "font_class": "cuowuguanbiquxiao",
+ "unicode": "e8e7",
+ "unicode_decimal": 59623
+ },
+ {
+ "icon_id": "4880431",
+ "name": "关闭",
+ "font_class": "guanbi1",
+ "unicode": "e63d",
+ "unicode_decimal": 58941
+ },
+ {
+ "icon_id": "5286697",
+ "name": "关闭",
+ "font_class": "guanbi2",
+ "unicode": "e63f",
+ "unicode_decimal": 58943
+ },
+ {
+ "icon_id": "5387522",
+ "name": "关闭",
+ "font_class": "guanbi3",
+ "unicode": "eaf2",
+ "unicode_decimal": 60146
+ },
+ {
+ "icon_id": "5532892",
+ "name": "密码",
+ "font_class": "mima4",
+ "unicode": "e642",
+ "unicode_decimal": 58946
+ },
+ {
+ "icon_id": "9526788",
+ "name": "关闭",
+ "font_class": "guanbi4",
+ "unicode": "e645",
+ "unicode_decimal": 58949
+ },
+ {
+ "icon_id": "10268991",
+ "name": "关闭",
+ "font_class": "guanbi5",
+ "unicode": "e6a5",
+ "unicode_decimal": 59045
+ },
+ {
+ "icon_id": "11372676",
+ "name": "密码",
+ "font_class": "mima5",
+ "unicode": "e8b2",
+ "unicode_decimal": 59570
+ },
+ {
+ "icon_id": "11490918",
+ "name": "最小化",
+ "font_class": "zuixiaohua1",
+ "unicode": "e656",
+ "unicode_decimal": 58966
+ },
+ {
+ "icon_id": "18336449",
+ "name": "关闭",
+ "font_class": "guanbi6",
+ "unicode": "e646",
+ "unicode_decimal": 58950
+ },
+ {
+ "icon_id": "741952",
+ "name": "退出",
+ "font_class": "tuichu",
+ "unicode": "e655",
+ "unicode_decimal": 58965
+ },
+ {
+ "icon_id": "784287",
+ "name": "退出",
+ "font_class": "tuichu1",
+ "unicode": "e638",
+ "unicode_decimal": 58936
+ },
+ {
+ "icon_id": "2150401",
+ "name": "退出",
+ "font_class": "tuichu2",
+ "unicode": "e7c8",
+ "unicode_decimal": 59336
+ },
+ {
+ "icon_id": "14440232",
+ "name": "配置管理",
+ "font_class": "configuration-management",
+ "unicode": "e616",
+ "unicode_decimal": 58902
+ },
+ {
+ "icon_id": "14488543",
+ "name": "测试,实验",
+ "font_class": "ziyuan120",
+ "unicode": "e789",
+ "unicode_decimal": 59273
+ },
+ {
+ "icon_id": "15562234",
+ "name": "任务管理",
+ "font_class": "renwuguanli3",
+ "unicode": "e781",
+ "unicode_decimal": 59265
+ },
+ {
+ "icon_id": "16560688",
+ "name": "智能科技-icon-柔性自动化线",
+ "font_class": "zhinengkeji-icon-8",
+ "unicode": "e617",
+ "unicode_decimal": 58903
+ },
+ {
+ "icon_id": "16802498",
+ "name": "agora_面向用例的解决方案",
+ "font_class": "agora_mianxiangyonglidejiejuefangan",
+ "unicode": "e67c",
+ "unicode_decimal": 59004
+ },
+ {
+ "icon_id": "17523068",
+ "name": "配置-运维配置",
+ "font_class": "peizhi-yunweipeizhi",
+ "unicode": "e618",
+ "unicode_decimal": 58904
+ },
+ {
+ "icon_id": "17581486",
+ "name": "任务管理",
+ "font_class": "renwuguanli4",
+ "unicode": "ec4c",
+ "unicode_decimal": 60492
+ },
+ {
+ "icon_id": "17605466",
+ "name": "编辑",
+ "font_class": "bianji5",
+ "unicode": "e816",
+ "unicode_decimal": 59414
+ },
+ {
+ "icon_id": "17755679",
+ "name": "车型",
+ "font_class": "chexing",
+ "unicode": "e61b",
+ "unicode_decimal": 58907
+ },
+ {
+ "icon_id": "18532317",
+ "name": "任务管理",
+ "font_class": "renwuguanli5",
+ "unicode": "e6e2",
+ "unicode_decimal": 59106
+ },
+ {
+ "icon_id": "18610226",
+ "name": "产品压力测试",
+ "font_class": "chanpinyaliceshi",
+ "unicode": "e61f",
+ "unicode_decimal": 58911
+ },
+ {
+ "icon_id": "18681358",
+ "name": "2-1配置管理",
+ "font_class": "2-1peizhiguanli",
+ "unicode": "e632",
+ "unicode_decimal": 58930
+ },
+ {
+ "icon_id": "18736890",
+ "name": "小胖车查车型",
+ "font_class": "xiaopangchechachexing",
+ "unicode": "e621",
+ "unicode_decimal": 58913
+ },
+ {
+ "icon_id": "18749030",
+ "name": "自动化",
+ "font_class": "zidonghua",
+ "unicode": "e633",
+ "unicode_decimal": 58931
+ },
+ {
+ "icon_id": "18797439",
+ "name": "供应商管理",
+ "font_class": "gongyingshangguanli2",
+ "unicode": "e622",
+ "unicode_decimal": 58914
+ },
+ {
+ "icon_id": "18799720",
+ "name": "任务 管理",
+ "font_class": "renwuguanli6",
+ "unicode": "e625",
+ "unicode_decimal": 58917
+ },
+ {
+ "icon_id": "18853237",
+ "name": "供应商管理",
+ "font_class": "gongyingshangguanli3",
+ "unicode": "e67b",
+ "unicode_decimal": 59003
+ },
+ {
+ "icon_id": "19542637",
+ "name": "供应商管理",
+ "font_class": "gongyingshangguanli4",
+ "unicode": "e626",
+ "unicode_decimal": 58918
+ },
+ {
+ "icon_id": "19542645",
+ "name": "任务管理",
+ "font_class": "renwuguanli7",
+ "unicode": "e627",
+ "unicode_decimal": 58919
+ },
+ {
+ "icon_id": "20240567",
+ "name": "节点事 件测试",
+ "font_class": "jiedianshijianceshi",
+ "unicode": "e63a",
+ "unicode_decimal": 58938
+ },
+ {
+ "icon_id": "20853344",
+ "name": "日志管理",
+ "font_class": "rizhiguanli2",
+ "unicode": "e6a7",
+ "unicode_decimal": 59047
+ },
+ {
+ "icon_id": "20853357",
+ "name": "系统日志",
+ "font_class": "xitongrizhi1",
+ "unicode": "e6a9",
+ "unicode_decimal": 59049
+ },
+ {
+ "icon_id": "21106041",
+ "name": "网络",
+ "font_class": "wangluo1",
+ "unicode": "e628",
+ "unicode_decimal": 58920
+ },
+ {
+ "icon_id": "21736129",
+ "name": "网络自动化",
+ "font_class": "wangluozidonghuaguanli",
+ "unicode": "e6ab",
+ "unicode_decimal": 59051
+ },
+ {
+ "icon_id": "21905674",
+ "name": "任务管理",
+ "font_class": "renwuguanli8",
+ "unicode": "e653",
+ "unicode_decimal": 58963
+ },
+ {
+ "icon_id": "22412664",
+ "name": "车型-线性3-0",
+ "font_class": "chexing-xianxing3-0",
+ "unicode": "e694",
+ "unicode_decimal": 59028
+ },
+ {
+ "icon_id": "22417274",
+ "name": "任务管理",
+ "font_class": "renwuguanli9",
+ "unicode": "e64f",
+ "unicode_decimal": 58959
+ },
+ {
+ "icon_id": "22773536",
+ "name": "工业自动化",
+ "font_class": "gongyezidonghua",
+ "unicode": "e654",
+ "unicode_decimal": 58964
+ },
+ {
+ "icon_id": "22806233",
+ "name": "iServer数据接入测试",
+ "font_class": "iServershujujieruceshi",
+ "unicode": "e629",
+ "unicode_decimal": 58921
+ },
+ {
+ "icon_id": "22806242",
+ "name": "倾斜入库测试",
+ "font_class": "qingxierukuceshi",
+ "unicode": "e62a",
+ "unicode_decimal": 58922
+ },
+ {
+ "icon_id": "24067295",
+ "name": "任务管理",
+ "font_class": "renwuguanli10",
+ "unicode": "e62b",
+ "unicode_decimal": 58923
+ },
+ {
+ "icon_id": "24068781",
+ "name": "供应商管理",
+ "font_class": "gongyingshangguanli5",
+ "unicode": "e62c",
+ "unicode_decimal": 58924
+ },
+ {
+ "icon_id": "24271986",
+ "name": "配置管理",
+ "font_class": "peizhiguanli",
+ "unicode": "e67d",
+ "unicode_decimal": 59005
+ },
+ {
+ "icon_id": "24433506",
+ "name": "车型管理",
+ "font_class": "chexingguanli",
+ "unicode": "e66d",
+ "unicode_decimal": 58989
+ },
+ {
+ "icon_id": "24818718",
+ "name": "网段",
+ "font_class": "a-ziyuan114",
+ "unicode": "e62d",
+ "unicode_decimal": 58925
+ },
+ {
+ "icon_id": "24848374",
+ "name": "部门管理",
+ "font_class": "bumenguanli2",
+ "unicode": "e636",
+ "unicode_decimal": 58934
+ },
+ {
+ "icon_id": "24849176",
+ "name": "配置管理",
+ "font_class": "peizhiguanli1",
+ "unicode": "e641",
+ "unicode_decimal": 58945
+ },
+ {
+ "icon_id": "24849343",
+ "name": "配置管理",
+ "font_class": "peizhiguanli2",
+ "unicode": "e643",
+ "unicode_decimal": 58947
+ },
+ {
+ "icon_id": "25857085",
+ "name": "自动化运维",
+ "font_class": "a-lianhe79",
+ "unicode": "e677",
+ "unicode_decimal": 58999
+ },
+ {
+ "icon_id": "25876391",
+ "name": "文件夹、文件",
+ "font_class": "a-wenjianjiawenjian",
+ "unicode": "e644",
+ "unicode_decimal": 58948
+ },
+ {
+ "icon_id": "1233",
+ "name": "文本",
+ "font_class": "wenben",
+ "unicode": "e600",
+ "unicode_decimal": 58880
+ },
+ {
+ "icon_id": "297678",
+ "name": "文本编辑_填充",
+ "font_class": "wenbenbianjitianchong",
+ "unicode": "e6d4",
+ "unicode_decimal": 59092
+ },
+ {
+ "icon_id": "410325",
+ "name": "日志管理",
+ "font_class": "rizhiguanli",
+ "unicode": "e639",
+ "unicode_decimal": 58937
+ },
+ {
+ "icon_id": "425606",
+ "name": "编辑",
+ "font_class": "bianji",
+ "unicode": "e612",
+ "unicode_decimal": 58898
+ },
+ {
+ "icon_id": "521014",
+ "name": "测试辅助",
+ "font_class": "ceshifuzhu",
+ "unicode": "e601",
+ "unicode_decimal": 58881
+ },
+ {
+ "icon_id": "521024",
+ "name": "回归测试",
+ "font_class": "huiguiceshi",
+ "unicode": "e608",
+ "unicode_decimal": 58888
+ },
+ {
+ "icon_id": "579741",
+ "name": "用户",
+ "font_class": "yonghu",
+ "unicode": "e788",
+ "unicode_decimal": 59272
+ },
+ {
+ "icon_id": "588685",
+ "name": "测试",
+ "font_class": "ceshi",
+ "unicode": "e6e1",
+ "unicode_decimal": 59105
+ },
+ {
+ "icon_id": "712256",
+ "name": "供应商管理",
+ "font_class": "icon-supplier",
+ "unicode": "e63c",
+ "unicode_decimal": 58940
+ },
+ {
+ "icon_id": "763159",
+ "name": "部门管理",
+ "font_class": "suyaniconchanpinleibufenzuodaohangbufen87",
+ "unicode": "e730",
+ "unicode_decimal": 59184
+ },
+ {
+ "icon_id": "992586",
+ "name": "提交日志",
+ "font_class": "tijiaorizhi",
+ "unicode": "e650",
+ "unicode_decimal": 58960
+ },
+ {
+ "icon_id": "1151051",
+ "name": "编辑",
+ "font_class": "bianji1",
+ "unicode": "e62e",
+ "unicode_decimal": 58926
+ },
+ {
+ "icon_id": "1459142",
+ "name": "编辑",
+ "font_class": "bianji2",
+ "unicode": "e619",
+ "unicode_decimal": 58905
+ },
+ {
+ "icon_id": "1494665",
+ "name": "网络",
+ "font_class": "wangluo",
+ "unicode": "e609",
+ "unicode_decimal": 58889
+ },
+ {
+ "icon_id": "1799696",
+ "name": "配置",
+ "font_class": "peizhi",
+ "unicode": "e667",
+ "unicode_decimal": 58983
+ },
+ {
+ "icon_id": "1963493",
+ "name": "供应商管理",
+ "font_class": "gongyingshangguanli",
+ "unicode": "e611",
+ "unicode_decimal": 58897
+ },
+ {
+ "icon_id": "2542134",
+ "name": "文件",
+ "font_class": "wenjian",
+ "unicode": "e67a",
+ "unicode_decimal": 59002
+ },
+ {
+ "icon_id": "2678627",
+ "name": "任务管理",
+ "font_class": "renwuguanli",
+ "unicode": "e657",
+ "unicode_decimal": 58967
+ },
+ {
+ "icon_id": "2815727",
+ "name": "素材",
+ "font_class": "sucai",
+ "unicode": "e602",
+ "unicode_decimal": 58882
+ },
+ {
+ "icon_id": "2959078",
+ "name": "日志管理",
+ "font_class": "rizhiguanli1",
+ "unicode": "e62f",
+ "unicode_decimal": 58927
+ },
+ {
+ "icon_id": "3108158",
+ "name": "测试用例集",
+ "font_class": "test-case-group",
+ "unicode": "e606",
+ "unicode_decimal": 58886
+ },
+ {
+ "icon_id": "3108159",
+ "name": "测试用例子集",
+ "font_class": "test-case-secondary",
+ "unicode": "e607",
+ "unicode_decimal": 58887
+ },
+ {
+ "icon_id": "3108160",
+ "name": "测试用例库",
+ "font_class": "test-case-group2",
+ "unicode": "e60a",
+ "unicode_decimal": 58890
+ },
+ {
+ "icon_id": "3521808",
+ "name": "文件",
+ "font_class": "wenjian1",
+ "unicode": "e604",
+ "unicode_decimal": 58884
+ },
+ {
+ "icon_id": "3663271",
+ "name": "销售自动化",
+ "font_class": "xiaoshouzidonghua",
+ "unicode": "e6a0",
+ "unicode_decimal": 59040
+ },
+ {
+ "icon_id": "3956119",
+ "name": "生产自动化",
+ "font_class": "kujialeqiyezhan_shengchanzidonghua",
+ "unicode": "e64b",
+ "unicode_decimal": 58955
+ },
+ {
+ "icon_id": "4396316",
+ "name": "部门管理",
+ "font_class": "bumenguanli",
+ "unicode": "e624",
+ "unicode_decimal": 58916
+ },
+ {
+ "icon_id": "4503760",
+ "name": "文件",
+ "font_class": "noun__cc",
+ "unicode": "e610",
+ "unicode_decimal": 58896
+ },
+ {
+ "icon_id": "4742649",
+ "name": "文件",
+ "font_class": "wenjian2",
+ "unicode": "e630",
+ "unicode_decimal": 58928
+ },
+ {
+ "icon_id": "4774868",
+ "name": "部门",
+ "font_class": "bumen",
+ "unicode": "e758",
+ "unicode_decimal": 59224
+ },
+ {
+ "icon_id": "4893191",
+ "name": "文件夹",
+ "font_class": "wenjianjia",
+ "unicode": "ec17",
+ "unicode_decimal": 60439
+ },
+ {
+ "icon_id": "5466489",
+ "name": "自动化运维-1",
+ "font_class": "oper-auto-1",
+ "unicode": "e7ca",
+ "unicode_decimal": 59338
+ },
+ {
+ "icon_id": "5466532",
+ "name": "自动化运维",
+ "font_class": "oper-auto",
+ "unicode": "e7cb",
+ "unicode_decimal": 59339
+ },
+ {
+ "icon_id": "5661138",
+ "name": "品质检测",
+ "font_class": "pinzhijiance",
+ "unicode": "e620",
+ "unicode_decimal": 58912
+ },
+ {
+ "icon_id": "6196914",
+ "name": "部门",
+ "font_class": "bumen1",
+ "unicode": "e64d",
+ "unicode_decimal": 58957
+ },
+ {
+ "icon_id": "6241655",
+ "name": "供应商管理",
+ "font_class": "gongyingshangguanli1",
+ "unicode": "e623",
+ "unicode_decimal": 58915
+ },
+ {
+ "icon_id": "6540381",
+ "name": "编辑",
+ "font_class": "bianji3",
+ "unicode": "e603",
+ "unicode_decimal": 58883
+ },
+ {
+ "icon_id": "6550608",
+ "name": "编辑",
+ "font_class": "bianji4",
+ "unicode": "e61c",
+ "unicode_decimal": 58908
+ },
+ {
+ "icon_id": "6627737",
+ "name": "部门管理",
+ "font_class": "bumenguanli1",
+ "unicode": "e61d",
+ "unicode_decimal": 58909
+ },
+ {
+ "icon_id": "6659705",
+ "name": "监控,测试",
+ "font_class": "icon-",
+ "unicode": "e605",
+ "unicode_decimal": 58885
+ },
+ {
+ "icon_id": "6834996",
+ "name": "文件-文件夹",
+ "font_class": "wj-wjj",
+ "unicode": "e7b8",
+ "unicode_decimal": 59320
+ },
+ {
+ "icon_id": "6978129",
+ "name": "部门",
+ "font_class": "bumen2",
+ "unicode": "e631",
+ "unicode_decimal": 58929
+ },
+ {
+ "icon_id": "7159346",
+ "name": "日志",
+ "font_class": "rizhi",
+ "unicode": "e614",
+ "unicode_decimal": 58900
+ },
+ {
+ "icon_id": "7326003",
+ "name": "配置",
+ "font_class": "peizhi1",
+ "unicode": "e60f",
+ "unicode_decimal": 58895
+ },
+ {
+ "icon_id": "7474663",
+ "name": "操作日志",
+ "font_class": "caozuorizhi",
+ "unicode": "e60b",
+ "unicode_decimal": 58891
+ },
+ {
+ "icon_id": "7571402",
+ "name": "测试工具",
+ "font_class": "ceshigongju",
+ "unicode": "e71a",
+ "unicode_decimal": 59162
+ },
+ {
+ "icon_id": "7596825",
+ "name": "24gl-portraitMalePlus4",
+ "font_class": "24gl-portraitMalePlus4",
+ "unicode": "eb25",
+ "unicode_decimal": 60197
+ },
+ {
+ "icon_id": "7596839",
+ "name": "24gl-portraitMalePlus6",
+ "font_class": "24gl-portraitMalePlus6",
+ "unicode": "eb27",
+ "unicode_decimal": 60199
+ },
+ {
+ "icon_id": "8084582",
+ "name": "配置/设置",
+ "font_class": "shezhi",
+ "unicode": "e61a",
+ "unicode_decimal": 58906
+ },
+ {
+ "icon_id": "8094211",
+ "name": "配置:设置",
+ "font_class": "peizhishezhi",
+ "unicode": "e64c",
+ "unicode_decimal": 58956
+ },
+ {
+ "icon_id": "8329623",
+ "name": "配置",
+ "font_class": "peizhi2",
+ "unicode": "e6db",
+ "unicode_decimal": 59099
+ },
+ {
+ "icon_id": "8605745",
+ "name": "用户",
+ "font_class": "yonghu1",
+ "unicode": "e668",
+ "unicode_decimal": 58984
+ },
+ {
+ "icon_id": "8668813",
+ "name": "财务自动化配置",
+ "font_class": "caiwuzidonghuapeizhi",
+ "unicode": "e60c",
+ "unicode_decimal": 58892
+ },
+ {
+ "icon_id": "9592599",
+ "name": "HTSCIT_文件",
+ "font_class": "wenjian3",
+ "unicode": "e64e",
+ "unicode_decimal": 58958
+ },
+ {
+ "icon_id": "9923110",
+ "name": "系统日志",
+ "font_class": "xitongrizhi",
+ "unicode": "e60d",
+ "unicode_decimal": 58893
+ },
+ {
+ "icon_id": "10268893",
+ "name": "文件",
+ "font_class": "wenjian4",
+ "unicode": "e695",
+ "unicode_decimal": 59029
+ },
+ {
+ "icon_id": "10593835",
+ "name": "用户-角色-用户名-单人_jurassic",
+ "font_class": "jurassic_user",
+ "unicode": "e6a4",
+ "unicode_decimal": 59044
+ },
+ {
+ "icon_id": "11192566",
+ "name": "供应商管理_ico@2x",
+ "font_class": "gongyingshangguanli_icox",
+ "unicode": "e6ce",
+ "unicode_decimal": 59086
+ },
+ {
+ "icon_id": "11762121",
+ "name": "自动化处理_line",
+ "font_class": "automated-processing_line",
+ "unicode": "e72f",
+ "unicode_decimal": 59183
+ },
+ {
+ "icon_id": "11762138",
+ "name": "自动化处理_fill",
+ "font_class": "automated-processing_fill",
+ "unicode": "e731",
+ "unicode_decimal": 59185
+ },
+ {
+ "icon_id": "12291973",
+ "name": "配置信息",
+ "font_class": "peizhixinxi",
+ "unicode": "e60e",
+ "unicode_decimal": 58894
+ },
+ {
+ "icon_id": "12498350",
+ "name": "27营销自动化",
+ "font_class": "yingxiaozidonghua",
+ "unicode": "e666",
+ "unicode_decimal": 58982
+ },
+ {
+ "icon_id": "12694603",
+ "name": "配置2",
+ "font_class": "peizhi3",
+ "unicode": "e61e",
+ "unicode_decimal": 58910
+ },
+ {
+ "icon_id": "13106277",
+ "name": "电气自动化",
+ "font_class": "dianqizidonghua",
+ "unicode": "e613",
+ "unicode_decimal": 58899
+ },
+ {
+ "icon_id": "13584361",
+ "name": "任务管理",
+ "font_class": "renwuguanli1",
+ "unicode": "e6de",
+ "unicode_decimal": 59102
+ },
+ {
+ "icon_id": "13604625",
+ "name": "财务自动化配置",
+ "font_class": "caiwuzidonghuapeizhi1",
+ "unicode": "e651",
+ "unicode_decimal": 58961
+ },
+ {
+ "icon_id": "13866072",
+ "name": "自动化测试",
+ "font_class": "xinicon_huabanfuben",
+ "unicode": "e647",
+ "unicode_decimal": 58951
+ },
+ {
+ "icon_id": "13866074",
+ "name": "测试用例",
+ "font_class": "xinicon_huabanfuben1",
+ "unicode": "e648",
+ "unicode_decimal": 58952
+ },
+ {
+ "icon_id": "13866081",
+ "name": "测试报告",
+ "font_class": "xinicon_huabanfuben2",
+ "unicode": "e649",
+ "unicode_decimal": 58953
+ },
+ {
+ "icon_id": "13867117",
+ "name": "测试历史版本",
+ "font_class": "lishibanben",
+ "unicode": "e652",
+ "unicode_decimal": 58962
+ },
+ {
+ "icon_id": "13872008",
+ "name": "节点配置",
+ "font_class": "jiedianpeizhi",
+ "unicode": "e63e",
+ "unicode_decimal": 58942
+ },
+ {
+ "icon_id": "14095330",
+ "name": "楼宇自动化",
+ "font_class": "louyuzidonghua",
+ "unicode": "e793",
+ "unicode_decimal": 59283
+ },
+ {
+ "icon_id": "14236693",
+ "name": "任务管理",
+ "font_class": "renwuguanli2",
+ "unicode": "e615",
+ "unicode_decimal": 58901
+ },
+ {
+ "icon_id": "14386921",
+ "name": "测试",
+ "font_class": "ceshi1",
+ "unicode": "e640",
+ "unicode_decimal": 58944
+ }
+ ]
+}
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.ttf b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.ttf
new file mode 100644
index 0000000..92f4cbb
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.ttf differ
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.woff b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.woff
new file mode 100644
index 0000000..52a19e6
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.woff differ
diff --git a/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.woff2 b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.woff2
new file mode 100644
index 0000000..f5112ed
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/assets/iconfront/iconfont.woff2 differ
diff --git a/RemoveMarineAnimals/app/src/main/java/bsp_IV.proto b/RemoveMarineAnimals/app/src/main/java/bsp_IV.proto
new file mode 100644
index 0000000..5b0396d
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/bsp_IV.proto
@@ -0,0 +1,11 @@
+syntax = "proto3";
+option java_multiple_files = false;//set true, and all the messages will be stored in different files, which is not what I want
+option java_package = "com.example.removemarineanimals.models";
+message IV_struct_define{
+
+ int32 Robot_Move_Speed= 1;
+ int32 Robot_Swing_Speed= 2;
+ double Pit_time = 3;
+ double Rot_time = 4;
+ int32 RF_Angle_Roll = 5;
+};
diff --git a/RemoveMarineAnimals/app/src/main/java/bsp_PV.proto b/RemoveMarineAnimals/app/src/main/java/bsp_PV.proto
new file mode 100644
index 0000000..fe4fb81
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/bsp_PV.proto
@@ -0,0 +1,8 @@
+syntax = "proto3";
+option java_multiple_files = false;//true, and all the messages will be stored in different files, which is not what I want
+option java_package = "com.example.removemarineanimals.models";
+message PV_struct_define{
+
+ int32 Robot_Tilt_TargetCurrent= 1;
+ int32 VehicleSpeed=2;
+};
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/MainActivity - 副本.txt b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/MainActivity - 副本.txt
new file mode 100644
index 0000000..1f074e9
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/MainActivity - 副本.txt
@@ -0,0 +1,335 @@
+package com.example.removemarineanimals;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
+import androidx.databinding.DataBindingUtil;
+import androidx.lifecycle.ViewModelProvider;
+
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+import android.os.Build;
+import android.os.Bundle;
+
+import com.example.removemarineanimals.databinding.ActivityMainBinding;
+import com.example.removemarineanimals.services.CustomProber;
+//import com.example.removemarineanimals.services.USBSerialPortHelper;
+import com.example.removemarineanimals.services.VideoHelper;
+import com.example.removemarineanimals.viewmodels.MainViewModel;
+import com.hoho.android.usbserial.driver.UsbSerialDriver;
+import com.hoho.android.usbserial.driver.UsbSerialPort;
+import com.hoho.android.usbserial.driver.UsbSerialProber;
+import com.hoho.android.usbserial.util.SerialInputOutputManager;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.os.Looper;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import cn.nodemedia.NodePlayer;
+
+
+public class MainActivity extends AppCompatActivity implements SerialInputOutputManager.Listener {
+
+
+ private enum UsbPermission {Unknown, Requested, Granted, Denied}
+
+ private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
+ private int deviceId = 60000;
+ private int deviceId_test = 60000;
+ private int portNum;
+ private static final int WRITE_WAIT_MILLIS = 500;
+ private static final int READ_WAIT_MILLIS = 1000;
+ private static String PortNameContians = "SILICON";/**/
+ private int baudRate = 57600;
+ private boolean withIoManager = true;
+
+ private BroadcastReceiver broadcastReceiver;
+ private Handler mainLooper;
+
+
+ private SerialInputOutputManager usbIoManager;
+ private UsbSerialPort usbSerialPort;
+ private UsbPermission usbPermission = UsbPermission.Unknown;
+ private boolean connected = false;
+
+
+ public void GetControlsReferences() {
+ broadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (INTENT_ACTION_GRANT_USB.equals(intent.getAction())) {
+ usbPermission = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)
+ ? UsbPermission.Granted : UsbPermission.Denied;
+ connect();
+ }
+
+
+ }
+ };
+ mainLooper = new Handler(Looper.getMainLooper());
+
+
+ _receiveBufferlist = new ArrayList();
+ }
+
+
+ public static ActivityMainBinding mainBinding;//通过Binding可以获取界面数据
+// public USBSerialPortHelper serialPortHelper;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // setContentView(R.layout.activity_main);
+ mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
+ MainViewModel vm = new ViewModelProvider(this).get(MainViewModel.class);
+ MainViewModel.mainBinding = mainBinding;
+ // vm.mainBinding=mainBinding;
+ mainBinding.setVm(vm);
+
+
+ //nodePlayer0 =new NodePlayer(this);
+ //nodePlayer1 =new NodePlayer(this);
+
+ VideoHelper.nodePlayerView0 = mainBinding.nodePlayerView0;
+ VideoHelper.nodePlayerView1 = mainBinding.nodePlayerView1;
+
+ VideoHelper.nodePlayer0 = new NodePlayer(this);
+ VideoHelper.nodePlayer1 = new NodePlayer(this);
+
+
+ VideoHelper.StatPlayVideo();
+
+//
+// serialPortHelper=new USBSerialPortHelper();
+// serialPortHelper.MainActivity=this;
+// serialPortHelper.intialize();
+
+
+ GetControlsReferences();
+ connect();
+
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ ContextCompat.registerReceiver(this, broadcastReceiver, new IntentFilter(INTENT_ACTION_GRANT_USB), ContextCompat.RECEIVER_NOT_EXPORTED);
+
+ }
+
+ @Override
+ public void onStop() {
+ this.unregisterReceiver(broadcastReceiver);
+ super.onStop();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (!connected && (usbPermission == UsbPermission.Unknown || usbPermission == UsbPermission.Granted)) {
+ //mainLooper.post(this::connect);
+
+ }
+
+ }
+
+ @Override
+ public void onPause() {
+ if (connected) {
+ status("串口断开");
+ // _serialPortSwitch.setChecked(false);
+ disconnect();
+ }
+ super.onPause();
+ }
+
+ @Override
+ public void onNewData(byte[] data) {
+ mainLooper.post(() ->
+ {
+ receive(data);
+ // receive data
+ });
+ }
+
+ @Override
+ public void onRunError(Exception e) {
+ mainLooper.post(() ->
+ {
+ status("connection lost: " + e.getMessage());
+ disconnect();
+ });
+ }
+
+ private void connect() {
+
+ UsbDevice device = null;
+ UsbManager usbManager = (UsbManager) this.getSystemService(Context.USB_SERVICE);
+ for (UsbDevice v : usbManager.getDeviceList().values()) {
+ status(v.getManufacturerName().toUpperCase());
+ if (v.getManufacturerName().toUpperCase().contains(PortNameContians)) {
+ device = v;
+ break;
+ }
+ }
+
+ if (device == null) {
+ // _serialPortSwitch.setChecked(false);
+
+ status("找不到设备");
+ return;
+ }
+ UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device);
+ if (driver == null) {
+ driver = CustomProber.getCustomProber().probeDevice(device);
+ }
+ if (driver == null) {
+ // _serialPortSwitch.setChecked(false);
+ status("无驱动");
+ return;
+ }
+ if (driver.getPorts().size() < portNum) //就是0 cp2102 或者同一个驱动,第一个
+ {
+ status("connection failed: not enough ports at device");
+ status("找不到设备");
+ return;
+ }
+ usbSerialPort = driver.getPorts().get(portNum);
+
+ UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice());
+ if (usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) {
+ usbPermission = UsbPermission.Requested;
+ int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_MUTABLE : 0;
+ Intent intent = new Intent(INTENT_ACTION_GRANT_USB);
+ intent.setPackage(this.getPackageName());
+ PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(this, 0, intent, flags);
+ usbManager.requestPermission(driver.getDevice(), usbPermissionIntent);
+ return;
+ }
+ if (usbConnection == null) {
+ if (!usbManager.hasPermission(driver.getDevice())) {
+ status("connection failed: permission denied");
+ } else {
+ status("connection failed: open failed");
+ }
+
+ return;
+ }
+
+ try {
+ usbSerialPort.open(usbConnection);
+ try {
+ usbSerialPort.setParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE);
+ } catch (UnsupportedOperationException e) {
+ status("unsupport setparameters");
+ }
+ if (withIoManager) {
+ usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
+ usbIoManager.setReadBufferSize(40960);
+ usbIoManager.setReadTimeout(READ_WAIT_MILLIS);
+ usbIoManager.start();
+ }
+ //status("connected");
+ connected = true;
+ // _serialPortSwitch.setChecked(true);
+ //switch set true
+
+ } catch (Exception e) {
+ status("connection failed: " + e.getMessage());
+ disconnect();
+ }
+ }
+
+ private void disconnect() {
+ connected = false;
+
+ if (usbIoManager != null) {
+ usbIoManager.setListener(null);
+ usbIoManager.stop();
+ }
+ usbIoManager = null;
+ try {
+ usbSerialPort.close();
+ } catch (IOException ignored)
+ {
+
+ }
+ usbSerialPort = null;
+ }
+
+ List _receiveBufferlist;
+
+ private byte[] listTobyte(List list) {
+ if (list == null || list.size() < 0)
+ return null;
+ byte[] bytes = new byte[list.size()];
+ int i = 0;
+ Iterator iterator = list.iterator();
+ while (iterator.hasNext()) {
+ bytes[i] = iterator.next();
+ i++;
+ }
+ return bytes;
+ }
+
+ public int Counter = 1000;
+ boolean StartCountDown = false;
+
+ private void receive(byte[] data) {
+
+ for (int i = 0; i < data.length; i++) {
+ _receiveBufferlist.add(data[i]);
+ }
+
+ //decodeRceive(data);
+ if (StartCountDown == false) {
+ StartCountDown = true;
+ new CountDownTimer(500, 500) {
+ public void onTick(long millisUntilFinished) {
+ // Used for formatting digit to be in 2 digits only
+
+ }
+
+ // When the task is over it will print 00:00:00 there
+ public void onFinish() {
+ decodeRceive(listTobyte(_receiveBufferlist));
+ _receiveBufferlist.clear();
+ StartCountDown = false;
+ }
+ }.start();
+ }
+
+
+ }
+
+ private void decodeRceive(byte[] data) {
+ try {
+
+ } catch (
+ Exception e) {
+ //spn.append("exception:{e} ");
+ }
+ }
+ void status(String str)
+ {
+ mainBinding.message.setText(str);
+// SpannableStringBuilder spn = new SpannableStringBuilder(str + '\r' + '\n');
+//
+// // spn.append(getTime());
+//
+// spn.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorAccent)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+// receiveText.append(spn);
+// scrollView.fullScroll(ScrollView.FOCUS_DOWN);
+ }
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/MainActivity.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/MainActivity.java
new file mode 100644
index 0000000..823de51
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/MainActivity.java
@@ -0,0 +1,172 @@
+package com.example.removemarineanimals;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.databinding.DataBindingUtil;
+import androidx.lifecycle.ViewModelProvider;
+import android.os.Bundle;
+import com.example.removemarineanimals.databinding.ActivityMainBinding;
+
+// import com.example.removemarineanimals.models.BspPV;
+import com.example.removemarineanimals.models.BspPV;
+import com.example.removemarineanimals.services.ModbusCRC;
+import com.example.removemarineanimals.services.USBSerialPortHelper;
+import com.example.removemarineanimals.services.VideoPlayerHelper;
+import com.example.removemarineanimals.viewmodels.MainViewModel;
+
+import android.widget.SeekBar;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import cn.nodemedia.NodePlayer;
+
+
+public class MainActivity extends AppCompatActivity {
+
+ public static ActivityMainBinding mainBinding;//通过Binding可以获取界面数据 而无需使用传统的 findViewById 方法
+ //USB 串口服务
+ public USBSerialPortHelper serialPortHelper;
+
+
+ protected BspPV.PV_struct_define _toSendPV;
+ private int Vehicle=0;
+ public MainActivity() {
+
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ //MainViewModel binding region
+ mainBinding= DataBindingUtil.setContentView(this,R.layout.activity_main);
+ MainViewModel vm=new ViewModelProvider(this).get(MainViewModel.class);
+ MainViewModel.mainBinding=mainBinding;
+ mainBinding.setVm(vm);
+
+ //mainBinding.tvLightness.setText(String.valueOf(0));
+
+ mainBinding.robotSpeed.setText(String.valueOf(0));
+ mainBinding.swingSpeed.setText(String.valueOf(0));
+ mainBinding.SwingRange.setText(String.valueOf(0));
+ mainBinding.TiltRange.setText(String.valueOf(0));
+ mainBinding.Roll.setText(String.valueOf(0));
+
+
+
+
+
+ /* USB串口 控制区域*/
+
+ serialPortHelper=new USBSerialPortHelper();
+ serialPortHelper.MainActivity=this;//当前的 MainActivity 实例赋值给 serialPortHelper 的一个成员变量
+ serialPortHelper.intialize();
+ serialPortHelper.connect();
+
+
+ /* NodePlayer 播放视频区域*/
+
+ NodePlayer nodePlayer0=new NodePlayer(this);
+ // String address0 = "rtsp://192.168.1.168:8554/0";
+ // String address1 = "rtsp://192.168.1.169:8554/0";
+ String address0 = "rtsp://192.168.144.25:8554/main.264";
+ VideoPlayerHelper.startVedio(mainBinding.nodePlayerView0,nodePlayer0,address0);
+
+ /**/
+
+
+ // 设置 SeekBar 的监听器
+ mainBinding.seekBarRobotSpeed.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ // 更新 TextView 显示当前进度
+// mainBinding.tvRobotSpeed.setText(String.valueOf(progress));
+// Vehicle=progress;
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ // 可选:用户开始拖动时调用
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ // 可选:用户停止拖动时调用
+ }
+ });
+
+ ////通过 Timer 定时器在 Android 应用中周期性地执行一个任务,任务的内容是构建一个字节数组并将其通过串口发送出去
+ timer.schedule(new TimerTask() { //在TimerTask的run方法中,调用了runOnUiThread
+ @Override
+ public void run() {
+ // 使用 Handler 或 runOnUiThread 更新 UI
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ // 更新 UI 的代码 向32发送数据
+ _toSendPV = BspPV.PV_struct_define.newBuilder().
+ setRobotTiltTargetCurrent(1)
+ .setVehicleSpeed(Vehicle)
+ .build();
+ byte[] byteArray = _toSendPV.toByteArray();
+ byte[] sendbyteArray = new byte[byteArray.length + 4];
+ byte[] sendbyteArray3 = new byte[byteArray.length + 6];
+ if (byteArray.length != 0) {
+ //从byteArray[0]开始赋值给sendbyteArray[4]开始,复制所有元素
+ System.arraycopy(byteArray, 0, sendbyteArray, 4, byteArray.length);
+ }
+ sendbyteArray[0] = (byte) 0x55;
+ sendbyteArray[1] = (byte) 0x55;
+ sendbyteArray[2] = (byte) 0x01;
+ sendbyteArray[3] = (byte) 0x01;
+ byte[] byteArray2 = ModbusCRC.calculateCRC(sendbyteArray);
+ System.arraycopy(sendbyteArray, 0, sendbyteArray3, 0, sendbyteArray.length);
+ System.arraycopy(byteArray2, 0, sendbyteArray3, sendbyteArray3.length - 2, 2);
+
+
+ serialPortHelper.SendData(sendbyteArray3);
+
+ }
+ });
+ }
+ }, 0, 1000); // 延迟 0 毫秒,每隔 1000 毫秒执行一次
+
+ }
+ int testCounter=0;
+ // Create a Timer instance
+ Timer timer = new Timer();
+ @Override
+ protected void onStart() {
+ super.onStart();
+ serialPortHelper.onStart();
+
+ }
+ @Override
+ public void onStop()
+ {
+ serialPortHelper.onStop();
+ super.onStop();
+ }
+
+ @Override
+ public void onResume()
+ {
+ super.onResume();
+ serialPortHelper.onResume();
+
+ }
+
+ @Override
+ public void onPause()
+ {
+ serialPortHelper.onPause();
+ super.onPause();
+ }
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (timer != null) {
+ timer.cancel();
+ }
+ }
+}
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/models/BspIV.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/models/BspIV.java
new file mode 100644
index 0000000..ed73e21
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/models/BspIV.java
@@ -0,0 +1,788 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// NO CHECKED-IN PROTOBUF GENCODE
+// source: bsp_IV.proto
+// Protobuf Java Version: 4.27.2
+
+package com.example.removemarineanimals.models;
+
+public final class BspIV {
+ private BspIV() {}
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
+ /* major= */ 4,
+ /* minor= */ 27,
+ /* patch= */ 2,
+ /* suffix= */ "",
+ BspIV.class.getName());
+ }
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ public interface IV_struct_defineOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:IV_struct_define)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * int32 Robot_Move_Speed = 1;
+ * @return The robotMoveSpeed.
+ */
+ int getRobotMoveSpeed();
+
+ /**
+ * int32 Robot_Swing_Speed = 2;
+ * @return The robotSwingSpeed.
+ */
+ int getRobotSwingSpeed();
+
+ /**
+ * double Pit_time = 3;
+ * @return The pitTime.
+ */
+ double getPitTime();
+
+ /**
+ * double Rot_time = 4;
+ * @return The rotTime.
+ */
+ double getRotTime();
+
+ /**
+ * int32 RF_Angle_Roll = 5;
+ * @return The rFAngleRoll.
+ */
+ int getRFAngleRoll();
+ }
+ /**
+ * Protobuf type {@code IV_struct_define}
+ */
+ public static final class IV_struct_define extends
+ com.google.protobuf.GeneratedMessage implements
+ // @@protoc_insertion_point(message_implements:IV_struct_define)
+ IV_struct_defineOrBuilder {
+ private static final long serialVersionUID = 0L;
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
+ /* major= */ 4,
+ /* minor= */ 27,
+ /* patch= */ 2,
+ /* suffix= */ "",
+ IV_struct_define.class.getName());
+ }
+ // Use IV_struct_define.newBuilder() to construct.
+ private IV_struct_define(com.google.protobuf.GeneratedMessage.Builder> builder) {
+ super(builder);
+ }
+ private IV_struct_define() {
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.example.removemarineanimals.models.BspIV.internal_static_IV_struct_define_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.example.removemarineanimals.models.BspIV.internal_static_IV_struct_define_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.example.removemarineanimals.models.BspIV.IV_struct_define.class, com.example.removemarineanimals.models.BspIV.IV_struct_define.Builder.class);
+ }
+
+ public static final int ROBOT_MOVE_SPEED_FIELD_NUMBER = 1;
+ private int robotMoveSpeed_ = 0;
+ /**
+ * int32 Robot_Move_Speed = 1;
+ * @return The robotMoveSpeed.
+ */
+ @java.lang.Override
+ public int getRobotMoveSpeed() {
+ return robotMoveSpeed_;
+ }
+
+ public static final int ROBOT_SWING_SPEED_FIELD_NUMBER = 2;
+ private int robotSwingSpeed_ = 0;
+ /**
+ * int32 Robot_Swing_Speed = 2;
+ * @return The robotSwingSpeed.
+ */
+ @java.lang.Override
+ public int getRobotSwingSpeed() {
+ return robotSwingSpeed_;
+ }
+
+ public static final int PIT_TIME_FIELD_NUMBER = 3;
+ private double pitTime_ = 0D;
+ /**
+ * double Pit_time = 3;
+ * @return The pitTime.
+ */
+ @java.lang.Override
+ public double getPitTime() {
+ return pitTime_;
+ }
+
+ public static final int ROT_TIME_FIELD_NUMBER = 4;
+ private double rotTime_ = 0D;
+ /**
+ * double Rot_time = 4;
+ * @return The rotTime.
+ */
+ @java.lang.Override
+ public double getRotTime() {
+ return rotTime_;
+ }
+
+ public static final int RF_ANGLE_ROLL_FIELD_NUMBER = 5;
+ private int rFAngleRoll_ = 0;
+ /**
+ * int32 RF_Angle_Roll = 5;
+ * @return The rFAngleRoll.
+ */
+ @java.lang.Override
+ public int getRFAngleRoll() {
+ return rFAngleRoll_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (robotMoveSpeed_ != 0) {
+ output.writeInt32(1, robotMoveSpeed_);
+ }
+ if (robotSwingSpeed_ != 0) {
+ output.writeInt32(2, robotSwingSpeed_);
+ }
+ if (java.lang.Double.doubleToRawLongBits(pitTime_) != 0) {
+ output.writeDouble(3, pitTime_);
+ }
+ if (java.lang.Double.doubleToRawLongBits(rotTime_) != 0) {
+ output.writeDouble(4, rotTime_);
+ }
+ if (rFAngleRoll_ != 0) {
+ output.writeInt32(5, rFAngleRoll_);
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (robotMoveSpeed_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(1, robotMoveSpeed_);
+ }
+ if (robotSwingSpeed_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(2, robotSwingSpeed_);
+ }
+ if (java.lang.Double.doubleToRawLongBits(pitTime_) != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeDoubleSize(3, pitTime_);
+ }
+ if (java.lang.Double.doubleToRawLongBits(rotTime_) != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeDoubleSize(4, rotTime_);
+ }
+ if (rFAngleRoll_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(5, rFAngleRoll_);
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof com.example.removemarineanimals.models.BspIV.IV_struct_define)) {
+ return super.equals(obj);
+ }
+ com.example.removemarineanimals.models.BspIV.IV_struct_define other = (com.example.removemarineanimals.models.BspIV.IV_struct_define) obj;
+
+ if (getRobotMoveSpeed()
+ != other.getRobotMoveSpeed()) return false;
+ if (getRobotSwingSpeed()
+ != other.getRobotSwingSpeed()) return false;
+ if (java.lang.Double.doubleToLongBits(getPitTime())
+ != java.lang.Double.doubleToLongBits(
+ other.getPitTime())) return false;
+ if (java.lang.Double.doubleToLongBits(getRotTime())
+ != java.lang.Double.doubleToLongBits(
+ other.getRotTime())) return false;
+ if (getRFAngleRoll()
+ != other.getRFAngleRoll()) return false;
+ if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + ROBOT_MOVE_SPEED_FIELD_NUMBER;
+ hash = (53 * hash) + getRobotMoveSpeed();
+ hash = (37 * hash) + ROBOT_SWING_SPEED_FIELD_NUMBER;
+ hash = (53 * hash) + getRobotSwingSpeed();
+ hash = (37 * hash) + PIT_TIME_FIELD_NUMBER;
+ hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+ java.lang.Double.doubleToLongBits(getPitTime()));
+ hash = (37 * hash) + ROT_TIME_FIELD_NUMBER;
+ hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+ java.lang.Double.doubleToLongBits(getRotTime()));
+ hash = (37 * hash) + RF_ANGLE_ROLL_FIELD_NUMBER;
+ hash = (53 * hash) + getRFAngleRoll();
+ hash = (29 * hash) + getUnknownFields().hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(com.example.removemarineanimals.models.BspIV.IV_struct_define prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code IV_struct_define}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessage.Builder implements
+ // @@protoc_insertion_point(builder_implements:IV_struct_define)
+ com.example.removemarineanimals.models.BspIV.IV_struct_defineOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.example.removemarineanimals.models.BspIV.internal_static_IV_struct_define_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.example.removemarineanimals.models.BspIV.internal_static_IV_struct_define_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.example.removemarineanimals.models.BspIV.IV_struct_define.class, com.example.removemarineanimals.models.BspIV.IV_struct_define.Builder.class);
+ }
+
+ // Construct using com.example.removemarineanimals.models.BspIV.IV_struct_define.newBuilder()
+ private Builder() {
+
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+ super(parent);
+
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ bitField0_ = 0;
+ robotMoveSpeed_ = 0;
+ robotSwingSpeed_ = 0;
+ pitTime_ = 0D;
+ rotTime_ = 0D;
+ rFAngleRoll_ = 0;
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return com.example.removemarineanimals.models.BspIV.internal_static_IV_struct_define_descriptor;
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspIV.IV_struct_define getDefaultInstanceForType() {
+ return com.example.removemarineanimals.models.BspIV.IV_struct_define.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspIV.IV_struct_define build() {
+ com.example.removemarineanimals.models.BspIV.IV_struct_define result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspIV.IV_struct_define buildPartial() {
+ com.example.removemarineanimals.models.BspIV.IV_struct_define result = new com.example.removemarineanimals.models.BspIV.IV_struct_define(this);
+ if (bitField0_ != 0) { buildPartial0(result); }
+ onBuilt();
+ return result;
+ }
+
+ private void buildPartial0(com.example.removemarineanimals.models.BspIV.IV_struct_define result) {
+ int from_bitField0_ = bitField0_;
+ if (((from_bitField0_ & 0x00000001) != 0)) {
+ result.robotMoveSpeed_ = robotMoveSpeed_;
+ }
+ if (((from_bitField0_ & 0x00000002) != 0)) {
+ result.robotSwingSpeed_ = robotSwingSpeed_;
+ }
+ if (((from_bitField0_ & 0x00000004) != 0)) {
+ result.pitTime_ = pitTime_;
+ }
+ if (((from_bitField0_ & 0x00000008) != 0)) {
+ result.rotTime_ = rotTime_;
+ }
+ if (((from_bitField0_ & 0x00000010) != 0)) {
+ result.rFAngleRoll_ = rFAngleRoll_;
+ }
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof com.example.removemarineanimals.models.BspIV.IV_struct_define) {
+ return mergeFrom((com.example.removemarineanimals.models.BspIV.IV_struct_define)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(com.example.removemarineanimals.models.BspIV.IV_struct_define other) {
+ if (other == com.example.removemarineanimals.models.BspIV.IV_struct_define.getDefaultInstance()) return this;
+ if (other.getRobotMoveSpeed() != 0) {
+ setRobotMoveSpeed(other.getRobotMoveSpeed());
+ }
+ if (other.getRobotSwingSpeed() != 0) {
+ setRobotSwingSpeed(other.getRobotSwingSpeed());
+ }
+ if (other.getPitTime() != 0D) {
+ setPitTime(other.getPitTime());
+ }
+ if (other.getRotTime() != 0D) {
+ setRotTime(other.getRotTime());
+ }
+ if (other.getRFAngleRoll() != 0) {
+ setRFAngleRoll(other.getRFAngleRoll());
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 8: {
+ robotMoveSpeed_ = input.readInt32();
+ bitField0_ |= 0x00000001;
+ break;
+ } // case 8
+ case 16: {
+ robotSwingSpeed_ = input.readInt32();
+ bitField0_ |= 0x00000002;
+ break;
+ } // case 16
+ case 25: {
+ pitTime_ = input.readDouble();
+ bitField0_ |= 0x00000004;
+ break;
+ } // case 25
+ case 33: {
+ rotTime_ = input.readDouble();
+ bitField0_ |= 0x00000008;
+ break;
+ } // case 33
+ case 40: {
+ rFAngleRoll_ = input.readInt32();
+ bitField0_ |= 0x00000010;
+ break;
+ } // case 40
+ default: {
+ if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+ done = true; // was an endgroup tag
+ }
+ break;
+ } // default:
+ } // switch (tag)
+ } // while (!done)
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.unwrapIOException();
+ } finally {
+ onChanged();
+ } // finally
+ return this;
+ }
+ private int bitField0_;
+
+ private int robotMoveSpeed_ ;
+ /**
+ * int32 Robot_Move_Speed = 1;
+ * @return The robotMoveSpeed.
+ */
+ @java.lang.Override
+ public int getRobotMoveSpeed() {
+ return robotMoveSpeed_;
+ }
+ /**
+ * int32 Robot_Move_Speed = 1;
+ * @param value The robotMoveSpeed to set.
+ * @return This builder for chaining.
+ */
+ public Builder setRobotMoveSpeed(int value) {
+
+ robotMoveSpeed_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 Robot_Move_Speed = 1;
+ * @return This builder for chaining.
+ */
+ public Builder clearRobotMoveSpeed() {
+ bitField0_ = (bitField0_ & ~0x00000001);
+ robotMoveSpeed_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int robotSwingSpeed_ ;
+ /**
+ * int32 Robot_Swing_Speed = 2;
+ * @return The robotSwingSpeed.
+ */
+ @java.lang.Override
+ public int getRobotSwingSpeed() {
+ return robotSwingSpeed_;
+ }
+ /**
+ * int32 Robot_Swing_Speed = 2;
+ * @param value The robotSwingSpeed to set.
+ * @return This builder for chaining.
+ */
+ public Builder setRobotSwingSpeed(int value) {
+
+ robotSwingSpeed_ = value;
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 Robot_Swing_Speed = 2;
+ * @return This builder for chaining.
+ */
+ public Builder clearRobotSwingSpeed() {
+ bitField0_ = (bitField0_ & ~0x00000002);
+ robotSwingSpeed_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private double pitTime_ ;
+ /**
+ * double Pit_time = 3;
+ * @return The pitTime.
+ */
+ @java.lang.Override
+ public double getPitTime() {
+ return pitTime_;
+ }
+ /**
+ * double Pit_time = 3;
+ * @param value The pitTime to set.
+ * @return This builder for chaining.
+ */
+ public Builder setPitTime(double value) {
+
+ pitTime_ = value;
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return this;
+ }
+ /**
+ * double Pit_time = 3;
+ * @return This builder for chaining.
+ */
+ public Builder clearPitTime() {
+ bitField0_ = (bitField0_ & ~0x00000004);
+ pitTime_ = 0D;
+ onChanged();
+ return this;
+ }
+
+ private double rotTime_ ;
+ /**
+ * double Rot_time = 4;
+ * @return The rotTime.
+ */
+ @java.lang.Override
+ public double getRotTime() {
+ return rotTime_;
+ }
+ /**
+ * double Rot_time = 4;
+ * @param value The rotTime to set.
+ * @return This builder for chaining.
+ */
+ public Builder setRotTime(double value) {
+
+ rotTime_ = value;
+ bitField0_ |= 0x00000008;
+ onChanged();
+ return this;
+ }
+ /**
+ * double Rot_time = 4;
+ * @return This builder for chaining.
+ */
+ public Builder clearRotTime() {
+ bitField0_ = (bitField0_ & ~0x00000008);
+ rotTime_ = 0D;
+ onChanged();
+ return this;
+ }
+
+ private int rFAngleRoll_ ;
+ /**
+ * int32 RF_Angle_Roll = 5;
+ * @return The rFAngleRoll.
+ */
+ @java.lang.Override
+ public int getRFAngleRoll() {
+ return rFAngleRoll_;
+ }
+ /**
+ * int32 RF_Angle_Roll = 5;
+ * @param value The rFAngleRoll to set.
+ * @return This builder for chaining.
+ */
+ public Builder setRFAngleRoll(int value) {
+
+ rFAngleRoll_ = value;
+ bitField0_ |= 0x00000010;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 RF_Angle_Roll = 5;
+ * @return This builder for chaining.
+ */
+ public Builder clearRFAngleRoll() {
+ bitField0_ = (bitField0_ & ~0x00000010);
+ rFAngleRoll_ = 0;
+ onChanged();
+ return this;
+ }
+
+ // @@protoc_insertion_point(builder_scope:IV_struct_define)
+ }
+
+ // @@protoc_insertion_point(class_scope:IV_struct_define)
+ private static final com.example.removemarineanimals.models.BspIV.IV_struct_define DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new com.example.removemarineanimals.models.BspIV.IV_struct_define();
+ }
+
+ public static com.example.removemarineanimals.models.BspIV.IV_struct_define getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public IV_struct_define parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ Builder builder = newBuilder();
+ try {
+ builder.mergeFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(builder.buildPartial());
+ } catch (com.google.protobuf.UninitializedMessageException e) {
+ throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(e)
+ .setUnfinishedMessage(builder.buildPartial());
+ }
+ return builder.buildPartial();
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspIV.IV_struct_define getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_IV_struct_define_descriptor;
+ private static final
+ com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internal_static_IV_struct_define_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\014bsp_IV.proto\"\202\001\n\020IV_struct_define\022\030\n\020R" +
+ "obot_Move_Speed\030\001 \001(\005\022\031\n\021Robot_Swing_Spe" +
+ "ed\030\002 \001(\005\022\020\n\010Pit_time\030\003 \001(\001\022\020\n\010Rot_time\030\004" +
+ " \001(\001\022\025\n\rRF_Angle_Roll\030\005 \001(\005B*\n&com.examp" +
+ "le.removemarineanimals.modelsP\000b\006proto3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ });
+ internal_static_IV_struct_define_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_IV_struct_define_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+ internal_static_IV_struct_define_descriptor,
+ new java.lang.String[] { "RobotMoveSpeed", "RobotSwingSpeed", "PitTime", "RotTime", "RFAngleRoll", });
+ descriptor.resolveAllFeaturesImmutable();
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/models/BspPV.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/models/BspPV.java
new file mode 100644
index 0000000..83de1f9
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/models/BspPV.java
@@ -0,0 +1,567 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// NO CHECKED-IN PROTOBUF GENCODE
+// source: bsp_PV.proto
+// Protobuf Java Version: 4.27.2
+
+package com.example.removemarineanimals.models;
+
+public final class BspPV {
+ private BspPV() {}
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
+ /* major= */ 4,
+ /* minor= */ 27,
+ /* patch= */ 2,
+ /* suffix= */ "",
+ BspPV.class.getName());
+ }
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(
+ com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions(
+ (com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+ public interface PV_struct_defineOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:PV_struct_define)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * int32 Robot_Tilt_TargetCurrent = 1;
+ * @return The robotTiltTargetCurrent.
+ */
+ int getRobotTiltTargetCurrent();
+
+ /**
+ * int32 VehicleSpeed = 2;
+ * @return The vehicleSpeed.
+ */
+ int getVehicleSpeed();
+ }
+ /**
+ * Protobuf type {@code PV_struct_define}
+ */
+ public static final class PV_struct_define extends
+ com.google.protobuf.GeneratedMessage implements
+ // @@protoc_insertion_point(message_implements:PV_struct_define)
+ PV_struct_defineOrBuilder {
+ private static final long serialVersionUID = 0L;
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC,
+ /* major= */ 4,
+ /* minor= */ 27,
+ /* patch= */ 2,
+ /* suffix= */ "",
+ PV_struct_define.class.getName());
+ }
+ // Use PV_struct_define.newBuilder() to construct.
+ private PV_struct_define(com.google.protobuf.GeneratedMessage.Builder> builder) {
+ super(builder);
+ }
+ private PV_struct_define() {
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.example.removemarineanimals.models.BspPV.internal_static_PV_struct_define_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.example.removemarineanimals.models.BspPV.internal_static_PV_struct_define_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.example.removemarineanimals.models.BspPV.PV_struct_define.class, com.example.removemarineanimals.models.BspPV.PV_struct_define.Builder.class);
+ }
+
+ public static final int ROBOT_TILT_TARGETCURRENT_FIELD_NUMBER = 1;
+ private int robotTiltTargetCurrent_ = 0;
+ /**
+ * int32 Robot_Tilt_TargetCurrent = 1;
+ * @return The robotTiltTargetCurrent.
+ */
+ @java.lang.Override
+ public int getRobotTiltTargetCurrent() {
+ return robotTiltTargetCurrent_;
+ }
+
+ public static final int VEHICLESPEED_FIELD_NUMBER = 2;
+ private int vehicleSpeed_ = 0;
+ /**
+ * int32 VehicleSpeed = 2;
+ * @return The vehicleSpeed.
+ */
+ @java.lang.Override
+ public int getVehicleSpeed() {
+ return vehicleSpeed_;
+ }
+
+ private byte memoizedIsInitialized = -1;
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1) return true;
+ if (isInitialized == 0) return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output)
+ throws java.io.IOException {
+ if (robotTiltTargetCurrent_ != 0) {
+ output.writeInt32(1, robotTiltTargetCurrent_);
+ }
+ if (vehicleSpeed_ != 0) {
+ output.writeInt32(2, vehicleSpeed_);
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1) return size;
+
+ size = 0;
+ if (robotTiltTargetCurrent_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(1, robotTiltTargetCurrent_);
+ }
+ if (vehicleSpeed_ != 0) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(2, vehicleSpeed_);
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof com.example.removemarineanimals.models.BspPV.PV_struct_define)) {
+ return super.equals(obj);
+ }
+ com.example.removemarineanimals.models.BspPV.PV_struct_define other = (com.example.removemarineanimals.models.BspPV.PV_struct_define) obj;
+
+ if (getRobotTiltTargetCurrent()
+ != other.getRobotTiltTargetCurrent()) return false;
+ if (getVehicleSpeed()
+ != other.getVehicleSpeed()) return false;
+ if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + ROBOT_TILT_TARGETCURRENT_FIELD_NUMBER;
+ hash = (53 * hash) + getRobotTiltTargetCurrent();
+ hash = (37 * hash) + VEHICLESPEED_FIELD_NUMBER;
+ hash = (53 * hash) + getVehicleSpeed();
+ hash = (29 * hash) + getUnknownFields().hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseDelimitedWithIOException(PARSER, input);
+ }
+
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseDelimitedFrom(
+ java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input);
+ }
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define parseFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage
+ .parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() { return newBuilder(); }
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+ public static Builder newBuilder(com.example.removemarineanimals.models.BspPV.PV_struct_define prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE
+ ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(
+ com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+ /**
+ * Protobuf type {@code PV_struct_define}
+ */
+ public static final class Builder extends
+ com.google.protobuf.GeneratedMessage.Builder implements
+ // @@protoc_insertion_point(builder_implements:PV_struct_define)
+ com.example.removemarineanimals.models.BspPV.PV_struct_defineOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor
+ getDescriptor() {
+ return com.example.removemarineanimals.models.BspPV.internal_static_PV_struct_define_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internalGetFieldAccessorTable() {
+ return com.example.removemarineanimals.models.BspPV.internal_static_PV_struct_define_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(
+ com.example.removemarineanimals.models.BspPV.PV_struct_define.class, com.example.removemarineanimals.models.BspPV.PV_struct_define.Builder.class);
+ }
+
+ // Construct using com.example.removemarineanimals.models.BspPV.PV_struct_define.newBuilder()
+ private Builder() {
+
+ }
+
+ private Builder(
+ com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+ super(parent);
+
+ }
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ bitField0_ = 0;
+ robotTiltTargetCurrent_ = 0;
+ vehicleSpeed_ = 0;
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor
+ getDescriptorForType() {
+ return com.example.removemarineanimals.models.BspPV.internal_static_PV_struct_define_descriptor;
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspPV.PV_struct_define getDefaultInstanceForType() {
+ return com.example.removemarineanimals.models.BspPV.PV_struct_define.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspPV.PV_struct_define build() {
+ com.example.removemarineanimals.models.BspPV.PV_struct_define result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspPV.PV_struct_define buildPartial() {
+ com.example.removemarineanimals.models.BspPV.PV_struct_define result = new com.example.removemarineanimals.models.BspPV.PV_struct_define(this);
+ if (bitField0_ != 0) { buildPartial0(result); }
+ onBuilt();
+ return result;
+ }
+
+ private void buildPartial0(com.example.removemarineanimals.models.BspPV.PV_struct_define result) {
+ int from_bitField0_ = bitField0_;
+ if (((from_bitField0_ & 0x00000001) != 0)) {
+ result.robotTiltTargetCurrent_ = robotTiltTargetCurrent_;
+ }
+ if (((from_bitField0_ & 0x00000002) != 0)) {
+ result.vehicleSpeed_ = vehicleSpeed_;
+ }
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof com.example.removemarineanimals.models.BspPV.PV_struct_define) {
+ return mergeFrom((com.example.removemarineanimals.models.BspPV.PV_struct_define)other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(com.example.removemarineanimals.models.BspPV.PV_struct_define other) {
+ if (other == com.example.removemarineanimals.models.BspPV.PV_struct_define.getDefaultInstance()) return this;
+ if (other.getRobotTiltTargetCurrent() != 0) {
+ setRobotTiltTargetCurrent(other.getRobotTiltTargetCurrent());
+ }
+ if (other.getVehicleSpeed() != 0) {
+ setVehicleSpeed(other.getVehicleSpeed());
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws java.io.IOException {
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 8: {
+ robotTiltTargetCurrent_ = input.readInt32();
+ bitField0_ |= 0x00000001;
+ break;
+ } // case 8
+ case 16: {
+ vehicleSpeed_ = input.readInt32();
+ bitField0_ |= 0x00000002;
+ break;
+ } // case 16
+ default: {
+ if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+ done = true; // was an endgroup tag
+ }
+ break;
+ } // default:
+ } // switch (tag)
+ } // while (!done)
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.unwrapIOException();
+ } finally {
+ onChanged();
+ } // finally
+ return this;
+ }
+ private int bitField0_;
+
+ private int robotTiltTargetCurrent_ ;
+ /**
+ * int32 Robot_Tilt_TargetCurrent = 1;
+ * @return The robotTiltTargetCurrent.
+ */
+ @java.lang.Override
+ public int getRobotTiltTargetCurrent() {
+ return robotTiltTargetCurrent_;
+ }
+ /**
+ * int32 Robot_Tilt_TargetCurrent = 1;
+ * @param value The robotTiltTargetCurrent to set.
+ * @return This builder for chaining.
+ */
+ public Builder setRobotTiltTargetCurrent(int value) {
+
+ robotTiltTargetCurrent_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 Robot_Tilt_TargetCurrent = 1;
+ * @return This builder for chaining.
+ */
+ public Builder clearRobotTiltTargetCurrent() {
+ bitField0_ = (bitField0_ & ~0x00000001);
+ robotTiltTargetCurrent_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int vehicleSpeed_ ;
+ /**
+ * int32 VehicleSpeed = 2;
+ * @return The vehicleSpeed.
+ */
+ @java.lang.Override
+ public int getVehicleSpeed() {
+ return vehicleSpeed_;
+ }
+ /**
+ * int32 VehicleSpeed = 2;
+ * @param value The vehicleSpeed to set.
+ * @return This builder for chaining.
+ */
+ public Builder setVehicleSpeed(int value) {
+
+ vehicleSpeed_ = value;
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+ /**
+ * int32 VehicleSpeed = 2;
+ * @return This builder for chaining.
+ */
+ public Builder clearVehicleSpeed() {
+ bitField0_ = (bitField0_ & ~0x00000002);
+ vehicleSpeed_ = 0;
+ onChanged();
+ return this;
+ }
+
+ // @@protoc_insertion_point(builder_scope:PV_struct_define)
+ }
+
+ // @@protoc_insertion_point(class_scope:PV_struct_define)
+ private static final com.example.removemarineanimals.models.BspPV.PV_struct_define DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new com.example.removemarineanimals.models.BspPV.PV_struct_define();
+ }
+
+ public static com.example.removemarineanimals.models.BspPV.PV_struct_define getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser
+ PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public PV_struct_define parsePartialFrom(
+ com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ Builder builder = newBuilder();
+ try {
+ builder.mergeFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(builder.buildPartial());
+ } catch (com.google.protobuf.UninitializedMessageException e) {
+ throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(e)
+ .setUnfinishedMessage(builder.buildPartial());
+ }
+ return builder.buildPartial();
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.example.removemarineanimals.models.BspPV.PV_struct_define getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor
+ internal_static_PV_struct_define_descriptor;
+ private static final
+ com.google.protobuf.GeneratedMessage.FieldAccessorTable
+ internal_static_PV_struct_define_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor
+ getDescriptor() {
+ return descriptor;
+ }
+ private static com.google.protobuf.Descriptors.FileDescriptor
+ descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n\014bsp_PV.proto\"J\n\020PV_struct_define\022 \n\030Ro" +
+ "bot_Tilt_TargetCurrent\030\001 \001(\005\022\024\n\014VehicleS" +
+ "peed\030\002 \001(\005B*\n&com.example.removemarinean" +
+ "imals.modelsP\000b\006proto3"
+ };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor
+ .internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {
+ });
+ internal_static_PV_struct_define_descriptor =
+ getDescriptor().getMessageTypes().get(0);
+ internal_static_PV_struct_define_fieldAccessorTable = new
+ com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+ internal_static_PV_struct_define_descriptor,
+ new java.lang.String[] { "RobotTiltTargetCurrent", "VehicleSpeed", });
+ descriptor.resolveAllFeaturesImmutable();
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/CustomProber.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/CustomProber.java
new file mode 100644
index 0000000..c9871c8
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/CustomProber.java
@@ -0,0 +1,23 @@
+package com.example.removemarineanimals.services;
+
+
+import com.hoho.android.usbserial.driver.FtdiSerialDriver;
+import com.hoho.android.usbserial.driver.ProbeTable;
+import com.hoho.android.usbserial.driver.UsbSerialProber;
+
+/**
+ * add devices here, that are not known to DefaultProber
+ *
+ * if the App should auto start for these devices, also
+ * add IDs to app/src/main/res/xml/device_filter.xml
+ */
+public class CustomProber {
+
+ public static UsbSerialProber getCustomProber() {
+ ProbeTable customTable = new ProbeTable();
+ customTable.addProduct(0x1234, 0x0001, FtdiSerialDriver.class); // e.g. device with custom VID+PID
+ customTable.addProduct(0x1234, 0x0002, FtdiSerialDriver.class); // e.g. device with custom VID+PID
+ return new UsbSerialProber(customTable);
+ }
+
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/ModbusCRC.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/ModbusCRC.java
new file mode 100644
index 0000000..f8b7316
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/ModbusCRC.java
@@ -0,0 +1,72 @@
+package com.example.removemarineanimals.services;
+
+public class ModbusCRC {
+
+// /**
+// * 一个字节包含位的数量 8
+// */
+// private static final int BITS_OF_BYTE = 8;
+// /**
+// * 多项式
+// */
+// private static final int POLYNOMIAL = 0xA001;
+// /**
+// * 初始值
+// */
+// private static final int INITIAL_VALUE = 0xFFFF;
+//
+// /**
+// * CRC16 编码
+// *
+// * @param bytes 编码内容
+// * @return 编码结果
+// */
+// public static int crc16(byte[] bytes) {
+// int res = INITIAL_VALUE;
+// for (int data : bytes) {
+// res = res ^ data;
+// for (int i = 0; i < BITS_OF_BYTE; i++) {
+// res = (res & 0x0001) == 1 ? (res >> 1) ^ POLYNOMIAL : res >> 1;
+// }
+// }
+// return revert(res);
+// }
+//
+// /**
+// * 翻转16位的高八位和低八位字节
+// *
+// * @param src 翻转数字
+// * @return 翻转结果
+// */
+// private static int revert(int src) {
+// int lowByte = (src & 0xFF00) >> 8;
+// int highByte = (src & 0x00FF) << 8;
+// return lowByte | highByte;
+// }
+
+
+ /**
+ * 计算 Modbus CRC 校验值
+ * @param data 要计算校验值的字节数组
+ * @return CRC 校验值,以 2 字节的数组形式返回
+ */
+ public static byte[] calculateCRC(byte[] data) {
+ int crc = 0xFFFF;
+ for (byte b : data) {
+ crc ^= (b & 0xFF);
+ for (int i = 0; i < 8; i++) {
+ if ((crc & 0x0001) != 0) {
+ crc >>= 1;
+ crc ^= 0xA001;
+ } else {
+ crc >>= 1;
+ }
+ }
+ }
+ // 将 CRC 结果拆分为两个字节
+ byte[] crcBytes = new byte[2];
+ crcBytes[0] = (byte) (crc & 0xFF);
+ crcBytes[1] = (byte) ((crc >> 8) & 0xFF);
+ return crcBytes;
+ }
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/RobotDataHanlder.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/RobotDataHanlder.java
new file mode 100644
index 0000000..02003fc
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/RobotDataHanlder.java
@@ -0,0 +1,41 @@
+package com.example.removemarineanimals.services;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+
+public class RobotDataHanlder {
+
+
+ public static void test()
+ {
+ //byte[] data=hexToByteArray("080110830118313A04B1CBBACF");
+ byte[] data=hexToByteArray("100A180A28013A32B1CBBACF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
+
+
+
+ }
+
+
+ public static byte[] hexToByteArray(String inHex){
+ int hexlen = inHex.length();
+ byte[] result;
+ if (hexlen % 2 == 1){
+ //奇数
+ hexlen++;
+ result = new byte[(hexlen/2)];
+ inHex="0"+inHex;
+ }else {
+ //偶数
+ result = new byte[(hexlen/2)];
+ }
+ int j=0;
+ for (int i = 0; i < hexlen; i+=2){
+ result[j]=hexToByte(inHex.substring(i,i+2));
+ j++;
+ }
+ return result;
+ }
+ public static byte hexToByte(String inHex){
+ return (byte)Integer.parseInt(inHex,16);
+ }
+
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/USBSerialPortHelper.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/USBSerialPortHelper.java
new file mode 100644
index 0000000..1417ba4
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/USBSerialPortHelper.java
@@ -0,0 +1,364 @@
+package com.example.removemarineanimals.services;
+
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+import android.os.Build;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.core.content.ContextCompat;
+
+import com.example.removemarineanimals.BuildConfig;
+import com.example.removemarineanimals.MainActivity;
+
+import com.example.removemarineanimals.models.BspIV;
+import com.example.removemarineanimals.viewmodels.MainViewModel;
+import com.hoho.android.usbserial.driver.UsbSerialDriver;
+import com.hoho.android.usbserial.driver.UsbSerialPort;
+import com.hoho.android.usbserial.driver.UsbSerialProber;
+import com.hoho.android.usbserial.util.SerialInputOutputManager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+//implements:关键字,用于指定一个类实现一个或多个接口。
+public class USBSerialPortHelper implements SerialInputOutputManager.Listener {
+
+
+ public MainActivity MainActivity;
+ //sserial port part start
+
+ private enum UsbPermission {Unknown, Requested, Granted, Denied}
+
+ private final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
+
+
+ //
+ //
+ //
+
+
+ private int deviceId = 60000;
+ private int deviceId_test = 60000;
+ private int portNum;
+ private final int WRITE_WAIT_MILLIS = 500;
+ private final int READ_WAIT_MILLIS = 100;
+ private String PortNameContians = "SILICON";/**/
+ // private static String PortNameContians="FTD";
+ private int baudRate = 57600;
+ private boolean withIoManager = true;
+
+ private BroadcastReceiver broadcastReceiver;
+ private Handler mainLooper;
+
+ private SerialInputOutputManager usbIoManager;
+ private UsbSerialPort usbSerialPort;
+ private UsbPermission usbPermission = UsbPermission.Unknown;
+ private boolean connected = false;
+
+ public void intialize() {
+
+ broadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (INTENT_ACTION_GRANT_USB.equals(intent.getAction())) {
+ usbPermission = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) ? UsbPermission.Granted : UsbPermission.Denied;
+ connect();
+ }
+ }
+ };
+ mainLooper = new Handler(Looper.getMainLooper());
+ _receiveBufferlist = new ArrayList();
+ }
+
+ /*
+ * Serial
+ */
+ @Override
+ public void onNewData(byte[] data) {
+ status("new data");
+ mainLooper.post(() -> {
+ receive(data);
+ // receive data
+ });
+ }
+
+ @Override
+ public void onRunError(Exception e) {
+ mainLooper.post(() -> {
+ status("connection lost: " + e.getMessage());
+ disconnect();
+ });
+ }
+
+ /*
+ * Serial + UI
+ */
+
+ public void connect() {
+
+ UsbDevice device = null;
+ UsbManager usbManager = (UsbManager) MainActivity.getSystemService(Context.USB_SERVICE);
+ for (UsbDevice v : usbManager.getDeviceList().values()) {
+ status(v.getManufacturerName().toUpperCase());
+ if (v.getManufacturerName().toUpperCase().contains(PortNameContians)) {
+ device = v;
+ break;
+ }
+ }
+
+ if (device == null) {
+ // _serialPortSwitch.setChecked(false);
+
+ status("找不到设备");
+ return;
+ }
+ UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device);
+ if (driver == null) {
+ driver = CustomProber.getCustomProber().probeDevice(device);
+ }
+ if (driver == null) {
+ // _serialPortSwitch.setChecked(false);
+ status("无驱动");
+ return;
+ }
+ if (driver.getPorts().size() < portNum) //就是0 cp2102 或者同一个驱动,第一个
+ {
+ status("connection failed: not enough ports at device");
+ status("找不到设备");
+ return;
+ }
+ usbSerialPort = driver.getPorts().get(portNum);
+
+ UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice());
+ if (usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) {
+ usbPermission = UsbPermission.Requested;
+ int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_MUTABLE : 0;
+ Intent intent = new Intent(INTENT_ACTION_GRANT_USB);
+ intent.setPackage(MainActivity.getPackageName());
+ PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(MainActivity, 0, intent, flags);
+ usbManager.requestPermission(driver.getDevice(), usbPermissionIntent);
+ return;
+ }
+ if (usbConnection == null) {
+ if (!usbManager.hasPermission(driver.getDevice())) {
+ status("connection failed: permission denied");
+ } else {
+ status("connection failed: open failed");
+ }
+
+ return;
+ }
+
+ try {
+ usbSerialPort.open(usbConnection);
+ try {
+ usbSerialPort.setParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE);
+ status("connected: ");
+
+ } catch (UnsupportedOperationException e) {
+ status("unsupport setparameters");
+ }
+ if (withIoManager) {
+ usbIoManager = new SerialInputOutputManager(usbSerialPort, this);
+ usbIoManager.setReadBufferSize(40960);
+ usbIoManager.setReadTimeout(READ_WAIT_MILLIS);
+ usbIoManager.start();
+ }
+ //status("connected");
+ connected = true;
+ // _serialPortSwitch.setChecked(true);
+ //switch set true
+
+ } catch (Exception e) {
+ status("connection failed: " + e.getMessage());
+ disconnect();
+ }
+ }
+
+ private void disconnect() {
+ connected = false;
+
+ if (usbIoManager != null) {
+ usbIoManager.setListener(null);
+ usbIoManager.stop();
+ }
+ usbIoManager = null;
+ try {
+ usbSerialPort.close();
+ } catch (IOException ignored) {
+
+ }
+ usbSerialPort = null;
+ }
+
+ List _receiveBufferlist;
+
+ private static byte[] listTobyte(List list) {
+ if (list == null || list.size() < 0) return null;
+ byte[] bytes = new byte[list.size()];
+ int i = 0;
+ Iterator iterator = list.iterator();
+ while (iterator.hasNext()) {
+ bytes[i] = iterator.next();
+ i++;
+ }
+ return bytes;
+ }
+
+ boolean StartCountDown = false;
+
+ // byte _receivedData
+ private void receive(byte[] data) {
+
+ status("read data");
+ for (int i = 0; i < data.length; i++) {
+ _receiveBufferlist.add(data[i]);
+ }
+
+ //decodeRceive(data);
+ if (StartCountDown == false)//从收到第一个数据开始计时
+ {
+ StartCountDown = true;
+ new CountDownTimer(50, 10) {
+ public void onTick(long millisUntilFinished) {
+
+
+ }
+
+
+ public void onFinish() {
+
+ status("read finished");
+ try {
+
+ decodeRceive(listTobyte(_receiveBufferlist));
+
+ }
+ catch (Exception ignored)
+ {
+ status(ignored.getMessage());
+ }
+ _receiveBufferlist.clear();
+ StartCountDown = false;
+ }
+ }.start();
+ }
+
+
+ }
+
+ void status(String str) {
+// SpannableStringBuilder spn = new SpannableStringBuilder(str+'\r'+'\n');
+//
+// // spn.append(getTime());
+//
+// spn.setSpan(new ForegroundColorSpan(MainActivity.getResources().getColor(R.color.colorAccent)), 0, spn.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+// receiveText.append(spn);
+ // mainBinding.roll.fullScroll(ScrollView.FOCUS_DOWN);
+
+
+ com.example.removemarineanimals.MainActivity.mainBinding.message.setText(str);
+ }
+
+ int receivedData=0;
+ private void decodeRceive(byte[] data) {
+ try {
+
+ byte[] crcbytes = new byte[data.length - 2];
+ System.arraycopy(data, 0, crcbytes, 0, data.length - 2);
+ byte[] crc=ModbusCRC.calculateCRC(crcbytes);
+ // status(bytesToHex(data));
+ // status(String.valueOf(crc[0]+" "+ String.valueOf(crc[1])));
+ if(data[data.length-2]==(byte)(crc[1]&0xff) && data[data.length-1]==(byte)(crc[0] & 0xff))
+ {
+
+ if (data[0] == 0x55 && data[1] == 0x55)
+ {
+ byte[] bytes = new byte[data.length - 4];
+ System.arraycopy(data, 2, bytes, 0, data.length - 4);
+
+
+ BspIV.IV_struct_define _toReceiveIV= BspIV.IV_struct_define.parseFrom(bytes);
+ //RobotData.DataTrans _dataTrans = RobotDataHanlder.DeoodeDataFromRobot(data);
+ status("received data");
+ if (_toReceiveIV != null) {
+
+ double RPM=_toReceiveIV.getRobotMoveSpeed()*0.6/101*3.14*20/100;
+ MainViewModel.mainBinding.robotSpeed.setText(String.valueOf(Math.round(RPM)));
+ MainViewModel.mainBinding.swingSpeed.setText(String.valueOf(_toReceiveIV.getRobotSwingSpeed()));
+ MainViewModel.mainBinding.SwingRange.setText(String.valueOf(_toReceiveIV.getRotTime()));
+ MainViewModel.mainBinding.TiltRange.setText(String.valueOf(_toReceiveIV.getPitTime()));
+ MainViewModel.mainBinding.Roll.setText(String.valueOf(_toReceiveIV.getRFAngleRoll()/100.0));
+ }
+ }
+ }else
+ {
+
+ status("crc failed");
+ }
+
+
+ } catch (Exception e) {
+
+ }
+ }
+
+
+ public void onStart() {
+
+ ContextCompat.registerReceiver(MainActivity, broadcastReceiver, new IntentFilter(INTENT_ACTION_GRANT_USB), ContextCompat.RECEIVER_NOT_EXPORTED);
+ status("onStart");
+
+ }
+
+ public void onStop() {
+ MainActivity.unregisterReceiver(broadcastReceiver);
+ status("onStop");
+ }
+
+
+ public void onResume() {
+
+ if (!connected && (usbPermission == UsbPermission.Unknown || usbPermission == UsbPermission.Granted)) {
+ mainLooper.post(this::connect);
+
+ }
+ }
+
+
+ public void onPause() {
+ if (connected) {
+ status("串口断开");
+ // _serialPortSwitch.setChecked(false);
+ disconnect();
+ }
+
+ }
+
+
+ public void SendData(byte[] data) {
+ if (connected) {
+ try {
+ usbSerialPort.write(data, WRITE_WAIT_MILLIS);
+ } catch (IOException e) {
+ status("Send Failed");
+ connected = false;
+ }
+ } else {
+ status("usb serialport disconnected");
+
+ }
+
+
+ }
+
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/VideoPlayerHelper.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/VideoPlayerHelper.java
new file mode 100644
index 0000000..23992f1
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/services/VideoPlayerHelper.java
@@ -0,0 +1,27 @@
+package com.example.removemarineanimals.services;
+
+import cn.nodemedia.NodePlayer;
+import cn.nodemedia.NodePlayerView;
+
+public class VideoPlayerHelper {
+
+
+
+ public static void startVedio(NodePlayerView nodePlayerView, NodePlayer nodePlayer,String address ){
+
+
+ nodePlayerView.setRenderType(NodePlayerView.RenderType.SURFACEVIEW);//设置渲染器类型
+ nodePlayerView.setUIViewContentMode(NodePlayerView.UIViewContentMode.ScaleToFill);//设置视频画面缩放模式
+ //nodePlayer=new NodePlayer(this);
+ nodePlayer.setPlayerView(nodePlayerView);//设置播放视图
+ //设置RTSP流使用的传输协议,支持的模式有:
+ nodePlayer.setRtspTransport(NodePlayer.RTSP_TRANSPORT_TCP);//设置传输
+ nodePlayer.setInputUrl(address);// 设置视频流地址
+ nodePlayer.setVideoEnable(true);//设置视频启用
+ nodePlayer.setBufferTime(100);//设置缓冲时间
+ nodePlayer.setHWEnable(true);// 启用硬件加速
+ nodePlayer.setMaxBufferTime(200);//设置最大缓冲时间
+ nodePlayer.start();
+ }
+}
+
diff --git a/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/viewmodels/MainViewModel.java b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/viewmodels/MainViewModel.java
new file mode 100644
index 0000000..7e2b9ad
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/com/example/removemarineanimals/viewmodels/MainViewModel.java
@@ -0,0 +1,77 @@
+package com.example.removemarineanimals.viewmodels;
+
+
+
+import android.view.View;
+import android.widget.SeekBar;
+
+import androidx.annotation.MainThread;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.ViewModel;
+
+import com.example.removemarineanimals.R;
+import com.example.removemarineanimals.databinding.ActivityMainBinding;
+//import com.example.removemarineanimals.models.user;
+//import com.example.removemarineanimals.services.RobotData;
+import com.example.removemarineanimals.services.RobotDataHanlder;
+//import com.example.removemarineanimals.services.VideoHelper;
+
+import java.io.UnsupportedEncodingException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import cn.nodemedia.NodePlayer;
+
+public class MainViewModel extends ViewModel {
+
+
+ // public RobotData.DataTrans _dataTrans=new RobotData.DataTrans();
+ public static ActivityMainBinding mainBinding;//通过Binding可以获取界面数据
+ // public final MutableLiveData LiveUser;
+
+ public MainViewModel()
+ {
+// LiveUser = new MutableLiveData();
+//
+// user u=LiveUser.getValue();
+// if(u==null)
+// {
+// u=new user();
+// u.setName("dddddd");
+// LiveUser.setValue(u);
+// }
+
+
+
+ }
+
+
+ //# region Video操作区域
+ int recordVideoState=0;
+
+ public void SnapVideo()
+ {
+
+
+ }
+
+ //#end region Video操作区域
+
+ void SetPage()
+ {
+
+
+ }
+
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+
+ }
+
+
+
+
+
+
+
+}
diff --git a/RemoveMarineAnimals/app/src/main/java/generate_java.bat b/RemoveMarineAnimals/app/src/main/java/generate_java.bat
new file mode 100644
index 0000000..59085ae
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/java/generate_java.bat
@@ -0,0 +1 @@
+ protoc --java_out . *.proto
diff --git a/RemoveMarineAnimals/app/src/main/java/protoc.exe b/RemoveMarineAnimals/app/src/main/java/protoc.exe
new file mode 100644
index 0000000..f1ffb02
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/java/protoc.exe differ
diff --git a/RemoveMarineAnimals/app/src/main/res/drawable/border.xml b/RemoveMarineAnimals/app/src/main/res/drawable/border.xml
new file mode 100644
index 0000000..3d0fd95
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/drawable/border.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/RemoveMarineAnimals/app/src/main/res/drawable/borderblue.xml b/RemoveMarineAnimals/app/src/main/res/drawable/borderblue.xml
new file mode 100644
index 0000000..d9db99d
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/drawable/borderblue.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RemoveMarineAnimals/app/src/main/res/drawable/dash_line.xml b/RemoveMarineAnimals/app/src/main/res/drawable/dash_line.xml
new file mode 100644
index 0000000..c83a8c5
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/drawable/dash_line.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/drawable/ic_launcher_background.xml b/RemoveMarineAnimals/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RemoveMarineAnimals/app/src/main/res/drawable/ic_launcher_foreground.xml b/RemoveMarineAnimals/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/drawable/squrelogo.png b/RemoveMarineAnimals/app/src/main/res/drawable/squrelogo.png
new file mode 100644
index 0000000..f7cafaf
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/drawable/squrelogo.png differ
diff --git a/RemoveMarineAnimals/app/src/main/res/layout/activity_main.xml b/RemoveMarineAnimals/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..9140a21
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+o=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/RemoveMarineAnimals/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/RemoveMarineAnimals/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/RemoveMarineAnimals/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/RemoveMarineAnimals/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/RemoveMarineAnimals/app/src/main/res/values-night/themes.xml b/RemoveMarineAnimals/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..06d7270
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/values/colors.xml b/RemoveMarineAnimals/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ce0cb76
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/values/colors.xml
@@ -0,0 +1,151 @@
+
+
+ #FF000000
+ #FFFFFFFF
+ #FFFFFFFF
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
+
+ #fffafa
+ #fffaf0
+ #ffebcd
+ #f8f8ff
+ #f5f5f5
+ #faebd7
+ #ffdead
+ #808080
+ #dcdcdc
+ #d3d3d3
+ #a9a9a9
+ #696969
+ #708090
+ #778899
+ #2f4f4f
+ #c0c0c0
+
+ #ff0000
+ #8b0000
+ #dc143c
+ #8b008b
+ #ff00ff
+ #ff6347
+ #f08080
+ #e9967a
+ #ffdab9
+ #dda0dd
+ #ffc0cb
+ #ffb6c1
+ #ff1493
+ #ff69b4
+ #fff0f5
+ #cd5c5c
+ #bc8f8f
+ #b22222
+ #800000
+ #f0fff0
+ #ff4500
+ #ffa500
+ #32cd32
+ #00ff00
+ #ffff00
+ #f5deb3
+ #f0e68c
+ #deb887
+ #ffe4c4
+ #ffffe0
+ #b8860b
+ #ff8c00
+ #fafad2
+ #fffacd
+ #fff8dc
+ #fff5ee
+ #ffefd5
+ #ffe4e1
+ #ffe4b5
+ #fffff0
+ #ffd700
+ #daa520
+ #ffa07a
+ #ff7f50
+ #f5fffa
+ #f5f5dc
+ #f4a460
+ #fdf5e6
+ #faf0e6
+ #fa8072
+ #d8bfd8
+ #d2b48c
+ #d2691e
+ #cd853f
+ #bdb76b
+ #eee8aa
+ #a52a2a
+ #8b4513
+ #a0522d
+ #808000
+ #7fff00
+ #adff2f
+ #008000
+ #006400
+ #556b2f
+ #6b8e23
+ #7cfc00
+ #228b22
+ #7fffd4
+ #afeeee
+ #98fb98
+ #48d1cc
+ #66cdaa
+ #00ffff
+ #00ff7f
+ #00fa9a
+ #00ced1
+ #2e8b57
+ #90ee90
+ #8fbc8f
+ #40e0d0
+ #00ffff
+ #008b8b
+ #e0ffff
+ #008080
+ #4b0082
+ #0000ff
+ #00008b
+ #0000cd
+ #191970
+ #000080
+ #4169e1
+ #f0ffff
+ #87ceeb
+ #00bfff
+ #87cefa
+ #20b2aa
+ #add8e6
+ #b0e0e6
+ #f0f8ff
+ #7b68ee
+ #6a5acd
+ #483d8b
+ #3cb371
+ #4682b4
+ #b0c4de
+ #6495ed
+ #1e90ff
+ #5f9ea0
+ #8a2be2
+ #800080
+ #e6e6fa
+ #da70d6
+ #9370db
+ #9932cc
+ #ee82ee
+ #c71585
+ #db7093
+ #9400d3
+ #ba55d3
+ #00000000
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/values/strings.xml b/RemoveMarineAnimals/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..201e15d
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+ 肋骨板机器人
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/values/themes.xml b/RemoveMarineAnimals/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..b2188ae
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/values/themes.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/xml/backup_rules.xml b/RemoveMarineAnimals/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/xml/data_extraction_rules.xml b/RemoveMarineAnimals/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/RemoveMarineAnimals/app/src/main/res/xml/device_filter.xml b/RemoveMarineAnimals/app/src/main/res/xml/device_filter.xml
new file mode 100644
index 0000000..b2a252c
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/main/res/xml/device_filter.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/RemoveMarineAnimals/app/src/test/java/com/example/removemarineanimals/ExampleUnitTest.java b/RemoveMarineAnimals/app/src/test/java/com/example/removemarineanimals/ExampleUnitTest.java
new file mode 100644
index 0000000..e4c36cc
--- /dev/null
+++ b/RemoveMarineAnimals/app/src/test/java/com/example/removemarineanimals/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.removemarineanimals;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/RemoveMarineAnimals/build.gradle b/RemoveMarineAnimals/build.gradle
new file mode 100644
index 0000000..ea2bb78
--- /dev/null
+++ b/RemoveMarineAnimals/build.gradle
@@ -0,0 +1,4 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+id 'com.android.application' version '8.2.2' apply false
+}
\ No newline at end of file
diff --git a/RemoveMarineAnimals/gradle.properties b/RemoveMarineAnimals/gradle.properties
new file mode 100644
index 0000000..3e927b1
--- /dev/null
+++ b/RemoveMarineAnimals/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/RemoveMarineAnimals/gradle/wrapper/gradle-wrapper.jar b/RemoveMarineAnimals/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/RemoveMarineAnimals/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/RemoveMarineAnimals/gradle/wrapper/gradle-wrapper.properties b/RemoveMarineAnimals/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..6ba68ad
--- /dev/null
+++ b/RemoveMarineAnimals/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Feb 05 16:51:00 CST 2025
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/RemoveMarineAnimals/gradlew b/RemoveMarineAnimals/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/RemoveMarineAnimals/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for 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='"-Xmx64m" "-Xms64m"'
+
+# 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 or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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"
+
+exec "$JAVACMD" "$@"
diff --git a/RemoveMarineAnimals/gradlew.bat b/RemoveMarineAnimals/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/RemoveMarineAnimals/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="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/RemoveMarineAnimals/settings.gradle b/RemoveMarineAnimals/settings.gradle
new file mode 100644
index 0000000..6b2f8b4
--- /dev/null
+++ b/RemoveMarineAnimals/settings.gradle
@@ -0,0 +1,20 @@
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+
+ maven { url 'https://jitpack.io' }
+
+ }
+}
+
+rootProject.name = "RemoveMarineAnimals"
+include ':app'