fix(monitoring): ChannelPanel (dev-mode) METHOD_D 미적용 버그 fix

증상 (사용자 보고 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) 는 기존 유지.
This commit is contained in:
2026-08-04 16:33:20 +09:00
parent 97e4933871
commit 6007c29c9d
@@ -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)
// 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<com.medithings.vesiscan.walldetect.MethodDResult?>? =
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)