diff --git a/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt b/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt index 66e896a..941bc81 100644 --- a/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt +++ b/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt @@ -2589,12 +2589,49 @@ private fun ChannelPanel( // Zone indicator val curMethod = com.medithings.vesiscan.managers.GreenZoneConstants.detectionMethod val analyzerAPanel = com.medithings.vesiscan.managers.PiezoEchoAnalyzerA.shared - val analyses = lastMultiChannelResult.map { chData -> - when (curMethod) { - com.medithings.vesiscan.managers.DetectionMethod.METHOD_A -> analyzerAPanel.analyzeChannel(chData.buffer, chData.channel) - else -> analyzer.analyzeChannel(chData.buffer, chData.channel) + // 2026-08-04 fix: METHOD_D 선택 시 이 패널도 MethodDRunner 로 동일 walls 계산. + // 이전엔 curMethod==METHOD_D 여도 `else -> analyzer.analyzeChannel` (legacy V4.1) + // 로 fallback → CH 색상/ant-post 마커가 실제 BV 계산과 다른 detection 을 표시. + // MethodDRunner 는 6채널 함께 계산이 필요하므로 여기서 한 번만 실행 후 재사용. + val methodDResults: List? = + if (curMethod == com.medithings.vesiscan.managers.DetectionMethod.METHOD_D) { + val signals = (0..5).map { ch -> + lastMultiChannelResult.find { it.channel == ch } + ?.buffer?.map { it.toDouble() }?.toDoubleArray() + ?: DoubleArray(0) + } + if (signals.any { it.isNotEmpty() }) + com.medithings.vesiscan.walldetect.MethodDRunner.detectMultichannel(signals) + else null + } else null + fun analyzeForPanel( + chData: com.medithings.vesiscan.ble.PiezoChannelData + ): com.medithings.vesiscan.managers.ChannelAnalysisResult = when (curMethod) { + com.medithings.vesiscan.managers.DetectionMethod.METHOD_A -> + analyzerAPanel.analyzeChannel(chData.buffer, chData.channel) + com.medithings.vesiscan.managers.DetectionMethod.METHOD_D -> { + val md = methodDResults?.getOrNull(chData.channel) + val bufD = chData.buffer.map { it.toDouble() }.toDoubleArray() + val low = md?.let { + com.medithings.vesiscan.managers.LowEchoResult( + ant = it.ant, post = it.post, + lowStart = it.lowStart, lowEnd = it.lowEnd, + lowMean = it.lowAmp, + urineLen = it.urineLen, + score = 0.0, + innerPeaks = emptyList(), + ) + } + com.medithings.vesiscan.managers.ChannelAnalysisResult( + channel = chData.channel, + result = low, + rawSignal = bufD, + denoisedSignal = bufD, + ) } + else -> analyzer.analyzeChannel(chData.buffer, chData.channel) } + val analyses = lastMultiChannelResult.map { analyzeForPanel(it) } val detectedCount = analyses.count { it.isValid } val zoneColor = when { detectedCount >= 4 -> Color.Green @@ -2652,10 +2689,7 @@ private fun ChannelPanel( // Per-channel waveforms for (chData in lastMultiChannelResult.filter { it.buffer.isNotEmpty() }) { - val chAnalysis = when (curMethod) { - com.medithings.vesiscan.managers.DetectionMethod.METHOD_A -> analyzerAPanel.analyzeChannel(chData.buffer, chData.channel) - else -> analyzer.analyzeChannel(chData.buffer, chData.channel) - } + val chAnalysis = analyzeForPanel(chData) // 실제 BV 계산에 사용된 allWalls 값으로 표시 val wall = allWalls.getOrNull(chData.channel)