Browse Source

refactor(更新) :
- 还钥匙的时候的连接策略改为和取钥匙一致

周文健 5 tháng trước cách đây
mục cha
commit
387a031101

+ 65 - 0
app/src/main/java/com/grkj/iscs/ble/BleConnectionManager.kt

@@ -16,6 +16,7 @@ import com.grkj.iscs.BusinessManager.sendLoadingEventMsg
 import com.grkj.iscs.R
 import com.grkj.iscs.extentions.toHexStrings
 import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.modbus.ModBusController.controlKeyCharge
 import com.grkj.iscs.model.Constants.PERMISSION_REQUEST_CODE
 import com.grkj.iscs.model.eventmsg.LoadingMsg
 import com.grkj.iscs.model.eventmsg.MsgEvent
@@ -27,9 +28,14 @@ import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.base.BaseActivity
 import com.sik.sikcore.activity.ActivityTracker
 import com.sik.sikcore.thread.ThreadUtils
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.withContext
 import pub.devrel.easypermissions.AfterPermissionGranted
 import java.util.LinkedList
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
 
 /**
  * BLE 连接管理工具:保持原有扫描、连接、监听、取 Token 流程,
@@ -507,6 +513,65 @@ object BleConnectionManager {
         }
     }
 
+    /**
+     * 对单个 MAC 做下面两步:
+     *   1. 先尝试不充电连接,若成功就返回 true;
+     *   2. 否则开启“充电”,等 500ms,再尝试一次连接,连接成功后断电并返回 true;否则返回 false。
+     */
+    suspend fun tryConnectWithOptionalCharge(mac: String): Boolean =
+        withContext(Dispatchers.IO) {
+            // -------- 第一次尝试 --------
+            LogUtil.i("蓝牙连接-第一次尝试")
+            val firstTry = suspendCancellableCoroutine<Boolean> { cont ->
+                // 1. 定义一个 flag,确保只 resume 一次
+                var isCalled = false
+                BusinessManager.registerConnectListener(mac, true) { isDone, _ ->
+                    if (isCalled) {
+                        return@registerConnectListener
+                    }
+                    isCalled = true
+                    if (isDone) {
+                        // 连接成功后,把电关掉(以防万一)
+                        controlKeyCharge(false, mac) { }
+                        cont.resume(true)
+                    } else {
+                        cont.resume(false)
+                    }
+                    cont.cancel()
+                }
+            }
+            LogUtil.i("蓝牙连接-第一次连接:${firstTry}")
+            if (firstTry) {
+                return@withContext true
+            }
+            // -------- 第二次尝试:先开电,再连 --------
+            // 开电,并等待回调
+            suspendCoroutine<Unit> { unitCont ->
+                controlKeyCharge(true, mac) {
+                    unitCont.resume(Unit)
+                }
+            }
+            LogUtil.i("蓝牙连接-开启充电并等待500ms")
+            // 等 500ms 保证硬件电源稳定
+            delay(500)
+
+            // 再次注册连接监听
+            val secondTry = suspendCancellableCoroutine<Boolean> { cont ->
+                var isCalled = false
+                BusinessManager.registerConnectListener(mac, true) { isDone, _ ->
+                    if (isCalled) {
+                        return@registerConnectListener
+                    }
+                    isCalled = true
+                    // 无论成功或失败,都先把电关掉
+                    controlKeyCharge(false, mac) { }
+                    cont.resume(isDone)
+                    cont.cancel()
+                }
+            }
+            return@withContext secondTry
+        }
+
 
     // 蓝牙连接准备监听
     data class ConnectListener(

+ 3 - 59
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -7,6 +7,7 @@ import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.BusinessManager.CAN_RETURN
 import com.grkj.iscs.R
 import com.grkj.iscs.ble.BleCmdManager
+import com.grkj.iscs.ble.BleConnectionManager
 import com.grkj.iscs.ble.CustomBleWriteCallback
 import com.grkj.iscs.extentions.removeLeadingZeros
 import com.grkj.iscs.extentions.toHexStrings
@@ -995,7 +996,7 @@ object ModBusController {
         for (kb in keyList) {
             val mac = kb.mac ?: continue
 
-            val connected = tryConnectWithOptionalCharge(mac)
+            val connected = BleConnectionManager.tryConnectWithOptionalCharge(mac)
             if (connected) {
                 LogUtil.i("蓝牙连接完成 :${mac}")
                 // 找到第一个能连的:从 keyDockList 里拿同 rfid 的 addr
@@ -1012,64 +1013,7 @@ object ModBusController {
         return null
     }
 
-    /**
-     * 对单个 MAC 做下面两步:
-     *   1. 先尝试不充电连接,若成功就返回 true;
-     *   2. 否则开启“充电”,等 500ms,再尝试一次连接,连接成功后断电并返回 true;否则返回 false。
-     */
-    private suspend fun tryConnectWithOptionalCharge(mac: String): Boolean =
-        withContext(Dispatchers.IO) {
-            // -------- 第一次尝试 --------
-            LogUtil.i("蓝牙连接-第一次尝试")
-            val firstTry = suspendCancellableCoroutine<Boolean> { cont ->
-                // 1. 定义一个 flag,确保只 resume 一次
-                var isCalled = false
-                BusinessManager.registerConnectListener(mac, true) { isDone, _ ->
-                    if (isCalled) {
-                        return@registerConnectListener
-                    }
-                    isCalled = true
-                    if (isDone) {
-                        // 连接成功后,把电关掉(以防万一)
-                        controlKeyCharge(false, mac) { }
-                        cont.resume(true)
-                    } else {
-                        cont.resume(false)
-                    }
-                    cont.cancel()
-                }
-            }
-            LogUtil.i("蓝牙连接-第一次连接:${firstTry}")
-            if (firstTry) {
-                return@withContext true
-            }
-            // -------- 第二次尝试:先开电,再连 --------
-            // 开电,并等待回调
-            suspendCoroutine<Unit> { unitCont ->
-                controlKeyCharge(true, mac) {
-                    unitCont.resume(Unit)
-                }
-            }
-            LogUtil.i("蓝牙连接-开启充电并等待500ms")
-            // 等 500ms 保证硬件电源稳定
-            delay(500)
-
-            // 再次注册连接监听
-            val secondTry = suspendCancellableCoroutine<Boolean> { cont ->
-                var isCalled = false
-                BusinessManager.registerConnectListener(mac, true) { isDone, _ ->
-                    if (isCalled) {
-                        return@registerConnectListener
-                    }
-                    isCalled = true
-                    // 无论成功或失败,都先把电关掉
-                    controlKeyCharge(false, mac) { }
-                    cont.resume(isDone)
-                    cont.cancel()
-                }
-            }
-            return@withContext secondTry
-        }
+
 
     /**
      * 根据数量获取锁具(基于锁柜和便携柜不存在接一起的情况)

+ 18 - 14
app/src/main/java/com/grkj/iscs/view/presenter/HomePresenter.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.view.presenter
 import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.MyApplication
 import com.grkj.iscs.R
+import com.grkj.iscs.ble.BleConnectionManager
 import com.grkj.iscs.extentions.serialNo
 import com.grkj.iscs.modbus.ModBusController
 import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
@@ -13,6 +14,7 @@ import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.base.BasePresenter
 import com.grkj.iscs.view.iview.IHomeView
 import com.sik.sikcore.thread.ThreadUtils
+import kotlinx.coroutines.delay
 
 class HomePresenter : BasePresenter<IHomeView>() {
 
@@ -28,18 +30,16 @@ class HomePresenter : BasePresenter<IHomeView>() {
                             Executor.repeatOnMain({
                                 keyBean.mac?.let { mac ->
                                     BusinessManager.sendLoadingEventMsg(mContext?.getString(R.string.loading_msg_return_key_start))
-                                    ModBusController.controlKeyCharge(
-                                        true,
-                                        keyBean.isLeft,
-                                        dockBean.addr
-                                    ) {
-                                        LogUtil.i("钥匙开启充电:${mac}")
-                                        ThreadUtils.runOnMainDelayed(500) {
-                                            BusinessManager.registerConnectListener(
-                                                mac
-                                            ) { isDone, bleBean ->
-                                                if (isDone && bleBean != null) {
-                                                    Executor.delayOnMain(300) {
+                                    ThreadUtils.runOnIO {
+                                        suspend fun readJobTicket(mac: String) {
+                                            val isConnect =
+                                                BleConnectionManager.tryConnectWithOptionalCharge(
+                                                    mac
+                                                )
+                                            if (isConnect) {
+                                                val bleBean = BusinessManager.getBleDeviceByMac(mac)
+                                                Executor.delayOnMain(300) {
+                                                    bleBean?.let {
                                                         BusinessManager.sendLoadingEventMsg(
                                                             mContext?.getString(
                                                                 R.string.loading_msg_get_ticket_status_start
@@ -47,13 +47,17 @@ class HomePresenter : BasePresenter<IHomeView>() {
                                                         )
                                                         BusinessManager.getCurrentStatus(
                                                             4,
-                                                            bleBean.bleDevice
+                                                            it.bleDevice
                                                         )
-                                                        BusinessManager.getBatteryPower(bleBean.bleDevice)
+                                                        BusinessManager.getBatteryPower(it.bleDevice)
                                                     }
                                                 }
+                                            } else {
+                                                delay(500)
+                                                readJobTicket(mac)
                                             }
                                         }
+                                        readJobTicket(mac)
                                     }
                                 }
                                 return@repeatOnMain keyBean.mac == null