From deac2f50eb76776e611190e92c7500c1c701c358 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Tue, 7 Jul 2026 17:38:31 +0900 Subject: [PATCH] =?UTF-8?q?fix(ui):=20"=EA=B8=B0=EA=B8=B0=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=EC=97=86=EC=9D=8C"=20false-positive=20=EB=B0=B0?= =?UTF-8?q?=EB=84=88=20=E2=80=94=20lastBleRxAt=20=EA=B0=B1=EC=8B=A0=20?= =?UTF-8?q?=ED=99=95=EB=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: posture chip 이 정상 갱신되기 시작한 후에도 도넛차트 상단에 "기기 응답 없음" 빨강 배너가 뜸. 원인: FirmwareWarningBanner.showTimedOut = timedOut && !deviceAlive. deviceAlive = lastBleRxAt > 0 && (now - lastBleRxAt) < 12_000. 기존 lastBleRxAt 갱신은 `reb:` (piezo 측정 응답) 케이스에만 있었음. Auto scan 꺼진 도넛차트 idle 상태에서는 reb 이 아예 안 오고 mim → rim (IMU) 응답만 매 초 옴. 그래서 lastBleRxAt = 0 유지 → deviceAlive false → timedOut 되는 순간 배너 노출. 수정: processReceivedData 진입점에서 무조건 lastBleRxAt = now 갱신. 이제 rim / rsn / rid / rls / rpa / rbb 등 모든 유효 응답이 alive 마크 대상. Auto scan 상관없이 rim 폴링만으로도 deviceAlive=true 유지. Co-Authored-By: Claude Opus 4.7 --- .../main/java/com/medithings/vesiscan/ble/BleManager.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/medithings/vesiscan/ble/BleManager.kt b/app/src/main/java/com/medithings/vesiscan/ble/BleManager.kt index 90cbaca..bb74285 100644 --- a/app/src/main/java/com/medithings/vesiscan/ble/BleManager.kt +++ b/app/src/main/java/com/medithings/vesiscan/ble/BleManager.kt @@ -1155,7 +1155,14 @@ class BleManager private constructor(private val context: Context) { } private fun processReceivedData(data: ByteArray) { - lastRxTimestamp = System.currentTimeMillis() + val now = System.currentTimeMillis() + lastRxTimestamp = now + // 2026-07-07 fix: lastBleRxAt 을 processReceivedData 진입점에서 무조건 갱신. + // 이전에는 reb: (piezo 측정) 응답 케이스에만 세팅 → auto scan 꺼진 도넛차트 + // idle 상태 (mim 폴링만) 에서는 rim 응답이 매초 오는데도 lastBleRxAt = 0. + // FirmwareWarningBanner 의 deviceAlive 판정이 false → 어떤 이유로 timedOut=true + // 되면 "기기 응답 없음" false-positive 배너 노출. + lastBleRxAt.value = now // Raw BLE capture (디버그 — 사용자가 토글로 enable 했을 때만 writes) com.medithings.vesiscan.services.RawBleLogger.write(data) val prefix = String(data, 0, minOf(4, data.size), Charsets.US_ASCII)