From cc16fcecff4a67577f5b3d83372f5da9fbaf99c7 Mon Sep 17 00:00:00 2001
From: mazengfei <331023091@qq.com>
Date: Mon, 30 Mar 2026 18:17:49 +0800
Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E6=B7=BB=E5=8A=A0PLC=E6=8E=A7?=
=?UTF-8?q?=E5=88=B6=E8=AE=BE=E7=BD=AE=E7=95=8C=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增PLC设置界面布局文件,包含连接控制、出盘操作、平台控制等功能模块
- 在AndroidManifest.xml中注册PlcSettingActivity组件
- 为初始化和人脸识别登录页面添加右键双击打开PLC设置的功能
- 实现完整的PLC设置活动类,集成串口通信、自动模式、出盘、平台升降等控制功能
- 添加参数设置输入验证和状态信息实时显示功能
- 实现故障复位和状态刷新等关键操作接口
---
app/src/main/AndroidManifest.xml | 3 +
.../sw/platecabinet/activity/InitActivity.kt | 4 +
.../activity/LoginByFaceActivity.kt | 4 +
.../activity/PlcSettingActivity.kt | 287 ++++++++++++++++++
.../main/res/layout/activity_plc_setting.xml | 269 ++++++++++++++++
5 files changed, 567 insertions(+)
create mode 100644 app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt
create mode 100644 app/src/main/res/layout/activity_plc_setting.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a50f7e4..a781694 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -64,6 +64,9 @@
android:name=".activity.MainActivity"
android:exported="false">
+
diff --git a/app/src/main/java/com/sw/platecabinet/activity/InitActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/InitActivity.kt
index f0f2438..8032034 100644
--- a/app/src/main/java/com/sw/platecabinet/activity/InitActivity.kt
+++ b/app/src/main/java/com/sw/platecabinet/activity/InitActivity.kt
@@ -41,4 +41,8 @@ class InitActivity : BaseActivity() {
finish()
}
+ override fun onRightDoubleClick() {
+ PlcSettingActivity.start(this)
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt
index bb7777a..cc159db 100644
--- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt
+++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt
@@ -188,6 +188,10 @@ class LoginByFaceActivity : BaseActivity(),
finish()
}
+ override fun onRightDoubleClick() {
+ PlcSettingActivity.start(this)
+ }
+
private var isRecognition = false
private var rgbCameraHelper: DualCameraHelper? = null
private var rgbFaceRectTransformer: FaceRectTransformer? = null
diff --git a/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt
new file mode 100644
index 0000000..9790114
--- /dev/null
+++ b/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt
@@ -0,0 +1,287 @@
+package com.sw.platecabinet.activity
+
+import android.content.Context
+import android.content.Intent
+import android.view.inputmethod.InputMethodManager
+import com.sw.plate.utils.ToastUtils
+import com.sw.platecabinet.databinding.ActivityPlcSettingBinding
+import com.sw.platecabinet.databinding.ItemTitleTimeBinding
+import com.sw.platecabinet.ext.clickWithDebounce
+import com.sw.platecabinet.utils.mego.PlcCallback
+import com.sw.platecabinet.utils.mego.PlcHelper
+import com.sw.platecabinet.utils.mego.PlcStatus
+
+/**
+ * PLC 控制设置界面
+ * 通过右侧时间双击(onRightDoubleClick)打开,提供全套 PLC 控制操作入口
+ */
+class PlcSettingActivity : BaseActivity() {
+
+ companion object {
+ /**
+ * 启动 PlcSettingActivity
+ */
+ fun start(context: Context) {
+ context.startActivity(Intent(context, PlcSettingActivity::class.java))
+ }
+ }
+
+ override fun inflateViewBinding(): ActivityPlcSettingBinding {
+ return ActivityPlcSettingBinding.inflate(layoutInflater)
+ }
+
+ override fun inflateTitleBinding(): ItemTitleTimeBinding {
+ return binding.includeHeader
+ }
+
+ override fun initialize() {
+ initConnectButtons()
+ initOutPlateButton()
+ initPlatformButtons()
+ initAlarmButton()
+ initParamButtons()
+ initStatusButton()
+ }
+
+ // ==================== 连接控制 ====================
+
+ /**
+ * 初始化连接控制区按钮:打开串口、打开自动模式
+ */
+ private fun initConnectButtons() {
+ binding.btnOpenSerialPort.clickWithDebounce {
+ showWaitingDialog("正在打开串口……")
+ PlcHelper.getInstance(this).openSerialPort(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("打开串口成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("打开串口失败:$message")
+ }
+ })
+ }
+
+ binding.btnOpenAutoMode.clickWithDebounce {
+ showWaitingDialog("正在打开自动模式……")
+ PlcHelper.getInstance(this).openAutoMode(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("打开自动模式成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("打开自动模式失败:$message")
+ }
+ })
+ }
+ }
+
+ // ==================== 出盘操作 ====================
+
+ /**
+ * 初始化出盘操作按钮
+ */
+ private fun initOutPlateButton() {
+ binding.btnOutPlate.clickWithDebounce {
+ showWaitingDialog("正在出盘……")
+ PlcHelper.getInstance(this).outPlate(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("出盘成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("出盘失败:$message")
+ }
+ })
+ }
+ }
+
+ // ==================== 平台控制 ====================
+
+ /**
+ * 初始化平台控制区按钮:平台下降、平台上升、返回营业
+ */
+ private fun initPlatformButtons() {
+ binding.btnPlatformDown.clickWithDebounce {
+ showWaitingDialog("正在执行平台下降……")
+ PlcHelper.getInstance(this).platformDown(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("平台下降成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("平台下降失败:$message")
+ }
+ })
+ }
+
+ binding.btnPlatformUp.clickWithDebounce {
+ showWaitingDialog("正在执行平台上升……")
+ PlcHelper.getInstance(this).platformUp(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("平台上升成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("平台上升失败:$message")
+ }
+ })
+ }
+
+ binding.btnBackToBusiness.clickWithDebounce {
+ showWaitingDialog("正在返回营业状态……")
+ PlcHelper.getInstance(this).backToBusiness(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("返回营业成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("返回营业失败:$message")
+ }
+ })
+ }
+ }
+
+ // ==================== 故障处理 ====================
+
+ /**
+ * 初始化故障复位按钮
+ */
+ private fun initAlarmButton() {
+ binding.btnAlarmReset.clickWithDebounce {
+ showWaitingDialog("正在故障复位……")
+ PlcHelper.getInstance(this).alarmReset(object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("故障复位成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("故障复位失败:$message")
+ }
+ })
+ }
+ }
+
+ // ==================== 参数设置 ====================
+
+ /**
+ * 初始化参数设置按钮
+ * 读取参数类型和参数值输入框内容,调用 setParams
+ */
+ private fun initParamButtons() {
+ binding.btnSetParams.clickWithDebounce {
+ val paramType = binding.etParamType.text.toString().trim()
+ val paramValueStr = binding.etParamValue.text.toString().trim()
+
+ if (paramType.isEmpty()) {
+ ToastUtils.showToast("请输入参数类型")
+ return@clickWithDebounce
+ }
+ if (paramValueStr.isEmpty()) {
+ ToastUtils.showToast("请输入参数值")
+ return@clickWithDebounce
+ }
+ val paramValue = paramValueStr.toIntOrNull()
+ if (paramValue == null) {
+ ToastUtils.showToast("参数值须为整数")
+ return@clickWithDebounce
+ }
+
+ // 隐藏键盘
+ hideKeyboard()
+
+ showWaitingDialog("正在设置参数……")
+ PlcHelper.getInstance(this).setParams(
+ paramType,
+ paramValue,
+ object : PlcCallback {
+ override fun onSuccess(result: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("参数设置成功:$result")
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ ToastUtils.showToast("参数设置失败:$message")
+ }
+ }
+ )
+ }
+ }
+
+ // ==================== 状态显示 ====================
+
+ /**
+ * 初始化状态刷新按钮,获取 PLC 状态并格式化展示
+ */
+ private fun initStatusButton() {
+ binding.btnRefreshStatus.clickWithDebounce {
+ showWaitingDialog("正在获取状态……")
+ PlcHelper.getInstance(this).getStatus(object : PlcCallback {
+ override fun onSuccess(result: PlcStatus) {
+ hideWaitingDialog()
+ binding.tvStatusInfo.text = buildStatusText(result)
+ }
+
+ override fun onError(message: String) {
+ hideWaitingDialog()
+ binding.tvStatusInfo.text = "获取状态失败:$message"
+ ToastUtils.showToast("获取状态失败:$message")
+ }
+ })
+ }
+ }
+
+ /**
+ * 将 PlcStatus 格式化为多行可读文本
+ */
+ private fun buildStatusText(status: PlcStatus): String {
+ return """
+ 空盘状态:${if (status.isEmptyPlate) "是(无餐盘)" else "否(有餐盘)"}
+ 平台下位:${if (status.isPlateformDown) "是" else "否"}
+ 平台上位:${if (status.isPlateformUp) "是" else "否"}
+ 取盘红外:${if (status.isTakePlateInfrared) "已触发" else "未触发"}
+ 报警代码:${if (status.alarmCode == 0) "正常(0)" else "异常(${status.alarmCode})"}
+ """.trimIndent()
+ }
+
+ // ==================== 生命周期 ====================
+
+ /**
+ * 左侧日期双击 → 关闭设置界面
+ */
+ override fun onLeftDoubleClick() {
+ finish()
+ }
+
+ /**
+ * 右侧时间双击 → 不做操作,防止循环打开
+ */
+ override fun onRightDoubleClick() {
+ // 空实现,避免在设置页再次触发跳转
+ }
+
+ // ==================== 工具方法 ====================
+
+ /**
+ * 隐藏软键盘
+ */
+ private fun hideKeyboard() {
+ val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
+ }
+}
diff --git a/app/src/main/res/layout/activity_plc_setting.xml b/app/src/main/res/layout/activity_plc_setting.xml
new file mode 100644
index 0000000..62817b3
--- /dev/null
+++ b/app/src/main/res/layout/activity_plc_setting.xml
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+