From 9842644e23c551fbba73087e1d47f18f86648e4d Mon Sep 17 00:00:00 2001 From: jjangddu Date: Fri, 24 Apr 2026 12:14:27 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20mbb=20=EC=B8=A1=EC=A0=95=20=EB=B3=B5?= =?UTF-8?q?=EC=9B=90=20=E2=80=94=20PiezoPacketCollector=EA=B0=80=20rbb:=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=EB=A5=BC=20skip=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 근본 원인: mbb? 응답에서 rbb: 헤더가 먼저 오는데 collector가 모르고 무시 → onMultiChannelComplete 콜백 안 불림 → isMeasuring 영구 true → 버튼 비활성화 수정: - PiezoPacketCollector.addPacket(): rbb: prefix 인식 → skip + 로그 - BleManager: rbb: 수신 시 piezoCollector.addPacket()에도 전달 - PiezoMonitoringView: sendChannelsOnly→sendFullMeasurement(mbb) 복원 흐름: mbb? → rbb:(skip) → reb:×6(수집) → raa:(완료) → 콜백 정상 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../java/com/example/medilightv2android/ble/BleManager.kt | 1 + .../example/medilightv2android/ble/PiezoPacketCollector.kt | 3 +++ .../ui/views/monitoring/PiezoMonitoringView.kt | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) 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 5f0cab0..4c3fa8f 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -816,6 +816,7 @@ class BleManager private constructor(private val context: Context) { "rbb:" -> { debugLogger.rx("rbb", data.size, "full measurement header (battery+IMU+temp)") onMbbHeaderReceived?.invoke(data) + piezoCollector.addPacket(data) } "rsp:" -> { if (data.size >= 16) { diff --git a/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt b/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt index c0644a2..2ab6947 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/PiezoPacketCollector.kt @@ -64,6 +64,9 @@ class PiezoPacketCollector { val prefix = String(data, 0, 4, Charsets.US_ASCII) when (prefix) { + "rbb:" -> { + onLog?.invoke("rbb: header skipped (${data.size}B) — waiting for reb:") + } "reb:" -> processRebPacket(data) "red:" -> processRedPacket(data) "ree:", "raa:" -> processEndPacket(prefix, data) 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 2ebb4f9..c45887b 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 @@ -181,7 +181,7 @@ fun PiezoMonitoringView(appState: AppState) { } bleManager.piezoCollector.onLog = { msg -> Log.d("PiezoCollector", msg) } - bleManager.sendChannelsOnly() + bleManager.sendFullMeasurement() // Timeout with auto-retry (15s) handler.postDelayed({ @@ -190,7 +190,7 @@ fun PiezoMonitoringView(appState: AppState) { measureRetryCount++ Log.w("PiezoMonitor", "Timeout — auto-retry $measureRetryCount/$maxMeasureRetries") bleManager.piezoCollector.reset() - bleManager.sendChannelsOnly() + bleManager.sendFullMeasurement() // Second timeout for retry handler.postDelayed({ if (!isMeasuring) return@postDelayed