Pārlūkot izejas kodu

refactor(更新)
- 蓝牙连接判断条件调整
- 蓝牙钥匙信息检查逻辑优化
- 移除部分日志输出

周文健 2 mēneši atpakaļ
vecāks
revīzija
3d7e685bba

+ 0 - 2
shared/src/main/java/com/grkj/shared/utils/i18n/util/CsvUtils.kt

@@ -83,7 +83,6 @@ object CsvUtils {
                 type = curType,
                 value = curVal.toString()
             )
-            logger.info("csv值:$k,${out[k]}")
             curKey = null
             curVal = StringBuilder()
         }
@@ -91,7 +90,6 @@ object CsvUtils {
         while (true) {
             val line0 = br.readLine() ?: break
             val raw = line0.stripBom().trimCR()
-            logger.info("原始数据:$raw")
 
             if (raw.isBlank()) {
                 if (curKey != null) curVal.append('\n')

+ 34 - 27
ui-base/src/main/java/com/grkj/ui_base/service/CheckKeyInfoTask.kt

@@ -71,43 +71,50 @@ class CheckKeyInfoTask {
      */
     @SuppressLint("MissingPermission")
     private suspend fun safeCheckKeyInfo() = runMutex.withLock {
-        try {
-            logger.info("开始检查钥匙信息")
-            // 第一次进入也要尊重闸门:如果不在登录页,这里直接挂起,直到回到登录页
-            awaitLogin()
+        logger.info("开始检查钥匙信息")
+        awaitLogin()
 
-            val existsKey = ModbusBusinessManager.getExistsKey()
-            for (bean in existsKey) {
-                val mac = bean.mac ?: continue
+        for (bean in ModbusBusinessManager.getExistsKey()) {
+            val mac = bean.mac ?: continue
+            handleSingleMac(mac) // 串行执行
+        }
 
-                // 每个 mac 开始前都尊重闸门;如果离开登录页,这里会挂起等待
-                awaitLogin()
+        logger.info("检查钥匙信息结束")
+    }
 
-                // 还可以防止过度并发:如果连接已满,这里做一个小等候(可按需调整)
-                waitUntilCanConnect()
+    /**
+     * 串行处理单个 MAC
+     */
+    private suspend fun handleSingleMac(mac: String) {
+        // 登录状态检查
+        awaitLogin()
+        waitUntilCanConnect()
 
-                if (!isInLogin) {
-                    // await 之后仍有可能被关闭;稳妥再判一次
-                    logger.info("检测到不在登录页,暂停检查;mac=$mac")
-                    awaitLogin() // 再挂起一次,直到登录页回归
-                }
+        if (!isInLogin) {
+            logger.info("检测到不在登录页,暂停检查;mac=$mac")
+            awaitLogin()
+        }
+
+        // 提交连接并等待回调完成
+        awaitBleCheck(mac)
+    }
 
-                BleSendDispatcher.submit(mac) { ok ->
-                    // 回调时:电量/状态已更新完毕
-                    if (isInLogin) {
-                        // 登录页场景:礼貌性断开(由队列自己控制是否立即断)
-                        BleSendDispatcher.scheduleDisconnect(mac)
-                    }
+    /**
+     * 提交到 BleSendDispatcher 并等待回调完成
+     */
+    private suspend fun awaitBleCheck(mac: String) {
+        return suspendCancellableCoroutine { cont ->
+            BleSendDispatcher.submit(mac) { ok ->
+                if (isInLogin) {
+                    BleSendDispatcher.scheduleDisconnect(mac)
                 }
+                cont.resume(Unit) {}
             }
-            logger.info("检查钥匙信息结束")
-        } catch (ce: CancellationException) {
-            logger.warn("检查任务被取消:${ce.message}")
-        } catch (e: Throwable) {
-            logger.error("检查任务异常", e)
         }
     }
 
+
+
     /**
      * 挂起直到登录页(isInLogin=true)
      * - 不 busy-wait;真正挂起,省电省 CPU

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleQueueDispatcher.kt

@@ -195,7 +195,7 @@ abstract class BleQueueDispatcher {
     /**
      * 是否可以连接
      */
-    fun canConnect(): Boolean = (activeMacs.size + connectedMacs.size) < maxConnections
+    fun canConnect(): Boolean = (activeMacs.size + connectedMacs.size) <= maxConnections
 
     /**
      * 是否可以断连