diff --git a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt index 7e627a4..3b1442c 100644 --- a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt @@ -102,10 +102,10 @@ return taskBeanDao.queryBuilder().where(TaskBeanDao.Properties.TaskId.eq(taskId)).list() } - fun queryTaskLabelByIdAndState(identifierId: String, state: String): TaskBean? { + fun queryTaskLabelByIdAndState(markerId: String, state: String): TaskBean? { return taskBeanDao.queryBuilder() .where( - TaskBeanDao.Properties.MarkerId.eq(identifierId), + TaskBeanDao.Properties.MarkerId.eq(markerId), TaskBeanDao.Properties.State.eq(state) ).list().firstOrNull() } diff --git a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt index 7e627a4..3b1442c 100644 --- a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt @@ -102,10 +102,10 @@ return taskBeanDao.queryBuilder().where(TaskBeanDao.Properties.TaskId.eq(taskId)).list() } - fun queryTaskLabelByIdAndState(identifierId: String, state: String): TaskBean? { + fun queryTaskLabelByIdAndState(markerId: String, state: String): TaskBean? { return taskBeanDao.queryBuilder() .where( - TaskBeanDao.Properties.MarkerId.eq(identifierId), + TaskBeanDao.Properties.MarkerId.eq(markerId), TaskBeanDao.Properties.State.eq(state) ).list().firstOrNull() } diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt index c6c8885..0e95a77 100644 --- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt @@ -14,6 +14,8 @@ const val PERMISSIONS_CODE = 999 const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 + const val INSTALL_MARKER_CODE = 2024010701 + const val SEARCH_MARKER_CODE = 2024010702 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" @@ -29,7 +31,16 @@ val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全") var POINT_TYPE_ARRAY = arrayOf("管线", "管线附属物", "管线特征管点", "交叉穿越点") - var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注") + var SPINNER_ARRAY = arrayOf( + "标识器ID", + "所属区域", + "所属线路", + "所属道路", + "权属单位", + "安装部门", + "安装时间", + "备注" + ) var PIPE_MATERIAL_ARRAY = arrayOf("铸铁", "塑料") var DOWN_PIPE_TYPE_ARRAY = arrayOf("热力", "燃气", "供水", "电力", "通信") var BURY_METHOD_ARRAY = arrayOf("直埋", "圆管", "管块", "管沟", "架空") diff --git a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt index 7e627a4..3b1442c 100644 --- a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt @@ -102,10 +102,10 @@ return taskBeanDao.queryBuilder().where(TaskBeanDao.Properties.TaskId.eq(taskId)).list() } - fun queryTaskLabelByIdAndState(identifierId: String, state: String): TaskBean? { + fun queryTaskLabelByIdAndState(markerId: String, state: String): TaskBean? { return taskBeanDao.queryBuilder() .where( - TaskBeanDao.Properties.MarkerId.eq(identifierId), + TaskBeanDao.Properties.MarkerId.eq(markerId), TaskBeanDao.Properties.State.eq(state) ).list().firstOrNull() } diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt index c6c8885..0e95a77 100644 --- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt @@ -14,6 +14,8 @@ const val PERMISSIONS_CODE = 999 const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 + const val INSTALL_MARKER_CODE = 2024010701 + const val SEARCH_MARKER_CODE = 2024010702 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" @@ -29,7 +31,16 @@ val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全") var POINT_TYPE_ARRAY = arrayOf("管线", "管线附属物", "管线特征管点", "交叉穿越点") - var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注") + var SPINNER_ARRAY = arrayOf( + "标识器ID", + "所属区域", + "所属线路", + "所属道路", + "权属单位", + "安装部门", + "安装时间", + "备注" + ) var PIPE_MATERIAL_ARRAY = arrayOf("铸铁", "塑料") var DOWN_PIPE_TYPE_ARRAY = arrayOf("热力", "燃气", "供水", "电力", "通信") var BURY_METHOD_ARRAY = arrayOf("直埋", "圆管", "管块", "管沟", "架空") diff --git a/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt b/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt index c235471..904719b 100644 --- a/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt +++ b/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt @@ -15,11 +15,11 @@ private val kTag = "SerialPortManager" private val registry = LifecycleRegistry(this) + private val serialPorts = BaseApplication.get().getSerialPorts() init { //读取串口数据 lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() val buffer = ByteArray(72) var size: Int serialPorts?.forEach { @@ -46,7 +46,6 @@ * */ fun detectMarker() { lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() serialPorts?.apply { while (size >= 1) { val outStream = this[0].outputStream @@ -72,7 +71,6 @@ * */ fun detectDepth(markerTag: Char) { lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() serialPorts?.apply { val outStream = this[0].outputStream try { @@ -91,7 +89,6 @@ * */ fun searchMarkerSignal() { lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() serialPorts?.apply { val outStream = this[0].outputStream try { diff --git a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt index 7e627a4..3b1442c 100644 --- a/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/detector/utils/DataBaseManager.kt @@ -102,10 +102,10 @@ return taskBeanDao.queryBuilder().where(TaskBeanDao.Properties.TaskId.eq(taskId)).list() } - fun queryTaskLabelByIdAndState(identifierId: String, state: String): TaskBean? { + fun queryTaskLabelByIdAndState(markerId: String, state: String): TaskBean? { return taskBeanDao.queryBuilder() .where( - TaskBeanDao.Properties.MarkerId.eq(identifierId), + TaskBeanDao.Properties.MarkerId.eq(markerId), TaskBeanDao.Properties.State.eq(state) ).list().firstOrNull() } diff --git a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt index c6c8885..0e95a77 100644 --- a/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/detector/utils/LocaleConstant.kt @@ -14,6 +14,8 @@ const val PERMISSIONS_CODE = 999 const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 + const val INSTALL_MARKER_CODE = 2024010701 + const val SEARCH_MARKER_CODE = 2024010702 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" @@ -29,7 +31,16 @@ val POPUP_TITLES = arrayOf("更新数据", "下载工单", "关于软件", "事件上报", "标识器补全") var POINT_TYPE_ARRAY = arrayOf("管线", "管线附属物", "管线特征管点", "交叉穿越点") - var SPINNER_ARRAY = arrayOf("标识器ID", "所属区域", "所属线路", "所属道路", "权属单位", "安装部门", "安装时间", "备注") + var SPINNER_ARRAY = arrayOf( + "标识器ID", + "所属区域", + "所属线路", + "所属道路", + "权属单位", + "安装部门", + "安装时间", + "备注" + ) var PIPE_MATERIAL_ARRAY = arrayOf("铸铁", "塑料") var DOWN_PIPE_TYPE_ARRAY = arrayOf("热力", "燃气", "供水", "电力", "通信") var BURY_METHOD_ARRAY = arrayOf("直埋", "圆管", "管块", "管沟", "架空") diff --git a/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt b/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt index c235471..904719b 100644 --- a/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt +++ b/app/src/main/java/com/casic/detector/utils/SerialPortManager.kt @@ -15,11 +15,11 @@ private val kTag = "SerialPortManager" private val registry = LifecycleRegistry(this) + private val serialPorts = BaseApplication.get().getSerialPorts() init { //读取串口数据 lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() val buffer = ByteArray(72) var size: Int serialPorts?.forEach { @@ -46,7 +46,6 @@ * */ fun detectMarker() { lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() serialPorts?.apply { while (size >= 1) { val outStream = this[0].outputStream @@ -72,7 +71,6 @@ * */ fun detectDepth(markerTag: Char) { lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() serialPorts?.apply { val outStream = this[0].outputStream try { @@ -91,7 +89,6 @@ * */ fun searchMarkerSignal() { lifecycleScope.launch(Dispatchers.IO) { - val serialPorts = BaseApplication.get().getSerialPorts() serialPorts?.apply { val outStream = this[0].outputStream try { diff --git a/app/src/main/java/com/casic/detector/view/MainActivity.kt b/app/src/main/java/com/casic/detector/view/MainActivity.kt index 0ce360a..1e1e44c 100644 --- a/app/src/main/java/com/casic/detector/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/view/MainActivity.kt @@ -13,6 +13,8 @@ import android.media.SoundPool import android.os.Bundle import android.os.CountDownTimer +import android.os.Handler +import android.os.Message import android.provider.Settings import android.util.Log import android.view.KeyEvent @@ -92,6 +94,7 @@ import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog @@ -108,34 +111,38 @@ class MainActivity : KotlinBaseActivity(), SerialPortManager.OnSerialPortListener { + companion object { + private val audioAttributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + val soundPool: SoundPool = SoundPool.Builder() + .setMaxStreams(16) + .setAudioAttributes(audioAttributes) + .build() + lateinit var serialPortManager: SerialPortManager + lateinit var taskViewModel: TaskViewModel + } private val kTag = "MainActivity" private val context = this@MainActivity - private val serialPortManager by lazy { SerialPortManager(this) } private val gpioManager by lazy { GpioManager() } private val samplePopupWindow by lazy { SamplePopupWindow(this) } private val gson by lazy { Gson() } private val locationHub by lazy { LocationHub(this) } private val regionRadius by lazy { LocaleConstant.RADIUS_SIZE.dp2px(this) } private val backDrawables by lazy { HashMap() } - private val soundPool = SoundPool.Builder().setMaxStreams(16).setAudioAttributes( - AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - ).build() - private var readMarkerSoundResourceId = 0 - private var slowSoundResourceId = 0 - private var fastSoundResourceId = 0 + private val installDialog by lazy { InstallMarkerDialog(this) } + private val searchDialog by lazy { SearchMarkerDialog(this) } + private var soundResourceId = 0 private var clickTime: Long = 0 private var labelBeans = ArrayList() private var clusterOverlay: ClusterOverlay? = null private var latitude: Double = 0.0 private var longitude: Double = 0.0 + private var isFreeTask = false private var ids = ArrayList() - private lateinit var markerId: String private lateinit var aMap: AMap - private lateinit var taskViewModel: TaskViewModel private lateinit var taskBean: TaskBean private lateinit var taskId: String @@ -148,19 +155,24 @@ } override fun initOnCreate(savedInstanceState: Bundle?) { - initMapConfig(savedInstanceState) - - readMarkerSoundResourceId = soundPool.load(this, R.raw.ring3, 1) - slowSoundResourceId = soundPool.load(this, R.raw.ring4, 1) - fastSoundResourceId = soundPool.load(this, R.raw.ring2, 1) - //调高串口电位 gpioManager.setGpioHigh("18") + //地图初始化 + initMapConfig(savedInstanceState) + + //初始化 + serialPortManager = SerialPortManager(this) + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] + + //音效资源 + soundResourceId = soundPool.load(this, R.raw.ring3, 1) + + //右上角菜单 samplePopupWindow.setPopupMenuItem(LocaleConstant.POPUP_TITLES) samplePopupWindow.setBackgroundDrawable(null) - taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] + //task网络请求监听 taskViewModel.markerFileResult.observe(this) { if (it.isSuccess) { //清空之前的数据 @@ -213,9 +225,7 @@ }).build().show() } } - taskViewModel.freeTaskResult.observe(this) { taskId = it } - taskViewModel.uploadTaskMarkerResult.observe(this) { "自由巡检任务已完成".show(this) ids.clear() @@ -380,7 +390,7 @@ AlertMessageDialog.OnDialogButtonClickListener { override fun onConfirmClick() { isFreeTask = false - soundPool.stop(readMarkerSoundResourceId) + soundPool.stop(soundResourceId) taskViewModel.uploadTaskMarker(taskId, ids) binding.stopFreeTaskButton.visibility = View.GONE @@ -390,13 +400,6 @@ } } - private val installDialog by lazy { InstallMarkerDialog(this) } - private val searchDialog by lazy { SearchMarkerDialog(this) } - private var isFreeTask = false - private var taskLabel: TaskBean? = null - private var isPlaying = false - private val decimal by lazy { DecimalFormat("0.0") } - private fun startFreeTask() { AlertInputDialog.Builder() .setContext(this) @@ -409,8 +412,7 @@ val userId = SaveKeyValues.getValue(LocaleConstant.USER_ID, "") as String taskViewModel.createFreeTask(userId, value) - soundPool.play(readMarkerSoundResourceId, 1f, 1f, 0, -1, 1f) - + soundPool.play(soundResourceId, 1f, 1f, 0, -1, 1f) isFreeTask = true //自由巡检 serialPortManager.searchMarkerSignal() @@ -425,139 +427,18 @@ override fun onDataReceived(buffer: ByteArray) { val hex = buffer.toHex() Log.d(kTag, "$kTag => $hex") -// if (hex.length >= 20) { -// val markerId = hex.take(20).hexToString() -// if (markerId.isNumber()) { -// "标识器${markerId}已探测".show(this) -// ids.add(markerId) -// } -// } if (searchDialog.isDetectMarker) { - if (hex.startsWith("4E")) { - try { - //4E转为String为N,代表能量值 - //用能量值转动表盘 - val energyResponse = hex.take(10).hexToString() - val energy = energyResponse.substring(1).toInt() - if (energy >= 4000) { - isPlaying = if (!isPlaying) { - soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) - true - } else { - soundPool.stop(fastSoundResourceId) - false - } - } else { - isPlaying = if (!isPlaying) { - soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) - true - } else { - soundPool.stop(slowSoundResourceId) - false - } - } - - searchDialog.binding.resultTextView.text = "信号能量值:${energyResponse}" - - //转换为转动的角度 - val degree = (energy.toFloat() / (50 * 100)) * 180 - searchDialog.binding.energyValueView.text = decimal.format(degree) - - searchDialog.degreeCache["lastDegree"]?.apply { - val animation = RotateAnimation( - this, degree, - Animation.RELATIVE_TO_SELF, 0.5f, - Animation.RELATIVE_TO_SELF, 0.5f - ) - animation.duration = 0 - animation.fillAfter = true - searchDialog.binding.needleView.startAnimation(animation) - } - - //保存旋转后的角度 - searchDialog.degreeCache["lastDegree"] = degree - - if (energy <= 700) {//18° - searchDialog.binding.energyTipsView.text = "标识器信号较弱,可能距离较远" - searchDialog.binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) - searchDialog.binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - - searchDialog.binding.depthButton.isEnabled = false - searchDialog.binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) - searchDialog.binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) - searchDialog.binding.markerInfoButton.isEnabled = false - searchDialog.binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) - searchDialog.binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) - - searchDialog.binding.searchResultView.text = "未检测到标识器" - searchDialog.binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) - searchDialog.binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) - } else if (energy >= 4100) {//148° - searchDialog.binding.energyTipsView.text = "标识器信号极强,可能在正下方" - searchDialog.binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) - searchDialog.binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) - } else {//[18°,148°] - searchDialog.binding.energyTipsView.text = "已靠近标识器,请继续移动位置" - searchDialog.binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) - searchDialog.binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) - } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else if (hex.startsWith("53")) { - LoadingDialogHub.dismiss() - try { - val depthResponse = hex.take(10).hexToString() - val depth = depthResponse.drop(4) - AlertMessageDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("标识器埋深:${depth}厘米") - .setPositiveButton("知道了") - .setOnDialogButtonClickListener(object : - AlertMessageDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - - } - }).build().show() - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else { - val id = hex.take(20).hexToString() - if (id.isNumber()) { - markerId = id - - searchDialog.binding.depthButton.isEnabled = true - searchDialog.binding.depthButton.setTextColor(Color.WHITE) - searchDialog.binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) - searchDialog.binding.markerInfoButton.isEnabled = true - searchDialog.binding.markerInfoButton.setTextColor(Color.WHITE) - searchDialog.binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) - - searchDialog.binding.searchResultView.text = "已检测到标识器" - searchDialog.binding.searchResultView.setTextColor(Color.parseColor("#428d00")) - searchDialog.binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) - - //自动上传标识器 - taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState( - markerId, "未开始" - ) - taskLabel?.apply { - /** - * 此taskCode是 [com.casic.detector.model.TaskModel.MessageModel.TaskDetailInfosModel] 里面的主键,也就是这个标签在数据库里面的主键 - * */ - taskViewModel.uploadMarker(taskCode) - } - } - } + val message = searchDialog.weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER_CODE + message.obj = hex + searchDialog.weakReferenceHandler.sendMessage(message) } else if (installDialog.isReadMarker) { val markerId = hex.take(20).hexToString() if (markerId.isNumber()) { - LoadingDialogHub.dismiss() - soundPool.stop(readMarkerSoundResourceId) - installDialog.isReadMarker = false - installDialog.binding.identifierInclude.identifierIdView.text = markerId + val message = installDialog.weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER_CODE + message.obj = markerId + installDialog.weakReferenceHandler.sendMessage(message) } } else if (isFreeTask) { val markerId = hex.take(20).hexToString() @@ -574,6 +455,11 @@ LoadState.Loading -> { if (installDialog.isInstallMarker) { LoadingDialogHub.show(this, "标识器安装中,请稍后...") + } else if (searchDialog.isDetectMarker) { + searchDialog.taskBean?.apply { + "标识器${this.markerId}已探测!".show(context) + DataBaseManager.get.updateTaskLabel(this) + } } else { LoadingDialogHub.show(this, "提交工单中,请稍后") } @@ -980,28 +866,36 @@ /**安装标识器对话框******************************************************************************/ @SuppressLint("SetTextI18n") - class InstallMarkerDialog(private val activity: MainActivity) : Dialog(activity) { + class InstallMarkerDialog(private val activity: MainActivity) : Dialog(activity), + Handler.Callback { - val binding: DialogInstallMarkerBinding by binding() - var isReadMarker = false - var isInstallMarker = false - + private val binding: DialogInstallMarkerBinding by binding() private val calendar by lazy { Calendar.getInstance() } private val realPaths = ArrayList() //真实图片路径 + private var soundResourceId = 0 private lateinit var imageAdapter: EditableImageAdapter + lateinit var weakReferenceHandler: WeakReferenceHandler + var isReadMarker = false + var isInstallMarker = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.initDialogLayoutParams(1f) setCancelable(false) setCanceledOnTouchOutside(false) + weakReferenceHandler = WeakReferenceHandler(this) + + //初始化音频资源 + soundResourceId = soundPool.load(activity, R.raw.ring3, 1) + //初始化数据 initDefaultData() //返回 binding.titleInclude.leftBackView.setOnClickListener { - activity.soundPool.stop(activity.readMarkerSoundResourceId) + soundPool.stop(soundResourceId) dismiss() } @@ -1089,7 +983,7 @@ saveLabelInLocal() isInstallMarker = true - activity.taskViewModel.installLabel( + taskViewModel.installLabel( companyId, binding.objectInclude.objectTypeSpinner.selectedItem.toString().toObjectType(), binding.objectInclude.markerObjectTypeView.text.toString(), @@ -1138,13 +1032,23 @@ LoadingDialogHub.show(activity, "标识器读取中,请稍后...") isReadMarker = true - - activity.soundPool.play(activity.readMarkerSoundResourceId, 1f, 1f, 0, -1, 1f) - - activity.serialPortManager.searchMarkerSignal() + serialPortManager.searchMarkerSignal() + soundPool.play(soundResourceId, 1f, 1f, 0, -1, 1f) } } + override fun handleMessage(msg: Message): Boolean { + if (msg.what == LocaleConstant.INSTALL_MARKER_CODE) { + LoadingDialogHub.dismiss() + soundPool.stop(soundResourceId) + + val markerId = msg.obj as String + isReadMarker = false + binding.identifierInclude.identifierIdView.text = markerId + } + return true + } + private fun initDefaultData() { binding.titleInclude.titleView.text = "安装新标识器" binding.titleInclude.titleView.setTextColor(R.color.themeColor.convertColor(activity)) @@ -1321,25 +1225,39 @@ } /**探测标识器对话框******************************************************************************/ - class SearchMarkerDialog(private val activity: MainActivity) : Dialog(activity) { + class SearchMarkerDialog(private val activity: MainActivity) : Dialog(activity), + Handler.Callback { - val binding: DialogSearchMarkerBinding by binding() - val degreeCache by lazy { HashMap() } + private val binding: DialogSearchMarkerBinding by binding() + private val decimal by lazy { DecimalFormat("0.0") } + private val degreeCache by lazy { HashMap() } + private var slowSoundResourceId = 0 + private var fastSoundResourceId = 0 + private var isPlaying = false + private var markerId = "" + + lateinit var weakReferenceHandler: WeakReferenceHandler var isDetectMarker = false - var isDetectDepth = false + var taskBean: TaskBean? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.initDialogLayoutParams(1f) + weakReferenceHandler = WeakReferenceHandler(this) + + //初始化音频资源 + slowSoundResourceId = soundPool.load(activity, R.raw.ring4, 1) + fastSoundResourceId = soundPool.load(activity, R.raw.ring2, 1) + isDetectMarker = true - activity.serialPortManager.detectMarker() + serialPortManager.detectMarker() //角度 degreeCache["lastDegree"] = 0f binding.depthButton.setOnClickListener { - val result = DataBaseManager.get.queryLabelById(activity.markerId) + val result = DataBaseManager.get.queryLabelById(markerId) if (result.isNotEmpty()) { val tag = when (result.first().identifierType) { "EM30" -> '7' @@ -1351,18 +1269,16 @@ "此标识器无法读取埋深!".show(activity) } else { // 发送读取标识器埋设深度指令 - isDetectDepth = true LoadingDialogHub.show(activity, "正在测距,请稍后...") - activity.serialPortManager.detectDepth(tag) + serialPortManager.detectDepth(tag) object : CountDownTimer(15 * 1000, 1000) { override fun onTick(millisUntilFinished: Long) { } override fun onFinish() { - isDetectDepth = false LoadingDialogHub.dismiss() - "请重试".show(activity) + "探测此标识器深度超时,请重试".show(activity) } }.start() } @@ -1373,19 +1289,140 @@ binding.markerInfoButton.setOnClickListener { //查库 - val result = DataBaseManager.get.queryLabelById(activity.markerId) + val result = DataBaseManager.get.queryLabelById(markerId) if (result.isNotEmpty()) { activity.navigatePageTo(result.first().toJson()) } else { - activity.navigatePageTo(activity.markerId) + activity.navigatePageTo(markerId) } } } + override fun handleMessage(msg: Message): Boolean { + val hex = msg.obj as String + if (hex.startsWith("4E")) { + try { + //4E转为String为N,代表能量值 + //用能量值转动表盘 + val energyResponse = hex.take(10).hexToString() + val energy = energyResponse.substring(1).toInt() + if (energy >= 4000) { + isPlaying = if (!isPlaying) { + soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) + true + } else { + soundPool.stop(fastSoundResourceId) + false + } + } else { + isPlaying = if (!isPlaying) { + soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) + true + } else { + soundPool.stop(slowSoundResourceId) + false + } + } + + binding.resultTextView.text = "信号能量值:${energyResponse}" + + //转换为转动的角度 + val degree = (energy.toFloat() / (50 * 100)) * 180 + binding.energyValueView.text = decimal.format(degree) + + degreeCache["lastDegree"]?.apply { + val animation = RotateAnimation( + this, degree, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ) + animation.duration = 0 + animation.fillAfter = true + binding.needleView.startAnimation(animation) + } + + //保存旋转后的角度 + degreeCache["lastDegree"] = degree + + if (energy <= 700) {//18° + binding.energyTipsView.text = "标识器信号较弱,可能距离较远" + binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) + binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) + + binding.depthButton.isEnabled = false + binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) + binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) + binding.markerInfoButton.isEnabled = false + binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) + binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) + + binding.searchResultView.text = "未检测到标识器" + binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) + binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) + } else if (energy >= 4100) {//148° + binding.energyTipsView.text = "标识器信号极强,可能在正下方" + binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) + binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) + } else {//[18°,148°] + binding.energyTipsView.text = "已靠近标识器,请继续移动位置" + binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) + binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) + } + } catch (e: NumberFormatException) { + e.printStackTrace() + } + } else if (hex.startsWith("53")) { + LoadingDialogHub.dismiss() + try { + val depthResponse = hex.take(10).hexToString() + val depth = depthResponse.drop(4) + AlertMessageDialog.Builder() + .setContext(activity) + .setTitle("温馨提示") + .setMessage("标识器埋深:${depth}厘米") + .setPositiveButton("知道了") + .setOnDialogButtonClickListener(object : + AlertMessageDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + + } + }).build().show() + } catch (e: NumberFormatException) { + e.printStackTrace() + } + } else { + val id = hex.take(20).hexToString() + if (id.isNumber()) { + markerId = id + + binding.depthButton.isEnabled = true + binding.depthButton.setTextColor(Color.WHITE) + binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) + binding.markerInfoButton.isEnabled = true + binding.markerInfoButton.setTextColor(Color.WHITE) + binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) + + binding.searchResultView.text = "已检测到标识器" + binding.searchResultView.setTextColor(Color.parseColor("#428d00")) + binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) + + //自动上传标识器 + taskBean = DataBaseManager.get.queryTaskLabelByIdAndState(markerId, "未开始") + taskBean?.apply { + /** + * 此taskCode是 [com.casic.detector.model.TaskModel.MessageModel.TaskDetailInfosModel] 里面的主键,也就是这个标签在数据库里面的主键 + * */ + taskViewModel.uploadMarker(taskCode) + } + } + } + return true + } + override fun dismiss() { isDetectMarker = false - activity.soundPool.stop(activity.slowSoundResourceId) - activity.soundPool.stop(activity.fastSoundResourceId) + soundPool.stop(slowSoundResourceId) + soundPool.stop(fastSoundResourceId) super.dismiss() } }