diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index a784141..6cc25d6 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -31,7 +31,6 @@ import com.casic.br.ar.app.vm.InspectionViewModel import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToDate @@ -45,13 +44,15 @@ import org.opencv.core.Mat import org.opencv.osgi.OpenCVNativeLoader import java.io.File +import java.util.LinkedList +import java.util.Timer +import java.util.TimerTask class CheckModeActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index a784141..6cc25d6 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -31,7 +31,6 @@ import com.casic.br.ar.app.vm.InspectionViewModel import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToDate @@ -45,13 +44,15 @@ import org.opencv.core.Mat import org.opencv.osgi.OpenCVNativeLoader import java.io.File +import java.util.LinkedList +import java.util.Timer +import java.util.TimerTask class CheckModeActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt index e38bdd1..bb53e98 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt @@ -41,7 +41,10 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + delay(1000) + yolov8ncnn.openCamera(1) + } } override fun initViewBinding(): ActivityFreeModeBinding { diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index a784141..6cc25d6 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -31,7 +31,6 @@ import com.casic.br.ar.app.vm.InspectionViewModel import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToDate @@ -45,13 +44,15 @@ import org.opencv.core.Mat import org.opencv.osgi.OpenCVNativeLoader import java.io.File +import java.util.LinkedList +import java.util.Timer +import java.util.TimerTask class CheckModeActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt index e38bdd1..bb53e98 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt @@ -41,7 +41,10 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + delay(1000) + yolov8ncnn.openCamera(1) + } } override fun initViewBinding(): ActivityFreeModeBinding { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index c74e141..8833949 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -6,13 +6,10 @@ import android.os.Bundle import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.ar.app.model.SceneCheckManifestModel -import com.casic.br.ar.app.utils.LocaleConstant import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.saveImage import org.opencv.android.Utils import org.opencv.core.Mat @@ -72,26 +69,13 @@ } fun updateDialogContentView( - checkManifestArray: MutableList, target: String, mat: Mat, listener: OnDialogButtonClickListener ): DetectResultDialog { this.target = target this.mat = mat this.listener = listener - if (target.isNumber()) { - binding.messageView.text = LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()] - - //查询目标的检查标准 - for (rule in checkManifestArray) { - if (rule.type == target) { - binding.standardRuleView.text = rule.checkItem - break - } - } - } else { - binding.messageView.text = target - } + binding.messageView.text = target return this } diff --git a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt index a784141..6cc25d6 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/CheckModeActivity.kt @@ -31,7 +31,6 @@ import com.casic.br.ar.app.vm.InspectionViewModel import com.casic.br.ar.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToDate @@ -45,13 +44,15 @@ import org.opencv.core.Mat import org.opencv.osgi.OpenCVNativeLoader import java.io.File +import java.util.LinkedList +import java.util.Timer +import java.util.TimerTask class CheckModeActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt index e38bdd1..bb53e98 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt @@ -41,7 +41,10 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + delay(1000) + yolov8ncnn.openCamera(1) + } } override fun initViewBinding(): ActivityFreeModeBinding { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index c74e141..8833949 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -6,13 +6,10 @@ import android.os.Bundle import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.ar.app.model.SceneCheckManifestModel -import com.casic.br.ar.app.utils.LocaleConstant import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.saveImage import org.opencv.android.Utils import org.opencv.core.Mat @@ -72,26 +69,13 @@ } fun updateDialogContentView( - checkManifestArray: MutableList, target: String, mat: Mat, listener: OnDialogButtonClickListener ): DetectResultDialog { this.target = target this.mat = mat this.listener = listener - if (target.isNumber()) { - binding.messageView.text = LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()] - - //查询目标的检查标准 - for (rule in checkManifestArray) { - if (rule.type == target) { - binding.standardRuleView.text = rule.checkItem - break - } - } - } else { - binding.messageView.text = target - } + binding.messageView.text = target return this } diff --git a/app/src/main/res/drawable/ic_check_no.xml b/app/src/main/res/drawable/ic_check_no.xml index 1628343..ad1de77 100644 --- a/app/src/main/res/drawable/ic_check_no.xml +++ b/app/src/main/res/drawable/ic_check_no.xml @@ -1,6 +1,6 @@ (), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt index e38bdd1..bb53e98 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt @@ -41,7 +41,10 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + delay(1000) + yolov8ncnn.openCamera(1) + } } override fun initViewBinding(): ActivityFreeModeBinding { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index c74e141..8833949 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -6,13 +6,10 @@ import android.os.Bundle import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.ar.app.model.SceneCheckManifestModel -import com.casic.br.ar.app.utils.LocaleConstant import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.saveImage import org.opencv.android.Utils import org.opencv.core.Mat @@ -72,26 +69,13 @@ } fun updateDialogContentView( - checkManifestArray: MutableList, target: String, mat: Mat, listener: OnDialogButtonClickListener ): DetectResultDialog { this.target = target this.mat = mat this.listener = listener - if (target.isNumber()) { - binding.messageView.text = LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()] - - //查询目标的检查标准 - for (rule in checkManifestArray) { - if (rule.type == target) { - binding.standardRuleView.text = rule.checkItem - break - } - } - } else { - binding.messageView.text = target - } + binding.messageView.text = target return this } diff --git a/app/src/main/res/drawable/ic_check_no.xml b/app/src/main/res/drawable/ic_check_no.xml index 1628343..ad1de77 100644 --- a/app/src/main/res/drawable/ic_check_no.xml +++ b/app/src/main/res/drawable/ic_check_no.xml @@ -1,6 +1,6 @@ (), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt index e38bdd1..bb53e98 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt @@ -41,7 +41,10 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + delay(1000) + yolov8ncnn.openCamera(1) + } } override fun initViewBinding(): ActivityFreeModeBinding { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index c74e141..8833949 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -6,13 +6,10 @@ import android.os.Bundle import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.ar.app.model.SceneCheckManifestModel -import com.casic.br.ar.app.utils.LocaleConstant import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.saveImage import org.opencv.android.Utils import org.opencv.core.Mat @@ -72,26 +69,13 @@ } fun updateDialogContentView( - checkManifestArray: MutableList, target: String, mat: Mat, listener: OnDialogButtonClickListener ): DetectResultDialog { this.target = target this.mat = mat this.listener = listener - if (target.isNumber()) { - binding.messageView.text = LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()] - - //查询目标的检查标准 - for (rule in checkManifestArray) { - if (rule.type == target) { - binding.standardRuleView.text = rule.checkItem - break - } - } - } else { - binding.messageView.text = target - } + binding.messageView.text = target return this } diff --git a/app/src/main/res/drawable/ic_check_no.xml b/app/src/main/res/drawable/ic_check_no.xml index 1628343..ad1de77 100644 --- a/app/src/main/res/drawable/ic_check_no.xml +++ b/app/src/main/res/drawable/ic_check_no.xml @@ -1,6 +1,6 @@ (), SurfaceHolder.Callback, INativeCallback, Handler.Callback { private val kTag = "StartCheckActivity" private val context = this - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } private val detectedTargetSet by lazy { HashSet() } @@ -64,13 +65,15 @@ private lateinit var imageFileViewModel: ImageFileViewModel private lateinit var alarmViewModel: AlarmViewModel private lateinit var checkManifestViewModel: CheckManifestViewModel + private lateinit var timer: Timer private var mainDicModels: MutableList = ArrayList() - private var checkManifestArray: MutableList = ArrayList() + private var checkItemLinkedList = LinkedList() private var isDetectTarget = false private var alarmCode = "" private var checkItemCount = 0 private var checkPassCount = 0 private var troubleCount = 0 + private var isConfirmedByUser = false override fun initOnCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) @@ -86,7 +89,11 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + //性能太差,延缓加载相机 + delay(1000) + yolov8ncnn.openCamera(1) + } inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] val inspectionUser = SaveKeyValues.getValue( @@ -124,11 +131,35 @@ checkManifestViewModel = ViewModelProvider(this)[CheckManifestViewModel::class.java] checkManifestViewModel.sceneManifestResult.observe(this) { if (it.code == 200) { - checkManifestArray = it.data checkItemCount = it.data.size binding.noCheckCountView.text = "${checkItemCount}项" + it.data.forEach { item -> + //追加元素到队列尾部 + checkItemLinkedList.offer(item) + } } } + + //队列处理清单内容 + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + runOnUiThread { + binding.noCheckCountView.text = "${checkItemLinkedList.size}项" + } + if (isConfirmedByUser && checkItemLinkedList.isNotEmpty()) { + isConfirmedByUser = false + //取出队列头部元素 + val headItem = checkItemLinkedList.poll() + if (headItem != null) { + val message = weakReferenceHandler.obtainMessage() + message.what = 2024091901 + message.obj = headItem.checkItem + weakReferenceHandler.sendMessage(message) + } + } + } + }, 1000, 3000) } override fun initEvent() { @@ -407,16 +438,14 @@ } } - val target = if (warnings == "") { - detectResults.first().type.toString() - } else { - warnings + if (warnings == "") { + return } //显示弹框 val message = weakReferenceHandler.obtainMessage() message.what = 2024082902 - message.obj = target + message.obj = warnings weakReferenceHandler.sendMessage(message) } } @@ -478,6 +507,9 @@ isDetectTarget = true //调用多模型 yolov8ncnn.loadMultiModel(assets, intArrayOf(0, 1), false) + + //识别完场景,显示第一条规则 + isConfirmedByUser = true return } } @@ -496,20 +528,13 @@ } val target = msg.obj as String - if (target.isNumber()) { - if (detectedTargetSet.contains(target)) { - "${LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()]}已识别过".show(this) - return true - } - } else { - if (detectedTargetSet.contains(target)) { - "该隐患已识别过".show(this) - return true - } + if (detectedTargetSet.contains(target)) { + "该隐患已识别过".show(this) + return true } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(checkManifestArray, target, mat, + detectResultDialog.updateDialogContentView(target, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onCheckPassClick(file: File) { imageFileViewModel.uploadImage(file) @@ -517,8 +542,6 @@ checkPassCount++ binding.checkedCountView.text = "${checkPassCount}项" - binding.noCheckCountView.text = - "${checkItemCount - checkPassCount}项" if (checkItemCount - checkPassCount == 0) { stopCheck() } @@ -530,7 +553,33 @@ troubleCount++ binding.troubleCountView.text = "${troubleCount}项" - binding.noCheckCountView.text = "${checkItemCount - troubleCount}项" + } + }).show() + } + } + + 2024091901 -> { + val target = msg.obj as String + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView(target, mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onCheckPassClick(file: File) { + imageFileViewModel.uploadImage(file) + + checkPassCount++ + binding.checkedCountView.text = "${checkPassCount}项" + if (checkItemCount - checkPassCount == 0) { + stopCheck() + } + isConfirmedByUser = true + } + + override fun onHaveTroubleClick(file: File) { + imageFileViewModel.uploadImage(file) + + troubleCount++ + binding.troubleCountView.text = "${troubleCount}项" + isConfirmedByUser = true } }).show() } @@ -538,4 +587,9 @@ } return true } + + override fun onDestroy() { + super.onDestroy() + timer.cancel() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt index e38bdd1..bb53e98 100644 --- a/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt +++ b/app/src/main/java/com/casic/br/ar/app/view/FreeModeActivity.kt @@ -41,7 +41,10 @@ binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) - yolov8ncnn.openCamera(1) + lifecycleScope.launch(Dispatchers.Main) { + delay(1000) + yolov8ncnn.openCamera(1) + } } override fun initViewBinding(): ActivityFreeModeBinding { diff --git a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt index c74e141..8833949 100644 --- a/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/ar/app/widgets/DetectResultDialog.kt @@ -6,13 +6,10 @@ import android.os.Bundle import com.casic.br.ar.app.databinding.DialogDetectResultBinding import com.casic.br.ar.app.extensions.compressImage -import com.casic.br.ar.app.model.SceneCheckManifestModel -import com.casic.br.ar.app.utils.LocaleConstant import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams -import com.pengxh.kt.lite.extensions.isNumber import com.pengxh.kt.lite.extensions.saveImage import org.opencv.android.Utils import org.opencv.core.Mat @@ -72,26 +69,13 @@ } fun updateDialogContentView( - checkManifestArray: MutableList, target: String, mat: Mat, listener: OnDialogButtonClickListener ): DetectResultDialog { this.target = target this.mat = mat this.listener = listener - if (target.isNumber()) { - binding.messageView.text = LocaleConstant.CLASS_NAMES_ARRAY[target.toInt()] - - //查询目标的检查标准 - for (rule in checkManifestArray) { - if (rule.type == target) { - binding.standardRuleView.text = rule.checkItem - break - } - } - } else { - binding.messageView.text = target - } + binding.messageView.text = target return this } diff --git a/app/src/main/res/drawable/ic_check_no.xml b/app/src/main/res/drawable/ic_check_no.xml index 1628343..ad1de77 100644 --- a/app/src/main/res/drawable/ic_check_no.xml +++ b/app/src/main/res/drawable/ic_check_no.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent"> - + android:layout_height="match_parent" /> - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:src="@drawable/ic_check_pass" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintStart_toEndOf="@id/imageView" + app:layout_constraintTop_toTopOf="parent" /> - + + - + - - + - + + + + + + + + + + + + + + + +