功能修改

This commit is contained in:
hayu 2025-04-10 14:43:39 +08:00
parent 1762a35971
commit 9a769ae9cd
9 changed files with 709 additions and 75 deletions

View File

@ -1,6 +1,7 @@
package com.bonus.wrjtest
import android.annotation.SuppressLint
import android.app.ProgressDialog
import android.content.Intent
import android.os.Bundle
import android.os.Handler
@ -58,6 +59,8 @@ class MainActivity : AppCompatActivity() {
lateinit var sagEditText: EditText
lateinit var hAngleText: EditText
lateinit var vAngleText: EditText
lateinit var positionText: EditText
lateinit var spanText: EditText
var handler: Handler = Handler(Looper.getMainLooper())
val resultDataSb = StringBuilder()
@ -78,6 +81,12 @@ class MainActivity : AppCompatActivity() {
private var methodNum = 6
private var isPrint=0;
private var position="大号在右"
// 定义一个全局的 ProgressDialog 变量
private var progressDialog: ProgressDialog? = null
//GPS与雷达位置偏移常量切换
// var gpsDistance = 0.28
// var gpsAngle = 0.0
@ -104,24 +113,28 @@ class MainActivity : AppCompatActivity() {
sagEditText = findViewById(R.id.sag)
hAngleText = findViewById(R.id.hAngle)
vAngleText = findViewById(R.id.vAngle)
positionText = findViewById(R.id.position)
spanText = findViewById(R.id.span)
//创建通道
createChannel()
findViewById<Button>(R.id.switchType).setOnClickListener {
if (splitType == "01") {
splitType = "02"
span = 48.209
// span = 48.209
h = 4.136
Toast.makeText(this, "切换至二分裂数据", Toast.LENGTH_LONG).show()
} else if (splitType == "02") {
splitType = "04"
span = 47.991
// span = 47.991
// span = 45.23
h = 4.125
Toast.makeText(this, "切换至四分裂数据", Toast.LENGTH_LONG).show()
} else {
splitType = "01"
span = 45.23
// span = 45.23
h = 0.139
Toast.makeText(this, "切换至单分裂数据", Toast.LENGTH_LONG).show()
}
@ -129,20 +142,51 @@ class MainActivity : AppCompatActivity() {
sensorDataList.clear()
}
// findViewById<Button>(R.id.poll).setOnClickListener {
// if (sensorDataBean.rollAngle>2 || sensorDataBean.rollAngle<-2){
// Toast.makeText(this, "横滚角过大,请稳定后再保存", Toast.LENGTH_LONG).show()
// return@setOnClickListener
// }
// Toast.makeText(this, "数据记录中。。。。。", Toast.LENGTH_LONG).show()
// sensorDataList.add(sensorDataBean)
// coordinatesList.add(coordinates)
//
// logger.log(sensorDataBean.toString(),isPrint)
// for (coordinate in coordinates) {
// logger.log(coordinate.toString(),isPrint)
// }
//
// // 使用 Handler 计时一秒后执行
// Handler(Looper.getMainLooper()).postDelayed({
// if (sensorDataBean.rollAngle>2 || sensorDataBean.rollAngle<-2){
// Toast.makeText(this, "横滚角过大,请稳定后再保存", Toast.LENGTH_LONG).show()
// return@postDelayed
// }
// if (job != null) {
// // 取消之前的任务
// job?.cancel()
// }
// // 计时结束后执行的逻辑
// sensorDataList.add(sensorDataBean)
// coordinatesList.add(coordinates)
//
// logger.log(sensorDataBean.toString(), isPrint)
// for (coordinate in coordinates) {
// logger.log(coordinate.toString(), isPrint)
// }
//
// Toast.makeText(this, "已保存数据", Toast.LENGTH_LONG).show()
// isPrint = 0
// sendMsg(3)
// // 延迟 1000 毫秒1 秒)
// }, 3000)
// }
findViewById<Button>(R.id.poll).setOnClickListener {
if (job != null) {
job?.cancel()
}
sensorDataList.add(sensorDataBean)
coordinatesList.add(coordinates)
logger.log(sensorDataBean.toString())
for (coordinate in coordinates) {
logger.log(coordinate.toString())
}
Toast.makeText(this, "保存数据", Toast.LENGTH_LONG).show()
// 显示加载提示
showLoadingDialog()
// 调用方法检查横滚角是否满足条件
waitForRollAngleCondition()
}
findViewById<Button>(R.id.clear).setOnClickListener {
@ -155,6 +199,7 @@ class MainActivity : AppCompatActivity() {
Toast.makeText(this, "清除数据", Toast.LENGTH_LONG).show()
}
findViewById<Button>(R.id.measure).setOnClickListener {
isPrint=1;
if (job != null) {
job?.cancel()
}
@ -162,18 +207,28 @@ class MainActivity : AppCompatActivity() {
getSag()
}
findViewById<Button>(R.id.switchMethod).setOnClickListener {
if (methodNum == 6) {
methodNum = 3
if (position.equals("大号在右")) {
position = "大号在左"
positionText.setText("大号在左")
} else {
methodNum = 6
position = "大号在右"
positionText.setText("大号在右")
}
Toast.makeText(this, "切换计算方法为" + methodNum + "点弧垂测量法", Toast.LENGTH_LONG).show()
Toast.makeText(this, "切换测量位置为:" + position, Toast.LENGTH_LONG).show()
sendMsg(4)
}
findViewById<Button>(R.id.send1).setOnClickListener {
Toast.makeText(this, "基础发送信息", Toast.LENGTH_LONG).show()
sendMsg(1)
if (spanText.getText().toString().isNotEmpty()) {
span = spanText.getText().toString().toDouble()
Toast.makeText(this, "基础发送信息", Toast.LENGTH_LONG).show()
sendMsg(1)
} else {
Toast.makeText(this, "请输入档距", Toast.LENGTH_LONG).show()
}
}
findViewById<Button>(R.id.send2).setOnClickListener {
isPrint=1;
if (job != null) {
job?.cancel()
}
@ -195,6 +250,82 @@ class MainActivity : AppCompatActivity() {
}
}
/**
* 定义一个方法用于等待横滚角满足条件
*/
private fun waitForRollAngleCondition() {
if ((sensorDataBean.rollAngle > 1 || sensorDataBean.rollAngle < -1) && (sensorDataBean.pitchAngle > 3 || sensorDataBean.pitchAngle < -3)) {
// 如果不满足条件,则每隔 1 秒递归调用自己,直到满足条件为止
Handler(Looper.getMainLooper()).postDelayed({
waitForRollAngleCondition()
}, 500)
return
}
// 横滚角满足条件后,执行后续逻辑
// Toast.makeText(this, "数据记录中。。。。。", Toast.LENGTH_LONG).show()
sensorDataList.add(sensorDataBean)
coordinatesList.add(coordinates)
logger.log(sensorDataBean.toString(), isPrint)
println(sensorDataBean.toString())
for (coordinate in coordinates) {
logger.log(coordinate.toString(), isPrint)
println(coordinate.toString())
}
// 延迟 3 秒后再次检查横滚角
Handler(Looper.getMainLooper()).postDelayed({
checkRollAngleAndSave()
}, 2000)
}
/**
* 定义一个方法用于检查横滚角并保存数据
*/
private fun checkRollAngleAndSave() {
if ((sensorDataBean.rollAngle > 1 || sensorDataBean.rollAngle < -1) && (sensorDataBean.pitchAngle > 3 || sensorDataBean.pitchAngle < -3)) {
// 如果不满足条件,则每隔 1 秒递归调用自己,直到满足条件为止
Handler(Looper.getMainLooper()).postDelayed({
checkRollAngleAndSave()
}, 1000)
return
}
// 满足条件后保存数据
sensorDataList.add(sensorDataBean)
coordinatesList.add(coordinates)
println(sensorDataBean.toString())
logger.log(sensorDataBean.toString(), isPrint)
for (coordinate in coordinates) {
logger.log(coordinate.toString(), isPrint)
println(coordinate.toString())
}
isPrint = 0
sendMsg(3)
// 数据保存完成后,隐藏加载提示
hideLoadingDialog()
}
// 显示加载提示的方法
private fun showLoadingDialog() {
progressDialog = ProgressDialog(this).apply {
setMessage("数据获取中,请稍候...")
setCancelable(false) // 禁止用户手动关闭
show()
}
}
// 隐藏加载提示的方法
private fun hideLoadingDialog() {
progressDialog?.dismiss()
progressDialog = null
Toast.makeText(this, "已保存数据", Toast.LENGTH_LONG).show()
}
private fun createChannel() {
// 创建通讯管道
pipeline = PipelineManager.createPipeline()!!
@ -244,9 +375,18 @@ class MainActivity : AppCompatActivity() {
resultDataSb.clear()
returnData.setText("激光雷达解析数据与分裂类型不匹配")
}
"F0000003" -> {
resultDataSb.clear()
// 需要传递 Context 的引用,例如使用 applicationContext
Toast.makeText(
applicationContext,
"该无人机位置不合适,请调整",
Toast.LENGTH_SHORT
).show()
}
}
} else {
if (resultDataSb.length == 96) {
if (resultDataSb.length == 104) {
//因为有分包现象,判断头尾
if (resultDataSb.startsWith("F0F0F0") && resultDataSb.endsWith("CCDD")) {
returnData.setText("")
@ -264,20 +404,20 @@ class MainActivity : AppCompatActivity() {
val angle3 = data.substring(24, 28)
val distance4 = data.substring(28, 32)
val angle4 = data.substring(32, 36)
val pitchAngle1 = data.substring(36, 40)
val rollAngle1 = data.substring(40, 44)
val azimuthAngle1 = data.substring(44, 48)
val lon = data.substring(48, 58)
val lat = data.substring(58, 68)
val h = data.substring(68, 74)
val qual = data.substring(74, 76)
val pitchAngle1 = data.substring(36, 44)
val rollAngle1 = data.substring(44, 52)
val azimuthAngle1 = data.substring(52, 56)
val lon = data.substring(56, 66)
val lat = data.substring(66, 76)
val h = data.substring(76, 82)
val qual = data.substring(82, 84)
val splitType = data.substring(76, 78)
val splitType = data.substring(84, 86)
val splitNum = Integer.parseInt(splitType)
//水平角
val hAngleNum = data.substring(78, 82)
val hAngleNum = data.substring(86, 90)
//垂直角
val vAngleNum = data.substring(82, 86)
val vAngleNum = data.substring(90, 94)
var radarDistance1: Double =
ByteUtil.hexToDecimalInt(distance1).toDouble() / 1000.0
@ -304,11 +444,13 @@ class MainActivity : AppCompatActivity() {
RadarPointBean(radarAngle3, radarDistance3),
RadarPointBean(radarAngle4, radarDistance4)
)
var pitchAngle2: Double =
ByteUtil.hexToDecimalInt(pitchAngle1).toDouble() / 100.0
var rollAngle2: Double =
ByteUtil.hexToDecimalInt(rollAngle1).toDouble() / 100.0
// 解析俯仰角和横滚角
var pitchAngle2: Double = ByteUtil.hexToSignedDecimalInt(pitchAngle1).toDouble() / 100.0
var rollAngle2: Double = ByteUtil.hexToSignedDecimalInt(rollAngle1).toDouble() / 100.0
// var pitchAngle2: Double =
// ByteUtil.hexToDecimalInt(pitchAngle1).toDouble() / 100.0
// var rollAngle2: Double =
// ByteUtil.hexToDecimalInt(rollAngle1).toDouble() / 100.0
var azimuthAngle2: Double =
ByteUtil.hexToDecimalInt(azimuthAngle1).toDouble() / 100.0
@ -368,10 +510,10 @@ class MainActivity : AppCompatActivity() {
// Toast.LENGTH_SHORT
// ).show()
//展示是水平方向的夹角
radar1.setText("${radarDistance1}m, ${90-radarAngle1}°")
radar2.setText("${radarDistance2}m, ${90-radarAngle2}°")
radar3.setText("${radarDistance3}m, ${90-radarAngle3}°")
radar4.setText("${radarDistance4}m, ${90-radarAngle4}°")
radar1.setText("${radarDistance1}m, ${radarAngle1-pitchAngle2}°")
radar2.setText("${radarDistance2}m, ${radarAngle2-pitchAngle2}°")
radar3.setText("${radarDistance3}m, ${radarAngle3-pitchAngle2}°")
radar4.setText("${radarDistance4}m, ${radarAngle4-pitchAngle2}°")
hAngleText.setText("${hAngle}°")
vAngleText.setText("${vAngle}°")
@ -380,6 +522,15 @@ class MainActivity : AppCompatActivity() {
rollAngle.setText("${rollAngle2}°")
azimuthAngle.setText("${azimuthAngle2}°")
gps.setText("经度:${lon2}°,纬度:${lat2}°,高度:${h2}m")
logger.log("1号线 "+radarDistance1+" , "+(radarAngle1-pitchAngle2)+"",isPrint);
logger.log("2号线 "+radarDistance2+" , "+(radarAngle2-pitchAngle2)+"",isPrint);
logger.log("3号线 "+radarDistance3+" , "+(radarAngle3-pitchAngle2)+"",isPrint);
logger.log("4号线 "+radarDistance4+" , "+(radarAngle4-pitchAngle2)+"",isPrint);
logger.log("俯仰角: "+pitchAngle2+" ",isPrint);
logger.log("横滚角: "+rollAngle2+" ",isPrint);
logger.log("航向角: "+azimuthAngle2+" ",isPrint);
logger.log("雷达点: 经度: "+lon2+" ,纬度: "+lat2+" ,高度: "+h2+" ",isPrint);
if (qual == "01") {
gpsMode.setText("单点定位")
} else if (qual == "02") {
@ -440,7 +591,7 @@ class MainActivity : AppCompatActivity() {
).show()
}
}
} else if (resultDataSb.length > 96) {
} else if (resultDataSb.length > 104) {
resultDataSb.clear()
}
}
@ -454,7 +605,312 @@ class MainActivity : AppCompatActivity() {
}
//hay 四分裂--3点/6点
private fun dealWithDatas() {
var sensor1 = SensorDataBean()
sensor1.pitchAngle = 3.0309
sensor1.rollAngle = 1.0171
sensor1.azimuthAngle = 257.2454
sensor1.lon = 117.1633331
sensor1.lat = 31.78590314
sensor1.h = 37.46575000
var radarPoint1: MutableList<RadarPointBean> = ArrayList()
radarPoint1.add(RadarPointBean(43.95-3.0309, 2.5315))
radarPoint1.add(RadarPointBean(53.35-3.0309, 2.318))
radarPoint1.add(RadarPointBean(57.15-3.0309, 2.7685))
radarPoint1.add(RadarPointBean(49.0-3.0309, 2.937))
var coordinate1: MutableList<Coordinate> = ArrayList()
for (radarPointBean in radarPoint1) {
val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor1)
coordinate.radarPoint = radarPointBean
coordinate1.add(coordinate)
}
//// var sensor2 = SensorDataBean()
//// sensor2.pitchAngle = 0.01
//// sensor2.rollAngle = 1.01
//// sensor2.azimuthAngle = 110.11
//// sensor2.lon = 117.16295435
//// sensor2.lat = 31.78569556
//// sensor2.h = 40.25136
//// var radarPoint2: MutableList<RadarPointBean> = ArrayList()
//// radarPoint2.add(RadarPointBean(170.35, 5.867))
//// radarPoint2.add(RadarPointBean(171.0, 6.323))
//// radarPoint2.add(RadarPointBean(166.65, 6.373))
//// radarPoint2.add(RadarPointBean(166.05, 5.935))
//// var coordinate2 :MutableList<Coordinate> = ArrayList()
//// for (radarPointBean in radarPoint2) {
//// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor2)
//// coordinate.radarPoint = radarPointBean
//// coordinate2.add(coordinate)
//// }
//
var sensor3 = SensorDataBean()
sensor3.pitchAngle = 3.0353
sensor3.rollAngle = 0.0018
sensor3.azimuthAngle = 271.2448
sensor3.lon = 117.16349030
sensor3.lat = 31.78590675
sensor3.h = 37.53740000
var radarPoint3: MutableList<RadarPointBean> = ArrayList()
radarPoint3.add(RadarPointBean(46.6-3.0353, 1.809))
radarPoint3.add(RadarPointBean(59.0-3.0353, 1.639))
radarPoint3.add(RadarPointBean(62.8-3.0353, 2.094))
radarPoint3.add(RadarPointBean(52.2-3.0353, 2.204))
var coordinate3: MutableList<Coordinate> = ArrayList()
for (radarPointBean in radarPoint3) {
val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor3)
coordinate.radarPoint = radarPointBean
coordinate3.add(coordinate)
}
//// var sensor4 = SensorDataBean()
//// sensor4.pitchAngle = 1.01
//// sensor4.rollAngle = 0.01
//// sensor4.azimuthAngle = 120.21
//// sensor4.lon = 117.16296837
//// sensor4.lat = 31.78568228
//// sensor4.h = 41.37936
//// var radarPoint4: MutableList<RadarPointBean> = ArrayList()
//// radarPoint4.add(RadarPointBean(157.9, 6.581))
//// radarPoint4.add(RadarPointBean(159.15, 7.005))
//// radarPoint4.add(RadarPointBean(155.55, 7.155))
//// radarPoint4.add(RadarPointBean(154.35, 7.766))
//// var coordinate4 :MutableList<Coordinate> = ArrayList()
//// for (radarPointBean in radarPoint4) {
//// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor4)
//// coordinate.radarPoint = radarPointBean
//// coordinate4.add(coordinate)
//// }
//
var sensor5 = SensorDataBean()
sensor5.pitchAngle = 2.0295
sensor5.rollAngle = 1.0171
sensor5.azimuthAngle = 269.5476
sensor5.lon = 117.16371240
sensor5.lat = 31.78590810
sensor5.h = 37.86845000
var radarPoint5: MutableList<RadarPointBean> = ArrayList()
radarPoint5.add(RadarPointBean(33.1-2.0295, 2.025))
radarPoint5.add(RadarPointBean(44.45-2.0295, 1.7655))
radarPoint5.add(RadarPointBean(50.05-2.0295, 2.1815))
radarPoint5.add(RadarPointBean(40.3-2.0295, 2.379))
var coordinate5: MutableList<Coordinate> = ArrayList()
for (radarPointBean in radarPoint5) {
val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor5)
coordinate.radarPoint = radarPointBean
coordinate5.add(coordinate)
}
//// var sensor6 = SensorDataBean()
//// sensor6.pitchAngle = 0.0
//// sensor6.rollAngle = 3.04
//// sensor6.azimuthAngle = 119.2
//// sensor6.lon = 117.16281242
//// sensor6.lat = 31.78569027
//// sensor6.h = 41.61336
//// var radarPoint6: MutableList<RadarPointBean> = ArrayList()
//// radarPoint6.add(RadarPointBean(160.05, 5.774))
//// radarPoint6.add(RadarPointBean(161.55, 6.197))
//// radarPoint6.add(RadarPointBean(157.8, 6.359))
//// radarPoint6.add(RadarPointBean(156.1, 5.973))
//// var coordinate6 :MutableList<Coordinate> = ArrayList()
//// for (radarPointBean in radarPoint6) {
//// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor6)
//// coordinate.radarPoint = radarPointBean
//// coordinate6.add(coordinate)
//// }
//
sensorDataList.add(sensor1)
//// sensorDataList.add(sensor2)
sensorDataList.add(sensor3)
coordinatesList.add(coordinate1)
//// coordinatesList.add(coordinate2)
coordinatesList.add(coordinate3)
//// sensorDataList.add(sensor4)
sensorDataList.add(sensor5)
//// sensorDataList.add(sensor6)
//// coordinatesList.add(coordinate4)
coordinatesList.add(coordinate5)
//// coordinatesList.add(coordinate6)
// var sensor1 = SensorDataBean()
// sensor1.pitchAngle = 3.04
// sensor1.rollAngle = 0.01
// sensor1.azimuthAngle = 258.24
// sensor1.lon = 117.16327966
// sensor1.lat = 31.78587773
// sensor1.h = 28.3873
// var radarPoint1: MutableList<RadarPointBean> = ArrayList()
// radarPoint1.add(RadarPointBean(173.5, 4.55))
// radarPoint1.add(RadarPointBean(174.2, 4.96))
//
// var coordinate1 :MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint1) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor1)
// coordinate.radarPoint = radarPointBean
// coordinate1.add(coordinate)
// }
//
// var sensor2 = SensorDataBean()
// sensor2.pitchAngle = 2.02
// sensor2.rollAngle = 0.0
// sensor2.azimuthAngle = 185.86
// sensor2.lon = 117.162919
// sensor2.lat = 31.786029
// sensor2.h = 44.81
// var radarPoint2: MutableList<RadarPointBean> = ArrayList()
// radarPoint2.add(RadarPointBean(170.5, 3.04))
// radarPoint2.add(RadarPointBean(173.55, 3.4))
// var coordinate2 :MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint2) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor2)
// coordinate.radarPoint = radarPointBean
// coordinate2.add(coordinate)
// }
//
// var sensor3 = SensorDataBean()
// sensor3.pitchAngle =1.02
// sensor3.rollAngle = 0.0
// sensor3.azimuthAngle = 187.88
// sensor3.lon = 117.16275
// sensor3.lat = 31.786031
// sensor3.h = 42.96
// var radarPoint3: MutableList<RadarPointBean> = ArrayList()
// radarPoint3.add(RadarPointBean(172.65, 3.9))
// radarPoint3.add(RadarPointBean(175.55, 4.23))
// var coordinate3 :MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint3) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor3)
// coordinate.radarPoint = radarPointBean
// coordinate3.add(coordinate)
// }
//
// sensorDataList.add(sensor1)
// sensorDataList.add(sensor2)
// sensorDataList.add(sensor3)
// coordinatesList.add(coordinate1)
// coordinatesList.add(coordinate2)
// coordinatesList.add(coordinate3)
// var sensor1 = SensorDataBean()
// sensor1.pitchAngle = 0.0
// sensor1.rollAngle = 0.0
// sensor1.azimuthAngle = 192.93
// sensor1.lon = 117.16394922
// sensor1.lat = 31.78600260
// sensor1.h = 32.66266
// var radarPoint1: MutableList<RadarPointBean> = ArrayList()
// radarPoint1.add(RadarPointBean(137.6, 6.588))
//
// var coordinate1: MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint1) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor1)
// coordinate.radarPoint = radarPointBean
// coordinate1.add(coordinate)
// }
//
// var sensor2 = SensorDataBean()
// sensor2.pitchAngle = 1.01
// sensor2.rollAngle = 4.05
// sensor2.azimuthAngle = 195.95
// sensor2.lon = 117.16394922
// sensor2.lat = 31.78600260
// sensor2.h = 32.66266
// var radarPoint2: MutableList<RadarPointBean> = ArrayList()
// radarPoint2.add(RadarPointBean(136.69, 6.669))
// var coordinate2: MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint2) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor2)
// coordinate.radarPoint = radarPointBean
// coordinate2.add(coordinate)
// }
//
// var sensor3 = SensorDataBean()
// sensor3.pitchAngle = 0.01
// sensor3.rollAngle = 0.01
// sensor3.azimuthAngle = 195.96
// sensor3.lon = 117.16394581
// sensor3.lat = 31.78550375
// sensor3.h = 30.31926
// var radarPoint3: MutableList<RadarPointBean> = ArrayList()
// radarPoint3.add(RadarPointBean(140.8, 6.334))
// var coordinate3: MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint3) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor3)
// coordinate.radarPoint = radarPointBean
// coordinate3.add(coordinate)
// }
//
// var sensor4 = SensorDataBean()
// sensor4.pitchAngle = 0.0
// sensor4.rollAngle = 0.01
// sensor4.azimuthAngle = 194.94
// sensor4.lon = 117.16394581
// sensor4.lat = 31.78550375
// sensor4.h = 30.31926
// var radarPoint4: MutableList<RadarPointBean> = ArrayList()
// radarPoint4.add(RadarPointBean(139.94, 6.277))
// var coordinate4: MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint4) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor4)
// coordinate.radarPoint = radarPointBean
// coordinate4.add(coordinate)
// }
//
// var sensor5 = SensorDataBean()
// sensor5.pitchAngle = 0.01
// sensor5.rollAngle = 1.01
// sensor5.azimuthAngle = 194.94
// sensor5.lon = 117.16395386
// sensor5.lat = 31.78494992
// sensor5.h = 34.99086
// var radarPoint5: MutableList<RadarPointBean> = ArrayList()
// radarPoint5.add(RadarPointBean(130.9, 6.495))
// var coordinate5: MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint5) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor5)
// coordinate.radarPoint = radarPointBean
// coordinate5.add(coordinate)
// }
//
// var sensor6 = SensorDataBean()
// sensor6.pitchAngle = 0.0
// sensor6.rollAngle = 5.05
// sensor6.azimuthAngle = 198.98
// sensor6.lon = 117.16395386
// sensor6.lat = 31.78494992
// sensor6.h = 34.99086
// var radarPoint6: MutableList<RadarPointBean> = ArrayList()
// radarPoint6.add(RadarPointBean(129.94, 6.485))
// var coordinate6: MutableList<Coordinate> = ArrayList()
// for (radarPointBean in radarPoint6) {
// val coordinate = RadarMathUtil.transferPoint2(radarPointBean, sensor6)
// coordinate.radarPoint = radarPointBean
// coordinate6.add(coordinate)
// }
//
// sensorDataList.add(sensor1)
// sensorDataList.add(sensor2)
// sensorDataList.add(sensor3)
// coordinatesList.add(coordinate1)
// coordinatesList.add(coordinate2)
// coordinatesList.add(coordinate3)
// sensorDataList.add(sensor4)
// sensorDataList.add(sensor5)
// sensorDataList.add(sensor6)
// coordinatesList.add(coordinate4)
// coordinatesList.add(coordinate5)
// coordinatesList.add(coordinate6)
}
private fun getSag() {
// dealWithDatas();
if (methodNum == 3) {
if (coordinatesList.size >= 3) {
var point1: MutableList<Coordinate> = ArrayList()
@ -485,8 +941,9 @@ class MainActivity : AppCompatActivity() {
lineAllPoint.add(point3[i])
sb.append(calculate(span, lineAllPoint, 3)).append(",")
}
sagEditText.setText(sb.toString())
logger.log("三点计算弧垂:"+sb.toString())
logger.log("三点计算弧垂:"+sb.toString(),isPrint)
}
} else if (methodNum == 6) {
var pointNum = methodNum
@ -528,10 +985,10 @@ class MainActivity : AppCompatActivity() {
sb.append(calculate(span, lineAllPoint, pointNum)).append(",")
}
sagEditText.setText(sb.toString())
logger.log("六点计算弧垂:"+sb.toString())
logger.log("六点计算弧垂:"+sb.toString(),isPrint)
}
}
isPrint=0;
}
@ -563,6 +1020,16 @@ class MainActivity : AppCompatActivity() {
} else if (i == 2) {
//获取测量数据
sb.append("0F020000000011")
} else if (i == 3) {
//保存数据
sb.append("0F030000000012")
} else if (i == 4) {
//更换测量位置
if (position.equals("大号在右")) {
sb.append("0F040100000014")
} else if (position.equals("大号在左")) {
sb.append("0F040200000015")
}
}
it.writeData(ByteUtil.hex2byte(sb.toString()))
}

View File

@ -76,7 +76,7 @@ public class Coordinate {
@Override
public String toString() {
return "测点{" +
return "保存的数据--测点{" +
"导线编号=" + wireNum +
", lat=" + lat +
", lon=" + lon +

View File

@ -14,6 +14,7 @@ public class SagCalculation {
*/
public double kn3Calculation(double l1,double l2,double z1,double z2,double z3)
{
System.out.println("l1:"+l1+","+l2+","+z1+","+z2+","+z3);
double k;
k=((z1-z3)-l2/l1*(z1-z2))/(l2*l2-l1*l2);
return k*1000.0;

View File

@ -129,12 +129,14 @@ public class SensorDataBean {
@Override
public String toString() {
return "雷达{" +
return "保存的数据--雷达{" +
"lon=" + lon +
", lat=" + lat +
", h=" + h +
", 方位角=" + azimuthAngle +
", 定位模式=" + positioningMode +
", 俯仰角=" + pitchAngle +
", 横滚角=" + rollAngle +
'}';
}

View File

@ -552,6 +552,16 @@ public class ByteUtil {
}
/**
* 将十六进制字符串解析为有符号整数
* @param hexStr 十六进制字符串
* @return 有符号整数值
*/
public static int hexToSignedDecimalInt(String hexStr) {
// 使用 Long.parseLong 支持有符号解析
return (int) Long.parseLong(hexStr, 16);
}
public static void main(String[] args) {

View File

@ -1,19 +1,19 @@
package com.bonus.wrjtest.utils;
package com.bonus.wrjtest.utils
import android.content.Context
import kotlin.jvm.Volatile;
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.text.SimpleDateFormat
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*
class KotlinLogger private constructor(context: Context) {
private val appContext: Context = context.applicationContext
private var currentLogFile: File? = null
private var logStartTime: Long = 0
// 一个小时的时间间隔
private val logIntervalMillis: Long = 60 * 60 * 1000
companion object {
@Volatile
@ -26,31 +26,83 @@ class KotlinLogger private constructor(context: Context) {
}
}
fun log(message: String) {
val fileName = "app_log${getCurrentTimeAsString()}.txt"
val storageDir = File(appContext.getExternalFilesDir(null), "Logs")
if (!storageDir.exists()) {
storageDir.mkdirs()
/**
* 打印并保存日志
*
* @param message 日志内容
* @param type 控制是否保存日志1 表示保存0 表示不保存
*/
fun log(message: String, type: Int) {
if (type == 1) {
saveLogToFile(message)
} else {
println("日志保存已禁用:$message")
}
}
/**
* 将日志保存到文件
*
* @param message 日志内容
*/
private fun saveLogToFile(message: String) {
val currentTime = System.currentTimeMillis()
// 如果当前时间超过了日志文件的有效期,或者没有日志文件,则创建新的日志文件
if (currentTime - logStartTime >= logIntervalMillis || currentLogFile == null) {
createNewLogFile()
logStartTime = currentTime
}
val logFile = File(storageDir, fileName)
try {
FileOutputStream(logFile, true).use { output ->
currentLogFile?.let { logFile ->
FileOutputStream(logFile, true).use { output ->
output.write("${getCurrentDateTimeString()} - $message\n".toByteArray())
}
println("日志文件已保存至:${logFile.absolutePath}")
}
println("日志文件已保存至:${logFile.absolutePath}")
} catch (e: IOException) {
e.printStackTrace()
println("写入日志文件时出错: ${e.message}")
}
}
private fun getCurrentTimeAsString(): String {
val currentTime = LocalTime.now()
val formatter = DateTimeFormatter.ofPattern("HHmmss")
return currentTime.format(formatter)
/**
* 创建一个新的日志文件
*/
private fun createNewLogFile() {
val storageDir = File(appContext.getExternalFilesDir(null), "Logs")
if (!storageDir.exists()) {
storageDir.mkdirs()
}
val fileName = "app_log${getCurrentTimeAsString()}.txt"
currentLogFile = File(storageDir, fileName)
println("新日志文件已创建:${currentLogFile?.absolutePath}")
}
/**
* 获取当前时间的字符串表示格式为 xxxx年xx月xx日xx时xx分xx秒
*
* @return 当前时间的字符串表示
*/
private fun getCurrentTimeAsString(): String {
val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
// 注意月份从0开始需加1
val month = String.format("%02d", calendar.get(Calendar.MONTH) + 1)
val day = String.format("%02d", calendar.get(Calendar.DAY_OF_MONTH))
val hour = String.format("%02d", calendar.get(Calendar.HOUR_OF_DAY))
val minute = String.format("%02d", calendar.get(Calendar.MINUTE))
val second = String.format("%02d", calendar.get(Calendar.SECOND))
return "${year}${month}${day}${hour}${minute}${second}"
}
/**
* 获取当前日期和时间的字符串表示格式为 yyyy-MM-dd HH:mm:ss
*
* @return 当前日期和时间的字符串表示
*/
private fun getCurrentDateTimeString(): String {
val currentDateTime = Date()
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())

View File

@ -4,6 +4,7 @@ package com.bonus.wrjtest.utils;
import com.bonus.wrjtest.entity.Coordinate;
import com.bonus.wrjtest.entity.SagCalculation;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.List;
@ -28,7 +29,11 @@ public class MultipointSagMeasure {
}else{
sag = calculateThreePoint(span, list);
}
return sag;
// 使用 DecimalFormat 格式化为两位小数
DecimalFormat df = new DecimalFormat("#.00");
// 四舍五入
df.setRoundingMode(RoundingMode.HALF_UP);
return Double.parseDouble(df.format(sag));
}
public static double calculateThreePoint(double span, List<Coordinate> list) {
@ -46,6 +51,11 @@ public class MultipointSagMeasure {
double h2 = list.get(1).getH();//P2高程
// 调用calculate方法计算距离
double d1 = calculator.calculate(lat1, lon1, lat2, lon2, FB_INDEX);
// 保留三位小数的字符串形式
String formattedValue = String.format("%.3f", d1);
// 如果需要转换回 double
d1 = Double.parseDouble(formattedValue);
// 创建一个DecimalFormat对象来格式化数字
DecimalFormat df = new DecimalFormat("#.###");
// 使用format方法将距离格式化为三位有效数字的字符串
@ -56,6 +66,12 @@ public class MultipointSagMeasure {
double h3 = list.get(2).getH();//P3高程
// 调用calculate方法计算距离
double d2 = calculator.calculate(lat1, lon1, lat3, lon3, FB_INDEX);
// 保留三位小数的字符串形式
String formattedValue2 = String.format("%.3f", d2);
// 如果需要转换回 double
d2 = Double.parseDouble(formattedValue2);
// 使用format方法将距离格式化为三位有效数字的字符串
formattedDistance = df.format(d2);
// 创建SagCalculation对象

View File

@ -87,9 +87,21 @@ public class RadarMathUtil {
* @return
*/
public static Coordinate transferPoint2(RadarPointBean radarPointBean, SensorDataBean sensorDataBean) {
double radarAngle = radarPointBean.getAngle();
// double radarAngles = 0;
// if (radarPointBean.getAngle()>90){
// //无人机在上面扫描角度加上0.05
// radarAngles = radarPointBean.getAngle()+0.05;
// radarPointBean.setAngle(radarAngles);
// }else if (radarPointBean.getAngle()<90){
// //无人机在下面扫描角度减去0.05
// radarAngles = radarPointBean.getAngle()-0.05;
// radarPointBean.setAngle(radarAngles);
// }
double radarAngle = radarPointBean.getAngle()-sensorDataBean.getPitchAngle();
double dis = radarPointBean.getDistance();
double dis2=dis;
dis = dis * Math.sin(Math.toRadians(radarAngle));
double lonGps = sensorDataBean.getLon();
double latGps = sensorDataBean.getLat();
double hGps = sensorDataBean.getH();
@ -119,7 +131,8 @@ public class RadarMathUtil {
// }else if(radarAngle<90){
// radarAngle = 90 - radarAngle;
// }
double h2 = hRadar + dis * MathUtils.cos(radarAngle - sensorDataBean.getRollAngle());
// double h2 = hRadar + dis * MathUtils.cos(radarAngle - sensorDataBean.getPitchAngle());
double h2 = hRadar + dis2 * MathUtils.cos(radarAngle - 0);
System.out.printf("ABC中心雷达点lat%.8f; lon%.8f; 高度:%.2f; 方位角:%.2f\n", latRadar, lonRadar, hRadar,azimuthAngle);
System.out.printf("ABC测量点lat%.8f; lon%.8f; 高度:%.2f\n", lat2, lon2, h2);
return new Coordinate(lon2,lat2,h2);

View File

@ -64,7 +64,7 @@
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="12sp"
android:text="6.切换方法"/>
android:text="6.测量位置"/>
<Button
android:id="@+id/clear"
@ -236,22 +236,61 @@
android:layout_height="wrap_content"
>
<TextView
<LinearLayout
android:orientation="horizontal"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定位模式:"
android:textSize="12sp"
android:layout_gravity="center_vertical"/>
<EditText
<EditText
android:id="@+id/gpsMode"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="12sp"
android:inputType="text"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测量位置:"
android:textSize="12sp"
android:layout_gravity="center_vertical"/>
<EditText
android:id="@+id/position"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="12sp"
android:text="大号在右"
android:inputType="none"
android:focusable="false"
android:clickable="false"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
@ -305,29 +344,63 @@
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
<LinearLayout
android:orientation="horizontal"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="航向角:"
android:textSize="12sp"
android:layout_gravity="center_vertical"/>
<EditText
<EditText
android:id="@+id/azimuthAngle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="12sp"
android:inputType="text"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="档距:"
android:textSize="12sp"
android:layout_gravity="center_vertical"/>
<EditText
android:id="@+id/span"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="12sp"
android:text="48.209"
android:inputType="text"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"