diff --git a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt index cae3652..6c20636 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -400,12 +400,8 @@ class BleManager private constructor(private val context: Context) { } fun sendAllChannels(mode: Int = 0): Boolean { - val now = System.currentTimeMillis() - if (now - lastMaaSentMs < 800) { - android.util.Log.w("BleManager", "maa THROTTLED — ${now - lastMaaSentMs}ms since last") - return false - } - lastMaaSentMs = now + if (!canSendMaa("sendAllChannels")) return false + lastMaaSentMs = System.currentTimeMillis() piezoCollector.startMultiChannel(6) sendRaw(CRC16.buildCommandASCII("maa", " ")) return true @@ -457,15 +453,34 @@ class BleManager private constructor(private val context: Context) { sendRaw(CRC16.buildCommandASCII("mbb", " ")) } - /** 6채널 측정만 (maa) — 최소 800ms 간격 throttle */ + /** + * 6채널 측정 명령(maa) 송신 가능 여부: + * (A) 이전 응답이 아직 진행 중(isMultiChannel && !isComplete)이면 차단. + * 단 5초 넘게 응답이 안 오면 강제 통과(영영 deadlock 방지). + * (B) 마지막 송신으로부터 1500ms 미만이면 차단(펌웨어 burst 방어). + */ private var lastMaaSentMs = 0L - fun sendChannelsOnly(): Boolean { + private fun canSendMaa(caller: String): Boolean { val now = System.currentTimeMillis() - if (now - lastMaaSentMs < 800) { - android.util.Log.w("BleManager", "maa THROTTLED — ${now - lastMaaSentMs}ms since last") + val collectorBusy = piezoCollector.isMultiChannel && !piezoCollector.isComplete + val sinceLast = now - lastMaaSentMs + if (collectorBusy) { + if (sinceLast < 5000) { + android.util.Log.w("BleManager", "maa BUSY [$caller] — prev response in progress (${sinceLast}ms)") + return false + } + android.util.Log.w("BleManager", "maa FORCE [$caller] — prev incomplete after ${sinceLast}ms, abandoning") + } + if (sinceLast < 1500) { + android.util.Log.w("BleManager", "maa THROTTLED [$caller] — ${sinceLast}ms since last") return false } - lastMaaSentMs = now + return true + } + + fun sendChannelsOnly(): Boolean { + if (!canSendMaa("sendChannelsOnly")) return false + lastMaaSentMs = System.currentTimeMillis() piezoCollector.startMultiChannel(6) sendRaw(CRC16.buildCommandASCII("maa", " ")) return true