From fb6f722b532b95d8219e902e2237a115231b601c Mon Sep 17 00:00:00 2001 From: jjangddu Date: Mon, 8 Jun 2026 16:21:41 +0900 Subject: [PATCH] =?UTF-8?q?BLE=20fix:=20msn=3F=20ASCII=20"=20"=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=20=EB=B3=80=EA=B2=BD=20+=20PiezoMonitoring=20?= =?UTF-8?q?=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=EA=B0=95=EC=A0=9C=20polling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 검증: ble.log에 rsn 응답이 보이지만 도넛차트는 0% 표시. 원인 1 — msn? 송신 포맷: 기존: CRC16.buildCommandBE("msn", intArrayOf(0)) → bytes: 6D 73 6E 3F 00 00 03 FE (BE param 2B) → 펌웨어가 응답 안 함 (rsn: 자체가 안 옴) 다른 query 명령(mid?, mtb?, maa?, mqq?, mag?)은 모두 ASCII " " 포맷. msn?만 BE param 포맷이라 펌웨어가 인식 못 한 듯. 수정: CRC16.buildCommandASCII("msn", " ") → bytes: 6D 73 6E 3F 20 ?? ?? (다른 query와 동일 패턴) 원인 2 — Clinical → Unpair → 새 연결 후 도넛차트 진입 시 batteryLevel=0: disconnectAndUnbond()에서 batteryLevel.value=0 reset됨. 새 BLE 연결의 onDescriptorWrite → startBatteryPolling 호출은 PiezoMonitoring 진입 전에 이미 완료. PiezoMonitoring의 LaunchedEffect에서 등록하는 onConnectionStateChanged 콜백은 '상태 변경 시점'에만 트리거되므로 이미 connected인 상태로 진입하면 호출 안 됨. 수정: PiezoMonitoring 진입 시 isConnected.value==true이면 명시적으로 startBatteryPolling() 한 번 더 호출 (idempotent — stopBatteryPolling 후 재시작). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../java/com/example/medilightv2android/ble/BleManager.kt | 4 +++- .../ui/views/monitoring/PiezoMonitoringView.kt | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) 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 523c1a2..32647bc 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -461,7 +461,9 @@ class BleManager private constructor(private val context: Context) { // ── Common Commands ── fun sendBatteryQuery() { - sendRaw(CRC16.buildCommandBE("msn", intArrayOf(0))) + // mid?/mtb?/maa? 등 다른 단순 query와 동일한 ASCII " " 형식 — BE [0]은 + // 펌웨어가 응답 안 함이 확인됨 (rsn: 자체가 안 옴, 2026-06-08). + sendRaw(CRC16.buildCommandASCII("msn", " ")) } fun sendDeviceInfoQuery() { diff --git a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt index a397d23..6a0c528 100644 --- a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt +++ b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt @@ -573,6 +573,13 @@ fun PiezoMonitoringView(appState: AppState) { bleManager.startBatteryPolling() } } + // 진입 시 이미 연결되어 있으면 한 번 polling 재시작 (안전망). + // 이전 화면(Clinical Unpair → 새 연결 등)에서 batteryLevel=0으로 reset된 채로 + // 도넛차트 진입 시 onDescriptorWrite/onConnectionStateChanged 둘 다 이미 끝나 있어 + // 콜백이 트리거 안 됨. 진입 시점에 강제 1회 polling으로 보강. + if (bleManager.isConnected.value) { + bleManager.startBatteryPolling() + } } // Add catheter dialog