fix: mbb 측정 복원 — PiezoPacketCollector가 rbb: 헤더를 skip하도록 수정

근본 원인: 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) <noreply@anthropic.com>
This commit is contained in:
2026-04-24 12:14:27 +09:00
parent bf2f16b207
commit 9842644e23
3 changed files with 6 additions and 2 deletions
@@ -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) {
@@ -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)
@@ -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