diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - - - - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt index e881698..c9fa134 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt @@ -51,6 +51,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private var isFirstConfirm = false private var isSecondConfirm = false private var isThirdConfirm = false @@ -84,7 +85,7 @@ return@setOnClickListener } SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + constructionCheckViewModel.setCurrentPhase("before_operation_environment") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -156,13 +157,15 @@ binding.videoView.start() } - initWebSocket() - timer = Timer() workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -203,6 +206,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@EnvironmentActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -220,6 +224,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt index e881698..c9fa134 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt @@ -51,6 +51,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private var isFirstConfirm = false private var isSecondConfirm = false private var isThirdConfirm = false @@ -84,7 +85,7 @@ return@setOnClickListener } SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + constructionCheckViewModel.setCurrentPhase("before_operation_environment") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -156,13 +157,15 @@ binding.videoView.start() } - initWebSocket() - timer = Timer() workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -203,6 +206,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@EnvironmentActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -220,6 +224,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index ef18670..93e94c7 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -29,7 +29,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView @@ -58,6 +57,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var imageAdapter: EditableImageAdapter private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private lateinit var timer: Timer private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } @@ -73,15 +73,18 @@ alarmViewModel.changeAlarmState("", state) } + binding.clearVideoRegionButton.setOnClickListener { + binding.regionView.clearRoutePath() + } + binding.setVideoRegionButton.setOnClickListener { val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - constructionCheckViewModel.setVideoRegion(this, region) + constructionCheckViewModel.setVideoRegion(region) } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase(this, "in_operation") + constructionCheckViewModel.setCurrentPhase("in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -132,17 +135,22 @@ binding.videoView.requestFocus() binding.videoView.start() } - initWebSocket() alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - alarmViewModel.alarmState.observe(this) { - } + binding.alarmCheckbox.isChecked = true constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { + constructionCheckViewModel.setVideoRegionResult.observe(this) { + if (it) { "区域配置成功".show(this) + } else { + "区域配置成功,请联系技术人员".show(this) + } + } + constructionCheckViewModel.setCurrentPhaseResult.observe(this) { + if (it) { + "监护人员检测开启成功".show(this) } } @@ -159,6 +167,10 @@ timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -183,13 +195,15 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = (msg.obj as String).split(":")[1] + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) if (recyclerViewImages.size == 3) { - recyclerViewImages.removeAt(0) + recyclerViewImages.removeFirst() + imageAdapter.notifyDataSetChanged() } recyclerViewImages.add(imagePath) imageAdapter.notifyDataSetChanged() @@ -213,6 +227,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@GuardiansActivity.webSocket = webSocket + isWebSocketConnected = true lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -230,6 +245,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -260,11 +276,6 @@ }) } - override fun onResume() { - super.onResume() - alarmViewModel.getAlarmState(this) - } - override fun onDestroy() { super.onDestroy() binding.videoView.suspend() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt index e881698..c9fa134 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt @@ -51,6 +51,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private var isFirstConfirm = false private var isSecondConfirm = false private var isThirdConfirm = false @@ -84,7 +85,7 @@ return@setOnClickListener } SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + constructionCheckViewModel.setCurrentPhase("before_operation_environment") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -156,13 +157,15 @@ binding.videoView.start() } - initWebSocket() - timer = Timer() workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -203,6 +206,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@EnvironmentActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -220,6 +224,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index ef18670..93e94c7 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -29,7 +29,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView @@ -58,6 +57,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var imageAdapter: EditableImageAdapter private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private lateinit var timer: Timer private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } @@ -73,15 +73,18 @@ alarmViewModel.changeAlarmState("", state) } + binding.clearVideoRegionButton.setOnClickListener { + binding.regionView.clearRoutePath() + } + binding.setVideoRegionButton.setOnClickListener { val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - constructionCheckViewModel.setVideoRegion(this, region) + constructionCheckViewModel.setVideoRegion(region) } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase(this, "in_operation") + constructionCheckViewModel.setCurrentPhase("in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -132,17 +135,22 @@ binding.videoView.requestFocus() binding.videoView.start() } - initWebSocket() alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - alarmViewModel.alarmState.observe(this) { - } + binding.alarmCheckbox.isChecked = true constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { + constructionCheckViewModel.setVideoRegionResult.observe(this) { + if (it) { "区域配置成功".show(this) + } else { + "区域配置成功,请联系技术人员".show(this) + } + } + constructionCheckViewModel.setCurrentPhaseResult.observe(this) { + if (it) { + "监护人员检测开启成功".show(this) } } @@ -159,6 +167,10 @@ timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -183,13 +195,15 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = (msg.obj as String).split(":")[1] + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) if (recyclerViewImages.size == 3) { - recyclerViewImages.removeAt(0) + recyclerViewImages.removeFirst() + imageAdapter.notifyDataSetChanged() } recyclerViewImages.add(imagePath) imageAdapter.notifyDataSetChanged() @@ -213,6 +227,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@GuardiansActivity.webSocket = webSocket + isWebSocketConnected = true lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -230,6 +245,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -260,11 +276,6 @@ }) } - override fun onResume() { - super.onResume() - alarmViewModel.getAlarmState(this) - } - override fun onDestroy() { super.onDestroy() binding.videoView.suspend() diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index 433ea5c..b93c694 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -44,6 +44,8 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.Timer +import java.util.TimerTask import java.util.concurrent.TimeUnit class SuppliesActivity : KotlinBaseActivity(), Handler.Callback { @@ -53,7 +55,9 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 @@ -96,7 +100,7 @@ ) { Log.d(kTag, "startVideoLauncher: ") SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + constructionCheckViewModel.setCurrentPhase("before_operation_protection") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -114,6 +118,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@SuppliesActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -131,6 +136,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -147,13 +153,20 @@ constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - initWebSocket() - binding.videoView.setOnPreparedListener { binding.videoView.requestFocus() binding.videoView.start() } + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + if (!isWebSocketConnected) { + initWebSocket() + } + } + }, 0, 5000) + //左右边距 val viewWidth = getScreenWidth() - (15 + 15).dp2px(this) imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 6, 3) @@ -228,6 +241,7 @@ override fun onDestroy() { super.onDestroy() binding.videoView.suspend() + timer.cancel() webSocket?.close(1000, null) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt index e881698..c9fa134 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt @@ -51,6 +51,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private var isFirstConfirm = false private var isSecondConfirm = false private var isThirdConfirm = false @@ -84,7 +85,7 @@ return@setOnClickListener } SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + constructionCheckViewModel.setCurrentPhase("before_operation_environment") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -156,13 +157,15 @@ binding.videoView.start() } - initWebSocket() - timer = Timer() workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -203,6 +206,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@EnvironmentActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -220,6 +224,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index ef18670..93e94c7 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -29,7 +29,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView @@ -58,6 +57,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var imageAdapter: EditableImageAdapter private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private lateinit var timer: Timer private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } @@ -73,15 +73,18 @@ alarmViewModel.changeAlarmState("", state) } + binding.clearVideoRegionButton.setOnClickListener { + binding.regionView.clearRoutePath() + } + binding.setVideoRegionButton.setOnClickListener { val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - constructionCheckViewModel.setVideoRegion(this, region) + constructionCheckViewModel.setVideoRegion(region) } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase(this, "in_operation") + constructionCheckViewModel.setCurrentPhase("in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -132,17 +135,22 @@ binding.videoView.requestFocus() binding.videoView.start() } - initWebSocket() alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - alarmViewModel.alarmState.observe(this) { - } + binding.alarmCheckbox.isChecked = true constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { + constructionCheckViewModel.setVideoRegionResult.observe(this) { + if (it) { "区域配置成功".show(this) + } else { + "区域配置成功,请联系技术人员".show(this) + } + } + constructionCheckViewModel.setCurrentPhaseResult.observe(this) { + if (it) { + "监护人员检测开启成功".show(this) } } @@ -159,6 +167,10 @@ timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -183,13 +195,15 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = (msg.obj as String).split(":")[1] + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) if (recyclerViewImages.size == 3) { - recyclerViewImages.removeAt(0) + recyclerViewImages.removeFirst() + imageAdapter.notifyDataSetChanged() } recyclerViewImages.add(imagePath) imageAdapter.notifyDataSetChanged() @@ -213,6 +227,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@GuardiansActivity.webSocket = webSocket + isWebSocketConnected = true lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -230,6 +245,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -260,11 +276,6 @@ }) } - override fun onResume() { - super.onResume() - alarmViewModel.getAlarmState(this) - } - override fun onDestroy() { super.onDestroy() binding.videoView.suspend() diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index 433ea5c..b93c694 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -44,6 +44,8 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.Timer +import java.util.TimerTask import java.util.concurrent.TimeUnit class SuppliesActivity : KotlinBaseActivity(), Handler.Callback { @@ -53,7 +55,9 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 @@ -96,7 +100,7 @@ ) { Log.d(kTag, "startVideoLauncher: ") SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + constructionCheckViewModel.setCurrentPhase("before_operation_protection") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -114,6 +118,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@SuppliesActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -131,6 +136,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -147,13 +153,20 @@ constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - initWebSocket() - binding.videoView.setOnPreparedListener { binding.videoView.requestFocus() binding.videoView.start() } + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + if (!isWebSocketConnected) { + initWebSocket() + } + } + }, 0, 5000) + //左右边距 val viewWidth = getScreenWidth() - (15 + 15).dp2px(this) imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 6, 3) @@ -228,6 +241,7 @@ override fun onDestroy() { super.onDestroy() binding.videoView.suspend() + timer.cancel() webSocket?.close(1000, null) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7014945..a29dde0 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -19,7 +19,6 @@ private val gson = Gson() val alarmModel = MutableLiveData() val detailModel = MutableLiveData() - val alarmState = MutableLiveData() fun getAlarmListByPage(context: Context, keywords: String, page: Int) = launch({ loadState.value = LoadState.Loading @@ -66,19 +65,4 @@ fun changeAlarmState(deviceIp: String, state: String) = launch({ RetrofitServiceManager.changeAlarmState(state) }) - - fun getAlarmState(context: Context) = launch({ - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } - }, { - it.printStackTrace() - }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt index e881698..c9fa134 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt @@ -51,6 +51,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private var isFirstConfirm = false private var isSecondConfirm = false private var isThirdConfirm = false @@ -84,7 +85,7 @@ return@setOnClickListener } SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + constructionCheckViewModel.setCurrentPhase("before_operation_environment") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -156,13 +157,15 @@ binding.videoView.start() } - initWebSocket() - timer = Timer() workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -203,6 +206,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@EnvironmentActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -220,6 +224,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index ef18670..93e94c7 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -29,7 +29,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView @@ -58,6 +57,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var imageAdapter: EditableImageAdapter private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private lateinit var timer: Timer private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } @@ -73,15 +73,18 @@ alarmViewModel.changeAlarmState("", state) } + binding.clearVideoRegionButton.setOnClickListener { + binding.regionView.clearRoutePath() + } + binding.setVideoRegionButton.setOnClickListener { val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - constructionCheckViewModel.setVideoRegion(this, region) + constructionCheckViewModel.setVideoRegion(region) } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase(this, "in_operation") + constructionCheckViewModel.setCurrentPhase("in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -132,17 +135,22 @@ binding.videoView.requestFocus() binding.videoView.start() } - initWebSocket() alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - alarmViewModel.alarmState.observe(this) { - } + binding.alarmCheckbox.isChecked = true constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { + constructionCheckViewModel.setVideoRegionResult.observe(this) { + if (it) { "区域配置成功".show(this) + } else { + "区域配置成功,请联系技术人员".show(this) + } + } + constructionCheckViewModel.setCurrentPhaseResult.observe(this) { + if (it) { + "监护人员检测开启成功".show(this) } } @@ -159,6 +167,10 @@ timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -183,13 +195,15 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = (msg.obj as String).split(":")[1] + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) if (recyclerViewImages.size == 3) { - recyclerViewImages.removeAt(0) + recyclerViewImages.removeFirst() + imageAdapter.notifyDataSetChanged() } recyclerViewImages.add(imagePath) imageAdapter.notifyDataSetChanged() @@ -213,6 +227,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@GuardiansActivity.webSocket = webSocket + isWebSocketConnected = true lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -230,6 +245,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -260,11 +276,6 @@ }) } - override fun onResume() { - super.onResume() - alarmViewModel.getAlarmState(this) - } - override fun onDestroy() { super.onDestroy() binding.videoView.suspend() diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index 433ea5c..b93c694 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -44,6 +44,8 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.Timer +import java.util.TimerTask import java.util.concurrent.TimeUnit class SuppliesActivity : KotlinBaseActivity(), Handler.Callback { @@ -53,7 +55,9 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 @@ -96,7 +100,7 @@ ) { Log.d(kTag, "startVideoLauncher: ") SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + constructionCheckViewModel.setCurrentPhase("before_operation_protection") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -114,6 +118,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@SuppliesActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -131,6 +136,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -147,13 +153,20 @@ constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - initWebSocket() - binding.videoView.setOnPreparedListener { binding.videoView.requestFocus() binding.videoView.start() } + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + if (!isWebSocketConnected) { + initWebSocket() + } + } + }, 0, 5000) + //左右边距 val viewWidth = getScreenWidth() - (15 + 15).dp2px(this) imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 6, 3) @@ -228,6 +241,7 @@ override fun onDestroy() { super.onDestroy() binding.videoView.suspend() + timer.cancel() webSocket?.close(1000, null) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7014945..a29dde0 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -19,7 +19,6 @@ private val gson = Gson() val alarmModel = MutableLiveData() val detailModel = MutableLiveData() - val alarmState = MutableLiveData() fun getAlarmListByPage(context: Context, keywords: String, page: Int) = launch({ loadState.value = LoadState.Loading @@ -66,19 +65,4 @@ fun changeAlarmState(deviceIp: String, state: String) = launch({ RetrofitServiceManager.changeAlarmState(state) }) - - fun getAlarmState(context: Context) = launch({ - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } - }, { - it.printStackTrace() - }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt index 8317578..c448bfa 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -1,47 +1,26 @@ package com.casic.br.operationsite.vm -import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.operationsite.extensions.getResponseCode -import com.casic.br.operationsite.extensions.getResponseMessage -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager -import com.google.gson.Gson import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show class ConstructionCheckViewModel : BaseViewModel() { - private val gson by lazy { Gson() } - val postResult = MutableLiveData() + val setCurrentPhaseResult = MutableLiveData() + val setVideoRegionResult = MutableLiveData() - fun setCurrentPhase(context: Context, phase: String) = launch({ - val response = RetrofitServiceManager.setCurrentPhase(phase) - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } + fun setVideoRegion(position: ArrayList) = launch({ + val response = RetrofitServiceManager.setVideoRegion(position) + setVideoRegionResult.value = response.getResponseCode() == 200 }, { it.printStackTrace() }) - fun setVideoRegion(context: Context, position: ArrayList) = launch({ - val response = RetrofitServiceManager.setVideoRegion(position) - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } + fun setCurrentPhase(phase: String) = launch({ + val response = RetrofitServiceManager.setCurrentPhase(phase) + setCurrentPhaseResult.value = response.getResponseCode() == 200 }, { it.printStackTrace() }) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a65259..ed8b745 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,10 +77,8 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> - - ): String { val param = JsonObject() - val typeToken = object : TypeToken>() {}.type - param.add("positions", gson.toJsonTree(position, typeToken).asJsonArray) + param.addProperty("position", position.toJson()) val requestBody = param.toString().toRequestBody( "application/json;charset=UTF-8".toMediaType() diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt index c5878b1..be24acf 100644 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocaleConstant.kt @@ -47,8 +47,12 @@ // const val SERVER_BASE_URL = "http://123.60.215.216:8065/api" const val SERVER_BASE_URL = "http://111.198.10.15:22006" - const val GAS_BASE_IP = "192.168.10.144" - const val AI_BASE_IP = "192.168.10.136" + + //一体机DeviceMonitor程序TCP Server IP地址 + const val GAS_BASE_IP = "192.168.10.142" + + //一体机算法程序IP地址 + const val AI_BASE_IP = "192.168.10.141" const val AI_BASE_URL = "http://${AI_BASE_IP}:5000" const val DEVICE_CONTROLLER_URL = "https://gbs.ntvgbs.cn/login/" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt deleted file mode 100644 index f30928d..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/ConstructionCheckActivity.kt +++ /dev/null @@ -1,325 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import com.bumptech.glide.Glide -import com.casic.br.operationsite.R -import com.casic.br.operationsite.callback.OnImageCompressListener -import com.casic.br.operationsite.databinding.ActivityConstructionCheckBinding -import com.casic.br.operationsite.extensions.combineImagePath -import com.casic.br.operationsite.extensions.compressImage -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.tcp.SocketManager -import com.casic.br.operationsite.vm.AlarmViewModel -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.casic.br.operationsite.vm.UploadFileViewModel -import com.casic.br.operationsite.vm.WorkSiteViewModel -import com.luck.picture.lib.basic.PictureSelector -import com.luck.picture.lib.config.SelectMimeType -import com.luck.picture.lib.entity.LocalMedia -import com.luck.picture.lib.interfaces.OnResultCallbackListener -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.LoadState -import com.pengxh.kt.lite.utils.LoadingDialogHub -import com.pengxh.kt.lite.utils.WeakReferenceHandler -import com.pengxh.kt.lite.widget.TitleBarView -import java.io.File -import java.util.Timer -import java.util.TimerTask - -class ConstructionCheckActivity : KotlinBaseActivity(), - Handler.Callback { - - private val kTag = "ConstructionCheckActivity" - private val context = this - private lateinit var uploadFileViewModel: UploadFileViewModel - private lateinit var alarmViewModel: AlarmViewModel - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var workSiteViewModel: WorkSiteViewModel - private lateinit var timer: Timer - private lateinit var weakReferenceHandler: WeakReferenceHandler - private var isConnected = false - private var isCompletedFirst = false - private var isCompletedSecond = false - private var isCompletedThird = false - - /** - * 1 - 确认现场 - * 2 - 环境监测-确认鼓风机 - * 3 - 劳保用品-确认鼓风机 - * */ - private var type = 1 - - override fun initEvent() { - binding.connectTcpButton.setOnClickListener { - if (isConnected) { - SocketManager.get.close() - } else { - SocketManager.get.connectTcpServer("192.168.10.145", LocaleConstant.TCP_PORT) - } - } - - binding.startCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.START_CONSTRUCTION_COMMAND) - } - - binding.captureDisclosureImageButton.setOnClickListener { - type = 1 - captureImage() - } - - binding.endCheckButton.setOnClickListener { - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - //发送指令 - SocketManager.get.send(LocaleConstant.END_CONSTRUCTION_COMMAND) - isCompletedFirst = true - } - - binding.startEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") - } - - binding.captureEnvImageButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - type = 2 - captureImage() - } - - binding.endEnvCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - } - - binding.endGasCheckButton.setOnClickListener { - if (!isCompletedFirst) { - "请先完成交底".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.END_ENV_COMMAND) - isCompletedSecond = true - } - - binding.startSuppliesCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - - if (!isConnected) { - "指令发送失败,请确认是否处于同一网段".show(this) - return@setOnClickListener - } - SocketManager.get.send(LocaleConstant.START_SUPPLIES_COMMAND) - } - - binding.startVideoCheckButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - startVideoLauncher.launch(Intent(this, HelmetVideoActivity::class.java)) - } - - binding.captureBlowerImageButton.setOnClickListener { - if (!isCompletedSecond) { - "请先完成环境检测".show(this) - return@setOnClickListener - } - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") - type = 3 - captureImage() - isCompletedThird = true - } - - binding.setVideoRegionButton.setOnClickListener { - if (!isCompletedThird) { - "请先完成劳保用品检测".show(this) - return@setOnClickListener - } - val intent = Intent(this, VideoBoundaryActivity::class.java) - intent.putExtra(Constant.INTENT_PARAM, "192.168.10.137") - videoRegionLauncher.launch(intent) - } - - binding.endAllCheckButton.setOnClickListener { - finish() - } - } - - private val startVideoLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "startVideoLauncher: ") - SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - } - - private val videoRegionLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - Log.d(kTag, "videoRegionLauncher: ") - constructionCheckViewModel.setCurrentPhase(this, "in_operation") - } - - private fun captureImage() { - PictureSelector.create(this).openCamera(SelectMimeType.ofImage()) - .forResult(object : OnResultCallbackListener { - override fun onResult(result: ArrayList?) { - result?.apply { - first().realPath.compressImage(context, object : OnImageCompressListener { - override fun onSuccess(file: File) { - uploadFileViewModel.uploadImage(context, file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }) - } - } - - override fun onCancel() { - - } - }) - } - - override fun handleMessage(msg: Message): Boolean { - isConnected = msg.what == 2024061801 - when (msg.what) { - 2024061801 -> { - binding.tcpStateView.setBackgroundColor(Color.GREEN) - binding.connectTcpButton.text = "断开" - } - - 2024061802 -> { - binding.tcpStateView.setBackgroundColor(Color.RED) - binding.connectTcpButton.text = "连接" - } - } - return true - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - val projectId = intent.getStringExtra(Constant.INTENT_PARAM) as String - - weakReferenceHandler = WeakReferenceHandler(this) - - uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val path = it.data.toString() - if (path.isNotBlank()) { - val url = path.combineImagePath() - Log.d(kTag, "url: $url") - when (type) { - 1 -> Glide.with(this).load(url).into(binding.disclosureImageView) - 2 -> Glide.with(this).load(url).into(binding.envImageView) - 3 -> Glide.with(this).load(url).into(binding.suppliesImageView) - } - "请点击完成确认".show(this) - } - } - } - - alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - - timer = Timer() - workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] - timer.schedule(object : TimerTask() { - override fun run() { - workSiteViewModel.getWorkers(context, projectId) - } - }, 0, 5000) - workSiteViewModel.workerResult.observe(this) { - if (it.code == 200) { - it.data.forEach { worker -> - if (worker.lat.isNotBlank() && worker.lng.isNotBlank()) { - binding.coValueView.text = "CO:${worker.co}ppm" - binding.gasValueView.text = "CH4:${worker.gas}ppm" - binding.h2sValueView.text = "H2S:${worker.co}ppm" - binding.o2ValueView.text = "O2:${worker.o2}%VOL" - } - } - } - } - } - - override fun initViewBinding(): ActivityConstructionCheckBinding { - return ActivityConstructionCheckBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - uploadFileViewModel.loadState.observe(this) { - when (it) { - LoadState.Loading -> LoadingDialogHub.show(this, "图片上传中,请稍后...") - else -> LoadingDialogHub.dismiss() - } - } - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - timer.cancel() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt deleted file mode 100644 index 120ae07..0000000 --- a/app/src/main/java/com/casic/br/operationsite/view/VideoBoundaryActivity.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.casic.br.operationsite.view - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.util.Log -import androidx.lifecycle.ViewModelProvider -import com.casic.br.operationsite.R -import com.casic.br.operationsite.databinding.ActivityVideoBoundaryBinding -import com.casic.br.operationsite.extensions.initImmersionBar -import com.casic.br.operationsite.vm.ConstructionCheckViewModel -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.ActivityStackManager -import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.TitleBarView - -class VideoBoundaryActivity : KotlinBaseActivity() { - - private val kTag = "VideoBoundaryActivity" - private val context = this@VideoBoundaryActivity - private var isStarted = false - private lateinit var constructionCheckViewModel: ConstructionCheckViewModel - private lateinit var cameraAddresses: String - - override fun initOnCreate(savedInstanceState: Bundle?) { - ActivityStackManager.addActivity(this) - - cameraAddresses = intent.getStringExtra(Constant.INTENT_PARAM) as String - - val params = binding.fragmentContainer.layoutParams - params.width = getScreenWidth() - params.height = ((9 / 16f) * params.width).toInt() - binding.fragmentContainer.layoutParams = params - - constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { - "区域配置成功".show(this) - val intent = Intent() - setResult(RESULT_OK, intent) - finish() - } - } - } - - override fun initEvent() { - binding.startRtspButton.setOnClickListener { - if (isStarted) { - binding.videoSurfaceView.stopPlayback() - binding.videoSurfaceView.clearFocus() - isStarted = false - binding.startRtspButton.text = "打开摄像头" - } else { - //播放RTSP流 - binding.videoSurfaceView.setVideoURI( - //rtsp://admin:admin@192.168.10.137:554/h264/ch1/main/av_stream - //rtsp://192.168.10.137:554/live/site - Uri.parse("rtsp://192.168.10.137:554/live/site") - ) - } - } - - binding.videoSurfaceView.setOnPreparedListener { - binding.videoSurfaceView.requestFocus() - binding.videoSurfaceView.start() - isStarted = true - binding.startRtspButton.text = "关闭摄像头" - } - - binding.saveCameraRegionButton.setOnClickListener { - val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - - constructionCheckViewModel.setVideoRegion(this, region) - } - } - - override fun initViewBinding(): ActivityVideoBoundaryBinding { - return ActivityVideoBoundaryBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - finish() - } - - override fun onRightClick() { - - } - }) - } - - override fun onDestroy() { - super.onDestroy() - binding.videoSurfaceView.suspend() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt index 34b9b5f..9ded0c3 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkTaskActivity.kt @@ -13,7 +13,7 @@ import com.casic.br.operationsite.model.WorkSiteListModel import com.casic.br.operationsite.service.TcpMessageService import com.casic.br.operationsite.utils.RuntimeCache -import com.casic.br.operationsite.view.check.DisclosureActivity +import com.casic.br.operationsite.view.check.GuardiansActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder @@ -125,7 +125,8 @@ position: Int, t: WorkSiteListModel.DataModel.RowsModel ) { RuntimeCache.projectId = t.id - navigatePageTo() +// navigatePageTo() + navigatePageTo() } }) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt index e881698..c9fa134 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/EnvironmentActivity.kt @@ -51,6 +51,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private var isFirstConfirm = false private var isSecondConfirm = false private var isThirdConfirm = false @@ -84,7 +85,7 @@ return@setOnClickListener } SocketManager.get.send(LocaleConstant.START_ENV_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_environment") + constructionCheckViewModel.setCurrentPhase("before_operation_environment") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -156,13 +157,15 @@ binding.videoView.start() } - initWebSocket() - timer = Timer() workSiteViewModel = ViewModelProvider(this)[WorkSiteViewModel::class.java] timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -203,6 +206,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@EnvironmentActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -220,6 +224,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt index ef18670..93e94c7 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/GuardiansActivity.kt @@ -29,7 +29,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.saveImage import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.ActivityStackManager import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView @@ -58,6 +57,7 @@ private lateinit var workSiteViewModel: WorkSiteViewModel private lateinit var imageAdapter: EditableImageAdapter private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private lateinit var timer: Timer private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } @@ -73,15 +73,18 @@ alarmViewModel.changeAlarmState("", state) } + binding.clearVideoRegionButton.setOnClickListener { + binding.regionView.clearRoutePath() + } + binding.setVideoRegionButton.setOnClickListener { val region = binding.regionView.getConfirmedPoints() - Log.d(kTag, region.toJson()) - constructionCheckViewModel.setVideoRegion(this, region) + constructionCheckViewModel.setVideoRegion(region) } binding.startVideoCheckButton.setOnClickListener { - constructionCheckViewModel.setCurrentPhase(this, "in_operation") + constructionCheckViewModel.setCurrentPhase("in_operation") } imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { @@ -132,17 +135,22 @@ binding.videoView.requestFocus() binding.videoView.start() } - initWebSocket() alarmViewModel = ViewModelProvider(this)[AlarmViewModel::class.java] - alarmViewModel.alarmState.observe(this) { - } + binding.alarmCheckbox.isChecked = true constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - constructionCheckViewModel.postResult.observe(this) { - if (it.code == 200) { + constructionCheckViewModel.setVideoRegionResult.observe(this) { + if (it) { "区域配置成功".show(this) + } else { + "区域配置成功,请联系技术人员".show(this) + } + } + constructionCheckViewModel.setCurrentPhaseResult.observe(this) { + if (it) { + "监护人员检测开启成功".show(this) } } @@ -159,6 +167,10 @@ timer.schedule(object : TimerTask() { override fun run() { workSiteViewModel.getWorkers(context, RuntimeCache.projectId) + + if (!isWebSocketConnected) { + initWebSocket() + } } }, 0, 5000) workSiteViewModel.workerResult.observe(this) { @@ -183,13 +195,15 @@ LocaleConstant.WEBSOCKET_MESSAGE_CODE -> { try { - val bitmapArray = Base64.decode((msg.obj as String), Base64.DEFAULT) + val base64 = (msg.obj as String).split(":")[1] + val bitmapArray = Base64.decode(base64, Base64.DEFAULT) val bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.size) val imagePath = "/${createImageFileDir()}/IMG${timeFormat.format(Date())}.png" Log.d(kTag, "imagePath: $imagePath") bitmap.saveImage(imagePath) if (recyclerViewImages.size == 3) { - recyclerViewImages.removeAt(0) + recyclerViewImages.removeFirst() + imageAdapter.notifyDataSetChanged() } recyclerViewImages.add(imagePath) imageAdapter.notifyDataSetChanged() @@ -213,6 +227,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@GuardiansActivity.webSocket = webSocket + isWebSocketConnected = true lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -230,6 +245,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -260,11 +276,6 @@ }) } - override fun onResume() { - super.onResume() - alarmViewModel.getAlarmState(this) - } - override fun onDestroy() { super.onDestroy() binding.videoView.suspend() diff --git a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt index 433ea5c..b93c694 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/check/SuppliesActivity.kt @@ -44,6 +44,8 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.Timer +import java.util.TimerTask import java.util.concurrent.TimeUnit class SuppliesActivity : KotlinBaseActivity(), Handler.Callback { @@ -53,7 +55,9 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var constructionCheckViewModel: ConstructionCheckViewModel private lateinit var imageAdapter: EditableImageAdapter + private lateinit var timer: Timer private var webSocket: WebSocket? = null + private var isWebSocketConnected = false private val timeFormat by lazy { SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA) } private val marginOffset by lazy { 1.dp2px(this) } private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 @@ -96,7 +100,7 @@ ) { Log.d(kTag, "startVideoLauncher: ") SocketManager.get.send(LocaleConstant.START_VIDEO_COMMAND) - constructionCheckViewModel.setCurrentPhase(this, "before_operation_protection") + constructionCheckViewModel.setCurrentPhase("before_operation_protection") //播放RTSP流 binding.videoView.setVideoURI(Uri.parse("rtsp://192.168.10.137:554")) } @@ -114,6 +118,7 @@ override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@SuppliesActivity.webSocket = webSocket + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_CONNECTED_CODE) } @@ -131,6 +136,7 @@ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { super.onFailure(webSocket, t, response) + isWebSocketConnected = false lifecycleScope.launch(Dispatchers.Main) { weakReferenceHandler.sendEmptyMessage(LocaleConstant.WEBSOCKET_DISCONNECTED_CODE) } @@ -147,13 +153,20 @@ constructionCheckViewModel = ViewModelProvider(this)[ConstructionCheckViewModel::class.java] - initWebSocket() - binding.videoView.setOnPreparedListener { binding.videoView.requestFocus() binding.videoView.start() } + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + if (!isWebSocketConnected) { + initWebSocket() + } + } + }, 0, 5000) + //左右边距 val viewWidth = getScreenWidth() - (15 + 15).dp2px(this) imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 6, 3) @@ -228,6 +241,7 @@ override fun onDestroy() { super.onDestroy() binding.videoView.suspend() + timer.cancel() webSocket?.close(1000, null) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt index 7014945..a29dde0 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -19,7 +19,6 @@ private val gson = Gson() val alarmModel = MutableLiveData() val detailModel = MutableLiveData() - val alarmState = MutableLiveData() fun getAlarmListByPage(context: Context, keywords: String, page: Int) = launch({ loadState.value = LoadState.Loading @@ -66,19 +65,4 @@ fun changeAlarmState(deviceIp: String, state: String) = launch({ RetrofitServiceManager.changeAlarmState(state) }) - - fun getAlarmState(context: Context) = launch({ - val response = RetrofitServiceManager.getAlarmState() - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } - }, { - it.printStackTrace() - }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt index 8317578..c448bfa 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/ConstructionCheckViewModel.kt @@ -1,47 +1,26 @@ package com.casic.br.operationsite.vm -import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.operationsite.extensions.getResponseCode -import com.casic.br.operationsite.extensions.getResponseMessage -import com.casic.br.operationsite.model.CommonResultModel import com.casic.br.operationsite.retrofit.RetrofitServiceManager -import com.google.gson.Gson import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show class ConstructionCheckViewModel : BaseViewModel() { - private val gson by lazy { Gson() } - val postResult = MutableLiveData() + val setCurrentPhaseResult = MutableLiveData() + val setVideoRegionResult = MutableLiveData() - fun setCurrentPhase(context: Context, phase: String) = launch({ - val response = RetrofitServiceManager.setCurrentPhase(phase) - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } + fun setVideoRegion(position: ArrayList) = launch({ + val response = RetrofitServiceManager.setVideoRegion(position) + setVideoRegionResult.value = response.getResponseCode() == 200 }, { it.printStackTrace() }) - fun setVideoRegion(context: Context, position: ArrayList) = launch({ - val response = RetrofitServiceManager.setVideoRegion(position) - when (response.getResponseCode()) { - 200 -> { - - } - - else -> { - response.getResponseMessage().show(context) - } - } + fun setCurrentPhase(phase: String) = launch({ + val response = RetrofitServiceManager.setCurrentPhase(phase) + setCurrentPhaseResult.value = response.getResponseCode() == 200 }, { it.printStackTrace() }) diff --git a/app/src/main/res/layout/activity_construction_check.xml b/app/src/main/res/layout/activity_construction_check.xml deleted file mode 100644 index 2e163a6..0000000 --- a/app/src/main/res/layout/activity_construction_check.xml +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - - - - - -