diff --git a/app/src/main/java/com/casic/detector/common/extensions/String.kt b/app/src/main/java/com/casic/detector/common/extensions/String.kt index 67452a4..c6d8862 100644 --- a/app/src/main/java/com/casic/detector/common/extensions/String.kt +++ b/app/src/main/java/com/casic/detector/common/extensions/String.kt @@ -10,6 +10,7 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.util.Locale /** * String扩展方法 @@ -136,4 +137,14 @@ fun String.isNumber(): Boolean { val regex = Regex("[-+]?\\d+(\\.\\d+)?") return this.matches(regex) +} + +fun String.calculateCheckDigit(): String { + var checksum = 0 + for (i in 1 until this.length - 3) { + checksum = checksum xor this[i].toInt() + } + + val hexChecksum = checksum.toString(16).uppercase(Locale.getDefault()) + return if (hexChecksum.length == 1) "0$hexChecksum" else hexChecksum } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/extensions/String.kt b/app/src/main/java/com/casic/detector/common/extensions/String.kt index 67452a4..c6d8862 100644 --- a/app/src/main/java/com/casic/detector/common/extensions/String.kt +++ b/app/src/main/java/com/casic/detector/common/extensions/String.kt @@ -10,6 +10,7 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.util.Locale /** * String扩展方法 @@ -136,4 +137,14 @@ fun String.isNumber(): Boolean { val regex = Regex("[-+]?\\d+(\\.\\d+)?") return this.matches(regex) +} + +fun String.calculateCheckDigit(): String { + var checksum = 0 + for (i in 1 until this.length - 3) { + checksum = checksum xor this[i].toInt() + } + + val hexChecksum = checksum.toString(16).uppercase(Locale.getDefault()) + return if (hexChecksum.length == 1) "0$hexChecksum" else hexChecksum } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt index 713fd92..2a873ca 100644 --- a/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt @@ -32,6 +32,7 @@ const val ACS = "Application_Access_Secret" const val RTK_SERVER = "RTK_SERVER" const val RTK_PORT = "RTK_PORT" + const val SATELLITE_EFFECTIVE_COUNT = "satelliteCount" val POPUP_TITLES = arrayOf( "更新数据", "下载工单", "关于软件", "事件上报", "标识器补全", "差分定位服务" diff --git a/app/src/main/java/com/casic/detector/common/extensions/String.kt b/app/src/main/java/com/casic/detector/common/extensions/String.kt index 67452a4..c6d8862 100644 --- a/app/src/main/java/com/casic/detector/common/extensions/String.kt +++ b/app/src/main/java/com/casic/detector/common/extensions/String.kt @@ -10,6 +10,7 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.util.Locale /** * String扩展方法 @@ -136,4 +137,14 @@ fun String.isNumber(): Boolean { val regex = Regex("[-+]?\\d+(\\.\\d+)?") return this.matches(regex) +} + +fun String.calculateCheckDigit(): String { + var checksum = 0 + for (i in 1 until this.length - 3) { + checksum = checksum xor this[i].toInt() + } + + val hexChecksum = checksum.toString(16).uppercase(Locale.getDefault()) + return if (hexChecksum.length == 1) "0$hexChecksum" else hexChecksum } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt index 713fd92..2a873ca 100644 --- a/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/detector/common/utils/LocaleConstant.kt @@ -32,6 +32,7 @@ const val ACS = "Application_Access_Secret" const val RTK_SERVER = "RTK_SERVER" const val RTK_PORT = "RTK_PORT" + const val SATELLITE_EFFECTIVE_COUNT = "satelliteCount" val POPUP_TITLES = arrayOf( "更新数据", "下载工单", "关于软件", "事件上报", "标识器补全", "差分定位服务" diff --git a/app/src/main/java/com/casic/detector/common/utils/RTKLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RTKLocationTool.kt new file mode 100644 index 0000000..91dca6a --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RTKLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RTKLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file