diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d106ce1..8cb72ff 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -62,6 +62,7 @@
+
+
(flag)
+// navigatePageTo(flag)
+ //TODO 审计版本
+ navigatePageTo()
}
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d106ce1..8cb72ff 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -62,6 +62,7 @@
+
(flag)
+// navigatePageTo(flag)
+ //TODO 审计版本
+ navigatePageTo()
}
}
diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt
new file mode 100644
index 0000000..2867377
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt
@@ -0,0 +1,238 @@
+package com.casic.detector.common.view
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.hardware.Sensor
+import android.hardware.SensorEvent
+import android.hardware.SensorEventListener
+import android.hardware.SensorManager
+import android.media.AudioAttributes
+import android.media.SoundPool
+import android.os.Bundle
+import android.os.IBinder
+import android.util.Log
+import androidx.lifecycle.lifecycleScope
+import com.amap.api.location.AMapLocation
+import com.amap.api.maps.AMapUtils
+import com.amap.api.maps.model.LatLng
+import com.casic.detector.common.R
+import com.casic.detector.common.callback.OnGetLocationListener
+import com.casic.detector.common.callback.OnSerialPortDataListener
+import com.casic.detector.common.databinding.ActivitySearchMarkerAuditBinding
+import com.casic.detector.common.extensions.handleSignalStrength
+import com.casic.detector.common.extensions.hexToString
+import com.casic.detector.common.model.MarkerDistanceData
+import com.casic.detector.common.service.SerialPortService
+import com.casic.detector.common.utils.DataBaseManager
+import com.casic.detector.common.utils.LocaleConstant
+import com.casic.detector.common.utils.LocationTool
+import com.casic.detector.common.widgets.RadarScanView
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.getSystemService
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.toJson
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.io.OutputStream
+import kotlin.math.atan2
+
+class SearchMarkerAuditActivity : KotlinBaseActivity(),
+ SensorEventListener {
+
+ private val kTag = "SearchMarkerActivity"
+ private val locationTool by lazy { LocationTool(this) }
+ private val markerPoints by lazy { ArrayList() }
+ private val sensorManager by lazy { getSystemService() }
+ private val attr = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM)
+ .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build()
+ private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build()
+ private val rotationMatrix = FloatArray(9)//旋转矩阵缓存
+ private val valueArray = FloatArray(3)//方位角数值
+ private var slowSoundResourceId = 0
+ private var fastSoundResourceId = 0
+ private var nearestMarkerId = ""//探测不到标识器的时候计算出来的最近的标识器ID
+ private var gravity: FloatArray? = null
+ private var geomagnetic: FloatArray? = null
+ private var serialPortService: SerialPortService? = null
+
+ private val serviceConnection = object : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) {
+ if (iBinder is SerialPortService.ServiceBinder) {
+ serialPortService = iBinder.getSerialPortService()
+ Log.d(kTag, "onServiceConnected: 服务已绑定")
+ serialPortService?.openSerialPort(object : OnSerialPortDataListener {
+ override fun write(outStream: OutputStream) {
+ outStream.write('6'.code)
+ outStream.flush()
+ }
+
+ override fun onDataReceived(buffer: ByteArray) {
+ if (buffer.first() == 78.toByte()) {
+ val energy = buffer.handleSignalStrength().take(10).hexToString()
+ val signalEnergy = energy.substring(1).toInt()
+ if (signalEnergy >= 3000) {
+ soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f)
+ } else {
+ soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f)
+ }
+ }
+ }
+ })
+ }
+ }
+
+ override fun onServiceDisconnected(name: ComponentName?) {
+
+ }
+ }
+
+
+ private fun stopSearchMarker() {
+ soundPool.autoPause()
+ serialPortService?.closeSerialPort()
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //绑定串口通信服务
+ Intent(this, SerialPortService::class.java).also {
+ bindService(it, serviceConnection, Context.BIND_AUTO_CREATE)
+ }
+
+ slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1)
+ fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1)
+
+ //点位渲染,每次定位都计算当前位置与符合条件的点距离
+ locationTool.getCurrentLocation(false, object : OnGetLocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ location?.apply {
+ renderDataPoint(this)
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+ binding.markerInfoButton.setOnClickListener {
+ //查库
+ val result = DataBaseManager.get.queryMarkerById(nearestMarkerId)
+ if (result.isNotEmpty()) {
+ navigatePageTo(result.first().toJson())
+ } else {
+ navigatePageTo(nearestMarkerId)
+ }
+ }
+ }
+
+ /**
+ * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿。默认2s计算一次
+ * @param location 定位点(RTK获取)
+ * */
+ private fun renderDataPoint(location: AMapLocation) {
+ val longitude = location.longitude
+ val latitude = location.latitude
+ lifecycleScope.launch(Dispatchers.IO) {
+ val dataPoints = ArrayList()
+ DataBaseManager.get.loadMarkers().forEach {
+ val distance = AMapUtils.calculateLineDistance(
+ LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude)
+ )
+ val formatDistance = "%.2f".format(distance).toFloat()
+ markerPoints.add(MarkerDistanceData(it.markerId, formatDistance))
+
+ if (formatDistance <= LocaleConstant.MAX_DISTANCE) {
+ val angle = atan2(
+ (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude)
+ ) + Math.PI
+ val formatAngle = "%.2f".format(angle).toDouble()
+
+ dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance))
+ }
+ }
+ withContext(Dispatchers.Main) {
+ binding.radarScanView.renderPointData(dataPoints,
+ object : RadarScanView.OnGetNearestPointCallback {
+ override fun getNearestPoint(point: RadarScanView.DataPoint?) {
+ if (point == null) {
+ binding.distanceValueView.text = "大于5.5m"
+ binding.distancePgBar.progress = 100
+ } else {
+ binding.distanceValueView.text = "${point.distance}m"
+ val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) {
+ 100
+ } else {
+ (point.distance / LocaleConstant.MAX_DISTANCE) * 100
+ }
+ binding.distancePgBar.progress = progress.toInt()
+ }
+ }
+ }
+ )
+ }
+ }
+ }
+
+ override fun initViewBinding(): ActivitySearchMarkerAuditBinding {
+ return ActivitySearchMarkerAuditBinding.inflate(layoutInflater)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun onResume() {
+ super.onResume()
+ //注册加速度传感器监听
+ val accelerometer = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
+ sensorManager?.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL)
+
+ //注册磁场传感器监听
+ val magnetic = sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
+ sensorManager?.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL)
+ }
+
+ override fun onPause() {
+ super.onPause()
+ sensorManager?.unregisterListener(this)
+ }
+
+ override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
+ //精度发生变化时触发
+ }
+
+ override fun onSensorChanged(event: SensorEvent?) {
+ //值发生变化时触发
+ val type = event?.sensor?.type
+
+ if (type == Sensor.TYPE_ACCELEROMETER) {
+ gravity = event.values
+ } else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
+ geomagnetic = event.values
+ }
+
+ if (gravity == null || geomagnetic == null) {
+ return
+ }
+
+ if (SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomagnetic)) {
+ SensorManager.getOrientation(rotationMatrix, valueArray)
+
+ val degree = ((360f + valueArray[0] * 180f / Math.PI) % 360).toInt()
+ //更新罗盘角度
+ binding.radarScanView.setDegreeValue(degree)
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ stopSearchMarker()
+ locationTool.stopLocation()
+ unbindService(serviceConnection)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d106ce1..8cb72ff 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -62,6 +62,7 @@
+
(flag)
+// navigatePageTo(flag)
+ //TODO 审计版本
+ navigatePageTo()
}
}
diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt
new file mode 100644
index 0000000..2867377
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt
@@ -0,0 +1,238 @@
+package com.casic.detector.common.view
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.hardware.Sensor
+import android.hardware.SensorEvent
+import android.hardware.SensorEventListener
+import android.hardware.SensorManager
+import android.media.AudioAttributes
+import android.media.SoundPool
+import android.os.Bundle
+import android.os.IBinder
+import android.util.Log
+import androidx.lifecycle.lifecycleScope
+import com.amap.api.location.AMapLocation
+import com.amap.api.maps.AMapUtils
+import com.amap.api.maps.model.LatLng
+import com.casic.detector.common.R
+import com.casic.detector.common.callback.OnGetLocationListener
+import com.casic.detector.common.callback.OnSerialPortDataListener
+import com.casic.detector.common.databinding.ActivitySearchMarkerAuditBinding
+import com.casic.detector.common.extensions.handleSignalStrength
+import com.casic.detector.common.extensions.hexToString
+import com.casic.detector.common.model.MarkerDistanceData
+import com.casic.detector.common.service.SerialPortService
+import com.casic.detector.common.utils.DataBaseManager
+import com.casic.detector.common.utils.LocaleConstant
+import com.casic.detector.common.utils.LocationTool
+import com.casic.detector.common.widgets.RadarScanView
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.getSystemService
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.toJson
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.io.OutputStream
+import kotlin.math.atan2
+
+class SearchMarkerAuditActivity : KotlinBaseActivity(),
+ SensorEventListener {
+
+ private val kTag = "SearchMarkerActivity"
+ private val locationTool by lazy { LocationTool(this) }
+ private val markerPoints by lazy { ArrayList() }
+ private val sensorManager by lazy { getSystemService() }
+ private val attr = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM)
+ .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build()
+ private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build()
+ private val rotationMatrix = FloatArray(9)//旋转矩阵缓存
+ private val valueArray = FloatArray(3)//方位角数值
+ private var slowSoundResourceId = 0
+ private var fastSoundResourceId = 0
+ private var nearestMarkerId = ""//探测不到标识器的时候计算出来的最近的标识器ID
+ private var gravity: FloatArray? = null
+ private var geomagnetic: FloatArray? = null
+ private var serialPortService: SerialPortService? = null
+
+ private val serviceConnection = object : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) {
+ if (iBinder is SerialPortService.ServiceBinder) {
+ serialPortService = iBinder.getSerialPortService()
+ Log.d(kTag, "onServiceConnected: 服务已绑定")
+ serialPortService?.openSerialPort(object : OnSerialPortDataListener {
+ override fun write(outStream: OutputStream) {
+ outStream.write('6'.code)
+ outStream.flush()
+ }
+
+ override fun onDataReceived(buffer: ByteArray) {
+ if (buffer.first() == 78.toByte()) {
+ val energy = buffer.handleSignalStrength().take(10).hexToString()
+ val signalEnergy = energy.substring(1).toInt()
+ if (signalEnergy >= 3000) {
+ soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f)
+ } else {
+ soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f)
+ }
+ }
+ }
+ })
+ }
+ }
+
+ override fun onServiceDisconnected(name: ComponentName?) {
+
+ }
+ }
+
+
+ private fun stopSearchMarker() {
+ soundPool.autoPause()
+ serialPortService?.closeSerialPort()
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //绑定串口通信服务
+ Intent(this, SerialPortService::class.java).also {
+ bindService(it, serviceConnection, Context.BIND_AUTO_CREATE)
+ }
+
+ slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1)
+ fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1)
+
+ //点位渲染,每次定位都计算当前位置与符合条件的点距离
+ locationTool.getCurrentLocation(false, object : OnGetLocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ location?.apply {
+ renderDataPoint(this)
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+ binding.markerInfoButton.setOnClickListener {
+ //查库
+ val result = DataBaseManager.get.queryMarkerById(nearestMarkerId)
+ if (result.isNotEmpty()) {
+ navigatePageTo(result.first().toJson())
+ } else {
+ navigatePageTo(nearestMarkerId)
+ }
+ }
+ }
+
+ /**
+ * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿。默认2s计算一次
+ * @param location 定位点(RTK获取)
+ * */
+ private fun renderDataPoint(location: AMapLocation) {
+ val longitude = location.longitude
+ val latitude = location.latitude
+ lifecycleScope.launch(Dispatchers.IO) {
+ val dataPoints = ArrayList()
+ DataBaseManager.get.loadMarkers().forEach {
+ val distance = AMapUtils.calculateLineDistance(
+ LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude)
+ )
+ val formatDistance = "%.2f".format(distance).toFloat()
+ markerPoints.add(MarkerDistanceData(it.markerId, formatDistance))
+
+ if (formatDistance <= LocaleConstant.MAX_DISTANCE) {
+ val angle = atan2(
+ (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude)
+ ) + Math.PI
+ val formatAngle = "%.2f".format(angle).toDouble()
+
+ dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance))
+ }
+ }
+ withContext(Dispatchers.Main) {
+ binding.radarScanView.renderPointData(dataPoints,
+ object : RadarScanView.OnGetNearestPointCallback {
+ override fun getNearestPoint(point: RadarScanView.DataPoint?) {
+ if (point == null) {
+ binding.distanceValueView.text = "大于5.5m"
+ binding.distancePgBar.progress = 100
+ } else {
+ binding.distanceValueView.text = "${point.distance}m"
+ val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) {
+ 100
+ } else {
+ (point.distance / LocaleConstant.MAX_DISTANCE) * 100
+ }
+ binding.distancePgBar.progress = progress.toInt()
+ }
+ }
+ }
+ )
+ }
+ }
+ }
+
+ override fun initViewBinding(): ActivitySearchMarkerAuditBinding {
+ return ActivitySearchMarkerAuditBinding.inflate(layoutInflater)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun onResume() {
+ super.onResume()
+ //注册加速度传感器监听
+ val accelerometer = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
+ sensorManager?.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL)
+
+ //注册磁场传感器监听
+ val magnetic = sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
+ sensorManager?.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL)
+ }
+
+ override fun onPause() {
+ super.onPause()
+ sensorManager?.unregisterListener(this)
+ }
+
+ override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
+ //精度发生变化时触发
+ }
+
+ override fun onSensorChanged(event: SensorEvent?) {
+ //值发生变化时触发
+ val type = event?.sensor?.type
+
+ if (type == Sensor.TYPE_ACCELEROMETER) {
+ gravity = event.values
+ } else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
+ geomagnetic = event.values
+ }
+
+ if (gravity == null || geomagnetic == null) {
+ return
+ }
+
+ if (SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomagnetic)) {
+ SensorManager.getOrientation(rotationMatrix, valueArray)
+
+ val degree = ((360f + valueArray[0] * 180f / Math.PI) % 360).toInt()
+ //更新罗盘角度
+ binding.radarScanView.setDegreeValue(degree)
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ stopSearchMarker()
+ locationTool.stopLocation()
+ unbindService(serviceConnection)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_new_object_detail.xml b/app/src/main/res/layout/activity_new_object_detail.xml
index 1a8415f..1df39e3 100644
--- a/app/src/main/res/layout/activity_new_object_detail.xml
+++ b/app/src/main/res/layout/activity_new_object_detail.xml
@@ -60,7 +60,7 @@
+ android:text="未登记" />
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d106ce1..8cb72ff 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -62,6 +62,7 @@
+
(flag)
+// navigatePageTo(flag)
+ //TODO 审计版本
+ navigatePageTo()
}
}
diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt
new file mode 100644
index 0000000..2867377
--- /dev/null
+++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt
@@ -0,0 +1,238 @@
+package com.casic.detector.common.view
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.hardware.Sensor
+import android.hardware.SensorEvent
+import android.hardware.SensorEventListener
+import android.hardware.SensorManager
+import android.media.AudioAttributes
+import android.media.SoundPool
+import android.os.Bundle
+import android.os.IBinder
+import android.util.Log
+import androidx.lifecycle.lifecycleScope
+import com.amap.api.location.AMapLocation
+import com.amap.api.maps.AMapUtils
+import com.amap.api.maps.model.LatLng
+import com.casic.detector.common.R
+import com.casic.detector.common.callback.OnGetLocationListener
+import com.casic.detector.common.callback.OnSerialPortDataListener
+import com.casic.detector.common.databinding.ActivitySearchMarkerAuditBinding
+import com.casic.detector.common.extensions.handleSignalStrength
+import com.casic.detector.common.extensions.hexToString
+import com.casic.detector.common.model.MarkerDistanceData
+import com.casic.detector.common.service.SerialPortService
+import com.casic.detector.common.utils.DataBaseManager
+import com.casic.detector.common.utils.LocaleConstant
+import com.casic.detector.common.utils.LocationTool
+import com.casic.detector.common.widgets.RadarScanView
+import com.pengxh.kt.lite.base.KotlinBaseActivity
+import com.pengxh.kt.lite.extensions.getSystemService
+import com.pengxh.kt.lite.extensions.navigatePageTo
+import com.pengxh.kt.lite.extensions.toJson
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.io.OutputStream
+import kotlin.math.atan2
+
+class SearchMarkerAuditActivity : KotlinBaseActivity(),
+ SensorEventListener {
+
+ private val kTag = "SearchMarkerActivity"
+ private val locationTool by lazy { LocationTool(this) }
+ private val markerPoints by lazy { ArrayList() }
+ private val sensorManager by lazy { getSystemService() }
+ private val attr = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM)
+ .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build()
+ private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes(attr).build()
+ private val rotationMatrix = FloatArray(9)//旋转矩阵缓存
+ private val valueArray = FloatArray(3)//方位角数值
+ private var slowSoundResourceId = 0
+ private var fastSoundResourceId = 0
+ private var nearestMarkerId = ""//探测不到标识器的时候计算出来的最近的标识器ID
+ private var gravity: FloatArray? = null
+ private var geomagnetic: FloatArray? = null
+ private var serialPortService: SerialPortService? = null
+
+ private val serviceConnection = object : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) {
+ if (iBinder is SerialPortService.ServiceBinder) {
+ serialPortService = iBinder.getSerialPortService()
+ Log.d(kTag, "onServiceConnected: 服务已绑定")
+ serialPortService?.openSerialPort(object : OnSerialPortDataListener {
+ override fun write(outStream: OutputStream) {
+ outStream.write('6'.code)
+ outStream.flush()
+ }
+
+ override fun onDataReceived(buffer: ByteArray) {
+ if (buffer.first() == 78.toByte()) {
+ val energy = buffer.handleSignalStrength().take(10).hexToString()
+ val signalEnergy = energy.substring(1).toInt()
+ if (signalEnergy >= 3000) {
+ soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f)
+ } else {
+ soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f)
+ }
+ }
+ }
+ })
+ }
+ }
+
+ override fun onServiceDisconnected(name: ComponentName?) {
+
+ }
+ }
+
+
+ private fun stopSearchMarker() {
+ soundPool.autoPause()
+ serialPortService?.closeSerialPort()
+ }
+
+ override fun initOnCreate(savedInstanceState: Bundle?) {
+ //绑定串口通信服务
+ Intent(this, SerialPortService::class.java).also {
+ bindService(it, serviceConnection, Context.BIND_AUTO_CREATE)
+ }
+
+ slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1)
+ fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1)
+
+ //点位渲染,每次定位都计算当前位置与符合条件的点距离
+ locationTool.getCurrentLocation(false, object : OnGetLocationListener {
+ override fun onAMapLocationGet(location: AMapLocation?) {
+ location?.apply {
+ renderDataPoint(this)
+ }
+ }
+ })
+ }
+
+ override fun initEvent() {
+ binding.markerInfoButton.setOnClickListener {
+ //查库
+ val result = DataBaseManager.get.queryMarkerById(nearestMarkerId)
+ if (result.isNotEmpty()) {
+ navigatePageTo(result.first().toJson())
+ } else {
+ navigatePageTo(nearestMarkerId)
+ }
+ }
+ }
+
+ /**
+ * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿。默认2s计算一次
+ * @param location 定位点(RTK获取)
+ * */
+ private fun renderDataPoint(location: AMapLocation) {
+ val longitude = location.longitude
+ val latitude = location.latitude
+ lifecycleScope.launch(Dispatchers.IO) {
+ val dataPoints = ArrayList()
+ DataBaseManager.get.loadMarkers().forEach {
+ val distance = AMapUtils.calculateLineDistance(
+ LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude)
+ )
+ val formatDistance = "%.2f".format(distance).toFloat()
+ markerPoints.add(MarkerDistanceData(it.markerId, formatDistance))
+
+ if (formatDistance <= LocaleConstant.MAX_DISTANCE) {
+ val angle = atan2(
+ (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude)
+ ) + Math.PI
+ val formatAngle = "%.2f".format(angle).toDouble()
+
+ dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance))
+ }
+ }
+ withContext(Dispatchers.Main) {
+ binding.radarScanView.renderPointData(dataPoints,
+ object : RadarScanView.OnGetNearestPointCallback {
+ override fun getNearestPoint(point: RadarScanView.DataPoint?) {
+ if (point == null) {
+ binding.distanceValueView.text = "大于5.5m"
+ binding.distancePgBar.progress = 100
+ } else {
+ binding.distanceValueView.text = "${point.distance}m"
+ val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) {
+ 100
+ } else {
+ (point.distance / LocaleConstant.MAX_DISTANCE) * 100
+ }
+ binding.distancePgBar.progress = progress.toInt()
+ }
+ }
+ }
+ )
+ }
+ }
+ }
+
+ override fun initViewBinding(): ActivitySearchMarkerAuditBinding {
+ return ActivitySearchMarkerAuditBinding.inflate(layoutInflater)
+ }
+
+ override fun observeRequestState() {
+
+ }
+
+ override fun setupTopBarLayout() {
+
+ }
+
+ override fun onResume() {
+ super.onResume()
+ //注册加速度传感器监听
+ val accelerometer = sensorManager?.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
+ sensorManager?.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL)
+
+ //注册磁场传感器监听
+ val magnetic = sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
+ sensorManager?.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL)
+ }
+
+ override fun onPause() {
+ super.onPause()
+ sensorManager?.unregisterListener(this)
+ }
+
+ override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
+ //精度发生变化时触发
+ }
+
+ override fun onSensorChanged(event: SensorEvent?) {
+ //值发生变化时触发
+ val type = event?.sensor?.type
+
+ if (type == Sensor.TYPE_ACCELEROMETER) {
+ gravity = event.values
+ } else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
+ geomagnetic = event.values
+ }
+
+ if (gravity == null || geomagnetic == null) {
+ return
+ }
+
+ if (SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomagnetic)) {
+ SensorManager.getOrientation(rotationMatrix, valueArray)
+
+ val degree = ((360f + valueArray[0] * 180f / Math.PI) % 360).toInt()
+ //更新罗盘角度
+ binding.radarScanView.setDegreeValue(degree)
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ stopSearchMarker()
+ locationTool.stopLocation()
+ unbindService(serviceConnection)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_new_object_detail.xml b/app/src/main/res/layout/activity_new_object_detail.xml
index 1a8415f..1df39e3 100644
--- a/app/src/main/res/layout/activity_new_object_detail.xml
+++ b/app/src/main/res/layout/activity_new_object_detail.xml
@@ -60,7 +60,7 @@
+ android:text="未登记" />
diff --git a/app/src/main/res/layout/activity_search_marker_audit.xml b/app/src/main/res/layout/activity_search_marker_audit.xml
new file mode 100644
index 0000000..ff93885
--- /dev/null
+++ b/app/src/main/res/layout/activity_search_marker_audit.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file