diff --git a/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV2.kt b/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV2.kt index fa09917..2eaabea 100644 --- a/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV2.kt +++ b/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV2.kt @@ -306,21 +306,32 @@ class AlignGuide4Stage( if (phase == Phase4.CENTER_OPTIMIZE) { val center4Detected = (0..3).all { it < s.detected.size && s.detected[it] } if (!s.ch3) { - // CH3 잃으면 CH3_STABILIZE 로 복귀 + // 2026-07-06 fix: CH3 를 CENTER_OPTIMIZE 진입 후 잃음 = probe 가 위로 올라가 + // CH3 beam 이 방광 inferior edge 를 넘어감 → 방광이 probe 아래로 이동. + // → MOVE_DOWN 으로 CH3 회복. 이전 MOVE_UP 은 잃음 원인과 반대라 무한 상승. phase = Phase4.CH3_STABILIZE stabilizeCount = 0 centerOptimizeStreak = 0 - return Out(AlignAction.MOVE_UP, "↑ ch3 재확인 필요", - phase, 0, msgKey = R.string.align_recover_up) + return Out(AlignAction.MOVE_DOWN, "↓ ch3 재확인 필요", + phase, 0, msgKey = R.string.align_recover_down_short) } if (!center4Detected) { - // CH0~2 중 일부 미검출 → probe 를 위로 올려 CH0 잡기 + // 2026-07-06 fix: 미검출 채널 위치로 probe 위치 판단. + // CH0 (+6.89° 위로 tilt, 상단 channel) 만 놓치고 CH3 검출 = probe 가 방광 + // dome 위에 있어 CH0 beam 이 위로 빠짐 → MOVE_DOWN 으로 방광 중심 재정렬. + // CH1/CH2 만 놓치고 CH0+CH3 검출 = 드물지만 부분적 dropout, default MOVE_UP. + // 상단 (CH0 or CH0+CH1) 만 놓침 = probe too high → MOVE_DOWN. centerOptimizeStreak = 0 val missing = (0..3).filter { !s.detected[it] } val missingLabel = missing.joinToString(",") { "ch$it" } - return Out(AlignAction.MOVE_UP, - "↑ 조금 더 위로 ($missingLabel 미검출)", phase, 0, - msgKey = R.string.align_move_up) + val topOnly = missing.isNotEmpty() && missing.all { it <= 1 } // {0} or {1} or {0,1} + val (direction, arrow, msgKey) = if (topOnly) + Triple(AlignAction.MOVE_DOWN, "↓", R.string.align_recover_down_short) + else + Triple(AlignAction.MOVE_UP, "↑", R.string.align_move_up) + return Out(direction, + "$arrow 조금 ${if (topOnly) "아래" else "더 위"}로 ($missingLabel 미검출)", + phase, 0, msgKey = msgKey) } // 4채널 모두 검출됨 → chord CV 계산 (summarize 에서 angle-corrected mm 값 저장됨) val chords = DoubleArray(4) { ch -> s.chords[ch] ?: 0.0 }