@ -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 |
|||
@ -0,0 +1,3 @@ |
|||
# Default ignored files |
|||
/shelf/ |
|||
/workspace.xml |
|||
@ -0,0 +1 @@ |
|||
RoughAPPUDPV2_0BBWiredRPM |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="AndroidProjectSystem"> |
|||
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="CompilerConfiguration"> |
|||
<bytecodeTargetLevel target="21" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="deploymentTargetDropDown"> |
|||
<value> |
|||
<entry key="app"> |
|||
<State /> |
|||
</entry> |
|||
</value> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,18 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="deploymentTargetSelector"> |
|||
<selectionStates> |
|||
<SelectionState runConfigName="app"> |
|||
<option name="selectionMode" value="DROPDOWN" /> |
|||
<DropdownSelection timestamp="2026-01-23T05:46:14.529204300Z"> |
|||
<Target type="DEFAULT_BOOT"> |
|||
<handle> |
|||
<DeviceId pluginId="Default" identifier="serial=192.168.144.20:5555;connection=174c930a" /> |
|||
</handle> |
|||
</Target> |
|||
</DropdownSelection> |
|||
<DialogSelection /> |
|||
</SelectionState> |
|||
</selectionStates> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,13 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="DeviceTable"> |
|||
<option name="columnSorters"> |
|||
<list> |
|||
<ColumnSorterState> |
|||
<option name="column" value="Name" /> |
|||
<option name="order" value="ASCENDING" /> |
|||
</ColumnSorterState> |
|||
</list> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,20 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="GradleMigrationSettings" migrationVersion="1" /> |
|||
<component name="GradleSettings"> |
|||
<option name="linkedExternalProjectsSettings"> |
|||
<GradleProjectSettings> |
|||
<option name="testRunner" value="CHOOSE_PER_TEST" /> |
|||
<option name="externalProjectPath" value="$PROJECT_DIR$" /> |
|||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" /> |
|||
<option name="modules"> |
|||
<set> |
|||
<option value="$PROJECT_DIR$" /> |
|||
<option value="$PROJECT_DIR$/app" /> |
|||
</set> |
|||
</option> |
|||
<option name="resolveExternalAnnotations" value="false" /> |
|||
</GradleProjectSettings> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="ProjectMigrations"> |
|||
<option name="MigrateToGradleLocalJavaHome"> |
|||
<set> |
|||
<option value="$PROJECT_DIR$" /> |
|||
</set> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,16 @@ |
|||
<project version="4"> |
|||
<component name="ExternalStorageConfigurationManager" enabled="true" /> |
|||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> |
|||
<output url="file://$PROJECT_DIR$/build/classes" /> |
|||
</component> |
|||
<component name="ProjectType"> |
|||
<option name="id" value="Android" /> |
|||
</component> |
|||
<component name="VisualizationToolProject"> |
|||
<option name="state"> |
|||
<ProjectState> |
|||
<option name="scale" value="0.04120409906063194" /> |
|||
</ProjectState> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,17 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="RunConfigurationProducerService"> |
|||
<option name="ignoredProducers"> |
|||
<set> |
|||
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.PatternConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" /> |
|||
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" /> |
|||
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" /> |
|||
</set> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="VcsDirectoryMappings"> |
|||
<mapping directory="$PROJECT_DIR$" vcs="Git" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1 @@ |
|||
/build |
|||
@ -0,0 +1,101 @@ |
|||
plugins { |
|||
id 'com.android.application' |
|||
} |
|||
|
|||
android { |
|||
namespace 'com.example.roughapp2_0bbwiredrpm' |
|||
compileSdk 34 |
|||
viewBinding |
|||
{ |
|||
enabled true |
|||
} |
|||
// //add this feature |
|||
dataBinding |
|||
{ |
|||
enabled true |
|||
} |
|||
defaultConfig { |
|||
//applicationId "com.example.rougheningapp" |
|||
minSdk 24 |
|||
targetSdk 34 |
|||
versionCode 1 |
|||
versionName "1.0" |
|||
|
|||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" |
|||
} |
|||
|
|||
// android.applicationVariants.all { variant -> |
|||
// variant.outputs.all { |
|||
// outputFileName = "Roughening.apk" |
|||
// } |
|||
// } |
|||
// 定义风味维度 |
|||
flavorDimensions "version" |
|||
// 定义产品风味 |
|||
productFlavors { |
|||
flavor1 { |
|||
dimension "version" |
|||
// 第一个应用的包名 |
|||
applicationId "com.example.roughapp2_0bbwiredrpm" |
|||
// 应用名称 |
|||
resValue "string", "app_name", "拉毛" |
|||
// 版本名后缀,可选 |
|||
versionNameSuffix "-2.0" |
|||
} |
|||
|
|||
// flavor2 { |
|||
// dimension "version" |
|||
// // 第二个应用的包名 |
|||
// applicationId "com.example.rougheningappTestDebug" |
|||
// // 应用名称 |
|||
// resValue "string", "app_name", "BingooRobotDebug" |
|||
// // 版本名后缀,可选 |
|||
// versionNameSuffix "-Test" |
|||
// } |
|||
} |
|||
//使用命令行构建特定风味 |
|||
// ./gradlew assembleFlavor1Debug # 构建flavor1的debug版本 |
|||
// ./gradlew assembleFlavor2Release # 构建flavor2的release版本 |
|||
|
|||
// 为每个风味配置输出文件名 |
|||
android.applicationVariants.all { variant -> |
|||
variant.outputs.all { |
|||
def flavorName = variant.flavorName |
|||
//outputFileName = "Roughening${flavorName}.apk" |
|||
outputFileName = "Roughening.apk" |
|||
} |
|||
} |
|||
|
|||
|
|||
buildTypes { |
|||
release { |
|||
minifyEnabled false |
|||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' |
|||
} |
|||
} |
|||
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' |
|||
implementation 'io.github.xmaihh:serialport:2.1.1' |
|||
|
|||
|
|||
|
|||
} |
|||
@ -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 |
|||
@ -0,0 +1,20 @@ |
|||
{ |
|||
"version": 3, |
|||
"artifactType": { |
|||
"type": "APK", |
|||
"kind": "Directory" |
|||
}, |
|||
"applicationId": "com.example.rougheningapp", |
|||
"variantName": "release", |
|||
"elements": [ |
|||
{ |
|||
"type": "SINGLE", |
|||
"filters": [], |
|||
"attributes": [], |
|||
"versionCode": 1, |
|||
"versionName": "1.0", |
|||
"outputFile": "Roughening00.apk" |
|||
} |
|||
], |
|||
"elementType": "File" |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package com.example.roughapp2_0bbwiredrpm; |
|||
|
|||
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 <a href="http://d.android.com/tools/testing">Testing documentation</a> |
|||
*/ |
|||
@RunWith(AndroidJUnit4.class) |
|||
public class ExampleInstrumentedTest { |
|||
@Test |
|||
public void useAppContext() { |
|||
// Context of the app under test.
|
|||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |
|||
assertEquals("com.example.rougheningapp", appContext.getPackageName()); |
|||
} |
|||
} |
|||
@ -0,0 +1,53 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools"> |
|||
|
|||
<uses-feature android:name="android.hardware.camera" /> |
|||
<uses-feature android:name="android.hardware.camera.autofocus" /> |
|||
|
|||
<uses-permission android:name="android.permission.INTERNET" /> |
|||
<uses-permission android:name="android.permission.CAMERA" /> |
|||
<uses-permission android:name="android.permission.RECORD_AUDIO" /> |
|||
<uses-permission android:name="android.permission.FLASHLIGHT" /> |
|||
<uses-permission android:name="android.permission.USB_PERMISSION" /> |
|||
|
|||
<uses-feature |
|||
android:name="android.hardware.usb.accessory" |
|||
android:required="false" /> |
|||
<uses-feature android:name="android.hardware.usb.host" /> |
|||
|
|||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
|||
<uses-permission android:name="android.permission.VIBRATE" /> |
|||
|
|||
<application |
|||
android:allowBackup="true" |
|||
android:dataExtractionRules="@xml/data_extraction_rules" |
|||
android:fullBackupContent="@xml/backup_rules" |
|||
android:icon="@drawable/squrelogo" |
|||
android:label="拉毛bwr" |
|||
android:roundIcon="@drawable/squrelogo" |
|||
android:supportsRtl="true" |
|||
android:theme="@style/Theme.RougheningApp" |
|||
tools:targetApi="31"> |
|||
<meta-data |
|||
android:name="com.google.android.actions" |
|||
android:resource="@xml/check_boxs" /> |
|||
|
|||
<activity |
|||
android:name=".MainActivity" |
|||
android:exported="true"> |
|||
<intent-filter> |
|||
<action android:name="android.intent.action.MAIN" /> |
|||
|
|||
<category android:name="android.intent.category.LAUNCHER" /> |
|||
|
|||
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> |
|||
</intent-filter> |
|||
|
|||
<meta-data |
|||
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" |
|||
android:resource="@xml/device_filter" /> |
|||
</activity> |
|||
</application> |
|||
|
|||
</manifest> |
|||
@ -0,0 +1,31 @@ |
|||
syntax = "proto3"; |
|||
option java_multiple_files = false; |
|||
option java_package = "com.example.roughapp2_0bbwiredrpm.models"; |
|||
message ErrorData |
|||
{ |
|||
int32 Com_Error_Code=1; |
|||
int32 Left_Motor_Error_Code=2; |
|||
int32 Right_Motor_Error_Code=3; |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
enum ComError //枚举消息类型 Error Bit Define |
|||
{ |
|||
MK32_SBus = 0; |
|||
TL720D = 1; |
|||
ZQ_LeftMotor = 2; |
|||
ZQ_RightMotor = 3; |
|||
Remote_Button_Reset_State = 4; |
|||
Strain_Gauge = 5; |
|||
Android_485 = 6; |
|||
DMAKE_1 = 7; |
|||
|
|||
|
|||
} |
|||
|
|||
//protoc --nanopb_out=. *.proto |
|||
|
|||
|
|||
|
|||
@ -0,0 +1,24 @@ |
|||
syntax = "proto3"; |
|||
|
|||
option java_multiple_files = false; |
|||
option java_package = "com.example.roughapp2_0bbwiredrpm.models"; |
|||
|
|||
message IV_struct_define |
|||
{ |
|||
int32 Press=1;//实时压力 |
|||
int32 RunMode=2; |
|||
int32 LeftCompensation= 3;//单位0.01° |
|||
int32 RightCompensation= 4;//单位0.01° |
|||
int32 CurrentAngle= 5; //单位0.01° |
|||
double RobotMoveSpeed= 6; //单位m/min |
|||
int32 SystemError=7;//硬件通讯错误及按键未初始化错误 |
|||
int32 Left_Motor_Err=8;//左轮电机报警 |
|||
int32 Right_Motor_Err=9;//右轮电机报警 |
|||
int32 Left_Motor_Temp=10;//左轮电机温度 |
|||
int32 Right_Motor_Temp=11;//右轮电机温度 |
|||
int32 IsWorking=12;//机器人正在执行运动指令 |
|||
int64 TimeStamp=13;//当前时间戳 |
|||
int32 RobotRestart=14;//是否重启 |
|||
double CurrentSpeed=15;//当前速度 |
|||
int32 SBUS_State=16; //0断开 1连接 |
|||
}; |
|||
@ -0,0 +1,22 @@ |
|||
syntax = "proto3"; |
|||
option java_multiple_files = false; |
|||
option java_package = "com.example.roughapp2_0bbwiredrpm.models"; |
|||
|
|||
message PV_struct_define{ |
|||
|
|||
// 拉毛项目 |
|||
int32 RobotSpeed=1;//0-20m/min |
|||
int32 RunMode = 2; //1 手动无校准作业 2 手动水平作业 3 手动竖直向左作业 4 手动竖直向右作业 5 自动水平作业 6 自动竖直向左作业 7 自动竖直向右作业; |
|||
int32 LaneChangeDistance= 3;//0-100cm |
|||
double HorizontalDistanceMeters=4;//水平方向 作业长度0-200m0-200m |
|||
double VerticalDistanceMeters=5;//竖直方向 作业宽度度0-200m |
|||
|
|||
int32 PressSet=6; //下压到某个值之后,停止运动 |
|||
int32 LeftCompensation= 7; //0.01° |
|||
int32 RightCompensation= 8;//0.01° |
|||
double Vertical_Calibration=9; |
|||
int32 RobotRestartAccepted=10;// 是否接收到IV restart flag |
|||
int64 TimeStamp=11;// |
|||
int32 DmkSpeed= 12;//RPM |
|||
int32 ToolRotationDirection=13;// 1正向 2反向 |
|||
}; |
|||
@ -0,0 +1,400 @@ |
|||
package com.example.roughapp2_0bbwiredrpm; |
|||
|
|||
import static java.lang.Integer.parseInt; |
|||
|
|||
import androidx.appcompat.app.AppCompatActivity; |
|||
import androidx.databinding.DataBindingUtil; |
|||
|
|||
import android.os.Bundle; |
|||
import android.text.Editable; |
|||
import android.text.InputFilter; |
|||
import android.text.TextUtils; |
|||
import android.text.TextWatcher; |
|||
import android.view.View; |
|||
import android.view.WindowManager; |
|||
import android.widget.Toast; |
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.databinding.ActivityMainBinding; |
|||
import com.example.roughapp2_0bbwiredrpm.models.BspPV; |
|||
import com.example.roughapp2_0bbwiredrpm.models.DisplayPV; |
|||
import com.example.roughapp2_0bbwiredrpm.services.CommunicationMethond; |
|||
import com.example.roughapp2_0bbwiredrpm.services.DataExchangeHelper; |
|||
import com.example.roughapp2_0bbwiredrpm.services.DecimalDigitsInputFilter; |
|||
import com.example.roughapp2_0bbwiredrpm.services.ModbusRtuSlaveService; |
|||
import com.example.roughapp2_0bbwiredrpm.services.MyDataHelper; |
|||
import com.example.roughapp2_0bbwiredrpm.services.PVModify; |
|||
import com.example.roughapp2_0bbwiredrpm.services.PopupHelper; |
|||
import com.example.roughapp2_0bbwiredrpm.services.UDPHelper; |
|||
import com.example.roughapp2_0bbwiredrpm.services.USBSerialPortHelper; |
|||
import com.example.roughapp2_0bbwiredrpm.services.ttySerialPortHelper; |
|||
|
|||
|
|||
import java.util.List; |
|||
import java.util.Timer; |
|||
import java.util.TimerTask; |
|||
|
|||
public class MainActivity extends AppCompatActivity { |
|||
|
|||
public ActivityMainBinding mainBinding;//通过Binding可以获取界面数据
|
|||
//USB 串口服务
|
|||
public USBSerialPortHelper serialPortHelper; |
|||
|
|||
public static CommunicationMethond AndroidMCUCommunicationMethod = CommunicationMethond.Wired;//0 默认无线, 1 有线
|
|||
public BspPV.PV_struct_define _toSendPV; |
|||
|
|||
Timer timer = new Timer(); |
|||
|
|||
public MyDataHelper myDataHelper = new MyDataHelper(this); |
|||
public PopupHelper popupHelper = new PopupHelper(this); |
|||
int UARTSendCount = 0; |
|||
public int USBSerialPortReceivedTimeCounter = 0; |
|||
|
|||
|
|||
public String rough_parameters_Call_Value = "1"; //默认1
|
|||
public String rough_Manual_Mode_Call_Value = "无"; // 默认为手动模式 无 模式值1-4
|
|||
public String rough_Auto_Mode_Call_Value = "未启用"; // 默认为未启用 模式值6 7
|
|||
|
|||
public String HorizontalDistance = "0.0"; //自动模式下水平作业长度----->变量存储
|
|||
public String VerticalDistance = "0.0"; ////自动模式下竖直作业宽度----->变量存储
|
|||
public String _Tool_Rotation_Direction_Value = "正向"; |
|||
|
|||
|
|||
@Override |
|||
protected void onCreate(Bundle savedInstanceState) { |
|||
super.onCreate(savedInstanceState); |
|||
//设置全屏显示
|
|||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); |
|||
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); |
|||
|
|||
mainBinding.roughEditVerticalAdjustTo32.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); //竖直微调一位小数限制
|
|||
|
|||
|
|||
myDataHelper.IntializeDataBaseRough(); |
|||
|
|||
//程序初始化,读取数据库,进行界面显示
|
|||
String parame = mainBinding.roughTvParameterCallTo32.getText().toString(); |
|||
|
|||
//读取数据
|
|||
// 下面这一堆像是界面左边的sensor实时data显示,从PV里取值。具体怎么取,见MyDataHelper文件
|
|||
int paraIndex = parseInt(parame); |
|||
List<DisplayPV> pvList = myDataHelper.getDisplayDataRough(paraIndex); |
|||
|
|||
|
|||
mainBinding.roughEditLaneChangeDistanceTo32.setText(String.valueOf(pvList.get(0).getLaneChangeDistance())); |
|||
mainBinding.roughEditPressTo32.setText(String.valueOf(pvList.get(0).getPressSet())); |
|||
mainBinding.roughEditVerticalAdjustTo32.setText(String.valueOf(pvList.get(0).getVerticalAdjust())); |
|||
HorizontalDistance = String.valueOf(pvList.get(0).getHorizontalDistance()); |
|||
VerticalDistance = String.valueOf(pvList.get(0).getVerticalDistance()); |
|||
|
|||
/* USB串口 控制区域*/ |
|||
serialPortHelper = new USBSerialPortHelper(this,115200); |
|||
serialPortHelper.intialize(); |
|||
serialPortHelper.connect(); |
|||
UDPHelper.Intialize(this,"192.168.144.98",8006,9006); |
|||
|
|||
ttySerialPortHelper.MainActivity = this; |
|||
ttySerialPortHelper.Open(); |
|||
|
|||
ModbusRtuSlaveService.ModbusRtuSlaveServiceIntialize(serialPortHelper); |
|||
|
|||
_toSendPV = BspPV.PV_struct_define.newBuilder() |
|||
.build(); |
|||
|
|||
mainBinding.roughSetManualModeBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
|
|||
// 实现界面跳转(弹出子界面):弹窗的具体逻辑实现细节见popupHelper
|
|||
popupHelper.Rough_ManualModePopup(this); |
|||
} |
|||
}); |
|||
|
|||
mainBinding.roughSetAutoModeBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.AutomaticModeSetPopUp(this); |
|||
|
|||
} |
|||
}); |
|||
|
|||
mainBinding.setToolRotationDirectionBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.ToolRotationDirectionPopUp(this); |
|||
} |
|||
}); |
|||
|
|||
|
|||
|
|||
|
|||
mainBinding.DMKSpeedTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
String input = s.toString(); |
|||
if (!input.isEmpty()) { |
|||
try { |
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < 0 || value > 3000) { |
|||
showToast("请输入 0 到 3000 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.DMKSpeedTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
mainBinding.roughEditLaneChangeDistanceTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
String input = s.toString(); |
|||
if (!input.isEmpty()) { |
|||
try { |
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < 1 || value > 100) { |
|||
showToast("请输入 1 到 100 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.roughEditLaneChangeDistanceTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
mainBinding.roughEditPressTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
String input = s.toString(); |
|||
if (!input.isEmpty()) { |
|||
try { |
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < 0 || value > 3000) { |
|||
showToast("请输入 0 到 3000 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.roughEditPressTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
mainBinding.roughEditVerticalAdjustTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
String input = s.toString().trim(); |
|||
|
|||
// 1. 允许空输入(用户正在删除)
|
|||
if (TextUtils.isEmpty(input)) { |
|||
return; |
|||
} |
|||
|
|||
// 2. 允许合法的中间状态(如"-10.")
|
|||
if (input.matches("^-?\\d*(\\.\\d*)?$")) { |
|||
// 合法格式:整数、负数、小数、小数点开头
|
|||
try { |
|||
|
|||
double value = Double.parseDouble(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < -10 || value > 10) { |
|||
showToast("请输入 -10 到 10 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.roughEditVerticalAdjustTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
// 尝试转换为double(处理小数)
|
|||
//lastValidValue = Double.parseDouble(input);
|
|||
} catch (NumberFormatException e) { |
|||
// 中间状态,忽略
|
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
mainBinding.roughSetCallParametersBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.ParametersCallPopup_Rough(this, myDataHelper); |
|||
} |
|||
}); |
|||
|
|||
|
|||
mainBinding. roughErrMessageBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.RobotErrorListPopUp(this); |
|||
} |
|||
}); |
|||
|
|||
} |
|||
private void showToast(String message) |
|||
{ |
|||
Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); |
|||
} |
|||
|
|||
@Override |
|||
protected void onStart() { |
|||
super.onStart(); |
|||
serialPortHelper.onStart(); |
|||
timer.schedule(new TimerTask() { |
|||
@Override |
|||
public void run() { |
|||
// 使用 Handler 或 runOnUiThread 更新 UI
|
|||
runOnUiThread(new Runnable() { |
|||
@Override |
|||
public void run() { |
|||
|
|||
PVModify.HandlePVDataRough(MainActivity.this); |
|||
|
|||
_toSendPV = _toSendPV.toBuilder() |
|||
.setTimeStamp(System.currentTimeMillis()) |
|||
.build(); |
|||
|
|||
|
|||
USBSerialPortReceivedTimeCounter++; //数值能加代表USB串口没连接-->无线 ..USB串口接收置0
|
|||
if (USBSerialPortReceivedTimeCounter >= 10) { //10次检测不到USB串口接收-->无线
|
|||
USBSerialPortReceivedTimeCounter = 10; |
|||
AndroidMCUCommunicationMethod = CommunicationMethond.Wireless; |
|||
} else { |
|||
AndroidMCUCommunicationMethod = CommunicationMethond.Wired; |
|||
} |
|||
// 根据当前的连接方式更新 UI 显示
|
|||
if (AndroidMCUCommunicationMethod == CommunicationMethond.Wired) { |
|||
; |
|||
mainBinding.roughTvConnect.setText("有线"); |
|||
} else { |
|||
|
|||
mainBinding.roughTvConnect.setText("无线"); |
|||
} |
|||
if (AndroidMCUCommunicationMethod == CommunicationMethond.Wireless) { |
|||
|
|||
//若sdk有数据返回,则停止发送
|
|||
if (ttySerialPortHelper.IsAllButtonSendBack == true) { |
|||
UARTSendCount = 0; |
|||
} |
|||
if (UARTSendCount <= 8) { |
|||
UARTSendCount++; |
|||
ttySerialPortHelper.SendData(ttySerialPortHelper.stopgetAllChData); //不让遥控返回数据了
|
|||
ttySerialPortHelper.IsAllButtonSendBack = false; |
|||
return; |
|||
} |
|||
|
|||
ttySerialPortHelper.SendData(DataExchangeHelper.getSendPVBytes(_toSendPV)); |
|||
return; |
|||
} |
|||
//有线
|
|||
if (AndroidMCUCommunicationMethod == CommunicationMethond.Wired) { |
|||
if (ttySerialPortHelper.IsAllButtonSendBack == false) { |
|||
ttySerialPortHelper.SendData(ttySerialPortHelper.getAllChData_20Hz); |
|||
} |
|||
} |
|||
|
|||
} |
|||
}); |
|||
|
|||
|
|||
} |
|||
}, 0, 100); // 延迟 0 毫秒,每隔 1000 毫秒执行一次
|
|||
|
|||
|
|||
} |
|||
|
|||
@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(); |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,815 @@ |
|||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
|||
// NO CHECKED-IN PROTOBUF GENCODE
|
|||
// source: bsp_Error.proto
|
|||
// Protobuf Java Version: 4.27.2
|
|||
|
|||
package com.example.roughapp2_0bbwiredrpm.models; |
|||
|
|||
public final class BspError { |
|||
private BspError() {} |
|||
static { |
|||
com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( |
|||
com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, |
|||
/* major= */ 4, |
|||
/* minor= */ 27, |
|||
/* patch= */ 2, |
|||
/* suffix= */ "", |
|||
BspError.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); |
|||
} |
|||
/** |
|||
* Protobuf enum {@code ComError} |
|||
*/ |
|||
public enum ComError |
|||
implements com.google.protobuf.ProtocolMessageEnum { |
|||
/** |
|||
* <code>MK32_SBus = 0;</code> |
|||
*/ |
|||
MK32_SBus(0), |
|||
/** |
|||
* <code>TL720D = 1;</code> |
|||
*/ |
|||
TL720D(1), |
|||
/** |
|||
* <code>ZQ_LeftMotor = 2;</code> |
|||
*/ |
|||
ZQ_LeftMotor(2), |
|||
/** |
|||
* <code>ZQ_RightMotor = 3;</code> |
|||
*/ |
|||
ZQ_RightMotor(3), |
|||
/** |
|||
* <code>Remote_Button_Reset_State = 4;</code> |
|||
*/ |
|||
Remote_Button_Reset_State(4), |
|||
/** |
|||
* <code>Strain_Gauge = 5;</code> |
|||
*/ |
|||
Strain_Gauge(5), |
|||
/** |
|||
* <code>Android_485 = 6;</code> |
|||
*/ |
|||
Android_485(6), |
|||
/** |
|||
* <code>DMAKE_1 = 7;</code> |
|||
*/ |
|||
DMAKE_1(7), |
|||
UNRECOGNIZED(-1), |
|||
; |
|||
|
|||
static { |
|||
com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( |
|||
com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, |
|||
/* major= */ 4, |
|||
/* minor= */ 27, |
|||
/* patch= */ 2, |
|||
/* suffix= */ "", |
|||
ComError.class.getName()); |
|||
} |
|||
/** |
|||
* <code>MK32_SBus = 0;</code> |
|||
*/ |
|||
public static final int MK32_SBus_VALUE = 0; |
|||
/** |
|||
* <code>TL720D = 1;</code> |
|||
*/ |
|||
public static final int TL720D_VALUE = 1; |
|||
/** |
|||
* <code>ZQ_LeftMotor = 2;</code> |
|||
*/ |
|||
public static final int ZQ_LeftMotor_VALUE = 2; |
|||
/** |
|||
* <code>ZQ_RightMotor = 3;</code> |
|||
*/ |
|||
public static final int ZQ_RightMotor_VALUE = 3; |
|||
/** |
|||
* <code>Remote_Button_Reset_State = 4;</code> |
|||
*/ |
|||
public static final int Remote_Button_Reset_State_VALUE = 4; |
|||
/** |
|||
* <code>Strain_Gauge = 5;</code> |
|||
*/ |
|||
public static final int Strain_Gauge_VALUE = 5; |
|||
/** |
|||
* <code>Android_485 = 6;</code> |
|||
*/ |
|||
public static final int Android_485_VALUE = 6; |
|||
/** |
|||
* <code>DMAKE_1 = 7;</code> |
|||
*/ |
|||
public static final int DMAKE_1_VALUE = 7; |
|||
|
|||
|
|||
public final int getNumber() { |
|||
if (this == UNRECOGNIZED) { |
|||
throw new java.lang.IllegalArgumentException( |
|||
"Can't get the number of an unknown enum value."); |
|||
} |
|||
return value; |
|||
} |
|||
|
|||
/** |
|||
* @param value The numeric wire value of the corresponding enum entry. |
|||
* @return The enum associated with the given numeric wire value. |
|||
* @deprecated Use {@link #forNumber(int)} instead. |
|||
*/ |
|||
@java.lang.Deprecated |
|||
public static ComError valueOf(int value) { |
|||
return forNumber(value); |
|||
} |
|||
|
|||
/** |
|||
* @param value The numeric wire value of the corresponding enum entry. |
|||
* @return The enum associated with the given numeric wire value. |
|||
*/ |
|||
public static ComError forNumber(int value) { |
|||
switch (value) { |
|||
case 0: return MK32_SBus; |
|||
case 1: return TL720D; |
|||
case 2: return ZQ_LeftMotor; |
|||
case 3: return ZQ_RightMotor; |
|||
case 4: return Remote_Button_Reset_State; |
|||
case 5: return Strain_Gauge; |
|||
case 6: return Android_485; |
|||
case 7: return DMAKE_1; |
|||
default: return null; |
|||
} |
|||
} |
|||
|
|||
public static com.google.protobuf.Internal.EnumLiteMap<ComError> |
|||
internalGetValueMap() { |
|||
return internalValueMap; |
|||
} |
|||
private static final com.google.protobuf.Internal.EnumLiteMap< |
|||
ComError> internalValueMap = |
|||
new com.google.protobuf.Internal.EnumLiteMap<ComError>() { |
|||
public ComError findValueByNumber(int number) { |
|||
return ComError.forNumber(number); |
|||
} |
|||
}; |
|||
|
|||
public final com.google.protobuf.Descriptors.EnumValueDescriptor |
|||
getValueDescriptor() { |
|||
if (this == UNRECOGNIZED) { |
|||
throw new java.lang.IllegalStateException( |
|||
"Can't get the descriptor of an unrecognized enum value."); |
|||
} |
|||
return getDescriptor().getValues().get(ordinal()); |
|||
} |
|||
public final com.google.protobuf.Descriptors.EnumDescriptor |
|||
getDescriptorForType() { |
|||
return getDescriptor(); |
|||
} |
|||
public static final com.google.protobuf.Descriptors.EnumDescriptor |
|||
getDescriptor() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.getDescriptor().getEnumTypes().get(0); |
|||
} |
|||
|
|||
private static final ComError[] VALUES = values(); |
|||
|
|||
public static ComError valueOf( |
|||
com.google.protobuf.Descriptors.EnumValueDescriptor desc) { |
|||
if (desc.getType() != getDescriptor()) { |
|||
throw new java.lang.IllegalArgumentException( |
|||
"EnumValueDescriptor is not for this type."); |
|||
} |
|||
if (desc.getIndex() == -1) { |
|||
return UNRECOGNIZED; |
|||
} |
|||
return VALUES[desc.getIndex()]; |
|||
} |
|||
|
|||
private final int value; |
|||
|
|||
private ComError(int value) { |
|||
this.value = value; |
|||
} |
|||
|
|||
// @@protoc_insertion_point(enum_scope:ComError)
|
|||
} |
|||
|
|||
public interface ErrorDataOrBuilder extends |
|||
// @@protoc_insertion_point(interface_extends:ErrorData)
|
|||
com.google.protobuf.MessageOrBuilder { |
|||
|
|||
/** |
|||
* <code>int32 Com_Error_Code = 1;</code> |
|||
* @return The comErrorCode. |
|||
*/ |
|||
int getComErrorCode(); |
|||
|
|||
/** |
|||
* <code>int32 Left_Motor_Error_Code = 2;</code> |
|||
* @return The leftMotorErrorCode. |
|||
*/ |
|||
int getLeftMotorErrorCode(); |
|||
|
|||
/** |
|||
* <code>int32 Right_Motor_Error_Code = 3;</code> |
|||
* @return The rightMotorErrorCode. |
|||
*/ |
|||
int getRightMotorErrorCode(); |
|||
} |
|||
/** |
|||
* Protobuf type {@code ErrorData} |
|||
*/ |
|||
public static final class ErrorData extends |
|||
com.google.protobuf.GeneratedMessage implements |
|||
// @@protoc_insertion_point(message_implements:ErrorData)
|
|||
ErrorDataOrBuilder { |
|||
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= */ "", |
|||
ErrorData.class.getName()); |
|||
} |
|||
// Use ErrorData.newBuilder() to construct.
|
|||
private ErrorData(com.google.protobuf.GeneratedMessage.Builder<?> builder) { |
|||
super(builder); |
|||
} |
|||
private ErrorData() { |
|||
} |
|||
|
|||
public static final com.google.protobuf.Descriptors.Descriptor |
|||
getDescriptor() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.internal_static_ErrorData_descriptor; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable |
|||
internalGetFieldAccessorTable() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.internal_static_ErrorData_fieldAccessorTable |
|||
.ensureFieldAccessorsInitialized( |
|||
com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.class, com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.Builder.class); |
|||
} |
|||
|
|||
public static final int COM_ERROR_CODE_FIELD_NUMBER = 1; |
|||
private int comErrorCode_ = 0; |
|||
/** |
|||
* <code>int32 Com_Error_Code = 1;</code> |
|||
* @return The comErrorCode. |
|||
*/ |
|||
@java.lang.Override |
|||
public int getComErrorCode() { |
|||
return comErrorCode_; |
|||
} |
|||
|
|||
public static final int LEFT_MOTOR_ERROR_CODE_FIELD_NUMBER = 2; |
|||
private int leftMotorErrorCode_ = 0; |
|||
/** |
|||
* <code>int32 Left_Motor_Error_Code = 2;</code> |
|||
* @return The leftMotorErrorCode. |
|||
*/ |
|||
@java.lang.Override |
|||
public int getLeftMotorErrorCode() { |
|||
return leftMotorErrorCode_; |
|||
} |
|||
|
|||
public static final int RIGHT_MOTOR_ERROR_CODE_FIELD_NUMBER = 3; |
|||
private int rightMotorErrorCode_ = 0; |
|||
/** |
|||
* <code>int32 Right_Motor_Error_Code = 3;</code> |
|||
* @return The rightMotorErrorCode. |
|||
*/ |
|||
@java.lang.Override |
|||
public int getRightMotorErrorCode() { |
|||
return rightMotorErrorCode_; |
|||
} |
|||
|
|||
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 (comErrorCode_ != 0) { |
|||
output.writeInt32(1, comErrorCode_); |
|||
} |
|||
if (leftMotorErrorCode_ != 0) { |
|||
output.writeInt32(2, leftMotorErrorCode_); |
|||
} |
|||
if (rightMotorErrorCode_ != 0) { |
|||
output.writeInt32(3, rightMotorErrorCode_); |
|||
} |
|||
getUnknownFields().writeTo(output); |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public int getSerializedSize() { |
|||
int size = memoizedSize; |
|||
if (size != -1) return size; |
|||
|
|||
size = 0; |
|||
if (comErrorCode_ != 0) { |
|||
size += com.google.protobuf.CodedOutputStream |
|||
.computeInt32Size(1, comErrorCode_); |
|||
} |
|||
if (leftMotorErrorCode_ != 0) { |
|||
size += com.google.protobuf.CodedOutputStream |
|||
.computeInt32Size(2, leftMotorErrorCode_); |
|||
} |
|||
if (rightMotorErrorCode_ != 0) { |
|||
size += com.google.protobuf.CodedOutputStream |
|||
.computeInt32Size(3, rightMotorErrorCode_); |
|||
} |
|||
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.roughapp2_0bbwiredrpm.models.BspError.ErrorData)) { |
|||
return super.equals(obj); |
|||
} |
|||
com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData other = (com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData) obj; |
|||
|
|||
if (getComErrorCode() |
|||
!= other.getComErrorCode()) return false; |
|||
if (getLeftMotorErrorCode() |
|||
!= other.getLeftMotorErrorCode()) return false; |
|||
if (getRightMotorErrorCode() |
|||
!= other.getRightMotorErrorCode()) 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) + COM_ERROR_CODE_FIELD_NUMBER; |
|||
hash = (53 * hash) + getComErrorCode(); |
|||
hash = (37 * hash) + LEFT_MOTOR_ERROR_CODE_FIELD_NUMBER; |
|||
hash = (53 * hash) + getLeftMotorErrorCode(); |
|||
hash = (37 * hash) + RIGHT_MOTOR_ERROR_CODE_FIELD_NUMBER; |
|||
hash = (53 * hash) + getRightMotorErrorCode(); |
|||
hash = (29 * hash) + getUnknownFields().hashCode(); |
|||
memoizedHashCode = hash; |
|||
return hash; |
|||
} |
|||
|
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom( |
|||
java.nio.ByteBuffer data) |
|||
throws com.google.protobuf.InvalidProtocolBufferException { |
|||
return PARSER.parseFrom(data); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom( |
|||
java.nio.ByteBuffer data, |
|||
com.google.protobuf.ExtensionRegistryLite extensionRegistry) |
|||
throws com.google.protobuf.InvalidProtocolBufferException { |
|||
return PARSER.parseFrom(data, extensionRegistry); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom( |
|||
com.google.protobuf.ByteString data) |
|||
throws com.google.protobuf.InvalidProtocolBufferException { |
|||
return PARSER.parseFrom(data); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData 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.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom(byte[] data) |
|||
throws com.google.protobuf.InvalidProtocolBufferException { |
|||
return PARSER.parseFrom(data); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom( |
|||
byte[] data, |
|||
com.google.protobuf.ExtensionRegistryLite extensionRegistry) |
|||
throws com.google.protobuf.InvalidProtocolBufferException { |
|||
return PARSER.parseFrom(data, extensionRegistry); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom(java.io.InputStream input) |
|||
throws java.io.IOException { |
|||
return com.google.protobuf.GeneratedMessage |
|||
.parseWithIOException(PARSER, input); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData 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.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseDelimitedFrom(java.io.InputStream input) |
|||
throws java.io.IOException { |
|||
return com.google.protobuf.GeneratedMessage |
|||
.parseDelimitedWithIOException(PARSER, input); |
|||
} |
|||
|
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData 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.roughapp2_0bbwiredrpm.models.BspError.ErrorData parseFrom( |
|||
com.google.protobuf.CodedInputStream input) |
|||
throws java.io.IOException { |
|||
return com.google.protobuf.GeneratedMessage |
|||
.parseWithIOException(PARSER, input); |
|||
} |
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData 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.roughapp2_0bbwiredrpm.models.BspError.ErrorData 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 ErrorData} |
|||
*/ |
|||
public static final class Builder extends |
|||
com.google.protobuf.GeneratedMessage.Builder<Builder> implements |
|||
// @@protoc_insertion_point(builder_implements:ErrorData)
|
|||
com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorDataOrBuilder { |
|||
public static final com.google.protobuf.Descriptors.Descriptor |
|||
getDescriptor() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.internal_static_ErrorData_descriptor; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable |
|||
internalGetFieldAccessorTable() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.internal_static_ErrorData_fieldAccessorTable |
|||
.ensureFieldAccessorsInitialized( |
|||
com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.class, com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.Builder.class); |
|||
} |
|||
|
|||
// Construct using com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.newBuilder()
|
|||
private Builder() { |
|||
|
|||
} |
|||
|
|||
private Builder( |
|||
com.google.protobuf.GeneratedMessage.BuilderParent parent) { |
|||
super(parent); |
|||
|
|||
} |
|||
@java.lang.Override |
|||
public Builder clear() { |
|||
super.clear(); |
|||
bitField0_ = 0; |
|||
comErrorCode_ = 0; |
|||
leftMotorErrorCode_ = 0; |
|||
rightMotorErrorCode_ = 0; |
|||
return this; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public com.google.protobuf.Descriptors.Descriptor |
|||
getDescriptorForType() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.internal_static_ErrorData_descriptor; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData getDefaultInstanceForType() { |
|||
return com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.getDefaultInstance(); |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData build() { |
|||
com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData result = buildPartial(); |
|||
if (!result.isInitialized()) { |
|||
throw newUninitializedMessageException(result); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData buildPartial() { |
|||
com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData result = new com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData(this); |
|||
if (bitField0_ != 0) { buildPartial0(result); } |
|||
onBuilt(); |
|||
return result; |
|||
} |
|||
|
|||
private void buildPartial0(com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData result) { |
|||
int from_bitField0_ = bitField0_; |
|||
if (((from_bitField0_ & 0x00000001) != 0)) { |
|||
result.comErrorCode_ = comErrorCode_; |
|||
} |
|||
if (((from_bitField0_ & 0x00000002) != 0)) { |
|||
result.leftMotorErrorCode_ = leftMotorErrorCode_; |
|||
} |
|||
if (((from_bitField0_ & 0x00000004) != 0)) { |
|||
result.rightMotorErrorCode_ = rightMotorErrorCode_; |
|||
} |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public Builder mergeFrom(com.google.protobuf.Message other) { |
|||
if (other instanceof com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData) { |
|||
return mergeFrom((com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData)other); |
|||
} else { |
|||
super.mergeFrom(other); |
|||
return this; |
|||
} |
|||
} |
|||
|
|||
public Builder mergeFrom(com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData other) { |
|||
if (other == com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData.getDefaultInstance()) return this; |
|||
if (other.getComErrorCode() != 0) { |
|||
setComErrorCode(other.getComErrorCode()); |
|||
} |
|||
if (other.getLeftMotorErrorCode() != 0) { |
|||
setLeftMotorErrorCode(other.getLeftMotorErrorCode()); |
|||
} |
|||
if (other.getRightMotorErrorCode() != 0) { |
|||
setRightMotorErrorCode(other.getRightMotorErrorCode()); |
|||
} |
|||
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: { |
|||
comErrorCode_ = input.readInt32(); |
|||
bitField0_ |= 0x00000001; |
|||
break; |
|||
} // case 8
|
|||
case 16: { |
|||
leftMotorErrorCode_ = input.readInt32(); |
|||
bitField0_ |= 0x00000002; |
|||
break; |
|||
} // case 16
|
|||
case 24: { |
|||
rightMotorErrorCode_ = input.readInt32(); |
|||
bitField0_ |= 0x00000004; |
|||
break; |
|||
} // case 24
|
|||
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 comErrorCode_ ; |
|||
/** |
|||
* <code>int32 Com_Error_Code = 1;</code> |
|||
* @return The comErrorCode. |
|||
*/ |
|||
@java.lang.Override |
|||
public int getComErrorCode() { |
|||
return comErrorCode_; |
|||
} |
|||
/** |
|||
* <code>int32 Com_Error_Code = 1;</code> |
|||
* @param value The comErrorCode to set. |
|||
* @return This builder for chaining. |
|||
*/ |
|||
public Builder setComErrorCode(int value) { |
|||
|
|||
comErrorCode_ = value; |
|||
bitField0_ |= 0x00000001; |
|||
onChanged(); |
|||
return this; |
|||
} |
|||
/** |
|||
* <code>int32 Com_Error_Code = 1;</code> |
|||
* @return This builder for chaining. |
|||
*/ |
|||
public Builder clearComErrorCode() { |
|||
bitField0_ = (bitField0_ & ~0x00000001); |
|||
comErrorCode_ = 0; |
|||
onChanged(); |
|||
return this; |
|||
} |
|||
|
|||
private int leftMotorErrorCode_ ; |
|||
/** |
|||
* <code>int32 Left_Motor_Error_Code = 2;</code> |
|||
* @return The leftMotorErrorCode. |
|||
*/ |
|||
@java.lang.Override |
|||
public int getLeftMotorErrorCode() { |
|||
return leftMotorErrorCode_; |
|||
} |
|||
/** |
|||
* <code>int32 Left_Motor_Error_Code = 2;</code> |
|||
* @param value The leftMotorErrorCode to set. |
|||
* @return This builder for chaining. |
|||
*/ |
|||
public Builder setLeftMotorErrorCode(int value) { |
|||
|
|||
leftMotorErrorCode_ = value; |
|||
bitField0_ |= 0x00000002; |
|||
onChanged(); |
|||
return this; |
|||
} |
|||
/** |
|||
* <code>int32 Left_Motor_Error_Code = 2;</code> |
|||
* @return This builder for chaining. |
|||
*/ |
|||
public Builder clearLeftMotorErrorCode() { |
|||
bitField0_ = (bitField0_ & ~0x00000002); |
|||
leftMotorErrorCode_ = 0; |
|||
onChanged(); |
|||
return this; |
|||
} |
|||
|
|||
private int rightMotorErrorCode_ ; |
|||
/** |
|||
* <code>int32 Right_Motor_Error_Code = 3;</code> |
|||
* @return The rightMotorErrorCode. |
|||
*/ |
|||
@java.lang.Override |
|||
public int getRightMotorErrorCode() { |
|||
return rightMotorErrorCode_; |
|||
} |
|||
/** |
|||
* <code>int32 Right_Motor_Error_Code = 3;</code> |
|||
* @param value The rightMotorErrorCode to set. |
|||
* @return This builder for chaining. |
|||
*/ |
|||
public Builder setRightMotorErrorCode(int value) { |
|||
|
|||
rightMotorErrorCode_ = value; |
|||
bitField0_ |= 0x00000004; |
|||
onChanged(); |
|||
return this; |
|||
} |
|||
/** |
|||
* <code>int32 Right_Motor_Error_Code = 3;</code> |
|||
* @return This builder for chaining. |
|||
*/ |
|||
public Builder clearRightMotorErrorCode() { |
|||
bitField0_ = (bitField0_ & ~0x00000004); |
|||
rightMotorErrorCode_ = 0; |
|||
onChanged(); |
|||
return this; |
|||
} |
|||
|
|||
// @@protoc_insertion_point(builder_scope:ErrorData)
|
|||
} |
|||
|
|||
// @@protoc_insertion_point(class_scope:ErrorData)
|
|||
private static final com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData DEFAULT_INSTANCE; |
|||
static { |
|||
DEFAULT_INSTANCE = new com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData(); |
|||
} |
|||
|
|||
public static com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData getDefaultInstance() { |
|||
return DEFAULT_INSTANCE; |
|||
} |
|||
|
|||
private static final com.google.protobuf.Parser<ErrorData> |
|||
PARSER = new com.google.protobuf.AbstractParser<ErrorData>() { |
|||
@java.lang.Override |
|||
public ErrorData 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<ErrorData> parser() { |
|||
return PARSER; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public com.google.protobuf.Parser<ErrorData> getParserForType() { |
|||
return PARSER; |
|||
} |
|||
|
|||
@java.lang.Override |
|||
public com.example.roughapp2_0bbwiredrpm.models.BspError.ErrorData getDefaultInstanceForType() { |
|||
return DEFAULT_INSTANCE; |
|||
} |
|||
|
|||
} |
|||
|
|||
private static final com.google.protobuf.Descriptors.Descriptor |
|||
internal_static_ErrorData_descriptor; |
|||
private static final |
|||
com.google.protobuf.GeneratedMessage.FieldAccessorTable |
|||
internal_static_ErrorData_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\017bsp_Error.proto\"b\n\tErrorData\022\026\n\016Com_Er" + |
|||
"ror_Code\030\001 \001(\005\022\035\n\025Left_Motor_Error_Code\030" + |
|||
"\002 \001(\005\022\036\n\026Right_Motor_Error_Code\030\003 \001(\005*\231\001" + |
|||
"\n\010ComError\022\r\n\tMK32_SBus\020\000\022\n\n\006TL720D\020\001\022\020\n" + |
|||
"\014ZQ_LeftMotor\020\002\022\021\n\rZQ_RightMotor\020\003\022\035\n\031Re" + |
|||
"mote_Button_Reset_State\020\004\022\020\n\014Strain_Gaug" + |
|||
"e\020\005\022\017\n\013Android_485\020\006\022\013\n\007DMAKE_1\020\007B,\n(com" + |
|||
".example.roughapp2_0bbwiredrpm.modelsP\000b" + |
|||
"\006proto3" |
|||
}; |
|||
descriptor = com.google.protobuf.Descriptors.FileDescriptor |
|||
.internalBuildGeneratedFileFrom(descriptorData, |
|||
new com.google.protobuf.Descriptors.FileDescriptor[] { |
|||
}); |
|||
internal_static_ErrorData_descriptor = |
|||
getDescriptor().getMessageTypes().get(0); |
|||
internal_static_ErrorData_fieldAccessorTable = new |
|||
com.google.protobuf.GeneratedMessage.FieldAccessorTable( |
|||
internal_static_ErrorData_descriptor, |
|||
new java.lang.String[] { "ComErrorCode", "LeftMotorErrorCode", "RightMotorErrorCode", }); |
|||
descriptor.resolveAllFeaturesImmutable(); |
|||
} |
|||
|
|||
// @@protoc_insertion_point(outer_class_scope)
|
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.models; |
|||
|
|||
import androidx.databinding.BaseObservable; |
|||
|
|||
public class DisplayIV extends BaseObservable { |
|||
private double leftCompensation; |
|||
private double rightCompensation; |
|||
private double currentAngle; |
|||
|
|||
public double getLeftCompensation() { |
|||
return leftCompensation; |
|||
} |
|||
|
|||
public void setLeftCompensation(double leftCompensation) { |
|||
this.leftCompensation = leftCompensation; |
|||
} |
|||
|
|||
public double getRightCompensation() { |
|||
return rightCompensation; |
|||
} |
|||
|
|||
public void setRightCompensation(double rightCompensation) { |
|||
this.rightCompensation = rightCompensation; |
|||
} |
|||
|
|||
public double getCurrentAngle() { |
|||
return currentAngle; |
|||
} |
|||
|
|||
public void setCurrentAngle(double currentAngle) { |
|||
this.currentAngle = currentAngle; |
|||
} |
|||
|
|||
public double getRobotMoveSpeed() { |
|||
return robotMoveSpeed; |
|||
} |
|||
|
|||
public void setRobotMoveSpeed(double robotMoveSpeed) { |
|||
this.robotMoveSpeed = robotMoveSpeed; |
|||
} |
|||
|
|||
private double robotMoveSpeed; |
|||
|
|||
public DisplayIV(double leftCompensation, double rightCompensation, double currentAngle, double robotMoveSpeed) { |
|||
this.leftCompensation = leftCompensation; |
|||
this.rightCompensation = rightCompensation; |
|||
this.currentAngle = currentAngle; |
|||
this.robotMoveSpeed = robotMoveSpeed; |
|||
} |
|||
} |
|||
@ -0,0 +1,90 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.models; |
|||
|
|||
import androidx.databinding.BaseObservable; |
|||
|
|||
public class DisplayPV extends BaseObservable { |
|||
|
|||
private int id; |
|||
|
|||
private int laneChangeDistance; |
|||
private double horizontalDistance; |
|||
private double verticalDistance; |
|||
private double verticalAdjust; |
|||
private double leftCompensation; |
|||
private double rightCompensation; |
|||
private int pressSet; |
|||
|
|||
public DisplayPV(int id, int laneChangeDistance, double horizontalDistance, double verticalDistance, double verticalAdjust, double leftCompensation, double rightCompensation ,int pressSet) { |
|||
this.id = id; |
|||
this.laneChangeDistance=laneChangeDistance; |
|||
this.horizontalDistance = horizontalDistance; |
|||
this.verticalDistance = verticalDistance; |
|||
this.verticalAdjust=verticalAdjust; |
|||
this.leftCompensation = leftCompensation; |
|||
this.rightCompensation=rightCompensation; |
|||
this.pressSet=pressSet; |
|||
|
|||
} |
|||
|
|||
|
|||
public int getId() { return id; } |
|||
public void setId(int id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
|
|||
|
|||
public int getLaneChangeDistance() { |
|||
return laneChangeDistance; |
|||
} |
|||
public void setLaneChangeDistance(int laneChangeDistance) { this.laneChangeDistance = laneChangeDistance;} |
|||
|
|||
public double getHorizontalDistance() { |
|||
return horizontalDistance; |
|||
} |
|||
public void setHorizontalDistance(double horizontalDistance) { this.horizontalDistance = horizontalDistance;} |
|||
|
|||
public double getVerticalDistance() { |
|||
return verticalDistance; |
|||
} |
|||
public void setVerticalDistance(double verticalDistance) { |
|||
this.verticalDistance = verticalDistance; |
|||
} |
|||
|
|||
public double getVerticalAdjust(){ |
|||
return verticalAdjust; |
|||
} |
|||
public void setVerticalAdjust(double verticalAdjust) { |
|||
this.verticalAdjust = verticalAdjust; |
|||
} |
|||
|
|||
|
|||
public double getLeftCompensation() { |
|||
return leftCompensation; |
|||
} |
|||
public void setLeftCompensation(double leftCompensation) { |
|||
this.leftCompensation = leftCompensation; |
|||
} |
|||
|
|||
public double getRightCompensation() { |
|||
return rightCompensation; |
|||
} |
|||
public void setRightCompensation(double rightCompensation) { |
|||
this.rightCompensation = rightCompensation; |
|||
} |
|||
|
|||
public int getPressSet() { |
|||
return pressSet; |
|||
} |
|||
public void setPressSet(int pressSet) { |
|||
this.pressSet = pressSet; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.models; |
|||
|
|||
public class ErrorModel { |
|||
|
|||
public ErrorModel(long timeID, String errorInfo) { |
|||
this.timeID = timeID; |
|||
this.errorInfo = errorInfo; |
|||
} |
|||
private long timeID; |
|||
|
|||
|
|||
public void setDateTimeBJ(String dateTimeUTC) { |
|||
this.dateTimeBJ = dateTimeUTC; |
|||
} |
|||
|
|||
private String errorInfo; |
|||
|
|||
public String getDateTimeBJ() { |
|||
return dateTimeBJ; |
|||
} |
|||
|
|||
private String dateTimeBJ; |
|||
|
|||
|
|||
@Override |
|||
public String toString() { |
|||
return String.valueOf(dateTimeBJ + errorInfo); |
|||
} |
|||
public void setTimeID(long timeID) { |
|||
this.timeID = timeID; |
|||
} |
|||
|
|||
public void setErrorInfo(String errorInfo) { |
|||
this.errorInfo = errorInfo; |
|||
} |
|||
|
|||
public long getTimeID() { |
|||
return timeID; |
|||
} |
|||
|
|||
public String getErrorInfo() { |
|||
return errorInfo; |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.models; |
|||
|
|||
import android.content.Context; |
|||
import android.util.AttributeSet; |
|||
import android.view.View; |
|||
import android.widget.ScrollView; |
|||
|
|||
public class ScrollBottomScrollView extends ScrollView { |
|||
|
|||
private OnScrollBottomListener listener; |
|||
private int calCount; |
|||
|
|||
public interface OnScrollBottomListener { |
|||
void scrollToBottom(); |
|||
} |
|||
|
|||
public void onScrollViewScrollToBottom(OnScrollBottomListener l) { |
|||
listener = l; |
|||
} |
|||
|
|||
public void unRegisterOnScrollViewScrollToBottom() { |
|||
listener = null; |
|||
} |
|||
|
|||
public ScrollBottomScrollView(Context context, AttributeSet attrs) { |
|||
super(context, attrs); |
|||
} |
|||
|
|||
@Override |
|||
protected void onScrollChanged(int l, int t, int oldl, int oldt) { |
|||
View view = this.getChildAt(0); |
|||
if (this.getHeight() + this.getScrollY() == view.getHeight()) { |
|||
calCount++; |
|||
if (calCount == 1) { |
|||
if (listener != null) { |
|||
listener.scrollToBottom(); |
|||
} |
|||
} |
|||
} else { |
|||
calCount = 0; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,55 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
|
|||
//用来校验有线的subs通道数据
|
|||
public class CCITT_CRC16 { |
|||
|
|||
|
|||
/** |
|||
* 计算XMODEM-CRC16校验值(符合XMODEM协议标准) |
|||
* @param data 待校验的字节数组 |
|||
* @return 包含2个字节的CRC16校验结果数组(高位在前,低位在后) |
|||
*/ |
|||
public static byte[] calculateXModemCRC16(byte[] data) { |
|||
// 1. 参数合法性校验,避免空指针和空数组异常
|
|||
if (data == null || data.length == 0) { |
|||
return new byte[]{0x00, 0x00}; // 空数据返回0值数组
|
|||
} |
|||
|
|||
// 2. XMODEM-CRC16 核心参数
|
|||
int crc = 0x0000; // 初始值为0(区别于CCITT的0xFFFF)
|
|||
final int POLYNOMIAL = 0x1021; // 固定多项式0x1021
|
|||
|
|||
// 3. 逐字节处理输入数据
|
|||
for (byte b : data) { |
|||
// 将字节转为无符号整数(解决Java byte有符号的问题)
|
|||
int byteValue = b & 0xFF; |
|||
// 先异或当前字节到CRC的高8位
|
|||
crc ^= (byteValue << 8); |
|||
|
|||
// 逐位处理8个比特
|
|||
for (int i = 0; i < 8; i++) { |
|||
// 判断最高位是否为1
|
|||
if ((crc & 0x8000) != 0) { |
|||
// 左移1位后异或多项式
|
|||
crc = (crc << 1) ^ POLYNOMIAL; |
|||
} else { |
|||
// 仅左移1位
|
|||
crc = crc << 1; |
|||
} |
|||
// 保留低16位,防止整数溢出
|
|||
crc &= 0xFFFF; |
|||
} |
|||
} |
|||
|
|||
// 4. 将16位CRC结果拆分为2字节数组(高位在前,符合XMODEM标准)
|
|||
byte[] crcResult = new byte[2]; |
|||
crcResult[0] = (byte)(crc & 0xFF); // 低8位
|
|||
crcResult[1] = (byte)((crc >> 8) & 0xFF); // 高8位
|
|||
|
|||
return crcResult; |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
|
|||
public enum CommunicationMethond { |
|||
Wireless, Wired |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.widget.EditText; |
|||
import android.widget.TextView; |
|||
|
|||
public class ConvertHelper { |
|||
|
|||
public static int convertEditTextToInt(TextView editText) { |
|||
// 获取 EditText 中的文本
|
|||
String input = editText.getText().toString().trim(); |
|||
try { |
|||
// 尝试将字符串转换为整数
|
|||
return Integer.parseInt(input); |
|||
} catch (NumberFormatException e) { |
|||
// 输入不是有效的整数格式,返回 -1 表示转换失败
|
|||
return -1; |
|||
} |
|||
} |
|||
|
|||
public static boolean isEditTextNullOrEmpty(EditText editText) { |
|||
|
|||
String str = String.valueOf(editText.getText()); |
|||
|
|||
return str == null || str.isEmpty(); |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.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); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,155 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.models.BspIV; |
|||
import com.example.roughapp2_0bbwiredrpm.models.BspPV; |
|||
import com.google.protobuf.InvalidProtocolBufferException; |
|||
|
|||
public class DataExchangeHelper { |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static int[] decodedCH = new int[17]; |
|||
static double slope = 1000.0 / (1950 - 1500); |
|||
|
|||
public static int[] getdecodedCH(byte[] receivedData) { |
|||
for (int i = 0; i < 16; i++) { |
|||
decodedCH[i] = ((receivedData[8 + i * 2] & 0xFF) | (receivedData[9 + i * 2] & 0xFF) << 8); |
|||
} |
|||
|
|||
for (int i = 0; i < 16; i++) { |
|||
decodedCH[i] = (int) Math.round(slope * (decodedCH[i] - 1500)); |
|||
} |
|||
return decodedCH; |
|||
} |
|||
|
|||
|
|||
public static byte[] getSendPVBytes(BspPV.PV_struct_define _toSendPV) { |
|||
byte[] byteArray = _toSendPV.toByteArray(); |
|||
byte[] sendbyteArray = new byte[byteArray.length + 4]; |
|||
byte[] sendbyteArray3 = new byte[byteArray.length + 6]; |
|||
if (byteArray.length != 0) { |
|||
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); |
|||
return sendbyteArray3; |
|||
} |
|||
|
|||
public static BspIV.IV_struct_define getIVByBytes(byte[] data) { |
|||
byte[] crcbytes = new byte[data.length - 2]; |
|||
System.arraycopy(data, 0, crcbytes, 0, data.length - 2); |
|||
byte[] crc = ModbusCRC.calculateCRC(crcbytes); |
|||
// status(bytesToHex(data));
|
|||
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); |
|||
try { |
|||
BspIV.IV_struct_define _toReceiveIV = BspIV.IV_struct_define.parseFrom(bytes); |
|||
return _toReceiveIV; |
|||
} catch (InvalidProtocolBufferException ex) { |
|||
return null; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static BspIV.IV_struct_define getIVByModbus() { |
|||
|
|||
try { |
|||
//定义100 是IV的数据开头数组个数 建立多少个字节数组
|
|||
byte[] bytes = new byte[ModbusRtuSlaveService.holdingRegisters[100]]; |
|||
int modifyHoldingRegisterNum = (bytes.length + 1) / 2; |
|||
for (int i = 0; i < modifyHoldingRegisterNum; i++) { |
|||
bytes[2 * i] = (byte) (ModbusRtuSlaveService.holdingRegisters[101 + i] >> 8); |
|||
if (2 * i + 1 > bytes.length - 1) { |
|||
break; |
|||
} |
|||
|
|||
bytes[2 * i + 1] = (byte) (ModbusRtuSlaveService.holdingRegisters[101 + i] & 0xff); |
|||
} |
|||
|
|||
BspIV.IV_struct_define _toReceiveIV = BspIV.IV_struct_define.parseFrom(bytes); |
|||
return _toReceiveIV; |
|||
} catch (InvalidProtocolBufferException ex) { |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
//_toSendPV 换算成bytes
|
|||
public static void setModbusPVValues(BspPV.PV_struct_define _toSendPV) { |
|||
|
|||
byte[] byteArray = _toSendPV.toByteArray(); |
|||
byte[] bytesToSend; |
|||
int modifyHoldingRegisterNum = (byteArray.length + 1) / 2; |
|||
|
|||
if (byteArray.length != 0) { |
|||
if (byteArray.length % 2 != 0) { |
|||
bytesToSend = new byte[byteArray.length + 1]; |
|||
bytesToSend[bytesToSend.length - 1] = 0; |
|||
|
|||
} else { |
|||
bytesToSend = new byte[byteArray.length]; |
|||
} |
|||
System.arraycopy(byteArray, 0, bytesToSend, 0, byteArray.length); |
|||
|
|||
ModbusRtuSlaveService.holdingRegisters[18] = (short) byteArray.length; |
|||
//将数据转为小端发送
|
|||
for (int i = 0; i < modifyHoldingRegisterNum; i++) { |
|||
|
|||
|
|||
ModbusRtuSlaveService.holdingRegisters[19 + i] = (short) ( |
|||
((bytesToSend[2 * i + 1] & 0xFF) << 8) | // 高位字节
|
|||
bytesToSend[2 * i] & 0xFF); // 低位字节
|
|||
|
|||
// (short) ((bytesToSend[2 * i + 1]) << 8 | ((short)bytesToSend[2 * i]));
|
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 判断字符串是否是数字 |
|||
*/ |
|||
public static boolean isNumber(String value) { |
|||
return isInteger(value) || isDouble(value); |
|||
} |
|||
|
|||
/** |
|||
* 判断字符串是否是整数 |
|||
*/ |
|||
public static boolean isInteger(String value) { |
|||
try { |
|||
Integer.parseInt(value); |
|||
return true; |
|||
} catch (NumberFormatException e) { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 判断字符串是否是浮点数 |
|||
*/ |
|||
public static boolean isDouble(String value) { |
|||
try { |
|||
Double.parseDouble(value); |
|||
if (value.contains(".")) |
|||
return true; |
|||
return false; |
|||
} catch (NumberFormatException e) { |
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,71 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.text.InputFilter; |
|||
import android.text.Spanned; |
|||
|
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
/* |
|||
自定义 InputFilter 类,用于限制输入格式 |
|||
支持整数、负数和最多一位小数的输入 |
|||
使用方法:editText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); |
|||
*/ |
|||
public class DecimalDigitsInputFilter implements InputFilter { |
|||
// 最终验证的正则表达式
|
|||
private final Pattern mFinalPattern; |
|||
// 中间状态允许的正则表达式
|
|||
private final Pattern mIntermediatePattern; |
|||
|
|||
public DecimalDigitsInputFilter() { |
|||
// 最终验证:必须是完整的数字格式
|
|||
mFinalPattern = Pattern.compile("^-?(0|[1-9]\\d*)(\\.\\d)?$"); |
|||
|
|||
// 中间状态:允许临时的不完整格式(如 "-"、"0."、"-2.")
|
|||
mIntermediatePattern = Pattern.compile("^-?(0|[1-9]\\d*)?(\\.)?$"); |
|||
} |
|||
|
|||
@Override |
|||
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { |
|||
// 处理删除操作
|
|||
if (end - start == 0) { |
|||
return null; |
|||
} |
|||
|
|||
// 拼接新的输入内容
|
|||
String newText = dest.toString().substring(0, dstart) + |
|||
source.toString().substring(start, end) + |
|||
dest.toString().substring(dend); |
|||
|
|||
// 允许空字符串或单独的负号
|
|||
if (newText.isEmpty() || newText.equals("-")) { |
|||
return null; |
|||
} |
|||
|
|||
// 防止前导零(除非是 0 或 0.x)
|
|||
if (newText.startsWith("0") && newText.length() > 1 && |
|||
!newText.startsWith("0.") && !newText.equals("0")) { |
|||
return ""; |
|||
} |
|||
|
|||
// 防止多个负号
|
|||
if (newText.indexOf('-') > 0) { |
|||
return ""; |
|||
} |
|||
|
|||
// 防止多个小数点
|
|||
if (newText.indexOf('.') != newText.lastIndexOf('.')) { |
|||
return ""; |
|||
} |
|||
|
|||
// 检查是否匹配最终模式或中间模式
|
|||
Matcher finalMatcher = mFinalPattern.matcher(newText); |
|||
Matcher intermediateMatcher = mIntermediatePattern.matcher(newText); |
|||
|
|||
if (finalMatcher.matches() || intermediateMatcher.matches()) { |
|||
return null; // 匹配成功,允许输入
|
|||
} |
|||
|
|||
return ""; // 匹配失败,阻止输入
|
|||
} |
|||
} |
|||
@ -0,0 +1,59 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.models.BspError; |
|||
|
|||
public class ErrorDeocdeHelper { |
|||
|
|||
//private static Map<String, Integer> flagMap = new HashMap<>();
|
|||
|
|||
// public static void AddMap(String errorName, Integer bitPosition)
|
|||
// {
|
|||
// flagMap.put(errorName,bitPosition);
|
|||
// }
|
|||
private static String ErrorResult; |
|||
private static String addErrorResult; |
|||
public static String ErrorDeocde(int data) |
|||
{ |
|||
ErrorResult=""; |
|||
|
|||
// 循环遍历 Map
|
|||
for (BspError.ComError err : BspError.ComError.values()) { |
|||
|
|||
int bitPosiiton = err.ordinal(); |
|||
// if (err.toString().equals("UNRECOGNIZED")) continue;
|
|||
// if (err.toString().equals("TL720D"))
|
|||
// addErrorResult = " 作业模式已切换至手动";
|
|||
// else
|
|||
// addErrorResult = " ";
|
|||
//
|
|||
// if (err.toString().equals("MK32_InitialState"))
|
|||
// addErrorResult = " 遥控器按键未复位";
|
|||
// else
|
|||
// addErrorResult = " ";
|
|||
|
|||
|
|||
// 使用左移操作生成要检查的标志位
|
|||
int bitToCheck = 1 << bitPosiiton; |
|||
|
|||
// 判断该位置是否有对应的标志位
|
|||
if ((data & bitToCheck) != 0) |
|||
{ |
|||
|
|||
// ErrorResult += String.valueOf(bitPosiiton);
|
|||
|
|||
if (err.toString().equals("Remote_Button_Reset_State")) |
|||
{ |
|||
ErrorResult = "未复位" ; |
|||
} |
|||
// else
|
|||
// {
|
|||
// ErrorResult += err.toString()+addErrorResult+"\t";
|
|||
// }
|
|||
} |
|||
} |
|||
return ErrorResult; |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.util.Log; |
|||
|
|||
public class LogUtil { |
|||
private String TAG; |
|||
private boolean isRelease = false; |
|||
private boolean isDebug; |
|||
|
|||
public LogUtil(Class c, boolean isDebug) { |
|||
this.TAG = c.getName(); |
|||
this.isDebug = isDebug; |
|||
} |
|||
|
|||
public void d(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.d(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
|
|||
public void i(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.i(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
|
|||
public void w(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.w(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
|
|||
public void e(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.e(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,72 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.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; |
|||
} |
|||
} |
|||
@ -0,0 +1,508 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.util.Log; |
|||
|
|||
import java.util.Arrays; |
|||
import java.util.concurrent.atomic.AtomicBoolean; |
|||
|
|||
public class ModbusRtuSlaveService { |
|||
public static void ModbusRtuSlaveServiceIntialize(USBSerialPortHelper serialPortHelper) { |
|||
_serialPortHelper = serialPortHelper; |
|||
initializeData(); |
|||
|
|||
} |
|||
|
|||
public static final String TAG = "ModbusRtuSlave"; |
|||
public static final int slaveId = 0x40; |
|||
public static Thread readThread; |
|||
public final AtomicBoolean shouldRead = new AtomicBoolean(false); |
|||
public static USBSerialPortHelper _serialPortHelper; |
|||
|
|||
// Modbus 数据存储
|
|||
public static final boolean[] coils = new boolean[65536]; |
|||
public static final boolean[] discreteInputs = new boolean[65536]; |
|||
|
|||
public static final short[] holdingRegisters_temp = new short[65536]; |
|||
public static final short[] holdingRegisters = new short[65536]; |
|||
public static final short[] inputRegisters = new short[65536]; |
|||
|
|||
// 数据更新监听器
|
|||
public DataUpdateListener dataUpdateListener; |
|||
|
|||
public interface DataUpdateListener { |
|||
void onCoilUpdated(int address, boolean value); |
|||
|
|||
void onRegisterUpdated(int address, short value); |
|||
|
|||
void onError(String errorMessage); |
|||
} |
|||
|
|||
public static void initializeData() { |
|||
// 初始化示例数据
|
|||
Arrays.fill(holdingRegisters, (short) 0); |
|||
Arrays.fill(inputRegisters, (short) 0); |
|||
Arrays.fill(coils, false); |
|||
Arrays.fill(discreteInputs, false); |
|||
|
|||
// 设置一些默认值 可以处理一些默认值 后面
|
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
public final byte[] buffer = new byte[256]; |
|||
|
|||
//处理Modbus数据,这个可以在数据接收后调用 返回调用的功能码
|
|||
public static int processModbusRequest(byte[] request, int length) { |
|||
if (length < 4) { |
|||
Log.w(TAG, "Request too short: " + length + " bytes"); |
|||
return 0; |
|||
} |
|||
|
|||
// 提取从站地址
|
|||
byte receivedSlaveId = request[0]; |
|||
if (receivedSlaveId != slaveId && receivedSlaveId != 0) { |
|||
Log.d(TAG, "Request not for this slave. Target: " + receivedSlaveId + ", Our ID: " + slaveId); |
|||
return 0; |
|||
} |
|||
|
|||
Log.d(TAG, "Processing request for slave: " + receivedSlaveId); |
|||
|
|||
// 验证CRC
|
|||
if (!validateCrc(request, length)) { |
|||
Log.w(TAG, "CRC validation failed"); |
|||
return 0; |
|||
} |
|||
|
|||
// 处理Modbus请求
|
|||
byte[] response = handleModbusFrame(request, length); |
|||
if (response != null && response.length > 0) { |
|||
try { |
|||
sendResponse(response); |
|||
return request[1];//返回功能码
|
|||
} catch (Exception e) { |
|||
return 0; |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
public static byte[] handleModbusFrame(byte[] frame, int length) { |
|||
if (length < 4) return null; |
|||
|
|||
byte functionCode = frame[1]; |
|||
byte[] response;// null;
|
|||
|
|||
Log.d(TAG, "Handling function code: 0x" + String.format("%02X", functionCode)); |
|||
|
|||
try { |
|||
switch (functionCode) { |
|||
case 0x01: // Read Coils
|
|||
response = handleReadCoils(frame, length); |
|||
break; |
|||
case 0x02: // Read Discrete Inputs
|
|||
response = handleReadDiscreteInputs(frame, length); |
|||
break; |
|||
case 0x03: // Read Holding Registers
|
|||
response = handleReadHoldingRegisters(frame, length); |
|||
break; |
|||
case 0x04: // Read Input Registers
|
|||
response = handleReadInputRegisters(frame, length); |
|||
break; |
|||
case 0x05: // Write Single Coil
|
|||
response = handleWriteSingleCoil(frame, length); |
|||
break; |
|||
case 0x06: // Write Single Register
|
|||
response = handleWriteSingleRegister(frame, length); |
|||
break; |
|||
case 0x0F: // Write Multiple Coils
|
|||
response = handleWriteMultipleCoils(frame, length); |
|||
break; |
|||
case 0x10: // Write Multiple Registers
|
|||
response = handleWriteMultipleRegisters(frame, length); |
|||
break; |
|||
default: |
|||
Log.w(TAG, "Unsupported function code: 0x" + String.format("%02X", functionCode)); |
|||
response = createExceptionResponse(functionCode, (byte) 0x01); // Illegal function
|
|||
break; |
|||
} |
|||
} catch (Exception e) { |
|||
Log.e(TAG, "Error handling Modbus request: " + e.getMessage()); |
|||
response = createExceptionResponse(functionCode, (byte) 0x04); // Slave device failure
|
|||
} |
|||
|
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleWriteMultipleRegisters(byte[] request, int length) { |
|||
int startAddress = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
int quantity = ((request[4] & 0xFF) << 8) | (request[5] & 0xFF); |
|||
int byteCount = request[6] & 0xFF; |
|||
|
|||
Log.d(TAG, "Write Multiple Registers - Start: " + startAddress + ", Quantity: " + quantity); |
|||
|
|||
if (quantity < 1 || quantity > 123) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
if (startAddress + quantity > holdingRegisters.length) { |
|||
return createExceptionResponse(request[1], (byte) 0x02); |
|||
} |
|||
|
|||
if (byteCount != quantity * 2) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
// 解析并写入寄存器数据
|
|||
for (int i = 0; i < quantity; i++) { |
|||
int dataIndex = 7 + i * 2; |
|||
short value = (short) (((request[dataIndex] & 0xFF) << 8) | (request[dataIndex + 1] & 0xFF)); |
|||
|
|||
int registerAddress = startAddress + i; |
|||
holdingRegisters[registerAddress] = value; |
|||
|
|||
} |
|||
|
|||
byte[] response = createWriteMultipleResponse(request[1], startAddress, quantity); |
|||
Log.d(TAG, "Wrote " + quantity + " registers from address " + startAddress); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleWriteMultipleCoils(byte[] request, int length) { |
|||
int startAddress = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
int quantity = ((request[4] & 0xFF) << 8) | (request[5] & 0xFF); |
|||
int byteCount = request[6] & 0xFF; |
|||
|
|||
Log.d(TAG, "Write Multiple Coils - Start: " + startAddress + ", Quantity: " + quantity); |
|||
|
|||
if (quantity < 1 || quantity > 1968) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
if (startAddress + quantity > coils.length) { |
|||
return createExceptionResponse(request[1], (byte) 0x02); |
|||
} |
|||
|
|||
int expectedByteCount = (quantity + 7) / 8; |
|||
if (byteCount != expectedByteCount) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
// 解析并写入线圈数据
|
|||
for (int i = 0; i < quantity; i++) { |
|||
int byteIndex = 7 + (i / 8); |
|||
int bitIndex = i % 8; |
|||
boolean value = ((request[byteIndex] >> bitIndex) & 0x01) == 0x01; |
|||
|
|||
int coilAddress = startAddress + i; |
|||
coils[coilAddress] = value; |
|||
|
|||
} |
|||
|
|||
byte[] response = createWriteMultipleResponse(request[1], startAddress, quantity); |
|||
Log.d(TAG, "Wrote " + quantity + " coils from address " + startAddress); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] createWriteMultipleResponse(byte functionCode, int startAddress, int quantity) { |
|||
byte[] response = new byte[8]; |
|||
|
|||
response[0] = (byte) slaveId; |
|||
response[1] = functionCode; |
|||
response[2] = (byte) (startAddress >> 8); |
|||
response[3] = (byte) (startAddress & 0xFF); |
|||
response[4] = (byte) (quantity >> 8); |
|||
response[5] = (byte) (quantity & 0xFF); |
|||
|
|||
addCrc(response); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] createExceptionResponse(byte functionCode, byte exceptionCode) { |
|||
byte[] response = new byte[5]; |
|||
response[0] = (byte) slaveId; |
|||
response[1] = (byte) (functionCode | 0x80); |
|||
response[2] = exceptionCode; |
|||
addCrc(response); |
|||
|
|||
Log.w(TAG, "Exception response - Function: 0x" + String.format("%02X", functionCode) + |
|||
", Code: " + exceptionCode); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleReadDiscreteInputs(byte[] request, int length) { |
|||
int startAddress = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
int quantity = ((request[4] & 0xFF) << 8) | (request[5] & 0xFF); |
|||
|
|||
Log.d(TAG, "Read Discrete Inputs - Start: " + startAddress + ", Quantity: " + quantity); |
|||
|
|||
if (quantity < 1 || quantity > 2000) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
if (startAddress + quantity > discreteInputs.length) { |
|||
return createExceptionResponse(request[1], (byte) 0x02); |
|||
} |
|||
|
|||
// 读离散输入响应结构:
|
|||
// [slaveId] + [function] + [byteCount] + [data] + [CRC]
|
|||
// 1字节 + 1字节 + 1字节 + N字节 + 2字节
|
|||
|
|||
|
|||
int byteCount = (quantity + 7) / 8; |
|||
byte[] response = new byte[3 + byteCount + 2]; |
|||
response[0] = (byte) slaveId; |
|||
response[1] = request[1]; |
|||
response[2] = (byte) byteCount; |
|||
|
|||
for (int i = 0; i < quantity; i++) { |
|||
if (discreteInputs[startAddress + i]) { |
|||
response[3 + i / 8] |= (1 << (i % 8)); |
|||
} |
|||
} |
|||
|
|||
addCrc(response); |
|||
Log.d(TAG, "Read " + quantity + " discrete inputs from address " + startAddress); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleReadInputRegisters(byte[] request, int length) { |
|||
int startAddress = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
int quantity = ((request[4] & 0xFF) << 8) | (request[5] & 0xFF); |
|||
|
|||
Log.d(TAG, "Read Input Registers - Start: " + startAddress + ", Quantity: " + quantity); |
|||
|
|||
if (quantity < 1 || quantity > 125) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
if (startAddress + quantity > inputRegisters.length) { |
|||
return createExceptionResponse(request[1], (byte) 0x02); |
|||
} |
|||
// 读输入寄存器响应结构:
|
|||
// [slaveId] + [function] + [byteCount] + [data] + [CRC]
|
|||
// 1字节 + 1字节 + 1字节 + (quantity × 2) + 2字节
|
|||
|
|||
byte[] response = new byte[3 + quantity * 2 + 2]; |
|||
response[0] = (byte) slaveId; |
|||
response[1] = request[1]; |
|||
response[2] = (byte) (quantity * 2); |
|||
|
|||
for (int i = 0; i < quantity; i++) { |
|||
short value = inputRegisters[startAddress + i]; |
|||
response[3 + i * 2] = (byte) (value >> 8); |
|||
response[3 + i * 2 + 1] = (byte) value; |
|||
} |
|||
|
|||
addCrc(response); |
|||
Log.d(TAG, "Read " + quantity + " input registers from address " + startAddress); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleReadHoldingRegisters(byte[] request, int length) { |
|||
int startAddress = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
int quantity = ((request[4] & 0xFF) << 8) | (request[5] & 0xFF); |
|||
|
|||
Log.d(TAG, "Read Holding Registers - Start: " + startAddress + ", Quantity: " + quantity); |
|||
|
|||
// 验证参数
|
|||
if (quantity < 1 || quantity > 125) { |
|||
Log.w(TAG, "Invalid quantity: " + quantity); |
|||
return createExceptionResponse(request[1], (byte) 0x03); // Illegal data value
|
|||
} |
|||
|
|||
if (startAddress + quantity > holdingRegisters.length) { |
|||
Log.w(TAG, "Address out of range: " + startAddress); |
|||
return createExceptionResponse(request[1], (byte) 0x02); // Illegal data address
|
|||
} |
|||
|
|||
// 读保持寄存器响应数据结构:
|
|||
// [slaveId] + [function] + [byteCount] + [data] + [CRC]
|
|||
// 1字节 + 1字节 + 1字节 + (quantity × 2) + 2字节
|
|||
byte[] response = new byte[1 + 1 + 1 + quantity * 2 + 2]; // slaveId + function + byteCount + data + CRC
|
|||
response[0] = (byte) slaveId; |
|||
response[1] = request[1]; // Function code
|
|||
response[2] = (byte) (quantity * 2); // Byte count
|
|||
|
|||
// 填充寄存器数据
|
|||
for (int i = 0; i < quantity; i++) { |
|||
short value = holdingRegisters[startAddress + i]; |
|||
response[3 + i * 2] = (byte) (value >> 8); |
|||
response[3 + i * 2 + 1] = (byte) value; |
|||
} |
|||
|
|||
// 添加CRC
|
|||
addCrc(response); |
|||
|
|||
Log.d(TAG, "Read " + quantity + " holding registers from address " + startAddress); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleWriteSingleRegister(byte[] request, int length) { |
|||
int address = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
short value = (short) (((request[4] & 0xFF) << 8) | (request[5] & 0xFF)); |
|||
|
|||
Log.d(TAG, "Write Single Register - Address: " + address + ", Value: " + value); |
|||
|
|||
if (address >= holdingRegisters.length) { |
|||
Log.w(TAG, "Register address out of range: " + address); |
|||
return createExceptionResponse(request[1], (byte) 0x02); // Illegal data address
|
|||
} |
|||
|
|||
// 更新寄存器值
|
|||
holdingRegisters[address] = value; |
|||
|
|||
|
|||
// 写单个寄存器响应结构:
|
|||
// [slaveId] + [function] + [address] + [value] + [CRC]
|
|||
// 1字节 + 1字节 + 2字节 + 2字节 + 2字节
|
|||
byte[] response = new byte[8]; |
|||
System.arraycopy(request, 0, response, 0, 6); |
|||
response[0] = (byte) slaveId; |
|||
addCrc(response); |
|||
|
|||
|
|||
Log.d(TAG, "Register " + address + " updated to: " + value); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleReadCoils(byte[] request, int length) { |
|||
int startAddress = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
int quantity = ((request[4] & 0xFF) << 8) | (request[5] & 0xFF); |
|||
|
|||
Log.d(TAG, "Read Coils - Start: " + startAddress + ", Quantity: " + quantity); |
|||
|
|||
if (quantity < 1 || quantity > 2000) { |
|||
return createExceptionResponse(request[1], (byte) 0x03); |
|||
} |
|||
|
|||
if (startAddress + quantity > coils.length) { |
|||
return createExceptionResponse(request[1], (byte) 0x02); |
|||
} |
|||
|
|||
// 读线圈响应结构:
|
|||
// [slaveId] + [function] + [byteCount] + [data] + [CRC]
|
|||
// 1字节 + 1字节 + 1字节 + N字节 + 2字节
|
|||
|
|||
// 数据字节数计算:N = ceil(quantity / 8)
|
|||
// int byteCount = (quantity + 7) / 8; // 向上取整
|
|||
// int totalBytes = 1 + 1 + 1 + byteCount + 2; // 5 + byteCount
|
|||
|
|||
|
|||
int byteCount = (quantity + 7) / 8; |
|||
byte[] response = new byte[3 + byteCount + 2]; // slaveId + function + byteCount + data + CRC
|
|||
response[0] = (byte) slaveId; |
|||
response[1] = request[1]; |
|||
response[2] = (byte) byteCount; |
|||
|
|||
// 打包线圈状态到字节
|
|||
for (int i = 0; i < quantity; i++) { |
|||
if (coils[startAddress + i]) { |
|||
response[3 + i / 8] |= (1 << (i % 8)); |
|||
} |
|||
} |
|||
|
|||
addCrc(response); |
|||
return response; |
|||
} |
|||
|
|||
public static byte[] handleWriteSingleCoil(byte[] request, int length) { |
|||
int address = ((request[2] & 0xFF) << 8) | (request[3] & 0xFF); |
|||
boolean value = (request[4] & 0xFF) == 0xFF; |
|||
|
|||
Log.d(TAG, "Write Single Coil - Address: " + address + ", Value: " + value); |
|||
|
|||
if (address >= coils.length) { |
|||
return createExceptionResponse(request[1], (byte) 0x02); |
|||
} |
|||
|
|||
coils[address] = value; |
|||
|
|||
|
|||
// 写单个线圈响应结构:
|
|||
// [slaveId] + [function] + [address] + [value] + [CRC]
|
|||
// 1字节 + 1字节 + 2字节 + 2字节 + 2字节 固定 8 字节 byte[] response = new byte[1 + 1 + 2 + 2 + 2]; //
|
|||
|
|||
byte[] response = new byte[8]; |
|||
System.arraycopy(request, 0, response, 0, 6); |
|||
response[0] = (byte) slaveId; |
|||
addCrc(response); |
|||
|
|||
Log.d(TAG, "Coil " + address + " updated to: " + value); |
|||
return response; |
|||
} |
|||
|
|||
public static boolean validateCrc(byte[] data, int length) { |
|||
if (length < 2) return false; |
|||
|
|||
int calculatedCrc = calculateCrc(data, 0, length - 2); |
|||
int receivedCrc = (data[length - 1] & 0xFF) << 8 | (data[length - 2] & 0xFF); |
|||
|
|||
boolean valid = calculatedCrc == receivedCrc; |
|||
if (!valid) { |
|||
Log.w(TAG, "CRC mismatch - Calculated: " + calculatedCrc + ", Received: " + receivedCrc); |
|||
} |
|||
|
|||
return valid; |
|||
} |
|||
|
|||
public static void addCrc(byte[] data) { |
|||
int crc = calculateCrc(data, 0, data.length - 2); |
|||
data[data.length - 2] = (byte) (crc & 0xFF); |
|||
data[data.length - 1] = (byte) ((crc >> 8) & 0xFF); |
|||
} |
|||
|
|||
public static int calculateCrc(byte[] data, int start, int length) { |
|||
int crc = 0xFFFF; |
|||
for (int i = start; i < start + length; i++) { |
|||
crc ^= (data[i] & 0xFF); |
|||
for (int j = 0; j < 8; j++) { |
|||
if ((crc & 0x0001) != 0) { |
|||
crc >>= 1; |
|||
crc ^= 0xA001; |
|||
} else { |
|||
crc >>= 1; |
|||
} |
|||
} |
|||
} |
|||
return crc; |
|||
} |
|||
|
|||
public static void sendResponse(byte[] response) { |
|||
if (_serialPortHelper == null) { |
|||
return; |
|||
} |
|||
_serialPortHelper.SendData(response); |
|||
Log.d(TAG, "Sent response: " + response.length + " bytes"); |
|||
} |
|||
|
|||
// 公共API方法
|
|||
public static void updateHoldingRegister(int address, short value) { |
|||
if (address >= 0 && address < holdingRegisters.length) { |
|||
holdingRegisters[address] = value; |
|||
} |
|||
} |
|||
|
|||
public static short getHoldingRegister(int address) { |
|||
if (address >= 0 && address < holdingRegisters.length) { |
|||
return holdingRegisters[address]; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
public static void updateCoil(int address, boolean state) { |
|||
if (address >= 0 && address < coils.length) { |
|||
coils[address] = state; |
|||
|
|||
} |
|||
} |
|||
|
|||
public static boolean getCoil(int address) { |
|||
if (address >= 0 && address < coils.length) { |
|||
return coils[address]; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,210 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.annotation.SuppressLint; |
|||
import android.content.ContentValues; |
|||
import android.content.Context; |
|||
import android.database.Cursor; |
|||
import android.database.SQLException; |
|||
import android.database.sqlite.SQLiteDatabase;//具体进行数据库、数据表的一个操作
|
|||
import android.database.sqlite.SQLiteOpenHelper;//用来创建数据库和对数据库进行版本管理
|
|||
import android.util.Log; |
|||
|
|||
import androidx.annotation.Nullable; |
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.models.DisplayPV; |
|||
import com.example.roughapp2_0bbwiredrpm.models.ErrorModel; |
|||
|
|||
import java.text.SimpleDateFormat; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.Date; |
|||
import java.util.TimeZone; |
|||
|
|||
public class MyDataHelper extends SQLiteOpenHelper { |
|||
public static final String COLUMN_ID = "id"; |
|||
public static final String TABLE_NAME_ROUGH = "rough"; |
|||
|
|||
public static final String COLUMN_PRESS_SET = "pressSet";//Maintv_PressTo32 压力设定
|
|||
|
|||
public static final String COLUMN_HORIZONTAL_DISTANCE = "horizontalDistance";/*横向距离*/ |
|||
public static final String COLUMN_VERTICAL_DISTANCE = "verticalDistance"; /*纵向距离*/ |
|||
public static final String COLUMN_LEFT_COMPENSATION = "leftCompensation"; /*左补偿*/ |
|||
public static final String COLUMN_RIGHT_COMPENSATION = "rightCompensation"; /*右补偿*/ |
|||
public static final String COLUMN_VERTICAL_ADJUST = "verticalAdjust";//Maintv_VerticalAdjustTo32 竖直微调
|
|||
public static final String COLUMN_LANE_CHANGE_DISTANCE = "laneChangeDistance";//换道距离
|
|||
public static final String Error_TABLE_NAME_ROUGH = "error"; |
|||
public static final String Error_COLUMN_TimeStamp = "timeID"; |
|||
public static final String Error_COLUMN_ERROR_INFO = "errorInfo"; |
|||
|
|||
List<ErrorModel> robotErrorList = new ArrayList<>() ; |
|||
|
|||
public MyDataHelper(@Nullable Context context) { |
|||
super(context, "bingbot.db", null, 22); |
|||
} |
|||
|
|||
@SuppressLint("SQLiteString") |
|||
@Override |
|||
public void onCreate(SQLiteDatabase db) { |
|||
|
|||
String sql = "CREATE TABLE " + TABLE_NAME_ROUGH + " (" + |
|||
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + |
|||
COLUMN_LEFT_COMPENSATION + " DOUBLE, " + |
|||
COLUMN_RIGHT_COMPENSATION + " DOUBLE, " + |
|||
COLUMN_HORIZONTAL_DISTANCE + " DOUBLE, " + |
|||
COLUMN_VERTICAL_DISTANCE + " DOUBLE, " + |
|||
COLUMN_VERTICAL_ADJUST + " DOUBLE, " + |
|||
COLUMN_PRESS_SET + " INTEGER, " + |
|||
COLUMN_LANE_CHANGE_DISTANCE + " INTEGER);" ; |
|||
db.execSQL(sql); //执行sql语句 拉毛表
|
|||
|
|||
|
|||
// (int id, int leftCompSelect, int rightCompSelect, int speedSelect, int laneChangeSelect, int endForceValue)
|
|||
|
|||
sql = "CREATE TABLE " + Error_TABLE_NAME_ROUGH + "(" + Error_COLUMN_TimeStamp + " INTEGER PRIMARY KEY ," + |
|||
Error_COLUMN_ERROR_INFO + " STRING " + ")"; |
|||
db.execSQL(sql); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { |
|||
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_ROUGH); |
|||
db.execSQL("DROP TABLE IF EXISTS " + Error_TABLE_NAME_ROUGH); |
|||
onCreate(db); |
|||
} |
|||
|
|||
//增 删 改 查
|
|||
public String addOrUpdateDisplayDataRough(DisplayPV pv) { |
|||
ContentValues cv = new ContentValues(); //键值对的类
|
|||
cv.put(COLUMN_ID, pv.getId()); |
|||
cv.put(COLUMN_LANE_CHANGE_DISTANCE, pv.getLaneChangeDistance()); |
|||
cv.put(COLUMN_HORIZONTAL_DISTANCE, pv.getHorizontalDistance()); |
|||
cv.put(COLUMN_VERTICAL_DISTANCE, pv.getVerticalDistance()); |
|||
cv.put(COLUMN_VERTICAL_ADJUST, pv.getVerticalAdjust()); |
|||
|
|||
cv.put(COLUMN_LEFT_COMPENSATION, pv.getLeftCompensation()); |
|||
cv.put(COLUMN_RIGHT_COMPENSATION, pv.getRightCompensation()); |
|||
cv.put(COLUMN_PRESS_SET, pv.getPressSet()); |
|||
|
|||
|
|||
|
|||
SQLiteDatabase sqliteDatabase = this.getWritableDatabase();//获取数据库实例以实现增上查改等,如果没有就新建 并把sqliteDatabase作为参数传给oncreate方法
|
|||
long insert = sqliteDatabase.insertWithOnConflict(TABLE_NAME_ROUGH, null, cv, SQLiteDatabase.CONFLICT_REPLACE); |
|||
sqliteDatabase.close(); |
|||
if (insert == -1) { |
|||
return "failed"; |
|||
} |
|||
return "success"; |
|||
} |
|||
|
|||
|
|||
|
|||
public void IntializeDataBaseRough() { |
|||
|
|||
for (int i = 1; i < 6; i++) { |
|||
List<DisplayPV> list = getDisplayDataRough(i); //从数据库中读
|
|||
if (list.size() == 0) { |
|||
DisplayPV pv = new DisplayPV(i, 0, 0, 0, 0, 0, 0,0); |
|||
addOrUpdateDisplayDataRough(pv);//一行一行添加
|
|||
} |
|||
} |
|||
} |
|||
|
|||
public List<DisplayPV> getDisplayDataRough(int id) { //初始化
|
|||
List<DisplayPV> list = new ArrayList<>(); |
|||
String sql = "SELECT * FROM " + TABLE_NAME_ROUGH + " WHERE " + COLUMN_ID + " = " + String.valueOf(id); |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();//获取可写数据库实例
|
|||
Cursor cursor = sqLiteDatabase.rawQuery(sql, null); //按id查询
|
|||
|
|||
int idIndex = cursor.getColumnIndex(COLUMN_ID); |
|||
int _laneChangeDistanceIndex = cursor.getColumnIndex(COLUMN_LANE_CHANGE_DISTANCE); |
|||
int _verticalAdjustIndex = cursor.getColumnIndex(COLUMN_VERTICAL_ADJUST); |
|||
int _pressSetIndex = cursor.getColumnIndex(COLUMN_PRESS_SET); |
|||
int _leftCompensationIndex=cursor.getColumnIndex(COLUMN_LEFT_COMPENSATION); |
|||
int _rightCompensationIndex=cursor.getColumnIndex(COLUMN_RIGHT_COMPENSATION); |
|||
int _horizontalDistanceIndex=cursor.getColumnIndex(COLUMN_HORIZONTAL_DISTANCE); |
|||
int _verticalDistanceIndex=cursor.getColumnIndex(COLUMN_VERTICAL_DISTANCE); |
|||
|
|||
while (cursor.moveToNext()) { |
|||
|
|||
DisplayPV pv = new DisplayPV(cursor.getInt(idIndex), cursor.getInt(_laneChangeDistanceIndex), |
|||
cursor.getDouble(_horizontalDistanceIndex), cursor.getDouble(_verticalDistanceIndex), cursor.getDouble(_verticalAdjustIndex),cursor.getDouble(_leftCompensationIndex), cursor.getDouble(_rightCompensationIndex), |
|||
cursor.getInt(_pressSetIndex) |
|||
); |
|||
|
|||
list.add(pv); |
|||
} |
|||
cursor.close(); |
|||
sqLiteDatabase.close(); |
|||
return list; |
|||
|
|||
} |
|||
public String AddOrUpdateErrorModelRough(ErrorModel em) { |
|||
ContentValues cv = new ContentValues(); |
|||
cv.put(Error_COLUMN_TimeStamp, em.getTimeID()); |
|||
cv.put(Error_COLUMN_ERROR_INFO, em.getErrorInfo()); |
|||
|
|||
|
|||
SQLiteDatabase sqliteDatabase = this.getWritableDatabase(); |
|||
long insert = sqliteDatabase.insertWithOnConflict(Error_TABLE_NAME_ROUGH, null, cv, SQLiteDatabase.CONFLICT_REPLACE); |
|||
|
|||
if (insert == -1) { |
|||
// 插入失败,按时间戳删除最早的100行
|
|||
try { |
|||
// 开始事务
|
|||
sqliteDatabase.beginTransaction(); |
|||
|
|||
String deleteQuery = "DELETE FROM error WHERE timeID IN (SELECT timeID FROM error ORDER BY timeID ASC LIMIT 100)"; |
|||
sqliteDatabase.execSQL(deleteQuery); |
|||
// 标记事务成功
|
|||
sqliteDatabase.setTransactionSuccessful(); |
|||
|
|||
Log.d("DB_OPERATION", "插入失败,已按时间戳删除最早的100行数据"); |
|||
} catch (SQLException e) { |
|||
Log.e("DB_ERROR", "删除时发生错误: " + e.getMessage()); |
|||
} finally { |
|||
// 结束事务(若setTransactionSuccessful()被调用则提交,否则回滚)
|
|||
sqliteDatabase.endTransaction(); |
|||
} |
|||
sqliteDatabase.close(); |
|||
return "failed"; |
|||
} |
|||
sqliteDatabase.close(); |
|||
return "success"; |
|||
} |
|||
|
|||
public List<ErrorModel> GetAllErrorModels() { |
|||
List<ErrorModel> list = new ArrayList<>(); |
|||
|
|||
String sql = "SELECT * FROM " + Error_TABLE_NAME_ROUGH; |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); |
|||
Cursor cursor = sqLiteDatabase.rawQuery(sql, null); |
|||
|
|||
|
|||
|
|||
int _time_id_Index = cursor.getColumnIndex(Error_COLUMN_TimeStamp); |
|||
int _error_Index = cursor.getColumnIndex(Error_COLUMN_ERROR_INFO); |
|||
|
|||
while (cursor.moveToNext()) { |
|||
|
|||
ErrorModel em = new ErrorModel(cursor.getLong(_time_id_Index),cursor.getString(_error_Index)); |
|||
|
|||
Date date = new Date(em.getTimeID()); // 将时间戳转换为Date对象
|
|||
// 创建SimpleDateFormat实例,并设置时区为UTC
|
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置为UTC时区
|
|||
// 格式化日期
|
|||
String utcTime = sdf.format(date); |
|||
// System.out.println("UTC时间: " + utcTime);
|
|||
em.setDateTimeBJ(utcTime); |
|||
|
|||
list.add(em); |
|||
} |
|||
cursor.close(); |
|||
sqLiteDatabase.close(); |
|||
return list; |
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,104 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
public class PVModify { |
|||
|
|||
public static void HandlePVDataRough(com.example.roughapp2_0bbwiredrpm.MainActivity roughActivity) { |
|||
|
|||
|
|||
String ChangeLaneDistanceStr = roughActivity.mainBinding.roughEditLaneChangeDistanceTo32.getText().toString(); |
|||
String PressStr = roughActivity.mainBinding.roughEditPressTo32.getText().toString(); |
|||
String VeticalAdjustStr = roughActivity.mainBinding.roughEditVerticalAdjustTo32.getText().toString(); |
|||
String DMKSpeedStr = roughActivity.mainBinding.DMKSpeedTo32.getText().toString(); |
|||
|
|||
//前端转速
|
|||
try{ |
|||
if (DMKSpeedStr.isEmpty()) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setDmkSpeed(0).build(); |
|||
} else { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder() |
|||
.setDmkSpeed((Integer.parseInt(String.valueOf(roughActivity.mainBinding.DMKSpeedTo32.getText())))).build(); |
|||
} |
|||
} catch (Exception e) { |
|||
//
|
|||
} |
|||
|
|||
//换道距离
|
|||
try{ |
|||
if (ChangeLaneDistanceStr.isEmpty()) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setLaneChangeDistance(1).build(); |
|||
} else { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder() |
|||
.setLaneChangeDistance((Integer.parseInt(String.valueOf(roughActivity.mainBinding.roughEditLaneChangeDistanceTo32.getText())))).build(); |
|||
} |
|||
} catch (Exception e) { |
|||
//
|
|||
} |
|||
|
|||
|
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setVerticalDistanceMeters(Double.parseDouble(roughActivity.VerticalDistance)).build(); //作业长度
|
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setHorizontalDistanceMeters(Double.parseDouble(roughActivity.HorizontalDistance)).build(); //作业宽度
|
|||
|
|||
try { |
|||
//压力设定
|
|||
if (PressStr.isEmpty()) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setPressSet(1).build(); |
|||
} else { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder() |
|||
.setPressSet((Integer.parseInt(String.valueOf(roughActivity.mainBinding.roughEditPressTo32.getText())))).build(); |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
} |
|||
|
|||
//竖直微调--小数 *10
|
|||
try { |
|||
|
|||
if (VeticalAdjustStr.isEmpty()) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setVerticalCalibration(0).build(); |
|||
} else { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder() |
|||
.setVerticalCalibration((Double.parseDouble(String.valueOf(roughActivity.mainBinding.roughEditVerticalAdjustTo32.getText())) * 100)).build(); |
|||
|
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
} |
|||
|
|||
//自动手动模式发送
|
|||
if (roughActivity.rough_Manual_Mode_Call_Value.equals("未启用")) //手动模式未启用
|
|||
{ |
|||
//发送自动模式值
|
|||
if (roughActivity.rough_Auto_Mode_Call_Value.equals("水平")) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRunMode(5).build(); |
|||
} |
|||
|
|||
} |
|||
else if (roughActivity.rough_Auto_Mode_Call_Value.equals("未启用")) //自动模式未启用
|
|||
{ |
|||
//发送手动模式值
|
|||
if (roughActivity.rough_Manual_Mode_Call_Value.equals("无")) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRunMode(1).build(); |
|||
} else if (roughActivity.rough_Manual_Mode_Call_Value.equals("水平")) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRunMode(2).build(); |
|||
} else if (roughActivity.rough_Manual_Mode_Call_Value.equals("竖直向左")) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRunMode(3).build(); |
|||
} else if (roughActivity.rough_Manual_Mode_Call_Value.equals("竖直向右")) { |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRunMode(4).build(); |
|||
} |
|||
} |
|||
//前端转向设置
|
|||
String toolRotationDirectionDAta =roughActivity.mainBinding.mainViewToolRotationDirectionTxView.getText().toString(); |
|||
switch (toolRotationDirectionDAta) { |
|||
|
|||
case "正向": |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setToolRotationDirection(1).build(); |
|||
break; |
|||
case "反向": |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setToolRotationDirection(2).build(); |
|||
break; |
|||
} |
|||
|
|||
} |
|||
} |
|||
@ -0,0 +1,505 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.app.Dialog; |
|||
import android.text.InputFilter; |
|||
import android.text.method.ScrollingMovementMethod; |
|||
import android.view.View; |
|||
import android.widget.Button; |
|||
import android.widget.EditText; |
|||
import android.widget.RadioButton; |
|||
import android.widget.RadioGroup; |
|||
import android.widget.ScrollView; |
|||
import android.widget.TextView; |
|||
import android.widget.Toast; |
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.MainActivity; |
|||
import com.example.roughapp2_0bbwiredrpm.R; |
|||
import com.example.roughapp2_0bbwiredrpm.models.DisplayPV; |
|||
import com.example.roughapp2_0bbwiredrpm.models.ErrorModel; |
|||
import com.example.roughapp2_0bbwiredrpm.models.ScrollBottomScrollView; |
|||
|
|||
import java.util.List; |
|||
|
|||
public class PopupHelper { |
|||
|
|||
String result="1"; |
|||
|
|||
private final MainActivity mainActivity; |
|||
|
|||
public PopupHelper(MainActivity mainActivity) |
|||
{ |
|||
this.mainActivity = mainActivity; |
|||
} |
|||
|
|||
//拉毛手动模式弹窗
|
|||
public void Rough_ManualModePopup(View.OnClickListener context) { //手动模式弹窗
|
|||
Dialog dialog = new Dialog(mainActivity); |
|||
|
|||
dialog.setContentView(R.layout.rough_manualmodepopup); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button cancelButton = dialog.findViewById(R.id.manualModeCancel_Rough); |
|||
Button confirmButton = dialog.findViewById(R.id.manualModeApply_Rough); |
|||
|
|||
//获取按钮组
|
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.manualModeSelectorGroup_Rough); |
|||
|
|||
//4种模式
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
if (radioButton!=null) |
|||
{ |
|||
mainActivity.rough_Manual_Mode_Call_Value = radioButton.getText().toString(); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
//下次进来保证是选中状态或者未选中
|
|||
String ii= mainActivity.mainBinding.roughManualModeDisplay.getText().toString(); |
|||
switch (ii) |
|||
{ |
|||
case "无": { radioGroup.check(R.id.rb_one_rough); |
|||
break; |
|||
} |
|||
case "水平": { radioGroup.check(R.id.rb_two_rough); |
|||
break; |
|||
} |
|||
case "竖直向左": { radioGroup.check(R.id.rb_three_rough); |
|||
break; |
|||
} |
|||
case "竖直向右": { radioGroup.check(R.id.rb_four_rough); |
|||
break; |
|||
} |
|||
default: |
|||
radioGroup.clearCheck(); |
|||
break; |
|||
|
|||
} |
|||
|
|||
// 设置确定按钮点击事件
|
|||
confirmButton.setOnClickListener(v -> { //手动模式弹窗确认
|
|||
if (radioGroup.getCheckedRadioButtonId() != -1) { //有按钮选中时按确定 更新值
|
|||
mainActivity.mainBinding.roughManualModeDisplay.setText(mainActivity.rough_Manual_Mode_Call_Value); |
|||
//失能自动模式
|
|||
mainActivity.rough_Auto_Mode_Call_Value="未启用"; |
|||
mainActivity.mainBinding.roughAutoModeDisplay.setText("未启用"); |
|||
Toast.makeText(mainActivity, "设置成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
// 设置取消按钮点击事件
|
|||
cancelButton.setOnClickListener(v -> { |
|||
Toast.makeText(mainActivity, "点击了取消", Toast.LENGTH_SHORT).show(); |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
|
|||
// 显示弹窗
|
|||
dialog.show(); |
|||
|
|||
} |
|||
|
|||
public void AutomaticModeSetPopUp(View.OnClickListener context) { |
|||
|
|||
|
|||
|
|||
Dialog dialog = new Dialog(mainActivity); |
|||
|
|||
dialog.setContentView(R.layout.rough_automodepopup); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button cancelButton = dialog.findViewById(R.id.autoModeCancel_Rough); |
|||
Button confirmButton = dialog.findViewById(R.id.autoModeApply_Rough); |
|||
|
|||
EditText HorizontalDistance_Edit=dialog.findViewById(R.id.HorizontalDistance_input); |
|||
EditText VerticalDistance_Edit=dialog.findViewById(R.id.VerticalDistance_input); |
|||
|
|||
HorizontalDistance_Edit.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); //editext 一位小数限制
|
|||
VerticalDistance_Edit.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); //editext 一位小数限制
|
|||
|
|||
/*进入显示文本*/ |
|||
HorizontalDistance_Edit.setText(mainActivity.HorizontalDistance); |
|||
VerticalDistance_Edit.setText(mainActivity.VerticalDistance); |
|||
|
|||
|
|||
|
|||
// 设置单选按钮点击事件
|
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.autoModeSelectorGroup_Rough); |
|||
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
if(radioButton!=null){ |
|||
mainActivity.rough_Auto_Mode_Call_Value = radioButton.getText().toString(); |
|||
} |
|||
|
|||
} |
|||
}); |
|||
|
|||
String ii= mainActivity.mainBinding.roughAutoModeDisplay.getText().toString(); |
|||
switch (ii) |
|||
{ |
|||
|
|||
case "水平": { radioGroup.check(R.id.rb_autoHorizontal); |
|||
break; |
|||
} |
|||
default: |
|||
radioGroup.clearCheck();//清除选中,此时触发radioGroup事件,自动模式值被改为未启用
|
|||
break; |
|||
|
|||
} |
|||
// 设置确定按钮点击事件
|
|||
confirmButton.setOnClickListener(v -> { |
|||
|
|||
if (radioGroup.getCheckedRadioButtonId() != -1) { //有按钮选中时按确定 更新值
|
|||
mainActivity.mainBinding.roughAutoModeDisplay.setText(mainActivity.rough_Auto_Mode_Call_Value); |
|||
//失能手动模式
|
|||
mainActivity.rough_Manual_Mode_Call_Value="未启用"; |
|||
mainActivity.mainBinding.roughManualModeDisplay.setText("未启用"); |
|||
Toast.makeText(mainActivity, "设置成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
|
|||
//检查作业宽度 长度 范围
|
|||
double value1=0; double value2=0; |
|||
try { |
|||
value1=Double.parseDouble(String.valueOf(HorizontalDistance_Edit.getText())); |
|||
value2=Double.parseDouble(String.valueOf(VerticalDistance_Edit.getText())); |
|||
} |
|||
catch(Exception e) |
|||
{ |
|||
Toast.makeText(mainActivity, "输入不能为空", Toast.LENGTH_SHORT).show(); |
|||
return; |
|||
} |
|||
|
|||
if(value1>=0 && value1<=50) |
|||
{ |
|||
mainActivity.HorizontalDistance=String.valueOf(value1); |
|||
|
|||
}else{ |
|||
Toast.makeText(mainActivity, "请输入0-50的数字", Toast.LENGTH_SHORT).show(); |
|||
HorizontalDistance_Edit.setText("0.0"); |
|||
return; |
|||
} |
|||
if(value2>=0 && value2<=50) |
|||
{ |
|||
mainActivity.VerticalDistance=String.valueOf(value2); |
|||
|
|||
}else{ |
|||
Toast.makeText(mainActivity, "请输入0-50的数字", Toast.LENGTH_SHORT).show(); |
|||
VerticalDistance_Edit.setText("0.0"); |
|||
return; |
|||
} |
|||
|
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
|
|||
// 设置取消按钮点击事件
|
|||
cancelButton.setOnClickListener(v -> { |
|||
Toast.makeText(mainActivity, "点击了取消", Toast.LENGTH_SHORT).show(); |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
|
|||
/*显示弹窗*/ |
|||
dialog.show(); |
|||
} |
|||
|
|||
/*前端旋转方向*/ |
|||
public void ToolRotationDirectionPopUp(View.OnClickListener context) { |
|||
|
|||
|
|||
Dialog dialog = new Dialog(mainActivity); |
|||
|
|||
dialog.setContentView(R.layout.toolrotationdirectionpopup); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button confirmButton = dialog.findViewById(R.id.Apply); |
|||
Button cancelButton = dialog.findViewById(R.id.Cancel); |
|||
|
|||
|
|||
|
|||
// 设置取消按钮点击事件
|
|||
cancelButton.setOnClickListener(v -> { |
|||
Toast.makeText(mainActivity, "点击了取消", Toast.LENGTH_SHORT).show(); |
|||
|
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.toolRotationDirectionSelectorGroup); |
|||
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
|
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
if (radioButton!=null) |
|||
{ |
|||
mainActivity._Tool_Rotation_Direction_Value = radioButton.getText().toString(); |
|||
} |
|||
} |
|||
}); |
|||
//下次进来保证是选中状态或者未选中
|
|||
String ii= mainActivity.mainBinding.mainViewToolRotationDirectionTxView.getText().toString(); |
|||
switch (ii) |
|||
{ |
|||
|
|||
case "正向": { radioGroup.check(R.id.rb_DirPos); |
|||
break; |
|||
} |
|||
case "反向": { radioGroup.check(R.id.rb_DirNag); |
|||
break; |
|||
} |
|||
|
|||
} |
|||
// 设置确定按钮点击事件
|
|||
confirmButton.setOnClickListener(v -> { |
|||
|
|||
mainActivity.mainBinding.mainViewToolRotationDirectionTxView.setText(mainActivity._Tool_Rotation_Direction_Value); |
|||
Toast.makeText(mainActivity, "设置成功", Toast.LENGTH_SHORT).show(); |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
dialog.show(); // 显示弹窗
|
|||
|
|||
} |
|||
|
|||
public void ParametersCallPopup_Rough(View.OnClickListener context,MyDataHelper myDataHelper) { |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
dialog.setContentView(R.layout.parameters_call_rough); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button exitButton = dialog.findViewById(R.id.parametersExitRough); |
|||
Button confirmButton = dialog.findViewById(R.id.parametersApplyRough); |
|||
Button saveButton=dialog.findViewById(R.id.parametersSavebtnRough); |
|||
Button clearButton=dialog.findViewById(R.id.parametersClearBtnRough); |
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.parameters_call_group_rough); |
|||
|
|||
Integer ii= ConvertHelper.convertEditTextToInt(mainActivity.mainBinding.roughTvParameterCallTo32); |
|||
|
|||
switch (ii) |
|||
{ |
|||
case 1: { radioGroup.check(R.id.rb_paraOneRough); |
|||
break; |
|||
} |
|||
case 2: { radioGroup.check(R.id.rb_paraTwoRough); |
|||
break; |
|||
} |
|||
case 3: { radioGroup.check(R.id.rb_paraThreeRough); |
|||
break; |
|||
} |
|||
case 4: { radioGroup.check(R.id.rb_paraFourRough); |
|||
break; |
|||
} |
|||
case 5: { radioGroup.check(R.id.rb_paraFiveRough); |
|||
break; |
|||
} |
|||
default: |
|||
radioGroup.clearCheck(); |
|||
break; |
|||
} |
|||
|
|||
dialog.show(); // 显示弹窗
|
|||
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
try { |
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
result = radioButton.getText().toString(); |
|||
|
|||
} catch (Exception e) { |
|||
//**/
|
|||
} |
|||
} |
|||
}); |
|||
|
|||
//保存按钮 获取界面参数 存入数据库
|
|||
saveButton.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
int selectedId = radioGroup.getCheckedRadioButtonId(); |
|||
if (selectedId == -1) { |
|||
Toast.makeText(mainActivity, "未选中参数,无法保存", Toast.LENGTH_SHORT).show(); |
|||
return; |
|||
} |
|||
|
|||
//获取界面参数以写进数据库
|
|||
int paraIndex = Integer.parseInt(mainActivity.mainBinding.roughTvParameterCallTo32.getText().toString()); |
|||
int laneChangeDistance = Integer.parseInt(mainActivity.mainBinding.roughEditLaneChangeDistanceTo32.getText().toString()); |
|||
double verticalAdjust = Double.parseDouble(mainActivity.mainBinding.roughEditVerticalAdjustTo32.getText().toString()); |
|||
double horizontalDistance = Double.parseDouble(mainActivity.HorizontalDistance); |
|||
double verticalDistance = Double.parseDouble(mainActivity.VerticalDistance); |
|||
double leftCompensation=Double.parseDouble(mainActivity.mainBinding.roughTvLCompensationFrom32.getText().toString()); |
|||
double rightCompensation=Double.parseDouble(mainActivity.mainBinding.roughTvRCopmpensationFrom32.getText().toString()); |
|||
int pressSet=Integer.parseInt(mainActivity.mainBinding.roughEditPressTo32.getText().toString()); |
|||
//把界面中的值放进PV类的变量中
|
|||
DisplayPV displayPV = new DisplayPV(paraIndex, laneChangeDistance,horizontalDistance,verticalDistance,verticalAdjust ,leftCompensation,rightCompensation, pressSet ); |
|||
myDataHelper.addOrUpdateDisplayDataRough(displayPV); //创建数据库的实例在这里 PV传进去保存到数据库
|
|||
Toast.makeText(dialog.getContext(), "保存成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
}); |
|||
|
|||
//清除按钮 界面显示设为默认值 并存入数据库
|
|||
clearButton.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
|
|||
int selectedId = radioGroup.getCheckedRadioButtonId(); |
|||
if (selectedId == -1) { |
|||
Toast.makeText(mainActivity, "未选中参数,无法清除", Toast.LENGTH_SHORT).show(); |
|||
return; |
|||
} |
|||
|
|||
mainActivity.mainBinding.roughEditLaneChangeDistanceTo32.setText(String.valueOf(1)); |
|||
mainActivity.mainBinding.roughEditVerticalAdjustTo32.setText(String.valueOf(0)); |
|||
mainActivity.mainBinding.roughEditPressTo32.setText(String.valueOf(0)); |
|||
mainActivity.mainBinding.roughTvLCompensationFrom32.setText(String.valueOf(0)); |
|||
mainActivity.mainBinding.roughTvRCopmpensationFrom32.setText(String.valueOf(0)); |
|||
mainActivity.HorizontalDistance=String.valueOf(0); |
|||
mainActivity.VerticalDistance=String.valueOf(0); |
|||
//获取界面参数以写进数据库
|
|||
int paraIndex = Integer.parseInt(mainActivity.mainBinding.roughTvParameterCallTo32.getText().toString()); |
|||
int laneChangeDistance = Integer.parseInt(mainActivity.mainBinding.roughEditLaneChangeDistanceTo32.getText().toString()); |
|||
double verticalAdjust = Double.parseDouble(mainActivity.mainBinding.roughEditVerticalAdjustTo32.getText().toString()); |
|||
double horizontalDistance = Double.parseDouble(mainActivity.HorizontalDistance); |
|||
double verticalDistance = Double.parseDouble(mainActivity.VerticalDistance); |
|||
double leftCompensation=Double.parseDouble(mainActivity.mainBinding.roughTvLCompensationFrom32.getText().toString()); |
|||
double rightCompensation=Double.parseDouble(mainActivity.mainBinding.roughTvRCopmpensationFrom32.getText().toString()); |
|||
int pressSet=Integer.parseInt(mainActivity.mainBinding.roughEditPressTo32.getText().toString()); |
|||
|
|||
//把界面中的值放进PV类的变量中
|
|||
DisplayPV displayPV = new DisplayPV(paraIndex, laneChangeDistance,horizontalDistance,verticalDistance,verticalAdjust ,leftCompensation,rightCompensation, pressSet ); |
|||
myDataHelper.addOrUpdateDisplayDataRough(displayPV); //创建数据库的实例在这里 PV传进去保存到数据库
|
|||
Toast.makeText(dialog.getContext(), "清除成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
}); |
|||
|
|||
// 使用按钮 点击事件 //把主界面 调用值显示 改了 并从数据库中读赋值给界面
|
|||
confirmButton.setOnClickListener(v -> { |
|||
|
|||
/*未选中时设为无*/ |
|||
int selectedId = radioGroup.getCheckedRadioButtonId(); |
|||
if (selectedId == -1) { |
|||
Toast.makeText(mainActivity, "未使用预设参数", Toast.LENGTH_SHORT).show(); |
|||
mainActivity.mainBinding.roughTvParameterCallTo32.setText("无"); |
|||
return; |
|||
} |
|||
mainActivity.rough_parameters_Call_Value = result; |
|||
mainActivity.mainBinding.roughTvParameterCallTo32.setText(mainActivity.rough_parameters_Call_Value);//把主界面 调用值显示 改了
|
|||
|
|||
//读取数据
|
|||
int paraIndex = Integer.parseInt(mainActivity.rough_parameters_Call_Value); |
|||
List<DisplayPV> pvList = mainActivity.myDataHelper.getDisplayDataRough(paraIndex);//从数据库中读,,并对其他控件进行赋值
|
|||
|
|||
mainActivity.mainBinding.roughEditLaneChangeDistanceTo32.setText(String.valueOf(pvList.get(0).getLaneChangeDistance())); |
|||
mainActivity.mainBinding.roughEditVerticalAdjustTo32.setText(String.valueOf(pvList.get(0).getVerticalAdjust())); |
|||
mainActivity.HorizontalDistance=String.valueOf(pvList.get(0).getHorizontalDistance()); |
|||
mainActivity.VerticalDistance=String.valueOf(pvList.get(0).getVerticalDistance()); |
|||
mainActivity.mainBinding.roughTvLCompensationFrom32.setText(String.valueOf(pvList.get(0).getLeftCompensation())); |
|||
mainActivity.mainBinding.roughTvRCopmpensationFrom32.setText(String.valueOf(pvList.get(0).getRightCompensation())); |
|||
mainActivity.mainBinding.roughEditPressTo32.setText(String.valueOf(pvList.get(0).getPressSet())); |
|||
//读取数据库,并对其他控件进行赋值
|
|||
Toast.makeText(dialog.getContext(), "调用成功", Toast.LENGTH_SHORT).show(); |
|||
|
|||
|
|||
}); |
|||
|
|||
|
|||
|
|||
// 退出按钮点击事件
|
|||
exitButton.setOnClickListener(v -> { |
|||
Toast.makeText(dialog.getContext(), "点击了退出", Toast.LENGTH_SHORT).show(); |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
} |
|||
|
|||
public void RobotErrorListPopUp(View.OnClickListener context) { |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
dialog.setContentView(R.layout.log_item_rough); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
TextView LogText = dialog.findViewById(R.id.popUpErrorLogTextView); |
|||
ScrollBottomScrollView LogScrollView = dialog.findViewById(R.id.popUpErrorLogScrollview); |
|||
List<ErrorModel> list = mainActivity.myDataHelper.GetAllErrorModels(); |
|||
LogText.setMovementMethod(ScrollingMovementMethod.getInstance()); |
|||
|
|||
final int[] firstDisplay = {1}; |
|||
final int[] display = {2}; |
|||
final int[] displayOver = {0}; |
|||
int displayNum = 25; |
|||
LogScrollView.post(new Runnable() { |
|||
@Override |
|||
public void run() { |
|||
if(firstDisplay[0] == 1){ |
|||
//滑动顶部
|
|||
LogScrollView.fullScroll(ScrollView.FOCUS_UP); |
|||
firstDisplay[0] = 0; |
|||
} |
|||
} |
|||
}); |
|||
|
|||
LogScrollView.onScrollViewScrollToBottom(new ScrollBottomScrollView.OnScrollBottomListener() { |
|||
@Override |
|||
public void scrollToBottom() { |
|||
//请求数据
|
|||
if (!list.isEmpty()) { |
|||
if(list.size()>displayNum * display[0]) { |
|||
for(int i = list.size() - displayNum * (display[0]-1); i-- > list.size() - displayNum * display[0];){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
} |
|||
display[0] ++; |
|||
} |
|||
else{ |
|||
if(displayOver[0]==0){ |
|||
for(int i = list.size() - displayNum * (display[0]-1); i-- > 0;){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
displayOver[0]=1; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}}); |
|||
|
|||
if (!list.isEmpty()) { |
|||
|
|||
if(list.size() > displayNum) { |
|||
|
|||
for(int i = list.size(); i-- > list.size() - displayNum;){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
} |
|||
} |
|||
else{ |
|||
for(int i = list.size(); i-- > 0;){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
} |
|||
} |
|||
|
|||
} |
|||
// String list3 = mainActivity.myDataHelper.DeleteAllErrorModels();
|
|||
|
|||
dialog.show(); // 显示弹窗
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,254 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import static com.example.roughapp2_0bbwiredrpm.MainActivity.AndroidMCUCommunicationMethod; |
|||
import static com.example.roughapp2_0bbwiredrpm.services.ErrorDeocdeHelper.ErrorDeocde; |
|||
|
|||
import android.annotation.SuppressLint; |
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.R; |
|||
import com.example.roughapp2_0bbwiredrpm.models.BspIV; |
|||
import com.example.roughapp2_0bbwiredrpm.models.ErrorModel; |
|||
import com.google.protobuf.InvalidProtocolBufferException; |
|||
|
|||
import java.util.Objects; |
|||
|
|||
public class ReceiivedIVHandler { |
|||
static String errorLastPaint = ""; |
|||
static String errorLastRough = ""; |
|||
static int Rough_485Flag = 0; //屏蔽有线485错误
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static BspIV.IV_struct_define _toReceiveIV = BspIV.IV_struct_define.newBuilder().build();//上一次有效数据
|
|||
public static BspIV.IV_struct_define _toReceiveIV_Temp = BspIV.IV_struct_define.newBuilder().build();//最新数据
|
|||
|
|||
|
|||
|
|||
public static void HandleData(com.example.roughapp2_0bbwiredrpm.MainActivity mainActivity, 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));
|
|||
|
|||
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); |
|||
try { |
|||
_toReceiveIV_Temp = BspIV.IV_struct_define.parseFrom(bytes);//单片机新数据到来
|
|||
HandleIVRough(mainActivity, _toReceiveIV_Temp); |
|||
} catch (InvalidProtocolBufferException ex) { |
|||
} |
|||
} else { |
|||
|
|||
} |
|||
} else { |
|||
//status("crc failed");
|
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
@SuppressLint("DefaultLocale") |
|||
public static void HandleIVRough(com.example.roughapp2_0bbwiredrpm.MainActivity roughActivity, BspIV.IV_struct_define _toReceiveIV_Temp) { |
|||
try { |
|||
|
|||
if (_toReceiveIV_Temp != null) { |
|||
//若单片机重启,则变量时间戳重置
|
|||
if (_toReceiveIV_Temp.getRobotRestart() == 1) { |
|||
_toReceiveIV = _toReceiveIV.toBuilder().setTimeStamp(0).build(); |
|||
//告知单片机接收到
|
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRobotRestartAccepted(1).build(); |
|||
return; |
|||
} |
|||
roughActivity._toSendPV = roughActivity._toSendPV.toBuilder().setRobotRestartAccepted(0).build(); |
|||
|
|||
//新数据的时间大于上次时间 将新数据赋值给上次数据
|
|||
if (_toReceiveIV_Temp.getTimeStamp() >= _toReceiveIV.getTimeStamp()) { |
|||
_toReceiveIV = _toReceiveIV_Temp; |
|||
} |
|||
} |
|||
|
|||
if (_toReceiveIV != null) { |
|||
|
|||
roughActivity.runOnUiThread(() -> { |
|||
roughActivity.mainBinding.roughTvSpeedFrom32.setText(String.format("%.1f", _toReceiveIV.getRobotMoveSpeed())); |
|||
roughActivity.mainBinding.roughTvCurrentSpeedFrom32.setText(String.format("%.1f", _toReceiveIV.getCurrentSpeed())); |
|||
roughActivity.mainBinding.roughTvLCompensationFrom32.setText(String.valueOf((double) _toReceiveIV.getLeftCompensation() / 100)); |
|||
roughActivity.mainBinding.roughTvRCopmpensationFrom32.setText(String.valueOf((double) _toReceiveIV.getRightCompensation() / 100)); |
|||
roughActivity.mainBinding.roughTvPressFrom32.setText(String.valueOf(_toReceiveIV.getPress())); |
|||
roughActivity.mainBinding.roughTvAngleFrom32.setText(String.valueOf((double) _toReceiveIV.getCurrentAngle() / 100)); |
|||
if (_toReceiveIV.getSBUSState() == 0) { |
|||
roughActivity.mainBinding.roughTvSignal.setText("断开"); |
|||
} else if (_toReceiveIV.getSBUSState() == 1) { |
|||
roughActivity.mainBinding.roughTvSignal.setText("已连接"); |
|||
} |
|||
|
|||
/******************************硬件错误*****************************/ |
|||
int errorInt = _toReceiveIV.getSystemError();//硬件错误
|
|||
String errorString2 = ErrorDeocde(errorInt); //未复位 null
|
|||
String errorString = " # " + unsignedIntToBinaryWithSeparator(errorInt); |
|||
errorString += " " + toHex4Digits(_toReceiveIV.getLeftMotorErr()); |
|||
errorString += " " + toHex4Digits(_toReceiveIV.getRightMotorErr()); |
|||
|
|||
if ( AndroidMCUCommunicationMethod == CommunicationMethond.Wireless &&errorInt==64 |
|||
&&_toReceiveIV.getLeftMotorErr() == 0 && _toReceiveIV.getRightMotorErr() == 0) |
|||
{ |
|||
//Rough_485Flag=1;
|
|||
// errorLastRough = errorString;
|
|||
roughActivity.mainBinding.mainViewErrMessageTxView.setText("无"); |
|||
roughActivity.mainBinding.messageRounded.setBackgroundResource(R.drawable.orange_rounded_rectangle); |
|||
} |
|||
|
|||
if (errorInt != 0 || _toReceiveIV.getLeftMotorErr() != 0 || _toReceiveIV.getRightMotorErr() != 0) { |
|||
if (!Objects.equals(errorLastRough, errorString)) { /*错误变了才显示*/ |
|||
ErrorModel em = new ErrorModel(System.currentTimeMillis(), errorString); |
|||
|
|||
roughActivity.myDataHelper.AddOrUpdateErrorModelRough(em); |
|||
|
|||
if (Objects.equals(errorString2, "未复位")) { |
|||
roughActivity.mainBinding.messageRounded.setBackgroundResource(R.drawable.message_rounded_rectangle_red); |
|||
roughActivity.mainBinding.mainViewErrMessageTxView.setText(String.valueOf(errorString2)); |
|||
} |
|||
else |
|||
{ |
|||
// if(Rough_485Flag==1)
|
|||
// {
|
|||
// return;
|
|||
// }
|
|||
roughActivity.mainBinding.mainViewErrMessageTxView.setText("有"); |
|||
roughActivity.mainBinding.messageRounded.setBackgroundResource(R.drawable.message_rounded_rectangle_red); |
|||
} |
|||
|
|||
errorLastRough = errorString;//错误码的二进制位
|
|||
} |
|||
|
|||
} |
|||
else { //无错误
|
|||
errorLastRough = errorString;//错误码的二进制位
|
|||
roughActivity.mainBinding.mainViewErrMessageTxView.setText("无"); |
|||
roughActivity.mainBinding.messageRounded.setBackgroundResource(R.drawable.orange_rounded_rectangle); |
|||
|
|||
} |
|||
if (_toReceiveIV.getIsWorking() == 1) { |
|||
|
|||
roughActivity.mainBinding.roughRightSend.setEnabled(false); |
|||
roughActivity.mainBinding.roughRightSend.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.roughSetManualModeBtn.setEnabled(false); |
|||
roughActivity.mainBinding.roughSetManualModeBtn.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.roughSetAutoModeBtn.setEnabled(false); |
|||
roughActivity.mainBinding.roughSetAutoModeBtn.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.roughEditLaneChangeDistanceTo32.setEnabled(false); |
|||
roughActivity.mainBinding.roughEditLaneChangeDistanceTo32.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.roughEditVerticalAdjustTo32.setEnabled(false); |
|||
roughActivity.mainBinding.roughEditVerticalAdjustTo32.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.roughEditPressTo32.setEnabled(false); |
|||
roughActivity.mainBinding.roughEditPressTo32.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.roughSetCallParametersBtn.setEnabled(false); |
|||
roughActivity.mainBinding.roughSetCallParametersBtn.setAlpha(0.5f); |
|||
|
|||
roughActivity.mainBinding.DMKSpeedTo32.setEnabled(false); |
|||
roughActivity.mainBinding.DMKSpeedTo32.setAlpha(0.5f); |
|||
|
|||
|
|||
} |
|||
else { |
|||
|
|||
roughActivity.mainBinding.roughRightSend.setEnabled(true); |
|||
roughActivity.mainBinding.roughRightSend.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.roughSetManualModeBtn.setEnabled(true); |
|||
roughActivity.mainBinding.roughSetManualModeBtn.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.roughSetAutoModeBtn.setEnabled(true); |
|||
roughActivity.mainBinding.roughSetAutoModeBtn.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.roughEditLaneChangeDistanceTo32.setEnabled(true); |
|||
roughActivity.mainBinding.roughEditLaneChangeDistanceTo32.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.roughEditVerticalAdjustTo32.setEnabled(true); |
|||
roughActivity.mainBinding.roughEditVerticalAdjustTo32.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.roughEditPressTo32.setEnabled(true); |
|||
roughActivity.mainBinding.roughEditPressTo32.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.roughSetCallParametersBtn.setEnabled(true); |
|||
roughActivity.mainBinding.roughSetCallParametersBtn.setAlpha(1.0f); |
|||
|
|||
roughActivity.mainBinding.DMKSpeedTo32.setEnabled(true); |
|||
roughActivity.mainBinding.DMKSpeedTo32.setAlpha(1.0f); |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
} else { //_toReceiveIV == null
|
|||
} |
|||
|
|||
} catch (Exception ex) { |
|||
} |
|||
|
|||
|
|||
} //函数头结尾
|
|||
|
|||
/* |
|||
逐位检查并构建二进制字符串 |
|||
*/ |
|||
String unsignedIntToBinary(int value) { |
|||
StringBuilder sb = new StringBuilder(32); |
|||
for (int i = 7; i >= 0; i--) { |
|||
sb.append((value & (1 << i)) == 0 ? '0' : '1'); |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
|
|||
/* |
|||
逐位检查并构建二进制字符串 每4位添加一个分隔符 |
|||
*/ |
|||
static String unsignedIntToBinaryWithSeparator(int value) { |
|||
StringBuilder sb = new StringBuilder(35); |
|||
for (int i = 11; i >= 0; i--) { |
|||
sb.append((value & (1 << i)) == 0 ? '0' : '1'); |
|||
if (i % 4 == 0 && i != 0) { |
|||
sb.append(' '); // 每4位添加一个分隔符
|
|||
} |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
|
|||
static String toHex4Digits(int value) { |
|||
char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; |
|||
int low16Bits = value & 0xFFFF; |
|||
|
|||
char[] result = new char[4]; |
|||
result[0] = hexChars[(low16Bits >> 12) & 0xF]; |
|||
result[1] = hexChars[(low16Bits >> 8) & 0xF]; |
|||
result[2] = hexChars[(low16Bits >> 4) & 0xF]; |
|||
result[3] = hexChars[low16Bits & 0xF]; |
|||
|
|||
return new String(result); |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,64 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
|
|||
import com.example.roughapp2_0bbwiredrpm.models.BspIV; |
|||
import com.example.roughapp2_0bbwiredrpm.models.BspPV; |
|||
import com.google.protobuf.InvalidProtocolBufferException; |
|||
|
|||
public class RobotDataHanlder { |
|||
|
|||
|
|||
public static void test() |
|||
{ |
|||
//byte[] data=hexToByteArray("080110830118313A04B1CBBACF");
|
|||
byte[] data=hexToByteArray("100A180A28013A32B1CBBACF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); |
|||
|
|||
|
|||
|
|||
} |
|||
public static void DeoodeDataFromRobot(byte[] data) |
|||
{ |
|||
try |
|||
{ |
|||
if(data[0]==0x55&&data[1]==0x55) |
|||
{ |
|||
if (data[2]==0x01) |
|||
{ |
|||
BspIV.IV_struct_define iv = BspIV.IV_struct_define.parseFrom(data); |
|||
}else if(data[2]==0x02) |
|||
{ |
|||
BspPV.PV_struct_define pv = BspPV.PV_struct_define.parseFrom(data); |
|||
} |
|||
} |
|||
} catch (InvalidProtocolBufferException e) |
|||
{ |
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
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); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,98 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
|
|||
|
|||
import java.io.IOException; |
|||
import java.net.DatagramPacket; |
|||
import java.net.DatagramSocket; |
|||
import java.net.InetAddress; |
|||
import java.util.logging.Handler; |
|||
|
|||
|
|||
public class UDPHelper { |
|||
|
|||
|
|||
private static com.example.roughapp2_0bbwiredrpm.MainActivity MainActivity; |
|||
private static Thread receiveThread; |
|||
private static boolean running = false; |
|||
private static DatagramSocket sendSocket; |
|||
private static DatagramSocket receiveSocket; |
|||
private static Handler handler;// = new Handler(Looper.getMainLooper());
|
|||
private static String target_ip; |
|||
private static int target_port; |
|||
private static int listening_port; |
|||
|
|||
public static void Intialize(com.example.roughapp2_0bbwiredrpm.MainActivity mainActivity, String targetip, int targetPort, int listentingPort) { |
|||
try { |
|||
MainActivity = mainActivity; |
|||
target_ip = targetip; |
|||
target_port = targetPort; |
|||
listening_port = listentingPort; |
|||
sendSocket = new DatagramSocket(10000); |
|||
//sendSocket.setBroadcast(true);
|
|||
|
|||
running = true; |
|||
receiveSocket = new DatagramSocket(listening_port); |
|||
receiveSocket.setBroadcast(true); |
|||
running = true; |
|||
|
|||
|
|||
receiveThread = new Thread(() -> { |
|||
byte[] buffer = new byte[1024]; |
|||
DatagramPacket packet = new DatagramPacket(buffer, buffer.length); |
|||
|
|||
while (running) { |
|||
try { |
|||
receiveSocket.receive(packet); |
|||
byte[] receivedArray = new byte[packet.getLength()]; |
|||
System.arraycopy( packet.getData(), 0, receivedArray, 0, receivedArray.length); |
|||
|
|||
ReceiivedIVHandler.HandleData(mainActivity,receivedArray); |
|||
|
|||
} catch (IOException e) { |
|||
if (running) { |
|||
|
|||
} |
|||
} |
|||
} |
|||
}); |
|||
receiveThread.start(); |
|||
} catch (IOException e) { |
|||
// tvOutput.setText("Socket error: " + e.getMessage());
|
|||
} |
|||
} |
|||
|
|||
public static void SendData(byte[] buffer) { |
|||
MainActivity.runOnUiThread(new Runnable() { |
|||
@Override |
|||
public void run() { |
|||
|
|||
new Thread(() -> |
|||
{ |
|||
DatagramSocket socket = null; |
|||
try { |
|||
InetAddress address = InetAddress.getByName(target_ip); |
|||
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, target_port); |
|||
sendSocket.send(packet); |
|||
} catch (Exception e) |
|||
{ |
|||
|
|||
|
|||
} |
|||
}).start(); |
|||
}}); |
|||
|
|||
|
|||
} |
|||
|
|||
public static void Destroy() { |
|||
running = false; |
|||
if (receiveSocket != null && !receiveSocket.isClosed()) { |
|||
receiveSocket.close(); |
|||
} |
|||
if (sendSocket != null && !sendSocket.isClosed()) { |
|||
sendSocket.close(); |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,333 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.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.roughapp2_0bbwiredrpm.BuildConfig; |
|||
import com.example.roughapp2_0bbwiredrpm.models.BspIV; |
|||
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; |
|||
|
|||
public class USBSerialPortHelper implements SerialInputOutputManager.Listener { |
|||
public USBSerialPortHelper(com.example.roughapp2_0bbwiredrpm.MainActivity mainActivity, int baudRate) { |
|||
this.MainActivity = mainActivity; |
|||
this.baudRate=baudRate; |
|||
} |
|||
private com.example.roughapp2_0bbwiredrpm.MainActivity MainActivity; |
|||
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 = 120; |
|||
private final int READ_WAIT_MILLIS = 120; |
|||
private String PortNameContians = "SILICON";/**/ |
|||
// private static String PortNameContians="FTD";
|
|||
//private int baudRate = 115200;
|
|||
private int baudRate = 115200; |
|||
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<Byte>(); |
|||
} |
|||
@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(); |
|||
}); |
|||
} |
|||
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.getVendorId() == 6790||v.getVendorId() == 1027) { |
|||
device = v; |
|||
break; |
|||
} |
|||
// 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(); |
|||
} |
|||
connected = 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<Byte> _receiveBufferlist; |
|||
|
|||
private static byte[] listTobyte(List<Byte> list) { |
|||
if (list == null || list.size() < 0) return null; |
|||
byte[] bytes = new byte[list.size()]; |
|||
int i = 0; |
|||
Iterator<Byte> iterator = list.iterator(); |
|||
while (iterator.hasNext()) { |
|||
bytes[i] = iterator.next(); |
|||
i++; |
|||
} |
|||
return bytes; |
|||
} |
|||
boolean StartCountDown = false; |
|||
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(4, 2) { |
|||
public void onTick(long millisUntilFinished) { |
|||
|
|||
} |
|||
public void onFinish() { |
|||
|
|||
status("read finished"); |
|||
decodeRceive(listTobyte(_receiveBufferlist)); |
|||
_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);
|
|||
|
|||
|
|||
// MainActivity.mainBinding.message.setText(str);
|
|||
} |
|||
|
|||
int Index = 0; |
|||
|
|||
|
|||
private void decodeRceive(byte[] data) { //USB串口接收
|
|||
|
|||
try { |
|||
|
|||
MainActivity.USBSerialPortReceivedTimeCounter = 0;//计算时间 归零
|
|||
|
|||
|
|||
for (int i = 0; i < 18; i++) |
|||
{ |
|||
ModbusRtuSlaveService.holdingRegisters[i] = ModbusRtuSlaveService.holdingRegisters_temp[i]; |
|||
} |
|||
|
|||
//单片机请求读取PV
|
|||
if (ModbusRtuSlaveService.processModbusRequest(data, data.length) == 0x03) { |
|||
Index++; |
|||
//Index=128;
|
|||
//由于 System.currentTimeMillis() 会随着时间累加,所以不存在
|
|||
MainActivity._toSendPV = MainActivity._toSendPV.toBuilder() |
|||
.setTimeStamp(System.currentTimeMillis()) |
|||
.build(); |
|||
DataExchangeHelper.setModbusPVValues(MainActivity._toSendPV); //设置PV
|
|||
} else if (ModbusRtuSlaveService.processModbusRequest(data, data.length) == 0x10) { |
|||
BspIV.IV_struct_define iv = DataExchangeHelper.getIVByModbus(); //收到单片机的IV.
|
|||
|
|||
//TODO
|
|||
ReceiivedIVHandler.HandleIVRough(MainActivity, iv); |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
catch (Exception e) { |
|||
int a =100; |
|||
|
|||
} |
|||
} |
|||
|
|||
public static String bytesToHex(byte[] bytes) { |
|||
StringBuilder result = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
result.append(String.format("%02X ", b & 0xFF)); |
|||
} |
|||
return result.toString(); |
|||
} |
|||
|
|||
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"); |
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.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.setMaxBufferTime(200);//设置最大缓冲时间
|
|||
nodePlayer.start(); |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,117 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.services; |
|||
|
|||
import android.util.Log; |
|||
|
|||
import android_serialport_api.SerialPortFinder; |
|||
import tp.xmaihh.serialport.SerialHelper; |
|||
import tp.xmaihh.serialport.bean.ComBean; |
|||
|
|||
public class ttySerialPortHelper { |
|||
public static com.example.roughapp2_0bbwiredrpm.MainActivity MainActivity; |
|||
private static final String TAG = "ttySerialPortHelper"; |
|||
private static SerialHelper serialHelper; |
|||
private static SerialPortFinder serialPortFinder; |
|||
public static boolean IsAllButtonSendBack = false; |
|||
|
|||
final String[] ports = serialPortFinder.getAllDevicesPath(); |
|||
final String[] botes = new String[]{"0", "50", "75", "110", "134", "150", "200", "300", "600", "1200", "1800", "2400", "4800", "9600", "19200", "38400", "57600", "115200", "230400", "460800", "500000", "576000", "921600", "1000000", "1152000", "1500000", "2000000", "2500000", "3000000", "3500000", "4000000", "CUSTOM"}; |
|||
final String[] databits = new String[]{"8", "7", "6", "5"}; |
|||
final String[] paritys = new String[]{"NONE", "ODD", "EVEN", "SPACE", "MARK"}; |
|||
final String[] stopbits = new String[]{"1", "2"}; |
|||
final String[] flowcons = new String[]{"NONE", "RTS/CTS", "XON/XOFF"}; |
|||
|
|||
public static int[] decodedCH = new int[17]; |
|||
|
|||
public static void Open() { |
|||
|
|||
try { |
|||
// serialPortFinder = new SerialPortFinder();
|
|||
serialHelper = new SerialHelper("dev/ttyHS0", 115200)//MK32
|
|||
// serialHelper = new SerialHelper("/dev/ttyHS3", 115200) //UR7
|
|||
{ |
|||
@Override |
|||
protected void onDataReceived(ComBean comBean) { |
|||
|
|||
MainActivity.runOnUiThread(new Runnable() { |
|||
@Override |
|||
public void run() { |
|||
// 更新 UI 的代码
|
|||
byte[] receivedData = comBean.bRec; |
|||
if (MainActivity.AndroidMCUCommunicationMethod == CommunicationMethond.Wireless) |
|||
{ |
|||
//解析单片机传来的数据
|
|||
//TODO
|
|||
ReceiivedIVHandler.HandleData(MainActivity, receivedData); |
|||
return; |
|||
} |
|||
//有按钮数据传输
|
|||
if (receivedData.length <= 2) { |
|||
return; |
|||
} |
|||
if (receivedData[0] != 0x55 || receivedData[1] != 0x66 || receivedData.length != 42) { |
|||
return; |
|||
} |
|||
byte[] crcbytes = new byte[receivedData.length - 2]; |
|||
System.arraycopy(receivedData, 0, crcbytes, 0, receivedData.length - 2); |
|||
byte[] crc = CCITT_CRC16.calculateXModemCRC16(crcbytes); |
|||
if (receivedData[receivedData.length - 2] == (byte) (crc[0] & 0xff) && receivedData[receivedData.length - 1] == (byte) (crc[1] & 0xff)) { |
|||
if ((receivedData[0] == 0x55) && (receivedData[1] == 0x66)) { |
|||
IsAllButtonSendBack = true; |
|||
int[] decodedCH = DataExchangeHelper.getdecodedCH(receivedData); |
|||
//0 代表index,和sbus里面的数据其实不同,这里用作接收一次,添加一个
|
|||
ModbusRtuSlaveService.holdingRegisters_temp[0] += 1; |
|||
for (int i = 0; i < decodedCH.length; i++) { |
|||
ModbusRtuSlaveService.holdingRegisters_temp[i + 1] = (short) decodedCH[i]; |
|||
} |
|||
ModbusRtuSlaveService.holdingRegisters_temp[17]=1; |
|||
} |
|||
}else |
|||
{ |
|||
ModbusRtuSlaveService.holdingRegisters_temp[17]=0; |
|||
} |
|||
|
|||
|
|||
// IsAllButtonSendBack = true;
|
|||
// int[] decodedCH = DataExchangeHelper.getdecodedCH(receivedData);
|
|||
// //0 代表index,和sbus里面的数据其实不同,这里用作接收一次,添加一个
|
|||
// ModbusRtuSlaveService.holdingRegisters[0] += 1;
|
|||
// for (int i = 0; i < decodedCH.length; i++) {
|
|||
// ModbusRtuSlaveService.holdingRegisters[i + 1] = (short) decodedCH[i];
|
|||
// }
|
|||
|
|||
|
|||
} |
|||
}); |
|||
} |
|||
}; |
|||
serialHelper.open(); |
|||
} catch (Exception exception) { |
|||
Log.d(TAG, "Data Received"); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
public static void SendData(byte[] data) { |
|||
|
|||
serialHelper.send(data); // 发送byte[]
|
|||
} |
|||
|
|||
public static byte[] getAllChData_4Hz = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x02, (byte) (0xB5 & 0xff), (byte) (0xC0 & 0xff)}; |
|||
public static byte[] getAllChData_5Hz = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x03, (byte) (0x94 & 0xff), (byte) (0xD0 & 0xff)}; |
|||
public static byte[] getAllChData_10Hz = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x04, (byte) (0x73 & 0xff), (byte) (0xA0 & 0xff)}; |
|||
public static byte[] getAllChData_20Hz = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x05, (byte) (0x52 & 0xff), (byte) (0xb0 & 0xff)}; |
|||
public static byte[] getAllChData_50Hz = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x06, (byte) (0x31 & 0xff), (byte) (0x80 & 0xff)}; |
|||
|
|||
|
|||
public static byte[] stopgetAllChData = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, (byte) (0xf7 & 0xff), (byte) (0xe0 & 0xff)}; |
|||
|
|||
public static void sendTxt(String sTxt) { |
|||
serialHelper.sendTxt(sTxt); // 发送byte[]
|
|||
} |
|||
public static void onDestroy() { |
|||
|
|||
serialHelper.close(); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
package com.example.roughapp2_0bbwiredrpm.viewmodels; |
|||
|
|||
import androidx.lifecycle.ViewModel; |
|||
|
|||
public class MainViewModel extends ViewModel { |
|||
|
|||
public MainViewModel() { |
|||
|
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,2 @@ |
|||
protoc --java_out . *.proto |
|||
pause |
|||
@ -0,0 +1,25 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="@color/gainsboro" />--> |
|||
<solid android:color="#f2f3f4" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 162 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,25 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="@color/white" />--> |
|||
<solid android:color="#d6eaf8" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" > |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke android:width="4px" android:color="#ffffff"/> |
|||
<!-- 渐变 --> |
|||
|
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,31 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="##deebf7" />--> |
|||
<solid android:color="#d6eaf8" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
|
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="5dp" |
|||
android:bottomRightRadius="5dp" |
|||
android:topLeftRadius="5dp" |
|||
android:topRightRadius="5dp" /> |
|||
|
|||
<!-- <corners--> |
|||
<!-- android:bottomLeftRadius="10px"--> |
|||
<!-- android:bottomRightRadius="10px"--> |
|||
<!-- android:topLeftRadius="10px"--> |
|||
<!-- android:topRightRadius="10px" />--> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,34 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="#87CEEB" />--> |
|||
|
|||
<!-- <!– 设置一个黑色边框 –>--> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/green" />--> |
|||
<!-- <!– 设置四个圆角的半径 –>--> |
|||
<!-- <corners--> |
|||
<!-- android:bottomLeftRadius="5dp"--> |
|||
<!-- android:bottomRightRadius="5dp"--> |
|||
<!-- android:topLeftRadius="5dp"--> |
|||
<!-- android:topRightRadius="5dp" />--> |
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="4px" |
|||
android:color="#6efe00" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,31 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="##deebf7" />--> |
|||
<solid android:color="@color/white" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
|
|||
<stroke |
|||
android:width="4px" |
|||
android:color="@color/grey" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="5dp" |
|||
android:bottomRightRadius="5dp" |
|||
android:topLeftRadius="5dp" |
|||
android:topRightRadius="5dp" /> |
|||
|
|||
<!-- <corners--> |
|||
<!-- android:bottomLeftRadius="10px"--> |
|||
<!-- android:bottomRightRadius="10px"--> |
|||
<!-- android:topLeftRadius="10px"--> |
|||
<!-- android:topRightRadius="10px" />--> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#f6ddcc" /> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="#ed7041" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="5dp" |
|||
android:bottomRightRadius="5dp" |
|||
android:topLeftRadius="5dp" |
|||
android:topRightRadius="5dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="#87CEEB" />--> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="4px" |
|||
android:color="@color/green" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="5dp" |
|||
android:bottomRightRadius="5dp" |
|||
android:topLeftRadius="5dp" |
|||
android:topRightRadius="5dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="#87CEEB" />--> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="2px" |
|||
android:color="#ffffff" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#00ffffff" /> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="16px" |
|||
android:color="#ffffff" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> |
|||
<stroke |
|||
android:color="#ffffff" |
|||
android:dashWidth="10dp" |
|||
/> |
|||
<!--width:线条的高度 |
|||
color:颜色 |
|||
android:dashGap="8dp" |
|||
dashWidth:破折线的宽度 |
|||
dashGap:破折线间空隙的宽度 |
|||
如果这里设置了width,xml中android:layout_height的值必须比它大。不设置就默认为0 |
|||
--> |
|||
</shape> |
|||
@ -0,0 +1,170 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:width="108dp" |
|||
android:height="108dp" |
|||
android:viewportWidth="108" |
|||
android:viewportHeight="108"> |
|||
<path |
|||
android:fillColor="#3DDC84" |
|||
android:pathData="M0,0h108v108h-108z" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M9,0L9,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,0L19,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M29,0L29,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M39,0L39,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M49,0L49,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M59,0L59,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M69,0L69,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M79,0L79,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M89,0L89,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M99,0L99,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,9L108,9" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,19L108,19" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,29L108,29" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,39L108,39" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,49L108,49" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,59L108,59" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,69L108,69" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,79L108,79" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,89L108,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,99L108,99" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,29L89,29" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,39L89,39" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,49L89,49" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,59L89,59" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,69L89,69" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,79L89,79" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M29,19L29,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M39,19L39,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M49,19L49,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M59,19L59,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M69,19L69,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M79,19L79,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
</vector> |
|||
@ -0,0 +1,30 @@ |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:aapt="http://schemas.android.com/aapt" |
|||
android:width="108dp" |
|||
android:height="108dp" |
|||
android:viewportWidth="108" |
|||
android:viewportHeight="108"> |
|||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> |
|||
<aapt:attr name="android:fillColor"> |
|||
<gradient |
|||
android:endX="85.84757" |
|||
android:endY="92.4963" |
|||
android:startX="42.9492" |
|||
android:startY="49.59793" |
|||
android:type="linear"> |
|||
<item |
|||
android:color="#44000000" |
|||
android:offset="0.0" /> |
|||
<item |
|||
android:color="#00000000" |
|||
android:offset="1.0" /> |
|||
</gradient> |
|||
</aapt:attr> |
|||
</path> |
|||
<path |
|||
android:fillColor="#FFFFFF" |
|||
android:fillType="nonZero" |
|||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" |
|||
android:strokeWidth="1" |
|||
android:strokeColor="#00000000" /> |
|||
</vector> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#FBD6D6" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
@ -0,0 +1,26 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
|
|||
<!-- <solid android:color="#F44336" />--> |
|||
<solid android:color="#FF0000" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
@ -0,0 +1,26 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="@color/white" />--> |
|||
<!-- <solid android:color="#c5e1a5" />--> |
|||
<solid android:color="#ef9a9a " /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> |
|||
|
|||
<solid android:color="#d6eaf8" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke android:width="4px" android:color="@color/deepskyblue"/>--> |
|||
<corners android:radius="5dp" /> |
|||
<!-- 渐变 --> |
|||
|
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
|
|||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<item android:color="@color/grey" |
|||
android:state_checked="false" /> |
|||
<item android:color="@color/deepskyblue" |
|||
android:state_checked="true" /> |
|||
</selector> |
|||
@ -0,0 +1,11 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:shape="rectangle"> |
|||
<!-- 填充 --> |
|||
<!-- <solid android:color="@color/gainsboro" />--> |
|||
<solid android:color="#eaeded" /> |
|||
|
|||
<!-- <stroke android:width="4px" android:color="@color/grey"/>--> |
|||
<!-- 圆角 --> |
|||
<corners android:radius="5dp" /> |
|||
</shape> |
|||
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<item android:state_checked="true" android:drawable="@drawable/radio_button_selected" /> |
|||
<item android:state_checked="false" android:drawable="@drawable/radio_button_unselected" /> |
|||
</selector> |
|||
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 75 KiB |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="@color/white" /> |
|||
<!-- <solid android:color="#d6eaf8" />--> |
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="2px" |
|||
android:color="@color/deepskyblue" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="2dp" |
|||
android:bottomRightRadius="2dp" |
|||
android:topLeftRadius="2dp" |
|||
android:topRightRadius="2dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,885 @@ |
|||
<layout |
|||
|
|||
xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:app="http://schemas.android.com/apk/res-auto" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
tools:context=".MainActivity"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:background="@drawable/background" |
|||
android:orientation="vertical"> |
|||
|
|||
<!--medium view--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_weight="1" |
|||
android:orientation="horizontal"> |
|||
<!--左侧信息区域--> |
|||
<LinearLayout |
|||
android:id="@+id/messageRounded" |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginTop="15dp" |
|||
android:layout_marginBottom="15dp" |
|||
android:layout_marginLeft="15dp" |
|||
android:background="@drawable/message_rounded_rectangle" |
|||
android:orientation="horizontal" |
|||
tools:ignore="NestedWeights"> |
|||
|
|||
<GridLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:columnCount="1" |
|||
android:orientation="vertical" |
|||
android:rowCount="9"> |
|||
|
|||
<!--机器人sbus状态--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:text="状态" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_signal" |
|||
android:layout_width="0dp" |
|||
android:layout_weight="2" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10sp" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
|
|||
<!--机器人有/无线状态--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="连接" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_connect" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
|
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
|
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
|
|||
<!--机器人当前速度--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="当前速度" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14dp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_currentSpeedFrom32" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="m/min" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10sp" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
|
|||
<!--机器人目标速度--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="目标速度" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_speedFrom32" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="m/min" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10sp" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
|
|||
<!--机器人当前角度--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="角度" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tvAngleFrom32" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" |
|||
tools:ignore="RtlHardcoded" /> |
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10sp" |
|||
android:text="°" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
<!--机器人压力常数--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="压力" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tvPressFrom32" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10sp" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
<!--机器人左补偿--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="左补偿" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_LCompensationFrom32" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="0" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold"/> |
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10sp" |
|||
android:text="°" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
<!--机器人右补偿--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="右补偿" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_RCopmpensationFrom32" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="0" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
|
|||
android:gravity="center" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10dp" |
|||
android:text="°" |
|||
android:textStyle="bold" /> |
|||
</LinearLayout> |
|||
|
|||
|
|||
<!--机器人错误信息--> |
|||
<FrameLayout |
|||
android:id="@+id/mainViewErrMessageFrameLayout" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_rowWeight="1"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1.5" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginLeft="6dp" |
|||
android:text="报错" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/mainViewErrMessageTxView" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="1dp" |
|||
android:layout_weight="2" |
|||
android:gravity="center" |
|||
android:text="xxx" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="14sp" |
|||
android:textStyle="bold" /> |
|||
<TextView |
|||
android:layout_width="35dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="10dp" |
|||
android:textStyle="bold" /> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<Button |
|||
android:id="@+id/roughErrMessageBtn" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_row="0" |
|||
android:layout_column="6" |
|||
android:layout_marginStart="0dp" |
|||
android:background="@color/trasnparent" |
|||
android:textAlignment="center" /> |
|||
|
|||
</FrameLayout> |
|||
|
|||
|
|||
|
|||
|
|||
</GridLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<!--右侧参数设定区域--> |
|||
<LinearLayout |
|||
android:id="@+id/roughRightSend" |
|||
android:layout_width="0dp" |
|||
android:layout_weight="2" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="15dp" |
|||
android:orientation="vertical" |
|||
tools:ignore="Suspicious0dp"> |
|||
<!-- 第一行--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_gravity="fill" |
|||
android:layout_weight="1"> |
|||
<!--手动模式--> |
|||
<FrameLayout |
|||
android:id="@+id/setManualModeBtnFrameLayout" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle" |
|||
tools:ignore="NestedWeights"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="手动\n模式" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="15sp" /> |
|||
|
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_manualModeDisplay" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:layout_marginHorizontal="5dp" |
|||
android:text="无" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<Button |
|||
android:id="@+id/rough_SetManualModeBtn" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:background="@color/trasnparent" |
|||
android:textAlignment="center" /> |
|||
|
|||
|
|||
</FrameLayout> |
|||
<!--自动模式--> |
|||
<FrameLayout |
|||
android:id="@+id/setAutomaticModeBtnFrameLayout" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
<TextView |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="自动\n模式" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_autoModeDisplay" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginHorizontal="5dp" |
|||
android:gravity="center" |
|||
android:text="未启用" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<Button |
|||
android:id="@+id/roughSetAutoModeBtn" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:background="@color/trasnparent" |
|||
android:textAlignment="center" /> |
|||
|
|||
</FrameLayout> |
|||
</LinearLayout> |
|||
|
|||
<!--第二行--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_weight="1"> |
|||
|
|||
<!--换道距离--> |
|||
<FrameLayout |
|||
android:id="@+id/mainViewLaneChangeDistanceFrameLayout" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="换道\n距离" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
|
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:layout_marginStart="-25dp" |
|||
android:text="cm" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="15sp" /> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<EditText |
|||
android:id="@+id/rough_Edit_LaneChangeDistanceTo32" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginStart="-10dp" |
|||
android:background="@null" |
|||
android:imeOptions="actionDone" |
|||
android:inputType="number" |
|||
android:gravity="center" |
|||
android:text="40" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
</FrameLayout> |
|||
|
|||
<!--压力设定--> |
|||
<FrameLayout |
|||
android:id="@+id/mainViewEndPressureFrameLayout" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
|
|||
<TextView |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="压力\n设定" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
<EditText |
|||
android:id="@+id/rough_Edit_PressTo32" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
|
|||
android:background="@null" |
|||
android:imeOptions="actionDone" |
|||
android:inputType="number" |
|||
android:gravity="center" |
|||
android:text="200" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
</FrameLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<!--第三行--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_weight="1"> |
|||
|
|||
<!--竖直微调--> |
|||
<FrameLayout |
|||
android:id="@+id/mainViewVerticalCalibrationFrameLayout" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="竖直\n微调" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="°" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="15sp" /> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<EditText |
|||
android:id="@+id/rough_Edit_VerticalAdjustTo32" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:background="@null" |
|||
android:gravity="center" |
|||
android:imeOptions="actionDone" |
|||
android:inputType="numberSigned|numberDecimal" |
|||
android:text="0.0" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
</FrameLayout> |
|||
|
|||
<!--参数预设--> |
|||
<FrameLayout |
|||
android:id="@+id/callParametersBtnFrameLayout" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
<TextView |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="参数\n设置" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:id="@+id/rough_tv_ParameterCallTo32" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginStart="10dp" |
|||
android:gravity="center" |
|||
android:text="1" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<Button |
|||
android:id="@+id/roughSetCallParametersBtn" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:background="@color/trasnparent" |
|||
android:textAlignment="center" /> |
|||
</FrameLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<!--第4行--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_weight="1"> |
|||
|
|||
<!--前端转向--> |
|||
<FrameLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="前端\n转向" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="15sp" /> |
|||
|
|||
|
|||
</LinearLayout> |
|||
<TextView |
|||
android:id="@+id/mainViewToolRotationDirectionTxView" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:layout_marginHorizontal="5dp" |
|||
android:text="正向" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<Button |
|||
android:id="@+id/setToolRotationDirectionBtn" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:background="@color/trasnparent" |
|||
android:textAlignment="center" /> |
|||
|
|||
|
|||
</FrameLayout> |
|||
|
|||
<!--前端转速--> |
|||
<FrameLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/blue_rounded_rectangle"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center|left" |
|||
android:layout_marginHorizontal="8dp" |
|||
android:text="前端\n转速" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="15sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="RPM" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="15sp" /> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
|
|||
<EditText |
|||
android:id="@+id/DMKSpeedTo32" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:background="@null" |
|||
android:imeOptions="actionDone" |
|||
android:inputType="number" |
|||
android:gravity="center" |
|||
android:text="2500" |
|||
android:hint="请输入0-3000的数字" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
|
|||
</FrameLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
</LinearLayout> |
|||
</layout> |
|||
@ -0,0 +1,43 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:layout_width="450dp" |
|||
android:layout_height="350dp" |
|||
android:layout_gravity="center" |
|||
android:background="@drawable/submenu" |
|||
android:orientation="vertical"> |
|||
|
|||
<!-- <TextView--> |
|||
<!-- android:layout_width="match_parent"--> |
|||
<!-- android:layout_height="wrap_content"--> |
|||
<!-- android:text="历史记录"--> |
|||
<!-- android:layout_marginTop="20dp"--> |
|||
<!-- android:gravity="center"--> |
|||
<!-- android:textSize="20sp"--> |
|||
<!-- android:textColor="@color/midnightblue" />--> |
|||
|
|||
<com.example.roughapp2_0bbwiredrpm.models.ScrollBottomScrollView |
|||
android:id="@+id/popUpErrorLogScrollview" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="8dp" |
|||
android:background="@drawable/borderlog"> |
|||
|
|||
<!-- <androidx.recyclerview.widget.RecyclerView--> |
|||
<!-- android:layout_width="match_parent"--> |
|||
<!-- android:layout_height="wrap_content">--> |
|||
|
|||
<!-- </androidx.recyclerview.widget.RecyclerView>--> |
|||
<TextView |
|||
android:id="@+id/popUpErrorLogTextView" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="8dp" |
|||
android:scrollbars="vertical" |
|||
android:scrollbarStyle="insideInset" |
|||
android:textSize="12sp" |
|||
android:textColor="@color/midnightblue" /> |
|||
</com.example.roughapp2_0bbwiredrpm.models.ScrollBottomScrollView> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
@ -0,0 +1,210 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="600dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@drawable/submenupng" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="30dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="参数设置" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</TextView> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:layout_marginTop="0dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
<RadioGroup |
|||
android:id="@+id/parameters_call_group_rough" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:orientation="horizontal" > |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_paraOneRough" |
|||
android:button="@null" |
|||
android:layout_width="80dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:layout_marginLeft="20dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:checked="true" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:text="1" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_paraTwoRough" |
|||
android:layout_width="80dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:text="2" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_paraThreeRough" |
|||
android:layout_width="80dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:text="3" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_paraFourRough" |
|||
android:layout_width="80dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:text="4" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_paraFiveRough" |
|||
android:layout_width="80dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:text="5" /> |
|||
</RadioGroup> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="30dp" |
|||
android:layout_marginHorizontal="30dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderblue"> |
|||
|
|||
<Button |
|||
android:id="@+id/parametersSavebtnRough" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:background="@color/trasnparent" |
|||
android:text="保存" |
|||
android:textAlignment="center" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="18dp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderorange"> |
|||
|
|||
<Button |
|||
android:id="@+id/parametersClearBtnRough" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:background="@color/trasnparent" |
|||
android:text="清除" |
|||
android:textAlignment="center" |
|||
android:textColor="#ed7041" |
|||
android:textSize="18dp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderblue"> |
|||
|
|||
<Button |
|||
android:id="@+id/parametersApplyRough" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/trasnparent" |
|||
android:text="使用" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="4dp" |
|||
android:layout_weight="1" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderorange"> |
|||
<Button |
|||
android:id="@+id/parametersExitRough" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/trasnparent" |
|||
android:text="退出" |
|||
android:padding="4dp" |
|||
android:textColor="#ed7041" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
</LinearLayout> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,269 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="600dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@drawable/submenupng" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="30dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="自动模式" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold"> |
|||
</TextView> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:layout_marginTop="0dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<RadioGroup |
|||
android:id="@+id/autoModeSelectorGroup_Rough" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:orientation="horizontal" |
|||
tools:ignore="UselessParent"> |
|||
|
|||
<!-- <RadioButton--> |
|||
<!-- android:id="@+id/rb_one"--> |
|||
<!-- android:layout_width="160dp"--> |
|||
<!-- android:layout_height="160dp"--> |
|||
<!-- android:background="@drawable/radiobutton_background"--> |
|||
<!-- android:button="@null"--> |
|||
<!-- android:checked="true"--> |
|||
<!-- android:gravity="center"--> |
|||
<!-- android:padding="10dp"--> |
|||
<!-- android:text="无"--> |
|||
<!-- android:textColor="@drawable/radio_button_textcolor"--> |
|||
<!-- android:textSize="50sp"--> |
|||
<!-- android:textStyle="bold" />--> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_autoHorizontal" |
|||
android:layout_width="415dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="水平" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<!-- <RadioButton--> |
|||
<!-- android:id="@+id/rb_three"--> |
|||
<!-- android:layout_width="wrap_content"--> |
|||
<!-- android:layout_height="wrap_content"--> |
|||
<!-- android:layout_marginStart="10dp"--> |
|||
<!-- android:background="@drawable/radiobutton_background"--> |
|||
<!-- android:button="@null"--> |
|||
<!-- android:gravity="center"--> |
|||
<!-- android:padding="10dp"--> |
|||
<!-- android:text="竖直向左"--> |
|||
<!-- android:textColor="@drawable/radio_button_textcolor"--> |
|||
<!-- android:textSize="40sp"--> |
|||
<!-- android:textStyle="bold" />--> |
|||
|
|||
<!-- <RadioButton--> |
|||
<!-- android:id="@+id/rb_four"--> |
|||
<!-- android:layout_width="wrap_content"--> |
|||
<!-- android:layout_height="wrap_content"--> |
|||
<!-- android:layout_marginStart="10dp"--> |
|||
<!-- android:background="@drawable/radiobutton_background"--> |
|||
<!-- android:button="@null"--> |
|||
<!-- android:gravity="center"--> |
|||
<!-- android:padding="10dp"--> |
|||
<!-- android:text="竖直向右"--> |
|||
<!-- android:textColor="@drawable/radio_button_textcolor"--> |
|||
<!-- android:textSize="40sp"--> |
|||
<!-- android:textStyle="bold" />--> |
|||
</RadioGroup> |
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="95dp" |
|||
android:layout_gravity="center"> |
|||
|
|||
<FrameLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="10dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/borderblue"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:layout_marginHorizontal="10dp" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:gravity="center" |
|||
android:text="纵向距离" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<EditText |
|||
android:id="@+id/VerticalDistance_input" |
|||
android:layout_width="100dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginStart="8dp" |
|||
android:background="@null" |
|||
android:inputType="numberDecimal" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" |
|||
tools:ignore="RtlHardcoded"></EditText> |
|||
|
|||
|
|||
|
|||
<TextView |
|||
|
|||
android:layout_width="20dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="m" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="20sp" |
|||
tools:ignore="RtlHardcoded" /> |
|||
</LinearLayout> |
|||
|
|||
<!-- <Button--> |
|||
<!-- android:id="@+id/setWorkWidthBtn"--> |
|||
<!-- android:layout_width="match_parent"--> |
|||
<!-- android:layout_height="match_parent"--> |
|||
<!-- android:layout_margin="8dp"--> |
|||
<!-- android:background="@color/trasnparent"--> |
|||
<!-- android:textAlignment="center" />--> |
|||
</FrameLayout> |
|||
|
|||
<FrameLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="10dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/borderblue"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_gravity="fill" |
|||
android:layout_marginHorizontal="10dp" |
|||
android:orientation="horizontal"> |
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:gravity="center" |
|||
android:text="横向距离" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<EditText |
|||
android:id="@+id/HorizontalDistance_input" |
|||
android:layout_width="100dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginStart="8dp" |
|||
android:background="@null" |
|||
android:inputType="numberDecimal" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" |
|||
tools:ignore="RtlHardcoded"></EditText> |
|||
|
|||
|
|||
|
|||
<TextView |
|||
android:layout_width="20dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:text="m" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="20sp" |
|||
tools:ignore="RtlHardcoded" /> |
|||
</LinearLayout> |
|||
|
|||
<!-- <Button--> |
|||
<!-- android:id="@+id/setWorkDistanceBtn"--> |
|||
<!-- android:layout_width="match_parent"--> |
|||
<!-- android:layout_height="match_parent"--> |
|||
<!-- android:layout_margin="8dp"--> |
|||
<!-- android:background="@color/trasnparent"--> |
|||
<!-- android:textAlignment="center" />--> |
|||
</FrameLayout> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginVertical="5dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginHorizontal="12dp" |
|||
android:background="@drawable/borderblue" |
|||
android:padding="4dp"> |
|||
|
|||
<Button |
|||
android:id="@+id/autoModeApply_Rough" |
|||
android:layout_width="200dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold"></Button> |
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginHorizontal="12dp" |
|||
android:background="@drawable/borderorange" |
|||
android:padding="4dp"> |
|||
|
|||
<Button |
|||
android:id="@+id/autoModeCancel_Rough" |
|||
android:layout_width="200dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@color/trasnparent" |
|||
android:padding="4dp" |
|||
android:text="取消" |
|||
android:textColor="#ed7041" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold"></Button> |
|||
</LinearLayout> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,147 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout |
|||
xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="600dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@drawable/submenupng" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="30dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="手动模式" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold"> |
|||
</TextView> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:layout_marginTop="0dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<RadioGroup |
|||
android:id="@+id/manualModeSelectorGroup_Rough" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:orientation="horizontal" |
|||
tools:ignore="UselessParent"> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_one_rough" |
|||
android:layout_width="130dp" |
|||
android:layout_height="130dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="无" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_two_rough" |
|||
android:layout_width="130dp" |
|||
android:layout_height="130dp" |
|||
android:layout_marginStart="10dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="水平" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_three_rough" |
|||
android:layout_width="130dp" |
|||
android:layout_height="130dp" |
|||
android:layout_marginStart="10dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="竖直向左" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_four_rough" |
|||
android:layout_width="130dp" |
|||
android:layout_height="130dp" |
|||
android:layout_marginStart="10dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="竖直向右" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
</RadioGroup> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="20dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_margin="10dp" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:padding="4dp" |
|||
android:background="@drawable/borderblue"> |
|||
|
|||
<Button |
|||
android:id="@+id/manualModeApply_Rough" |
|||
android:layout_width="200dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_margin="10dp" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:padding="4dp" |
|||
android:background="@drawable/borderorange"> |
|||
|
|||
<Button |
|||
android:id="@+id/manualModeCancel_Rough" |
|||
android:layout_width="200dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@color/trasnparent" |
|||
android:text="取消" |
|||
android:padding="4dp" |
|||
android:textColor="#ed7041" |
|||
android:textSize="25sp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
</LinearLayout> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,123 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="600dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@drawable/submenupng" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="40dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="转动方向" |
|||
android:textColor="@color/midnightblue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</TextView> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:layout_marginTop="0dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
<RadioGroup |
|||
android:id="@+id/toolRotationDirectionSelectorGroup" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:orientation="horizontal" > |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_DirPos" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:checked="true" |
|||
android:text="正向" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_DirNag" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="50sp" |
|||
android:text="反向" /> |
|||
</RadioGroup> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="40dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_margin="10dp" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/borderblue"> |
|||
|
|||
<Button |
|||
android:id="@+id/Apply" |
|||
android:layout_width="180dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="4dp" |
|||
android:padding="4dp" |
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/deepskyblue" |
|||
android:textSize="20sp" |
|||
|
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_margin="10dp" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/borderorange"> |
|||
<Button |
|||
android:id="@+id/Cancel" |
|||
android:layout_width="180dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="4dp" |
|||
android:background="@color/trasnparent" |
|||
android:text="取消" |
|||
android:padding="4dp" |
|||
android:textColor="#ed7041" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<background android:drawable="@drawable/ic_launcher_background" /> |
|||
<foreground android:drawable="@drawable/ic_launcher_foreground" /> |
|||
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> |
|||
</adaptive-icon> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<background android:drawable="@drawable/ic_launcher_background" /> |
|||
<foreground android:drawable="@drawable/ic_launcher_foreground" /> |
|||
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> |
|||
</adaptive-icon> |
|||
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 982 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |