BleDebugLogger:
- 매 entry마다 즉시 Downloads/VesiScan_BLE_*.log에 append
- 새 BLE 연결 시 새 파일 생성 + 헤더 기록
- 기존 메모리 내 로그 + UI 표시는 동일 유지
- 화면 잠금/Doze/앱 종료에도 로그 보존
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Spot:
- 1회 즉시 → 3회 연속 측정(200ms 간격) → median 표시
- 측정 중 로딩 인디케이터
- 2회 이상 유효 시 median 적용
Placement:
- 가이드 텍스트 최소 유지시간 4초 → 3초
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Method B:
- 채널별 otsu_ratio = OTSU_RATIO × cos(θ) 보정
- 큰 각도 채널은 threshold 완화 → 약한 후위벽 감지 개선
- detectLowEcho에 otsuRatioOverride 파라미터 추가
- analyzeMultiChannelWithTgc: initial + rerun 모두 각도 보정 적용
Method A:
- 채널별 min_wall_contrast_ratio = 1.2 × cos(θ) 보정
- detectMethodA에 contrastRatioOverride 파라미터 추가
- analyzeChannel에서 PiezoHW.degreeAll 기반 자동 계산
Monitoring:
- Detachment LED: 상태 변경 시에만 전송 (wasDetached 추적)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Foreground Service (BleForegroundService.kt):
- BLE 연결 시 자동 시작, 해제 시 자동 중단
- PARTIAL_WAKE_LOCK (최대 4시간)
- Notification: "VesiScan - BLE 기기 연결 중..."
- connectedDevice foregroundServiceType
- Doze 모드에서도 BLE 통신 유지
- keepScreenOn도 유지 (추가 안전장치)
Detachment 개선:
- THR_MEAN/STD 100→30 (완전 탈착만 감지, 거리 약화 무시)
- 6채널 모두 수신됐을 때만 체크 (BLE 거리 문제와 구분)
- Placement: if(false) 제거 → 활성화 + "센서가 부착되지 않았습니다"
- Monitoring: 정상 복귀 시 LED OFF
Placement 가이드 모드:
- Simple (기본): 3+채널 → 바로 좌우 (기존)
- Boundary: 올라갔다 내려오기 패턴 (경계 감지 → 최적점 복귀)
- 설정 톱니바퀴에 Simple/Boundary 스위치
BLE 로그:
- 역순 표시 (최신이 위) — 스크롤 위치 유지
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 그래프 벽 표시: analyzer.analyzeChannel(B 고정) → lastWallResults(선택 Method)
- lastWallResults state 추가: 콜백에서 allWalls 저장 → 그래프에서 참조
- Method C 선택 시에도 V41Detector의 ant/post가 그래프에 정확히 표시
- dot 색상 + 그래프 벽 + depth mm 모두 동일 Method 결과 사용
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Placement:
- LED 명령: 매 스캔 → 단계 변경 시 1회만 (lastLedMode 추적)
- 5=SEARCHING, 6=COMPLETE, 화면 나갈 때 0=OFF
- 화살표 크기: arrowLen 40→60, arrowHead 12→18, strokeWidth 4→5
Monitoring (도넛뷰):
- 매 측정마다 DetachmentDetection.detect() 실행
- 미부착 감지 시 LED 4 (DETACH_WARNING) 전송 + 로그
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
도넛차트:
- InfoCard: ml/% 단위를 숫자 오른쪽에 배치 (기존 아래 → 옆)
- Void/Catheterize: 글자 크기 통일 (11+13sp → 12sp 균일)
- Disconnect → "Delete Pairing" 텍스트 변경
Placement:
- 화면 벗어날 때 LED OFF (DisposableEffect onDispose → sendLedMode(0))
- LATERAL 디버그 로그 추가 (CH4/CH5 len + symmetry)
- 대칭 기준 0.7 유지
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Placement:
- 화면 진입 시 자동 스캔 시작 (isContinuousMode=true)
- 초기 힌트: "센서를 부착해주세요"
- Stop/Resume Scanning 버튼 삭제
- Start Measurement → "Placement Complete" (Green 또는 4+ch 감지 시 활성화)
- Skip 버튼 TextButton으로 유지
Algorithm:
- LATERAL 조건: (ch4&&ch5) OR 제거 → lrSymmetry >= 0.7 필수
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
도넛차트:
- Developer Tools 그래프: 선택된 Method(A/B/C)로 분석 표시 (기존 B 고정 → 동기화)
- Spot 버튼: 1.5초 쿨다운 (연속 탭 방지, 기기 회복 시간 확보)
DeviceScan:
- 스캐닝 캐릭터 가운데 정렬 (.fillMaxWidth()) + 크기 140→180dp
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
BLE:
- onCharacteristicChanged에서 handler.post 제거
- processReceivedData를 Binder 스레드에서 직접 실행
- 메인 스레드 큐 대기로 인한 reb 패킷 유실 방지
Auto:
- 최소 간격 1000ms → 1500ms (기기 연속 maa 채널 드롭 방지)
- 10개 × 1.5초 = ~15초마다 trimmed mean 업데이트
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
성능:
- 측정 콜백 분석(TGC/Otsu/BV)을 백그라운드 Thread로 이동
- UI 업데이트만 handler.post로 메인 스레드 복귀
- 메인 스레드 블로킹으로 인한 BLE 패킷 드롭 방지
- 분석 소요시간 로그 출력 (Analysis took Xms)
- Toast도 handler.post로 감싸서 Thread-safe
Placement:
- 6채널 그래프: 데이터 없는 채널도 "No data" 빈 칸 표시 (항상 6칸)
CSV:
- 일별 파일 → 세션별 파일 (YYYY-MM-DD_HHmmss.csv)
- BLE 연결 시 자동 newSession()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Auto 측정:
- 완료 대기 방식: isMeasuring polling (100ms) → 다음 측정
- 최소 1000ms 간격 강제 (기기 한계 0.6초 + 여유)
- 윈도우 5→10개, 최대/최소 제외 8개 평균 (~10초마다 업데이트)
- valid≥4만 윈도우에 추가, 나머지 skip (로그만)
- Auto 중 "접촉불량" 토스트 숨김 (Spot에서만 표시)
Placement:
- 그래프 ant/post 항상 표시 (감지 여부 무관)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- MIN_URINE_LEN_PLACEMENT 10 → 12 (짧은 오탐 필터 강화)
- 미감지 채널(channelDetected=false)은 그래프에서 ant/post 선, depth mm, cyan 영역 미표시
- 파형 자체는 유지 (신호 확인용)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
BLE:
- watchdog idle heartbeat: 10초 무통신 시 IMU query로 keepalive
- 배터리: 3500-3700mV→0-5%, 3700-4100mV→5-100%, 증가 무시
- 배터리 표시: 아이콘→퍼센트 숫자 (색상 유지)
Placement:
- 힌트 디바운스: 같은 phase 2회 연속일 때만 변경 (깜빡임 방지)
- 방향 힌트 반전: CH3만 잡힘→아래로↓, CH0만 잡힘→위로↑
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Settings 열면 화면 맨 위로 자동 스크롤 (animateScrollTo)
2. Placement Green 후 조건 벗어나면 isLocked=false → 가이드 다시 표시
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
기기가 piezo power off 상태에서 maa 보내면 reb 없이 raa만 옴
→ performScan()에서 sendPiezoPowerOn() 호출 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
onMultiChannelComplete에서 receivedCount < 6이면:
- 자동 retry (collector reset + 재전송)
- 최대 2회 재시도 (maxMeasureRetries)
- INCOMPLETE_SCAN 로그 기록
- 6채널 온전히 수신된 경우만 BV 파이프라인 진행
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
LaunchedEffect(Unit)으로 진입 시 모든 상태 초기화:
phase→VERTICAL, isLocked→false, scanCount→0,
channelDetected→false, urineLen→0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
scan_id,timestamp,volume_ml,lr_ratio,threshold,dps,sg_filter,channel,s0,...
1,14:30:12,305.2,1.20,1150,1.771,ON,CH0,1823,...
매 측정 시점의 설정값이 ADC와 함께 기록되어
추후 분석 시 어떤 파라미터로 측정했는지 추적 가능
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
근본 원인: CH0 첫 샘플이 LE/BE 둘 다 4095 이하일 때
감지 불가 → LE로 잘못 판정 → 전체 채널 값 폭발 (30000~65000)
수정:
- 확실한 경우: 기존 로직 유지 (LE>4095→BE, BE>4095→LE)
- 애매한 경우: forceBigEndian 기본값 사용
- VBT* 기기: forceBigEndian=true (기기 연결 시 자동 설정)
- 2025MEDIP: forceBigEndian=false
- Endian 결정 로그 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OutlinedTextField + Decimal 키보드로 정밀 입력 가능
범위: 0.5~5.0mm, 기본값 1.771mm
입력 즉시 PiezoHW.distancePerSample 반영
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- PiezoEchoAnalyzer.useSgFilter: true/false로 SG 필터 on/off
- OFF 시 raw ADC 그대로 low-echo detection에 사용
- Settings 패널에 Switch 토글 추가 (기본 ON)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Low Echo Threshold: 800~2000 슬라이더 (기본 1150, 주황색)
→ GreenZoneConstants.lowEchoAmp 런타임 변경
→ CH4/CH5 threshold 조절로 lateral 감지 개선
2. Distance/Sample: 1.5~2.5mm 슬라이더 (기본 1.771, 초록색)
→ PiezoHW.distancePerSample 런타임 변경
→ 기기별 캘리브레이션 가능
3. 도넛차트 ml 실시간 표시: estimatedVolume → lastVolumeMl 직접 표시
→ 측정 즉시 정확한 ml 반영 (기존: 레벨 변환 후 재계산으로 지연)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
테스터 코드 분석 결과:
exe: mls? + [0x00, 0x05] (16비트 Big Endian) → LED 바뀜
앱: mls? + [0x05, 0x00] (16비트 Little Endian) → LED 안 바뀜
CRC16.buildCommandBE() 추가: 파라미터를 Big Endian으로 직렬화
sendLedMode(): buildCommandBE("mls", [state]) 사용
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>