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