diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 08a5f66..3ca2220 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -218,10 +218,55 @@ LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "192.168.10.137" ) as String if (httpConfig == "") { - Log.d(kTag, "executeDeviceCommand: httpConfig is null") + Log.d(kTag, "httpConfig is null") return "" } val service = RetrofitFactory.createRetrofit("http://$httpConfig") return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) } + + /** + * 获取业务场景设备列表 + */ + suspend fun getBusinessDevices(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessDevices() + } + + /** + * 获取业务场景列表 + */ + suspend fun getBusinessScenarios(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessScenarios() + } + + /** + * 获取设备已关联的业务场景 + */ + suspend fun getSceneByDevice(deviceId: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getSceneByDevice(deviceId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 08a5f66..3ca2220 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -218,10 +218,55 @@ LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "192.168.10.137" ) as String if (httpConfig == "") { - Log.d(kTag, "executeDeviceCommand: httpConfig is null") + Log.d(kTag, "httpConfig is null") return "" } val service = RetrofitFactory.createRetrofit("http://$httpConfig") return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) } + + /** + * 获取业务场景设备列表 + */ + suspend fun getBusinessDevices(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessDevices() + } + + /** + * 获取业务场景列表 + */ + suspend fun getBusinessScenarios(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessScenarios() + } + + /** + * 获取设备已关联的业务场景 + */ + suspend fun getSceneByDevice(deviceId: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getSceneByDevice(deviceId) + } } \ No newline at end of file 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 cb17e58..1d65bb1 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 @@ -127,7 +127,7 @@ /*** * SP Key * */ - const val DEVICE_CONTROL_SERVER_CONFIG_KEY = "Key_1" + const val ALGORITHM_DEVICE_API_KEY = "Key_1" const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 08a5f66..3ca2220 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -218,10 +218,55 @@ LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "192.168.10.137" ) as String if (httpConfig == "") { - Log.d(kTag, "executeDeviceCommand: httpConfig is null") + Log.d(kTag, "httpConfig is null") return "" } val service = RetrofitFactory.createRetrofit("http://$httpConfig") return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) } + + /** + * 获取业务场景设备列表 + */ + suspend fun getBusinessDevices(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessDevices() + } + + /** + * 获取业务场景列表 + */ + suspend fun getBusinessScenarios(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessScenarios() + } + + /** + * 获取设备已关联的业务场景 + */ + suspend fun getSceneByDevice(deviceId: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getSceneByDevice(deviceId) + } } \ No newline at end of file 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 cb17e58..1d65bb1 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 @@ -127,7 +127,7 @@ /*** * SP Key * */ - const val DEVICE_CONTROL_SERVER_CONFIG_KEY = "Key_1" + const val ALGORITHM_DEVICE_API_KEY = "Key_1" const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index db25c40..a28aaef 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -355,12 +355,18 @@ SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "") as String val socketOldIp = SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, "") as String + val algorithmDeviceOldIp = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String val view = LayoutInflater.from(this).inflate(R.layout.dialog_input_config, null) val cameraIpView = view.findViewById(R.id.cameraIpView) val socketIpView = view.findViewById(R.id.socketIpView) + val algorithmDeviceIpView = + view.findViewById(R.id.algorithmDeviceIpView) cameraIpView.setText(cameraOldIp) socketIpView.setText(socketOldIp) + algorithmDeviceIpView.setText(algorithmDeviceOldIp) AlertDialog.Builder(this) .setTitle(getString(R.string.app_name)) @@ -372,12 +378,16 @@ .setPositiveButton("确定") { _, _ -> val cameraIp = cameraIpView.text.toString() val socketIp = socketIpView.text.toString() - if (cameraIp.isBlank() || socketIp.isBlank()) { - "什么都还没输入呢!".show(context) + val algorithmDeviceIp = algorithmDeviceIpView.text.toString() + if (cameraIp.isBlank() || socketIp.isBlank() || algorithmDeviceIp.isBlank()) { + "IP配置不能为空".show(context) return@setPositiveButton } SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, cameraIp) SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, socketIp) + SaveKeyValues.putValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, algorithmDeviceIp + ) //设置好了之后才跳转设备控制,确保设备能连上最新的配置 navigatePageTo() diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 08a5f66..3ca2220 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -218,10 +218,55 @@ LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "192.168.10.137" ) as String if (httpConfig == "") { - Log.d(kTag, "executeDeviceCommand: httpConfig is null") + Log.d(kTag, "httpConfig is null") return "" } val service = RetrofitFactory.createRetrofit("http://$httpConfig") return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) } + + /** + * 获取业务场景设备列表 + */ + suspend fun getBusinessDevices(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessDevices() + } + + /** + * 获取业务场景列表 + */ + suspend fun getBusinessScenarios(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessScenarios() + } + + /** + * 获取设备已关联的业务场景 + */ + suspend fun getSceneByDevice(deviceId: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getSceneByDevice(deviceId) + } } \ No newline at end of file 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 cb17e58..1d65bb1 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 @@ -127,7 +127,7 @@ /*** * SP Key * */ - const val DEVICE_CONTROL_SERVER_CONFIG_KEY = "Key_1" + const val ALGORITHM_DEVICE_API_KEY = "Key_1" const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index db25c40..a28aaef 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -355,12 +355,18 @@ SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "") as String val socketOldIp = SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, "") as String + val algorithmDeviceOldIp = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String val view = LayoutInflater.from(this).inflate(R.layout.dialog_input_config, null) val cameraIpView = view.findViewById(R.id.cameraIpView) val socketIpView = view.findViewById(R.id.socketIpView) + val algorithmDeviceIpView = + view.findViewById(R.id.algorithmDeviceIpView) cameraIpView.setText(cameraOldIp) socketIpView.setText(socketOldIp) + algorithmDeviceIpView.setText(algorithmDeviceOldIp) AlertDialog.Builder(this) .setTitle(getString(R.string.app_name)) @@ -372,12 +378,16 @@ .setPositiveButton("确定") { _, _ -> val cameraIp = cameraIpView.text.toString() val socketIp = socketIpView.text.toString() - if (cameraIp.isBlank() || socketIp.isBlank()) { - "什么都还没输入呢!".show(context) + val algorithmDeviceIp = algorithmDeviceIpView.text.toString() + if (cameraIp.isBlank() || socketIp.isBlank() || algorithmDeviceIp.isBlank()) { + "IP配置不能为空".show(context) return@setPositiveButton } SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, cameraIp) SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, socketIp) + SaveKeyValues.putValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, algorithmDeviceIp + ) //设置好了之后才跳转设备控制,确保设备能连上最新的配置 navigatePageTo() diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt new file mode 100644 index 0000000..a222914 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.ViewModel +import com.casic.br.operationsite.extensions.getResponseHeader +import com.casic.br.operationsite.model.BusinessDeviceModel +import com.casic.br.operationsite.model.BusinessSceneModel +import com.casic.br.operationsite.model.DeviceSceneModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.unpackingResponse + +class AlgorithmViewModel : ViewModel() { + fun getBusinessDevices( + onLoading: () -> Unit, + onSuccess: (BusinessDeviceModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getBusinessDevices() + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) + + fun getBusinessScenarios( + onLoading: () -> Unit, + onSuccess: (BusinessSceneModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getBusinessScenarios() + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) + + fun getSceneByDevice( + deviceId: Int, + onLoading: () -> Unit, + onSuccess: (DeviceSceneModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getSceneByDevice(deviceId) + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 08a5f66..3ca2220 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -218,10 +218,55 @@ LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "192.168.10.137" ) as String if (httpConfig == "") { - Log.d(kTag, "executeDeviceCommand: httpConfig is null") + Log.d(kTag, "httpConfig is null") return "" } val service = RetrofitFactory.createRetrofit("http://$httpConfig") return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) } + + /** + * 获取业务场景设备列表 + */ + suspend fun getBusinessDevices(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessDevices() + } + + /** + * 获取业务场景列表 + */ + suspend fun getBusinessScenarios(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessScenarios() + } + + /** + * 获取设备已关联的业务场景 + */ + suspend fun getSceneByDevice(deviceId: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getSceneByDevice(deviceId) + } } \ No newline at end of file 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 cb17e58..1d65bb1 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 @@ -127,7 +127,7 @@ /*** * SP Key * */ - const val DEVICE_CONTROL_SERVER_CONFIG_KEY = "Key_1" + const val ALGORITHM_DEVICE_API_KEY = "Key_1" const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index db25c40..a28aaef 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -355,12 +355,18 @@ SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "") as String val socketOldIp = SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, "") as String + val algorithmDeviceOldIp = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String val view = LayoutInflater.from(this).inflate(R.layout.dialog_input_config, null) val cameraIpView = view.findViewById(R.id.cameraIpView) val socketIpView = view.findViewById(R.id.socketIpView) + val algorithmDeviceIpView = + view.findViewById(R.id.algorithmDeviceIpView) cameraIpView.setText(cameraOldIp) socketIpView.setText(socketOldIp) + algorithmDeviceIpView.setText(algorithmDeviceOldIp) AlertDialog.Builder(this) .setTitle(getString(R.string.app_name)) @@ -372,12 +378,16 @@ .setPositiveButton("确定") { _, _ -> val cameraIp = cameraIpView.text.toString() val socketIp = socketIpView.text.toString() - if (cameraIp.isBlank() || socketIp.isBlank()) { - "什么都还没输入呢!".show(context) + val algorithmDeviceIp = algorithmDeviceIpView.text.toString() + if (cameraIp.isBlank() || socketIp.isBlank() || algorithmDeviceIp.isBlank()) { + "IP配置不能为空".show(context) return@setPositiveButton } SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, cameraIp) SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, socketIp) + SaveKeyValues.putValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, algorithmDeviceIp + ) //设置好了之后才跳转设备控制,确保设备能连上最新的配置 navigatePageTo() diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt new file mode 100644 index 0000000..a222914 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.ViewModel +import com.casic.br.operationsite.extensions.getResponseHeader +import com.casic.br.operationsite.model.BusinessDeviceModel +import com.casic.br.operationsite.model.BusinessSceneModel +import com.casic.br.operationsite.model.DeviceSceneModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.unpackingResponse + +class AlgorithmViewModel : ViewModel() { + fun getBusinessDevices( + onLoading: () -> Unit, + onSuccess: (BusinessDeviceModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getBusinessDevices() + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) + + fun getBusinessScenarios( + onLoading: () -> Unit, + onSuccess: (BusinessSceneModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getBusinessScenarios() + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) + + fun getSceneByDevice( + deviceId: Int, + onLoading: () -> Unit, + onSuccess: (DeviceSceneModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getSceneByDevice(deviceId) + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input_config.xml b/app/src/main/res/layout/dialog_input_config.xml index 5742abc..5c2db6a 100644 --- a/app/src/main/res/layout/dialog_input_config.xml +++ b/app/src/main/res/layout/dialog_input_config.xml @@ -24,7 +24,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" - android:hint="安全树视频相机IP地址" + android:hint="安全树相机预览IP地址" android:inputType="textEmailAddress" android:padding="@dimen/dp_10" android:textSize="@dimen/sp_16" /> @@ -34,7 +34,7 @@ style="@style/ThemeOverlay.Material3.AutoCompleteTextView.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_20" + android:layout_marginVertical="@dimen/dp_20" app:boxBackgroundColor="@color/white" app:boxBackgroundMode="outline" app:boxCornerRadiusBottomEnd="@dimen/dp_5" @@ -48,7 +48,30 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" - android:hint="安全树数据通信IP地址" + android:hint="安全树甲烷数据交互IP地址" + android:inputType="textEmailAddress" + android:padding="@dimen/dp_10" + android:textSize="@dimen/sp_16" /> + + + + + diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt index f608a2e..83f0b80 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/BaseSettingsFragment.kt @@ -7,10 +7,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.casic.br.operationsite.databinding.FragmentBaseSettingsBinding +import com.casic.br.operationsite.model.BusinessSceneModel import com.casic.br.operationsite.service.SocketConnectionService import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.vm.AlgorithmViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -26,6 +30,8 @@ } private val kTag = "BaseSettingsFragment" + private val algorithmViewModel by lazy { ViewModelProvider(this)[AlgorithmViewModel::class.java] } + private val dataBeans = ArrayList() private var isGetBoardConfig = false private var isGetWiFiConfig = false private var isGetAlgorithmConfig = false @@ -133,15 +139,69 @@ weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数获取失败,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } else { weakReferenceHandler?.removeCallbacksAndMessages(null) retryTimes.set(0) Log.d(kTag, "run: 所有参数均已获取,移除所有参数线程回调") + getBusinessDevices() + getBusinessScenarios() } } } + private fun getBusinessDevices() { + algorithmViewModel.getBusinessDevices( + onLoading = {}, + onSuccess = { + val result = it.data.find { item -> item.code == binding.deviceCodeView.text } + if (result == null) { + "AI模型配置获取失败,请重试".show(requireContext()) + return@getBusinessDevices + } + getSceneByDevice(result.id) + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getBusinessScenarios() { + algorithmViewModel.getBusinessScenarios( + onLoading = {}, + onSuccess = { + val scenarios = ArrayList() + it.data.forEach { item -> + dataBeans.add(item) + scenarios.add(item.name) + } + //绑定Spinner + binding.sceneTypeSpinner.adapter = ArrayAdapter( + requireContext(), android.R.layout.simple_spinner_item, scenarios + ).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + }, + onFailed = { it.show(requireContext()) } + ) + } + + private fun getSceneByDevice(id: Int) { + algorithmViewModel.getSceneByDevice( + id, + onLoading = {}, + onSuccess = { + dataBeans.forEachIndexed { index, item -> + if (item.name == it.data.scene_name) { + binding.sceneTypeSpinner.setSelection(index) + } + } + }, + onFailed = { it.show(requireContext()) } + ) + } + override fun initEvent() { binding.updateWiFiConfigButton.setOnClickListener { val password = binding.passwordView.text.toString() @@ -160,6 +220,10 @@ } } + binding.updateAlgorithmButton.setOnClickListener { + + } + binding.updateServerConfigButton.setOnClickListener { val serverHost = binding.serverHostView.text.toString() if (serverHost.isBlank()) { @@ -210,9 +274,11 @@ if (state == "0") { isUseAlgorithm = true binding.serverLayout.visibility = View.GONE + binding.algorithmLayout.visibility = View.VISIBLE } else { isUseAlgorithm = false binding.serverLayout.visibility = View.VISIBLE + binding.algorithmLayout.visibility = View.GONE } } diff --git a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt index f9e632f..2574a43 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragments/DeviceControllerFragment.kt @@ -34,7 +34,6 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch -@FlowPreview class DeviceControllerFragment : KotlinBaseFragment() { private val kTag = "DeviceFragment" @@ -197,40 +196,7 @@ } else { val beans = pointBeanDao.firstLinePoints binding.pointSpinner.setSelection(beans.size - 1) - LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") - lifecycleScope.launch(Dispatchers.Main) { - (1..beans.size).asFlow().onStart { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.SELECT_LINE_CODE - ) - delay(1000) - }.flatMapConcat { i -> - flow { - CameraInspectionService.weakReferenceHandler?.let { - val message = it.obtainMessage() - message.what = LocaleConstant.SETUP_POINT_CODE - message.obj = i - it.sendMessage(message) - } - delay(1000) - emit(i) - } - }.onCompletion { - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.START_ADD_POINT_CONFIG_CODE - ) - delay(1000) - CameraInspectionService.weakReferenceHandler?.sendEmptyMessage( - LocaleConstant.END_ADD_POINT_CONFIG_CODE - ) - LoadingDialog.dismiss() - "绑定成功,可以开始巡航了!".show(requireContext()) - }.collect() - } + bindPoint(beans) } } }).build().show() @@ -258,6 +224,40 @@ } } + @OptIn(FlowPreview::class) + private fun bindPoint(beans: List) { + LoadingDialog.show(requireActivity(), "预置点绑定中,请稍后...") + lifecycleScope.launch(Dispatchers.Main) { + (1..beans.size).asFlow().onStart { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.SELECT_LINE_CODE) + } + delay(1000) + }.flatMapConcat { i -> + flow { + CameraInspectionService.weakReferenceHandler?.let { + val message = it.obtainMessage() + message.what = LocaleConstant.SETUP_POINT_CODE + message.obj = i + it.sendMessage(message) + } + delay(1000) + emit(i) + } + }.onCompletion { + CameraInspectionService.weakReferenceHandler?.let { + it.sendEmptyMessage(LocaleConstant.START_ADD_POINT_CONFIG_CODE) + delay(1000) + it.sendEmptyMessage(LocaleConstant.END_ADD_POINT_CONFIG_CODE) + } + LoadingDialog.dismiss() + "绑定成功,可以开始巡航了!".show(requireContext()) + }.collect() + } + } + private fun executeCommand(action: String) { deviceViewModel.executeDeviceCommand(action, speed) } diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java new file mode 100644 index 0000000..fdd8e67 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessDeviceModel.java @@ -0,0 +1,190 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessDeviceModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private String name; + private String code; + private String type; + private String ip; + private int mode; + private String gas_ip; + private String input_stream_url; + private String output_stream_url; + private int image_save_interval; + private int alarm_interval; + private int id; + private Object status; + private Object relation_scene_name; + private Object relation_model_names; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getMode() { + return mode; + } + + public void setMode(int mode) { + this.mode = mode; + } + + public String getGas_ip() { + return gas_ip; + } + + public void setGas_ip(String gas_ip) { + this.gas_ip = gas_ip; + } + + public String getInput_stream_url() { + return input_stream_url; + } + + public void setInput_stream_url(String input_stream_url) { + this.input_stream_url = input_stream_url; + } + + public String getOutput_stream_url() { + return output_stream_url; + } + + public void setOutput_stream_url(String output_stream_url) { + this.output_stream_url = output_stream_url; + } + + public int getImage_save_interval() { + return image_save_interval; + } + + public void setImage_save_interval(int image_save_interval) { + this.image_save_interval = image_save_interval; + } + + public int getAlarm_interval() { + return alarm_interval; + } + + public void setAlarm_interval(int alarm_interval) { + this.alarm_interval = alarm_interval; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Object getStatus() { + return status; + } + + public void setStatus(Object status) { + this.status = status; + } + + public Object getRelation_scene_name() { + return relation_scene_name; + } + + public void setRelation_scene_name(Object relation_scene_name) { + this.relation_scene_name = relation_scene_name; + } + + public Object getRelation_model_names() { + return relation_model_names; + } + + public void setRelation_model_names(Object relation_model_names) { + this.relation_model_names = relation_model_names; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java new file mode 100644 index 0000000..f97454b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/BusinessSceneModel.java @@ -0,0 +1,109 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class BusinessSceneModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String name; + private String handle_task; + private String create_time; + private int id; + private String version; + private String update_time; + private String remark; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHandle_task() { + return handle_task; + } + + public void setHandle_task(String handle_task) { + this.handle_task = handle_task; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java new file mode 100644 index 0000000..892b4c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/DeviceSceneModel.java @@ -0,0 +1,134 @@ +package com.casic.br.operationsite.model; + +public class DeviceSceneModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String create_time; + private String update_time; + private int scene_id; + private int device_id; + private String range_points; + private int id; + private String scene_name; + private String scene_version; + private String scene_handle_task; + private String scene_remark; + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public int getScene_id() { + return scene_id; + } + + public void setScene_id(int scene_id) { + this.scene_id = scene_id; + } + + public int getDevice_id() { + return device_id; + } + + public void setDevice_id(int device_id) { + this.device_id = device_id; + } + + public String getRange_points() { + return range_points; + } + + public void setRange_points(String range_points) { + this.range_points = range_points; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getScene_name() { + return scene_name; + } + + public void setScene_name(String scene_name) { + this.scene_name = scene_name; + } + + public String getScene_version() { + return scene_version; + } + + public void setScene_version(String scene_version) { + this.scene_version = scene_version; + } + + public String getScene_handle_task() { + return scene_handle_task; + } + + public void setScene_handle_task(String scene_handle_task) { + this.scene_handle_task = scene_handle_task; + } + + public String getScene_remark() { + return scene_remark; + } + + public void setScene_remark(String scene_remark) { + this.scene_remark = scene_remark; + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index c093f36..dcc8ca8 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -155,4 +155,22 @@ @Query("pwd") pwd: String, @Query("Speed") Speed: String ): String + + /** + * 获取业务场景设备列表 + */ + @GET("/api/device/list") + suspend fun getBusinessDevices(): String + + /** + * 获取业务场景列表 + */ + @GET("/api/scene/list") + suspend fun getBusinessScenarios(): String + + /** + * 获取设备已关联的业务场景 + */ + @GET("/api/device_scene_relation/get_by_device") + suspend fun getSceneByDevice(@Query("device_id") deviceId: Int): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 08a5f66..3ca2220 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -218,10 +218,55 @@ LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "192.168.10.137" ) as String if (httpConfig == "") { - Log.d(kTag, "executeDeviceCommand: httpConfig is null") + Log.d(kTag, "httpConfig is null") return "" } val service = RetrofitFactory.createRetrofit("http://$httpConfig") return service.executeDeviceCommand(action, "admin", "admin", speed.toString()) } + + /** + * 获取业务场景设备列表 + */ + suspend fun getBusinessDevices(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessDevices() + } + + /** + * 获取业务场景列表 + */ + suspend fun getBusinessScenarios(): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getBusinessScenarios() + } + + /** + * 获取设备已关联的业务场景 + */ + suspend fun getSceneByDevice(deviceId: Int): String { + val httpConfig = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String + if (httpConfig == "") { + Log.d(kTag, "httpConfig is null") + return "" + } + val service = RetrofitFactory.createRetrofit("http://$httpConfig:9000") + return service.getSceneByDevice(deviceId) + } } \ No newline at end of file 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 cb17e58..1d65bb1 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 @@ -127,7 +127,7 @@ /*** * SP Key * */ - const val DEVICE_CONTROL_SERVER_CONFIG_KEY = "Key_1" + const val ALGORITHM_DEVICE_API_KEY = "Key_1" const val METHANE_DEFAULT_VALUE_KEY = "Key_2" const val SAFE_TREE_CAMERA_IP_KEY = "Key_3" const val SAFE_TREE_SOCKET_IP_KEY = "Key_4" diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index db25c40..a28aaef 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -355,12 +355,18 @@ SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, "") as String val socketOldIp = SaveKeyValues.getValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, "") as String + val algorithmDeviceOldIp = SaveKeyValues.getValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, "192.168.10.236" + ) as String val view = LayoutInflater.from(this).inflate(R.layout.dialog_input_config, null) val cameraIpView = view.findViewById(R.id.cameraIpView) val socketIpView = view.findViewById(R.id.socketIpView) + val algorithmDeviceIpView = + view.findViewById(R.id.algorithmDeviceIpView) cameraIpView.setText(cameraOldIp) socketIpView.setText(socketOldIp) + algorithmDeviceIpView.setText(algorithmDeviceOldIp) AlertDialog.Builder(this) .setTitle(getString(R.string.app_name)) @@ -372,12 +378,16 @@ .setPositiveButton("确定") { _, _ -> val cameraIp = cameraIpView.text.toString() val socketIp = socketIpView.text.toString() - if (cameraIp.isBlank() || socketIp.isBlank()) { - "什么都还没输入呢!".show(context) + val algorithmDeviceIp = algorithmDeviceIpView.text.toString() + if (cameraIp.isBlank() || socketIp.isBlank() || algorithmDeviceIp.isBlank()) { + "IP配置不能为空".show(context) return@setPositiveButton } SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_CAMERA_IP_KEY, cameraIp) SaveKeyValues.putValue(LocaleConstant.SAFE_TREE_SOCKET_IP_KEY, socketIp) + SaveKeyValues.putValue( + LocaleConstant.ALGORITHM_DEVICE_API_KEY, algorithmDeviceIp + ) //设置好了之后才跳转设备控制,确保设备能连上最新的配置 navigatePageTo() diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt new file mode 100644 index 0000000..a222914 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlgorithmViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.ViewModel +import com.casic.br.operationsite.extensions.getResponseHeader +import com.casic.br.operationsite.model.BusinessDeviceModel +import com.casic.br.operationsite.model.BusinessSceneModel +import com.casic.br.operationsite.model.DeviceSceneModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.unpackingResponse + +class AlgorithmViewModel : ViewModel() { + fun getBusinessDevices( + onLoading: () -> Unit, + onSuccess: (BusinessDeviceModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getBusinessDevices() + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) + + fun getBusinessScenarios( + onLoading: () -> Unit, + onSuccess: (BusinessSceneModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getBusinessScenarios() + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) + + fun getSceneByDevice( + deviceId: Int, + onLoading: () -> Unit, + onSuccess: (DeviceSceneModel) -> Unit, + onFailed: (String) -> Unit + ) = launch({ + onLoading() + val response = RetrofitServiceManager.getSceneByDevice(deviceId) + val header = response.getResponseHeader() + if (header.first == 200) { + onSuccess(unpackingResponse(response)) + } else { + onFailed(header.second) + } + }, { + it.printStackTrace() + onFailed(it.message ?: "Unknown error") + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input_config.xml b/app/src/main/res/layout/dialog_input_config.xml index 5742abc..5c2db6a 100644 --- a/app/src/main/res/layout/dialog_input_config.xml +++ b/app/src/main/res/layout/dialog_input_config.xml @@ -24,7 +24,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" - android:hint="安全树视频相机IP地址" + android:hint="安全树相机预览IP地址" android:inputType="textEmailAddress" android:padding="@dimen/dp_10" android:textSize="@dimen/sp_16" /> @@ -34,7 +34,7 @@ style="@style/ThemeOverlay.Material3.AutoCompleteTextView.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_20" + android:layout_marginVertical="@dimen/dp_20" app:boxBackgroundColor="@color/white" app:boxBackgroundMode="outline" app:boxCornerRadiusBottomEnd="@dimen/dp_5" @@ -48,7 +48,30 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" - android:hint="安全树数据通信IP地址" + android:hint="安全树甲烷数据交互IP地址" + android:inputType="textEmailAddress" + android:padding="@dimen/dp_10" + android:textSize="@dimen/sp_16" /> + + + + + diff --git a/app/src/main/res/layout/fragment_base_settings.xml b/app/src/main/res/layout/fragment_base_settings.xml index fe2bac1..e3b0394 100644 --- a/app/src/main/res/layout/fragment_base_settings.xml +++ b/app/src/main/res/layout/fragment_base_settings.xml @@ -221,6 +221,59 @@ android:text="更新WiFi配置" /> + + + + + + + + + + +