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:
+42
-8
@@ -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<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)
|
||||
|
||||
Reference in New Issue
Block a user