From 618267d8c0a13a769ed75bcf47b03dfda0eafada Mon Sep 17 00:00:00 2001 From: jjangddu Date: Fri, 26 Jun 2026 15:20:32 +0900 Subject: [PATCH] =?UTF-8?q?fix(posture):=20=EC=97=B0=EA=B2=B0=20=EC=A4=91?= =?UTF-8?q?=20=3F=5F=20=EC=A7=80=EC=86=8D=EB=90=98=EB=8D=98=20=EB=91=90=20?= =?UTF-8?q?=EC=9B=90=EC=9D=B8=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 원인 A — Auto Scan 켜져 있는 동안 mtb polling 영원 skip: isAutoMeasuring 가 Auto Scan 종료까지 계속 true → mtb 안 보냄 → IMU rim 응답 없음 → currentPosture 갱신 멈춤 → UNKNOWN 표시 지속. 변경: polling 조건에서 isAutoMeasuring 제거. !isMeasuring 만 검사 → Auto Scan 의 cycle 사이 idle 시간 (isMeasuring=false) 에는 mtb 가능. Spot 은 5회 연속이라 isSpotInProgress 유지 (충돌 회피). 원인 B — 다른 화면 다녀와도 imuCollector.onComplete cleanup 없어 stale callback 남음: 변경: DisposableEffect 로 onDispose 시 onComplete = null. 다시 진입하면 LaunchedEffect 가 재등록. Co-Authored-By: Claude Opus 4.7 --- .../ui/views/monitoring/PiezoMonitoringView.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 4ed1629..460d007 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 @@ -779,7 +779,11 @@ fun PiezoMonitoringView(appState: AppState) { Log.d("ImuDbg", "imuCollector log: $msg") } while (isActive) { - if (isConnected && !isMeasuring && !isAutoMeasuring && !isSpotInProgress) { + // Auto Scan 의 cycle 사이 idle 시간에도 polling 가능 — isAutoMeasuring 조건 제외. + // isMeasuring 은 현재 measure() 호출 중인 짧은 시간만 true → 사이 idle 에서 mtb 가능. + // isSpotInProgress 는 5회 연속 측정이라 분리 (충돌 회피). + // 이전: Auto Scan 켜두면 isAutoMeasuring=true 영원 유지 → mtb 영원 skip → posture UNKNOWN + if (isConnected && !isMeasuring && !isSpotInProgress) { Log.d("ImuDbg", "→ sendMtb (posture poll)") bleManager.piezoCollector.skipNextComplete = true val sent = bleManager.sendMtb() @@ -788,12 +792,20 @@ fun PiezoMonitoringView(appState: AppState) { Log.d("ImuDbg", "mtb throttled — skip this cycle") } } else { - Log.d("ImuDbg", "skip (connected=$isConnected measuring=$isMeasuring auto=$isAutoMeasuring spot=$isSpotInProgress)") + Log.d("ImuDbg", "skip (connected=$isConnected measuring=$isMeasuring spot=$isSpotInProgress)") } kotlinx.coroutines.delay(GreenZoneConstants.posturePollIntervalMs) } } + // PiezoMonitoring 이탈 시 imuCollector callback cleanup — 다른 화면 (PlacementGuide 등) 이 + // 자기 콜백 등록하기 전에 우리 콜백 해제. 다시 진입하면 위 LaunchedEffect 가 재등록. + androidx.compose.runtime.DisposableEffect(Unit) { + onDispose { + bleManager.imuCollector.onComplete = null + } + } + // Add catheter dialog if (showAddCatheterDialog) { var addAmount by remember { mutableStateOf("1") }