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 c799bf4..93f9f18 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -371,10 +371,27 @@ class BleManager private constructor(private val context: Context) { val silenceMs = System.currentTimeMillis() - lastRxTimestamp if (silenceMs > watchdogTimeoutMs) { + // 직접 로그 기록 (handler 블로킹 무관) + debugLogger.error("WATCHDOG_TIMEOUT silence=${silenceMs}ms — forcing reconnect") + + // GATT close는 어느 스레드에서든 호출 가능 + watchdogRunning = false + try { + bluetoothGatt?.disconnect() + bluetoothGatt?.close() + } catch (_: Exception) {} + bluetoothGatt = null + txCharacteristic = null + rxCharacteristic = null + + // UI 업데이트 + reconnect는 메인 스레드 handler.post { - logw { "Watchdog: no RX for ${silenceMs}ms — forcing disconnect + reconnect" } - debugLogger.error("WATCHDOG_TIMEOUT silence=${silenceMs}ms — forcing reconnect") - forceDisconnectAndReconnect() + stopBatteryPolling() + isConnected.value = false + isServiceReady.value = false + connectedDeviceName.value = "" + onUnexpectedDisconnect?.invoke() + scheduleAutoReconnect() } break }