diff --git a/app/src/main/java/com/casic/endoscope/extensions/Int.kt b/app/src/main/java/com/casic/endoscope/extensions/Int.kt new file mode 100644 index 0000000..b5aa3b7 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/extensions/Int.kt @@ -0,0 +1,40 @@ +package com.casic.endoscope.extensions + +import kotlin.math.abs + +fun Int.createHorizontalCommand(): ByteArray { + val temp = this * 100 + + val hData1 = temp shr 8 + val hData2 = temp - (hData1 shl 8) + val hSum = (0x01 + 0x4B + hData1 + hData2) % 0x100 + return byteArrayOf( + 0xFF.toByte(), + 0x01, + 0x00, 0x4B, + hData1.toByte(), + hData2.toByte(), + hSum.toByte() + ) +} + +fun Int.createVerticalCommand(): ByteArray { + val temp = if (this < 0) { + 36000 - abs(this) * 100 + } else { + this * 100 + } + + val vData1 = temp shr 8 + val vData2 = temp - (vData1 shl 8) + + val vSum = (0x01 + 0x4D + vData1 + vData2) % 0x100 + return byteArrayOf( + 0xFF.toByte(), + 0x01, + 0x00, 0x4D, + vData1.toByte(), + vData2.toByte(), + vSum.toByte() + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/extensions/Int.kt b/app/src/main/java/com/casic/endoscope/extensions/Int.kt new file mode 100644 index 0000000..b5aa3b7 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/extensions/Int.kt @@ -0,0 +1,40 @@ +package com.casic.endoscope.extensions + +import kotlin.math.abs + +fun Int.createHorizontalCommand(): ByteArray { + val temp = this * 100 + + val hData1 = temp shr 8 + val hData2 = temp - (hData1 shl 8) + val hSum = (0x01 + 0x4B + hData1 + hData2) % 0x100 + return byteArrayOf( + 0xFF.toByte(), + 0x01, + 0x00, 0x4B, + hData1.toByte(), + hData2.toByte(), + hSum.toByte() + ) +} + +fun Int.createVerticalCommand(): ByteArray { + val temp = if (this < 0) { + 36000 - abs(this) * 100 + } else { + this * 100 + } + + val vData1 = temp shr 8 + val vData2 = temp - (vData1 shl 8) + + val vSum = (0x01 + 0x4D + vData1 + vData2) % 0x100 + return byteArrayOf( + 0xFF.toByte(), + 0x01, + 0x00, 0x4D, + vData1.toByte(), + vData2.toByte(), + vSum.toByte() + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt b/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt index 8c4b495..46ee213 100644 --- a/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt @@ -54,6 +54,7 @@ GSYVideoManager.backFromWindowFull(context) //解决退出全屏后会被强制竖屏的问题 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + finish() } }) } diff --git a/app/src/main/java/com/casic/endoscope/extensions/Int.kt b/app/src/main/java/com/casic/endoscope/extensions/Int.kt new file mode 100644 index 0000000..b5aa3b7 --- /dev/null +++ b/app/src/main/java/com/casic/endoscope/extensions/Int.kt @@ -0,0 +1,40 @@ +package com.casic.endoscope.extensions + +import kotlin.math.abs + +fun Int.createHorizontalCommand(): ByteArray { + val temp = this * 100 + + val hData1 = temp shr 8 + val hData2 = temp - (hData1 shl 8) + val hSum = (0x01 + 0x4B + hData1 + hData2) % 0x100 + return byteArrayOf( + 0xFF.toByte(), + 0x01, + 0x00, 0x4B, + hData1.toByte(), + hData2.toByte(), + hSum.toByte() + ) +} + +fun Int.createVerticalCommand(): ByteArray { + val temp = if (this < 0) { + 36000 - abs(this) * 100 + } else { + this * 100 + } + + val vData1 = temp shr 8 + val vData2 = temp - (vData1 shl 8) + + val vSum = (0x01 + 0x4D + vData1 + vData2) % 0x100 + return byteArrayOf( + 0xFF.toByte(), + 0x01, + 0x00, 0x4D, + vData1.toByte(), + vData2.toByte(), + vSum.toByte() + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt b/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt index 8c4b495..46ee213 100644 --- a/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/AlbumActivity.kt @@ -54,6 +54,7 @@ GSYVideoManager.backFromWindowFull(context) //解决退出全屏后会被强制竖屏的问题 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + finish() } }) } diff --git a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt index d05c4c5..37ce0b4 100644 --- a/app/src/main/java/com/casic/endoscope/view/MainActivity.kt +++ b/app/src/main/java/com/casic/endoscope/view/MainActivity.kt @@ -14,7 +14,9 @@ import com.casic.endoscope.adapter.CameraPointAdapter import com.casic.endoscope.bean.CameraPointBean import com.casic.endoscope.databinding.ActivityMainBinding +import com.casic.endoscope.extensions.createHorizontalCommand import com.casic.endoscope.extensions.createImageFileDir +import com.casic.endoscope.extensions.createVerticalCommand import com.casic.endoscope.extensions.createVideoFileDir import com.casic.endoscope.extensions.getChannel import com.casic.endoscope.extensions.toTime @@ -27,6 +29,7 @@ import com.hikvision.netsdk.HCNetSDK import com.hikvision.netsdk.NET_DVR_JPEGPARA import com.hikvision.netsdk.NET_DVR_PREVIEWINFO +import com.hikvision.netsdk.NET_DVR_SERIALSTART_V40 import com.hikvision.netsdk.PTZCommand import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.getStatusBarHeight @@ -36,6 +39,7 @@ import com.pengxh.kt.lite.widget.SteeringWheelView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -47,6 +51,7 @@ Handler.Callback { private val kTag = "MainActivity" + private val context = this@MainActivity private val hkSDK by lazy { HCNetSDK.getInstance() } private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val selectedSpeed = 7 @@ -66,6 +71,10 @@ //焦距按钮是否已松开 private var isScaleButtonUp = true + + //是否拍照成功 + private var isCaptureSuccess = true + private var timer: Timer? = null private var timerTask: TimerTask? = null private var seconds = 0L @@ -113,6 +122,8 @@ //单张拍照 binding.imageButton.setOnClickListener { if (isPreviewSuccess) { + binding.imageButton.isEnabled = false + val strJpeg = NET_DVR_JPEGPARA() strJpeg.wPicQuality = 1 strJpeg.wPicSize = 2 @@ -123,7 +134,8 @@ ) if (MessageCodeHub.getErrorCode() == 0) { - "画面抓取成功".show(this@MainActivity) + "画面抓取成功".show(this) + binding.imageButton.isEnabled = true } } else { "摄像头预览未打开,无法拍照".show(this) @@ -145,7 +157,7 @@ //停止视频抓取 hkSDK.NET_DVR_StopSaveRealData(returnUserId) binding.videoStateView.visibility = View.INVISIBLE - "视频录制成功".show(this@MainActivity) + "视频录制成功".show(this) true } @@ -156,7 +168,36 @@ return@setOnClickListener } if (isPreviewSuccess) { + lifecycleScope.launch(Dispatchers.IO) { + dataBeans.forEach { + //再拍照 + if (isCaptureSuccess) { + isCaptureSuccess = false + //先执行角度 + executeAngle(it.hAngle, it.vAngle) + + withContext(Dispatchers.Main) { + "抓取步骤${it.step}画面".show(context) + } + + 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 + ) + + isCaptureSuccess = MessageCodeHub.getErrorCode() == 0 + } + } + withContext(Dispatchers.Main) { + "连续抓取画面完成".show(context) + } + } } else { "摄像头预览未打开,无法拍照".show(this) } @@ -270,7 +311,7 @@ return } isPreviewSuccess = true - "预览开启成功".show(this@MainActivity) + "预览开启成功".show(context) //开始计时 timer = Timer() timerTask = object : TimerTask() { @@ -284,7 +325,7 @@ timer?.schedule(timerTask, 0, 1000) } catch (e: IndexOutOfBoundsException) { e.printStackTrace() - "设备未正常连接,无法开启预览".show(this@MainActivity) + "设备未正常连接,无法开启预览".show(context) } } } else { @@ -293,7 +334,7 @@ } previewHandle = -1 isPreviewSuccess = false - "预览关闭成功".show(this@MainActivity) + "预览关闭成功".show(context) //停止计时 timerTask?.cancel() timer?.cancel() @@ -396,6 +437,47 @@ } } + /** + * 角度执行 + * */ + private fun executeAngle(horizontal: Int, vertical: Int) { + //建立透明通道 + val serialStart = NET_DVR_SERIALSTART_V40() + //串口类型:1- 232 串口,2- 485 串口 + serialStart.dwSerialPort = 2 + //串口编号 + serialStart.wPort = 0 + val serialHandle = hkSDK.NET_DVR_SerialStart_V40( + returnUserId, serialStart + ) { _, _, _, _ -> } + + //向透明通道发送数据,水平和垂直需要分开发送 + hkSDK.NET_DVR_SerialSend( + serialHandle, + 1, + horizontal.createHorizontalCommand(), + horizontal.createHorizontalCommand().size + ) + try { + Thread.sleep(50) + } catch (e: InterruptedException) { + e.printStackTrace() + } + hkSDK.NET_DVR_SerialSend( + serialHandle, + 1, + vertical.createVerticalCommand(), + vertical.createVerticalCommand().size + ) + + try { + Thread.sleep(50) + } catch (e: InterruptedException) { + e.printStackTrace() + } + //关闭通道 + hkSDK.NET_DVR_SerialStop(serialHandle) + } override fun observeRequestState() {