From 6007c29c9da74de3cf936fb6fbd4be86a067f79e Mon Sep 17 00:00:00 2001 From: jjangddu Date: Tue, 4 Aug 2026 16:33:20 +0900 Subject: [PATCH] =?UTF-8?q?fix(monitoring):=20ChannelPanel=20(dev-mode)=20?= =?UTF-8?q?METHOD=5FD=20=EB=AF=B8=EC=A0=81=EC=9A=A9=20=EB=B2=84=EA=B7=B8?= =?UTF-8?q?=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상 (사용자 보고 2026-08-04): PiezoMonitoring 페이지 · 개발자모드 · 아래 CH0~CH5 차트와 색상(초록/빨강) 이 Method D 검출과 일치하지 않는다. 원인: ChannelPanel (line 2591~) 이 curMethod == METHOD_D 여도 else 분기에서 legacy `analyzer.analyzeChannel` (V4.1/Method C 스타일) 로 fallback. → 실제 BV 계산은 METHOD_D 파이프라인이지만, 화면 표시용 walls 는 legacy 로 계산되어 시각적 불일치. 사용자가 "D 적용 안됨" 으로 오인. 수정: ChannelPanel 두 call site (Zone indicator + 채널 status bar · Per-channel waveform) 가 공통 helper `analyzeForPanel(chData)` 통과. curMethod == METHOD_D 시 MethodDRunner.detectMultichannel 을 6채널 한 번 실행 (재사용). 결과를 ChannelAnalysisResult (LowEchoResult) 형태로 변환해 legacy caller 와 호환. METHOD_A · else (V4.1/METHOD_C) 는 기존 유지. --- .../views/monitoring/PiezoMonitoringView.kt | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) 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)