diff --git a/app/src/main/java/com/casic/detector/common/extensions/Double.kt b/app/src/main/java/com/casic/detector/common/extensions/Double.kt index a91efd0..cc918fa 100644 --- a/app/src/main/java/com/casic/detector/common/extensions/Double.kt +++ b/app/src/main/java/com/casic/detector/common/extensions/Double.kt @@ -1,5 +1,7 @@ package com.casic.detector.common.extensions +import kotlin.math.floor + /** * 经纬度转度分格式,ddmm.mmmm * @@ -18,4 +20,15 @@ val mm = "%.4f".format(temp * 60) return "$degree$mm" +} + +/** + * 经纬度转度分秒 + * */ +fun Double.toDegree(): String { + val degrees = floor(this).toInt() + val minutes = ((this - degrees) * 60).toInt() + val seconds = ((this - degrees) * 60 - minutes) * 60 + val formattedSeconds = "%.3f".format(seconds) + return "$degrees°$minutes'$formattedSeconds\"" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/extensions/Double.kt b/app/src/main/java/com/casic/detector/common/extensions/Double.kt index a91efd0..cc918fa 100644 --- a/app/src/main/java/com/casic/detector/common/extensions/Double.kt +++ b/app/src/main/java/com/casic/detector/common/extensions/Double.kt @@ -1,5 +1,7 @@ package com.casic.detector.common.extensions +import kotlin.math.floor + /** * 经纬度转度分格式,ddmm.mmmm * @@ -18,4 +20,15 @@ val mm = "%.4f".format(temp * 60) return "$degree$mm" +} + +/** + * 经纬度转度分秒 + * */ +fun Double.toDegree(): String { + val degrees = floor(this).toInt() + val minutes = ((this - degrees) * 60).toInt() + val seconds = ((this - degrees) * 60 - minutes) * 60 + val formattedSeconds = "%.3f".format(seconds) + return "$degrees°$minutes'$formattedSeconds\"" } \ No newline at end of file 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 index 2867377..5131efa 100644 --- a/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerAuditActivity.kt @@ -1,9 +1,5 @@ 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 @@ -11,20 +7,13 @@ 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 @@ -36,7 +25,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.io.OutputStream +import java.util.Timer +import java.util.TimerTask import kotlin.math.atan2 class SearchMarkerAuditActivity : KotlinBaseActivity(), @@ -44,65 +34,19 @@ 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() - } + private lateinit var searchSignalEnergyTimer: Timer 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) + val fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1) //点位渲染,每次定位都计算当前位置与符合条件的点距离 locationTool.getCurrentLocation(false, object : OnGetLocationListener { @@ -112,6 +56,13 @@ } } }) + + searchSignalEnergyTimer = Timer() + searchSignalEnergyTimer.schedule(object : TimerTask() { + override fun run() { + soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) + } + }, 0, 100) } override fun initEvent() { @@ -140,16 +91,14 @@ LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude) ) val formatDistance = "%.2f".format(distance).toFloat() - markerPoints.add(MarkerDistanceData(it.markerId, formatDistance)) + val angle = atan2( + (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude) + ) + Math.PI + val formatAngle = "%.2f".format(angle).toDouble() - 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)) - } + dataPoints.add( + RadarScanView.DataPoint(it.markerId, formatAngle, formatDistance) + ) } withContext(Dispatchers.Main) { binding.radarScanView.renderPointData(dataPoints, @@ -159,6 +108,7 @@ binding.distanceValueView.text = "大于5.5m" binding.distancePgBar.progress = 100 } else { + nearestMarkerId = point.markerId binding.distanceValueView.text = "${point.distance}m" val progress = if (point.distance > LocaleConstant.MAX_DISTANCE) { 100 @@ -231,8 +181,8 @@ override fun onDestroy() { super.onDestroy() - stopSearchMarker() + searchSignalEnergyTimer.cancel() + soundPool.release() locationTool.stopLocation() - unbindService(serviceConnection) } } \ No newline at end of file