diff --git a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt index ee5d49d..a4cac36 100644 --- a/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt +++ b/app/src/main/java/com/casic/br/ktd/view/InspectionActivity.kt @@ -38,6 +38,7 @@ import com.casic.br.ktd.vm.FileViewModel import com.casic.br.ktd.vm.PointViewModel import com.casic.br.ktd.vm.TaskViewModel +import com.casic.br.ktd.widgets.AiAlarmImageDialog import com.casic.br.ktd.widgets.AlertControlDialog import com.casic.br.ktd.widgets.LineChartMarkerView import com.casic.br.ktd.widgets.SteeringWheelView @@ -45,7 +46,6 @@ import com.github.mikephil.charting.data.LineData import com.github.mikephil.charting.data.LineDataSet import com.github.mikephil.charting.interfaces.datasets.ILineDataSet -import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.hikvision.netsdk.* import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter @@ -82,8 +82,8 @@ private val latlngs = LinkedList() private val tcpTimer by lazy { Timer() } private val imageCaptureTimer by lazy { Timer() } + private val videoCaptureTimer by lazy { Timer() } private val decimalFormat by lazy { DecimalFormat("##0.0") } - private val gson by lazy { Gson() } private val udpClient by lazy { UdpClient() } private var isLoginSuccess = false private var previewHandle = -1 @@ -129,9 +129,6 @@ //甲烷浓度阈值 private var gasAlarmRule = 1000 - //是否正在抓取视频 - private var isRecordingVideo = false - override fun initViewBinding(): ActivityInspectionBinding { return ActivityInspectionBinding.inflate(layoutInflater) } @@ -266,38 +263,20 @@ fileViewModel.resultModel.observe(this) { if (it.code == 200) { - if (it.data.endsWith(".png")) { - alarmViewModel.addAlarm( - taskId, - deviceId, - "甲烷浓度超过阈值", - lat, - lng, - System.currentTimeMillis().timestampToCompleteDate(), - gasAlarmRule.toString(), - it.data, - "0", - "1", - "", - dataModel?.methane.toString(), - ) - } else { - alarmViewModel.addAlarm( - taskId, - deviceId, - "甲烷浓度超过阈值", - lat, - lng, - System.currentTimeMillis().timestampToCompleteDate(), - gasAlarmRule.toString(), - "", - "0", - "1", - it.data, - dataModel?.methane.toString(), - ) - isRecordingVideo = false - } + alarmViewModel.addAlarm( + taskId, + deviceId, + "甲烷浓度超过阈值", + lat, + lng, + System.currentTimeMillis().timestampToCompleteDate(), + gasAlarmRule.toString(), + it.data, + "0", + "1", + "", + dataModel?.methane.toString(), + ) } } @@ -330,24 +309,39 @@ alarmViewModel.alarmList.observe(this) { if (it.code == 200) { val dataRows = it.data?.rows!! - val videoAlarmAdapter = object : - NormalRecyclerAdapter( + val videoAlarmAdapter = + object : NormalRecyclerAdapter( R.layout.item_video_alarm_rv_l, dataRows ) { - override fun convertView( - viewHolder: ViewHolder, position: Int, - item: AlarmListModel.DataModel.RowsModel - ) { - if (position == 0) { - viewHolder.setTextColor(R.id.alarmTypeView, Color.RED) - .setTextColor(R.id.alarmTimeView, Color.RED) - } + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: AlarmListModel.DataModel.RowsModel + ) { + if (position == 0) { + viewHolder.setTextColor(R.id.alarmTypeView, Color.RED) + .setTextColor(R.id.alarmTimeView, Color.RED) + } - viewHolder.setText(R.id.alarmTypeView, item.recognitionType) - .setText(R.id.alarmTimeView, item.alarmTime) + viewHolder.setText(R.id.alarmTypeView, item.recognitionType) + .setText(R.id.alarmTimeView, item.alarmTime) + } } - } binding.videoAlarmView.adapter = videoAlarmAdapter + videoAlarmAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: AlarmListModel.DataModel.RowsModel + ) { + if (t.alarmPicture.isNullOrEmpty()) { + "报警图片已丢失,无法查看".show(this@InspectionActivity) + return + } + AiAlarmImageDialog(t.alarmPicture).show( + supportFragmentManager, "AiAlarmImageDialog" + ) + } + }) } } @@ -385,7 +379,16 @@ binding.captureButton.setOnClickListener { if (isPreviewSuccess) { - captureImage(false) + val strJpeg = NET_DVR_JPEGPARA() + strJpeg.wPicQuality = 1 + strJpeg.wPicSize = 2 + + val imagePath = "/${createImageFileDir()}/${timeFormat.format(Date())}.png" + hkSDK.NET_DVR_CaptureJPEGPicture(returnUserId, selectChannel, strJpeg, imagePath) + + if (MessageCodeHub.getErrorCode() == 0) { + "画面抓取成功".show(this) + } } } @@ -639,6 +642,21 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() } + /** + * TODO 未实测 + * 录制视频,本地录制30min视频 + * */ + private val videoCountDownTimer = object : CountDownTimer(30 * 60 * 1000, 1000) { + override fun onTick(l: Long) { + + } + + override fun onFinish() { + //停止视频抓取 + hkSDK.NET_DVR_StopSaveRealData(returnUserId) + } + } + private fun startPreview() { //配置设备通道 try { @@ -695,6 +713,26 @@ isPreviewSuccess = true isStartInspect = true + //打开激光传感器 + SDKGuider.sdkGuider.devPassThroughGuider.NET_DVR_SendToSerialPort_jni( + returnUserId, + 2, + 1, + LocaleConstant.OPEN_SENSOR_COMMAND, + LocaleConstant.OPEN_SENSOR_COMMAND.size + ) + + videoCaptureTimer.schedule(object : TimerTask() { + override fun run() { + if (isPreviewSuccess) { + val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" + Log.d(kTag, "开始抓取视频 => $videoPath") + hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) + videoCountDownTimer.start() + } + } + }, 1000, 31 * 60 * 1000) + /** * 本地画面存储 * */ @@ -715,16 +753,7 @@ //获取最新的第三方施工报警列表 alarmViewModel.getAlarmsByPage("", "", "2", "", 1) } - }, 1000, LocaleConstant.DATA_TIMER_PERIOD) - - //打开激光传感器 - SDKGuider.sdkGuider.devPassThroughGuider.NET_DVR_SendToSerialPort_jni( - returnUserId, - 2, - 1, - LocaleConstant.OPEN_SENSOR_COMMAND, - LocaleConstant.OPEN_SENSOR_COMMAND.size - ) + }, 1000, 1000) //初始化浓度趋势折线图 binding.methaneLineChart.init() @@ -822,51 +851,6 @@ } } - /** - * TODO 视频抓取,抓取10s的视频。带宽不够,暂时注掉 - * */ - private fun recordVideo() { - if (!isRecordingVideo) { - isRecordingVideo = true - val videoPath = "/${createVideoFileDir()}/${timeFormat.format(Date())}.mp4" - Log.d(kTag, "开始抓取视频 => $videoPath") - hkSDK.NET_DVR_SaveRealData(returnUserId, videoPath) - object : CountDownTimer(10 * 1000, 1000) { - override fun onTick(l: Long) { - - } - - override fun onFinish() { - //停止视频抓取 - hkSDK.NET_DVR_StopSaveRealData(returnUserId) - - //海康视频不能直接播放,需要转码。服务器转码 - fileViewModel.uploadFile(File(videoPath), FileType.VIDEO) - } - }.start() - } - } - - /** - * 画面抓取 - * */ - private fun captureImage(isAutoCapture: Boolean) { - val strJpeg = NET_DVR_JPEGPARA() - strJpeg.wPicQuality = 1 - strJpeg.wPicSize = 2 - - val imagePath = "/${createImageFileDir()}/${timeFormat.format(Date())}.png" - hkSDK.NET_DVR_CaptureJPEGPicture(returnUserId, selectChannel, strJpeg, imagePath) - - if (MessageCodeHub.getErrorCode() == 0) { - if (!isAutoCapture) { - "画面抓取成功".show(this) - } else { - fileViewModel.uploadFile(File(imagePath), FileType.IMAGE) - } - } - } - private fun stopPreview() { //关闭激光传感器 SDKGuider.sdkGuider.devPassThroughGuider.NET_DVR_SendToSerialPort_jni( @@ -877,6 +861,9 @@ LocaleConstant.CLOSE_SENSOR_COMMAND.size ) + //关闭视频录制 + hkSDK.NET_DVR_StopSaveRealData(returnUserId) + if (!SDKGuider.sdkGuider.devPreviewGuider.RealPlay_Stop_jni(previewHandle)) { return } @@ -924,12 +911,27 @@ binding.verticalDegreeView.text = String.format("${model.vertical}$degree") binding.gasConcentrationView.text = String.format("${model.methane}ppm·m") + //赋值上传参数对象缓存 + dataModel = model + if (model.methane >= gasAlarmRule) { isAlarm = "1" -// recordVideo() + /** + * 画面抓取 + * */ + val strJpeg = NET_DVR_JPEGPARA() + strJpeg.wPicQuality = 1 + strJpeg.wPicSize = 2 - captureImage(true) + val imagePath = "/${createImageFileDir()}/${timeFormat.format(Date())}.png" + hkSDK.NET_DVR_CaptureJPEGPicture( + returnUserId, selectChannel, strJpeg, imagePath + ) + + if (MessageCodeHub.getErrorCode() == 0) { + fileViewModel.uploadFile(File(imagePath), FileType.IMAGE) + } } /***折线图**************************************************************************/ @@ -955,9 +957,6 @@ } binding.methaneLineChart.data = lineData binding.methaneLineChart.invalidate() - - //赋值上传参数对象缓存 - dataModel = model } } return true