From 2172304e504d092ca0242dd3ed45bbc8cd475534 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Tue, 7 Jul 2026 12:20:15 +0900 Subject: [PATCH] =?UTF-8?q?fix(align):=20GREEN=20zone=20=EC=A1=B0=EA=B8=B0?= =?UTF-8?q?=20=EB=A6=AC=EC=85=8B=20=EC=99=84=ED=99=94=20+=20=EB=AC=B8?= =?UTF-8?q?=EA=B5=AC=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: 1. Sensor Alignment 완료 GREEN 진입 후 일정 시간 (약 7초 hold 종료 + 추가 몇 초) 지나면 UI 가 갑자기 "단계 0/3 / 정렬 시작" 으로 초기화되어 처음부터 재시작해야 하는 불쾌한 UX. 2. GREEN 문구 "제 위치입니다!" 가 다소 어색. 원인: PlacementGuideView V1 로직 (line 1098) 의 3-strike 규칙 — `greenHeld` (7초 hold) 종료 후 `guideResult.isPass=false` 가 **3회 연속** 나오면 전체 리셋 (isLocked=false, waitingForStart=true, scanCount=0, phase=VERTICAL, rTracker.reset() ...). 그런데 사용자가 GREEN 상태에서 버튼 안 누르고 그대로 기다리면 자연스러운 미세 자세 흔들림 (1~2초) 만으로 3회 실패 성립 → 완전 리셋. 수정: 1. `placement_in_position` "제 위치입니다!" → "최적의 위치입니다!" (영문: "In position!" → "Optimal position!"). 2. 3-strike → 10-strike 완화. 10회 연속 실패 (약 5초+) 는 되어야 진짜 이탈로 간주. 그 사이는 GREEN 유지 + "최적의 위치입니다" 표시. Co-Authored-By: Claude Opus 4.7 --- .../ui/views/monitoring/PlacementGuideView.kt | 12 ++++++++---- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PlacementGuideView.kt b/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PlacementGuideView.kt index 72d4b5f..e78538b 100644 --- a/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PlacementGuideView.kt +++ b/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PlacementGuideView.kt @@ -1096,15 +1096,19 @@ fun PlacementGuideView(appState: AppState) { if (lastLedMode != 6) { bleManager.sendLedMode(6); lastLedMode = 6 } bleManager.debugLogger.info("PLACEMENT_GREEN cv=${"%.3f".format(guideResult.cv)} lr_dev=${"%.3f".format(guideResult.lrDev)} score=${guideResult.score} otsu=${"%.0f".format(analyzer.lastOtsuThreshold)}") } else if (isLocked && !greenHeld) { - // hold 지남 + 실패 → 3회 연속 실패해야 이탈 + // hold 지남 + 실패 → N 회 연속 실패해야 이탈. + // 2026-07-07 fix: 3-strike → 10-strike 완화. 사용자가 GREEN 진입 후 + // 버튼을 누르지 않고 그대로 기다릴 때, 미세한 자세 흔들림 (1~2초) + // 만으로 3회 실패 → "0/3 정렬시작" 완전 리셋되어 처음부터 재시작하는 + // 불쾌한 UX 발생. 10회 (약 5초+) 는 되어야 진짜 이탈로 간주. greenFailCount++ - if (greenFailCount < 3) { + if (greenFailCount < 10) { // 아직 이탈 안 함 — GREEN 유지 directionHint = context.getString(R.string.placement_in_position) directionIcon = "checkmark.circle" placementPhase = PlacementPhase.GREEN } else { - // 3회 연속 실패 → 진짜 이탈 + // 10회 연속 실패 → 진짜 이탈 isLocked = false greenLockedAtMs = 0L greenFailCount = 0 @@ -1120,7 +1124,7 @@ fun PlacementGuideView(appState: AppState) { maxCenterSeen = 0; stableAtMax = 0; boundaryHit = false sweepLastDetected = 0; sweepEverSawAll = false rTracker.reset() - bleManager.debugLogger.info("PLACEMENT_GREEN_EXIT after 3 consecutive fails") + bleManager.debugLogger.info("PLACEMENT_GREEN_EXIT after 10 consecutive fails") } } else if (!greenHeld) { // GREEN 아닌 상태 + hold 아닌 상태에서 실패 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index f4f24e1..e17e62d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -320,7 +320,7 @@ 정렬 완료 측정 시작 건너뛰기 - 제 위치입니다! + 최적의 위치입니다! 위치를 놓쳤습니다. 치골 위에서 다시 시작해주세요. 센서가 분리되었습니다. 치골 위에서 다시 시작해주세요. 신호를 놓쳤습니다 — 위로 올려주세요 ↑ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b73fb40..c676676 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -320,7 +320,7 @@ Complete Alignment Start Scanning Skip - In position! + Optimal position! Position lost. Restart above pubic bone. Sensor detached. Restart above pubic bone. Signal lost — slide up ↑