diff --git a/VesiScan_Android_Pipeline_Summary.md b/VesiScan_Android_Pipeline_Summary.md index c980835..1d14544 100644 --- a/VesiScan_Android_Pipeline_Summary.md +++ b/VesiScan_Android_Pipeline_Summary.md @@ -2,7 +2,7 @@ ## 작성일: 2026-04-23 ## 작성자: dwjang -## 마지막 업데이트: 2026-04-23 +## 마지막 업데이트: 2026-04-24 --- @@ -888,21 +888,120 @@ RX: "raa all-ch complete [8B]" --- -# 14. 향후 과제 +# 14. BLE 명령어 포맷 (펌웨어 특이사항) + +이 기기(VBTFW0111)는 파라미터 없는 명령어에도 **`cmd? `(물음표+공백)** 포맷이 필요합니다. + +```kotlin +// ❌ 안 됨 (rxs: cmd_not_supported 응답) +CRC16.buildCommand("mid") // → "mid?" + CRC + +// ✅ 됨 +CRC16.buildCommandASCII("mid", " ") // → "mid? " + CRC +``` + +### 명령어별 포맷 + +| 명령 | 함수 | 포맷 | 응답 | +|------|------|------|------| +| `maa?` | `sendChannelsOnly()` | buildCommand("maa", [0]) | reb:×6 → raa: | +| `mbb? ` | `sendFullMeasurement()` | buildCommandASCII("mbb", " ") | rbb: → reb:×6 → raa: | +| `msp? ` | `sendImuQuery()` | buildCommandASCII("msp", " ") | rsp: (18B, accel+gyro) | +| `mid? ` | `sendDeviceInfoQuery()` | buildCommandASCII("mid", " ") | rid: (HW/SN/FW) | +| `mls?` + state | `sendLedMode(state)` | buildCommand("mls", [state]) | rls: | +| `msn?` + 0 | `sendBatteryQuery()` | buildCommand("msn", [0]) | rsn: (mV) | +| `mpa?` + freq/cyc | `sendPiezoPowerOn()` | buildCommand("mpa", [...]) | rpa: | + +### 기기 정보 (연결 시 자동 조회) + +``` +연결 직후 mid? 전송 → rid: 응답: + DEVICE_INFO VBTHW0100 VBT26040001 VBTFW0111 + ├ HW Version ├ Serial Number └ FW Version +``` + +--- + +# 15. 자동 측정 루프 (IMU + 6ch) + +### 동작 방식 + +``` +자동측정 시작 (Spot 롱프레스) + ↓ +1초차: msp? (IMU) → rsp: accel(x,y,z) + gyro(x,y,z) +2초차: msp? (IMU) +... +9초차: msp? (IMU) +10초차: maa? (6ch 측정) → reb:×6 → raa: → BV 파이프라인 +11초차: msp? (IMU) +... +20초차: maa? (6ch 측정) +... 반복 (Stop 누를 때까지) +``` + +### 병렬 통신 + +배터리 쿼리(msn, 5초)와 IMU/측정이 동시에 진행됩니다: + +``` +13:52:09.549 TX msp IMU query [7B] +13:52:09.607 TX msn battery query [8B] ← 거의 동시 +13:52:09.707 RX rsp IMU data [18B] +13:52:09.707 RX rsn battery=4128mV [8B] ← 둘 다 응답 옴 +``` + +--- + +# 16. LED 모드 (Placement Guide 연동) + +### LED 상태 코드 + +| state | 이름 | 용도 | +|-------|------|------| +| 0 | OFF | 기본 | +| 4 | DETACH_WARNING | 미부착 시 | +| 5 | ALIGN_SEARCHING | 정렬 모드 탐지 중 | +| 6 | ALIGN_COMPLETE | 정렬 모드 탐지 완료 | +| 7 | ERROR | 오류 발생 | + +### Placement Guide 연동 + +``` +Start Scanning → mls?(5) ALIGN_SEARCHING (LED 탐지 모드) + ↓ +3초 간격 스캔 중... + ↓ +CV PASS → mls?(6) ALIGN_COMPLETE (LED 완료) + ↓ +Stop Scanning → mls?(0) OFF +``` + +--- + +# 17. 향후 과제 | 항목 | 상태 | 비고 | |------|------|------| | BLE 6채널 수신 | ✅ 완료 | | -| Low-echo Detection (prominence) | ✅ 완료 | lowEchoAmp=1150 | +| Low-echo Detection (prominence + edge penalty) | ✅ 완료 | VALLEY_STOP=50, EDGE_DECAY=0.12 | | Frustum BV 추정 (6ch) | ✅ 완료 | center 4ch + lateral lr_ratio | | lr_ratio 동적 계산 | ✅ 완료 | CH4/CH5 타원 추정 | -| UrinAI Gate | ✅ 완료 | | -| Placement Guide | ✅ 완료 | 방향 가이드 수정 완료 | +| Placement Guide (CV threshold) | ✅ 완료 | CV≤0.15 + LR dev≤0.15 | | 기기 자동 감지 (V0/V1/V2) | ✅ 완료 | Snell's law 각도 | | Big Endian 자동 감지 | ✅ 완료 | | -| BLE 자동 reconnect | ✅ 완료 | 3s→5s→10s, 5회 | -| 배터리 폴링 5초 | ✅ 완료 | keep-alive | +| BLE 자동 reconnect | ✅ 완료 | 무한 3초 재시도 + watchdog | +| BLE 디버그 로거 | ✅ 완료 | TX/RX 파싱 + Downloads 내보내기 | +| ADC 로그 저장 | ✅ 완료 | 6ch raw ADC → JSONL | +| 기기 정보 조회 (mid?) | ✅ 완료 | 연결 시 자동 (HW/SN/FW) | +| LED 모드 (mls?) | ✅ 완료 | Placement 연동 (5→6→0) | +| IMU 쿼리 (msp?) | ✅ 완료 | 1초 간격, 자동측정 루프 | +| 자동측정 (IMU 1s + 측정 10s) | ✅ 완료 | | | iOS 동기화 (UI) | ✅ 완료 | 알림, Quick Save, 일지 | +| 배터리 폴링 5초 | ✅ 완료 | keep-alive | +| Python ↔ Android 1:1 검증 | ✅ 완료 | 전수 상수 비교 | | 금요일 APK 배포 | 🔜 예정 | Gitea 릴리즈 | -| Adaptive TGC | 🔜 예정 | Python에서 확인 필요 | +| mbb 전체측정 전환 | 🔜 예정 | rbb: 헤더 파싱 검증 후 | +| Adaptive TGC | 🔜 예정 | 원은지님 코드 확인 필요 | +| Placement Score 캘리브레이션 | 🔜 예정 | 팬텀 실측 기반 CV threshold 조정 | | 인체 임상 검증 | 🔜 예정 | 상수 재조정 |