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:
@@ -816,6 +816,7 @@ class BleManager private constructor(private val context: Context) {
|
|||||||
"rbb:" -> {
|
"rbb:" -> {
|
||||||
debugLogger.rx("rbb", data.size, "full measurement header (battery+IMU+temp)")
|
debugLogger.rx("rbb", data.size, "full measurement header (battery+IMU+temp)")
|
||||||
onMbbHeaderReceived?.invoke(data)
|
onMbbHeaderReceived?.invoke(data)
|
||||||
|
piezoCollector.addPacket(data)
|
||||||
}
|
}
|
||||||
"rsp:" -> {
|
"rsp:" -> {
|
||||||
if (data.size >= 16) {
|
if (data.size >= 16) {
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ class PiezoPacketCollector {
|
|||||||
|
|
||||||
val prefix = String(data, 0, 4, Charsets.US_ASCII)
|
val prefix = String(data, 0, 4, Charsets.US_ASCII)
|
||||||
when (prefix) {
|
when (prefix) {
|
||||||
|
"rbb:" -> {
|
||||||
|
onLog?.invoke("rbb: header skipped (${data.size}B) — waiting for reb:")
|
||||||
|
}
|
||||||
"reb:" -> processRebPacket(data)
|
"reb:" -> processRebPacket(data)
|
||||||
"red:" -> processRedPacket(data)
|
"red:" -> processRedPacket(data)
|
||||||
"ree:", "raa:" -> processEndPacket(prefix, data)
|
"ree:", "raa:" -> processEndPacket(prefix, data)
|
||||||
|
|||||||
+2
-2
@@ -181,7 +181,7 @@ fun PiezoMonitoringView(appState: AppState) {
|
|||||||
}
|
}
|
||||||
bleManager.piezoCollector.onLog = { msg -> Log.d("PiezoCollector", msg) }
|
bleManager.piezoCollector.onLog = { msg -> Log.d("PiezoCollector", msg) }
|
||||||
|
|
||||||
bleManager.sendChannelsOnly()
|
bleManager.sendFullMeasurement()
|
||||||
|
|
||||||
// Timeout with auto-retry (15s)
|
// Timeout with auto-retry (15s)
|
||||||
handler.postDelayed({
|
handler.postDelayed({
|
||||||
@@ -190,7 +190,7 @@ fun PiezoMonitoringView(appState: AppState) {
|
|||||||
measureRetryCount++
|
measureRetryCount++
|
||||||
Log.w("PiezoMonitor", "Timeout — auto-retry $measureRetryCount/$maxMeasureRetries")
|
Log.w("PiezoMonitor", "Timeout — auto-retry $measureRetryCount/$maxMeasureRetries")
|
||||||
bleManager.piezoCollector.reset()
|
bleManager.piezoCollector.reset()
|
||||||
bleManager.sendChannelsOnly()
|
bleManager.sendFullMeasurement()
|
||||||
// Second timeout for retry
|
// Second timeout for retry
|
||||||
handler.postDelayed({
|
handler.postDelayed({
|
||||||
if (!isMeasuring) return@postDelayed
|
if (!isMeasuring) return@postDelayed
|
||||||
|
|||||||
Reference in New Issue
Block a user