|
|
@@ -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(
|