Commit Graph

299 Commits

Author SHA1 Message Date
dw.jang 9e350d6d40 fix: Python 대조 검증 — CRITICAL 차이 7건 수정
Method A (PiezoEchoAnalyzerA.kt):
- sliding_scores_1d: edge padding 추가 (np.pad mode="edge" 동일)
- robust_z: 짝수 길이 시 두 중간값 평균 (np.median 동일)
- plateau threshold: 전체 배열 기반 quantile (잘린 배열 → 전체)
- urineLen: post-ant → post-ant-1 (Python 동일)
- score: ((ant+post)/2-lowMean)*len → sg[ant]+sg[post] (Python 동일)
- cross-validation: vals 미변경 + Math.round() (Python 동일)

BV Estimation (PiezoBVEstimator.kt):
- computeLrRatio maxRatio 기본값 3.0 → 1.0 (Python 동일)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 19:00:17 +09:00
dw.jang c849943b4e feat: Otsu adaptive threshold, Method A 포팅, BV ellipse cap, UI 정리
Algorithm:
- Otsu 1D adaptive threshold 포팅 (span_utils.py otsu_1d, 기본 ON)
- Method A 벽 검출 포팅 (PiezoEchoAnalyzerA.kt: plateau score + prominence)
- Method A cross-validation (채널간 중앙값/gradient 보정)
- BV cap 높이: parabolic → ellipse 피팅 (8점 축정렬 타원)
- Bottom cap: sphere, Top cap: cone (Python bv_estimation.py 동기화)
- 설정에 Method A/B 토글 (왼쪽=A, 오른쪽=B)

Logging:
- BLE 로그 + CSV에 otsu threshold 값 기록
- 측정 로그에 method label (A/B) 표시

UI:
- 설정 패널: floating overlay로 변경 + MaxVolume 슬라이더 추가
- Onboarding: 1페이지로 단순화 (Pager/indicator 제거)
- Registration: 한 페이지에 전체 입력 + Skip 버튼
- Placement: 로딩 인디케이터/스캔 텍스트 삭제

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 18:43:56 +09:00
dw.jang c6e84bd6c0 fix: watchdog heartbeat, 배터리 계산, placement 디바운스+방향 수정
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>
2026-04-28 17:27:32 +09:00
dw.jang 5cdae8a86e fix+UX: BLE 중복수신 수정, peak detection 개선, UI 대폭 정리
BLE:
- GATT 다중연결 race condition 수정 (reconnectConnecting 플래그)
- onCharacteristicChanged API 레벨 분기 (dual callback 방지)
- DeviceScan: isConnected → isServiceReady 전환 (서비스 준비 후 화면전환)
- Placement: mpa/maa 500ms 딜레이 (power on 대기)
- Disconnect & Unbond 기능 추가 (msr? + removeBond + 저장정보 삭제)
- autoConnect 삭제 (HomeView)

Algorithm:
- 후위벽 피크 >= threshold 조건 추가 (false positive 차단)
- low-echo 분석범위 80샘플 제한 (뒤쪽 노이즈 무시)
- urineLen: post-ant-1 → post-ant 수정
- Placement: UrinAI fallback 제거 (PiezoEchoAnalyzer만 사용)
- 기기 프리셋 autoDetect index 7→8 수정 (VBT26040Nxx)
- dps 기본값 1.771 → 1.968

UI:
- 도넛차트: Home버튼 삭제, Auto/Catheter count/History 삭제
- 3버튼 레이아웃 (Catheterize/Auto/Spot)
- 배터리 아이콘 (60+초록/30+주황/빨강) + 설정 톱니바퀴 분리
- SensorSelect/Consent 페이지 스킵
- 온보딩: VesiScan-Basic, NIRS 페이지 삭제
- MaxVolume: Step 표시 삭제, mL 오른쪽 배치
- BackHandler 전체 재정리 (자연스러운 뒤로가기)
- BLE 신호 기준 완화 (Good≥-80, Fair≥-90)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 17:03:37 +09:00
dw.jang 227480af4b feat: UI 일괄 수정 (5,6,7,8번)
5. Onboarding 간소화: 4단계→1단계 (Max Volume만)
   Step 1(자세)/2(위치)/4(최적화) 제거, Continue 바로 완료

6. 자동 reconnect: 앱 시작 시 마지막 기기에 자동 연결
   SharedPreferences에 address+name 저장, HomeView에서 autoConnectLastDevice()

7. Demo 모드: DeviceScanView에서 Demo 버튼 제거

8. Android 뒤로가기: BackHandler로 화면별 네비게이션 매핑
   Placement→Home, Monitoring→Placement, History/Diary→Monitoring 등

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 11:41:22 +09:00
dw.jang cc00c25a66 feat: UI 일괄 수정 (9개 항목 중 1,2,3,4,9번)
1+2. Placement peak 감도: urineLen >= 10 필터 (짧은 false positive 방지)
3. Placement 센서 그림(SensorLayoutCanvas) 제거
4. 앱 이름: MediLight → VesiScan-Basic (홈화면 + strings.xml)
9. BLE 신호: Good+Excellent 통합 (rssi >= -65 → Green 4칸)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 11:30:45 +09:00
dw.jang 45e06d8aba fix: mpa 첫 스캔 시 1회만 전송 (매초 중복 전송 제거)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 10:12:42 +09:00
dw.jang 0ffac85f44 UX: Placement 스캔 간격 3초→1초
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 10:10:32 +09:00
dw.jang 6098047cef fix: Settings 스크롤 + Placement Green 후 가이드 복귀
1. Settings 열면 화면 맨 위로 자동 스크롤 (animateScrollTo)
2. Placement Green 후 조건 벗어나면 isLocked=false → 가이드 다시 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 10:02:35 +09:00
dw.jang 9d171f0e06 fix: 배터리 연결 시 1회만 측정 (반복 폴링 없음)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 18:25:18 +09:00
dw.jang 953e6b56aa fix: 배터리 폴링(5초 msn) 제거 — 측정 간섭 방지
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 18:24:27 +09:00
dw.jang 0b06acea2b fix: Placement 스캔 전 mpa(piezo power on) 전송 — ADC 미수신 해결
기기가 piezo power off 상태에서 maa 보내면 reb 없이 raa만 옴
→ performScan()에서 sendPiezoPowerOn() 호출 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 18:04:38 +09:00
dw.jang 737eaa1a32 fix: mcs 명령 제거 (avg=10이 echo detection 방해 가능성 — 기기 기본값 사용)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 17:58:26 +09:00
dw.jang 26d5ae20fd fix: mcs avg=10으로 설정 (freq=2, cycles=5, avg=10, delay=20, samples=140)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 17:53:52 +09:00
dw.jang 4045ae5198 fix: 연결 시 mcs avg=3 복원 (이전 avg=10 설정이 기기에 남아있음)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 17:45:37 +09:00
dw.jang fff465f6f6 fix: detachment 비활성화 + incomplete retry 제거 (c3eba58 기반 안정화)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 17:39:44 +09:00
dw.jang c3eba581d4 docs: Placement 2단계 순차 + 패킷 retry + max volume 표시 업데이트
- 18. Placement: 2단계 순차 흐름도 (상하→좌우→CV Green)
  대표님 요구사항 반영 (센서 이동 안내, 크기 패턴, 대칭성)
- 패킷 드랍 자동 retry 설명
- 향후 과제: 순차 Placement, 패킷 retry, max volume 완료 항목 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 16:21:46 +09:00
dw.jang 01637ce503 feat: 6채널 미만 수신 시 자동 retry (패킷 드랍 대응)
onMultiChannelComplete에서 receivedCount < 6이면:
- 자동 retry (collector reset + 재전송)
- 최대 2회 재시도 (maxMeasureRetries)
- INCOMPLETE_SCAN 로그 기록
- 6채널 온전히 수신된 경우만 BV 파이프라인 진행

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 16:04:22 +09:00
dw.jang 1c5707ebf7 fix: Placement 재진입 시 상태 리셋 (Step 1부터 시작)
LaunchedEffect(Unit)으로 진입 시 모든 상태 초기화:
phase→VERTICAL, isLocked→false, scanCount→0,
channelDetected→false, urineLen→0

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 15:50:52 +09:00
dw.jang 9b92f09e88 feat: Placement Guide 2단계 순차 탐색으로 전면 교체 (대표님 요구사항)
[1단계: 상하 탐색 (VERTICAL)]
- 안내: "센서를 아래에서 위로 천천히 이동하세요"
- CH3,2,1,0 low echo 검출, 3개 이상 필요
- 크기 패턴: 3≥2≥1≥0 또는 유사(변동 <50%) → PASS
- 미달 시: CH0 약하면 "위로", CH3 약하면 "아래로"
- PASS → 2단계(LATERAL)로 자동 전환

[2단계: 좌우 탐색 (LATERAL)]
- 안내: "센서를 좌우로 천천히 이동하세요"
- CH4,CH5 대칭성: |len4-len5|/max < 0.3 → PASS
- 상하 벗어나면 1단계로 복귀
- PASS → 3단계(GREEN)로 전환

[3단계: 최종 Green (CV 확인)]
- CV = std(depths)/mean(depths)
- CV ≤ threshold + LR dev OK → Green (LED 6, Lock)
- CV 미달 → 1단계부터 다시

UI: "Step 1/3", "Step 2/3", "Step 3/3" 상단 표시
LED: 4(미부착) → 5(탐색중) → 6(Green)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 15:13:26 +09:00
dw.jang e9c5e4536b fix: 도넛차트 캐릭터 옆 ml을 max volume으로 변경
lastVolumeMl (마지막 측정) → maxVolumeMl (최대 측정값)
세션 중 가장 높은 측정값을 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 15:07:13 +09:00
dw.jang b750b22406 docs: CSV 포맷 업데이트 (threshold/dps/sg_filter 컬럼) + Endian 안정화
- CSV: threshold, dps, sg_filter 컬럼 추가 설명
- Python 예시: 설정값 기반 필터링 추가
- BLE 로그 대조 방법 설명 (scan_id 기반)
- Endian 자동 감지: VBT=BE 기본, forceBigEndian fallback 설명
- 향후 과제: Endian 안정화 완료 항목 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 12:24:11 +09:00
dw.jang fb8204994f feat: CSV에 threshold, dps, sg_filter 컬럼 추가
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>
2026-04-27 12:17:59 +09:00
dw.jang fecb02dfde fix: Endian 감지 간헐적 실패 수정 (19회 중 5회 ADC 값 폭발)
근본 원인: 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>
2026-04-27 12:09:57 +09:00
dw.jang 7125e79fb9 feat: scan_id를 BLE 로그에도 추가 (CSV와 대조 가능)
- MEASUREMENT scan=3 vol=305.2ml lr=1.20 valid=4/6
- BV_SKIP scan=4 center=2/4 total=2/6
- BV_FAIL scan=5 no valid channels

AdcCsvLogger.lastScanId 공개 → BleDebugLogger에서 참조

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 11:24:57 +09:00
dw.jang 099fcfaf97 docs: SG 토글 + DPS 직접입력 + ADC CSV 저장 문서 추가
- 19. Settings: SG Filter 토글 설명, DPS 슬라이더→직접입력 반영
- 21. ADC CSV: 파일 포맷, Python 읽기 예시, 저장 시점 설명
- 향후 과제: ADC CSV 완료 항목 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 11:06:36 +09:00
dw.jang f563b20659 feat: ADC 데이터 일별 CSV 저장 (Downloads/VesiScan_ADC/)
AdcCsvLogger: 측정마다 6채널 ADC를 CSV에 append
- 파일: Downloads/VesiScan_ADC/YYYY-MM-DD.csv
- 행: scan_id × 6채널 (1회 측정 = 6행)
- 열: scan_id, timestamp, volume_ml, lr_ratio, channel, s0~s99
- BV 성공/실패 모두 ADC 저장 (volume_ml 빈칸이면 실패)
- Python: pd.read_csv() → df[df.scan_id==1] 으로 1회 측정 추출

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 10:47:33 +09:00
dw.jang abc70623fa feat: Distance/Sample 슬라이더→숫자 직접 입력으로 변경
OutlinedTextField + Decimal 키보드로 정밀 입력 가능
범위: 0.5~5.0mm, 기본값 1.771mm
입력 즉시 PiezoHW.distancePerSample 반영

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 10:20:09 +09:00
dw.jang 7dea5b2eca feat: SG Filter on/off 토글 추가 (Settings 패널)
- 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>
2026-04-24 17:34:21 +09:00
dw.jang 36da75b1f0 docs: 런타임 캘리브레이션 + BLE Endian 통일 + 향후과제 업데이트
- 19. 런타임 캘리브레이션: Threshold/DPS 슬라이더, lr_ratio 하한
- 20. BLE Endian 통일: 테스터 exe 분석 결과 (BE 파라미터 + 공백)
- 21. 향후 과제: 20+ 완료 항목 업데이트

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 17:11:17 +09:00
dw.jang f391f404b4 feat: Settings에 Low Echo Threshold + Distance/Sample 슬라이더 추가
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>
2026-04-24 16:50:31 +09:00
dw.jang 208de17152 fix: 모든 BLE 명령어를 테스터 exe와 동일 포맷으로 통일
테스터(vsbtester) buildPacket() 분석 결과:
- 파라미터 있는 명령: 16비트 Big Endian (buildCommandBE)
- 파라미터 없는 명령: 공백 0x20 추가 (buildCommandASCII " ")

변경:
- mpa, mec, msn, mta, mls → buildCommandBE (BE 파라미터)
- mps, maa, mqq, mag, mcj, mid, msp, mbb → buildCommandASCII " " (공백)
- maa sendChannelsOnly도 공백 방식으로 통일 (기존 LE [0] 제거)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 16:42:02 +09:00
dw.jang fdc4047c5c fix: mls LED 명령 Big Endian 파라미터로 변경 (테스터 exe와 동일)
테스터 코드 분석 결과:
  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>
2026-04-24 16:38:35 +09:00
dw.jang 3cebaff6a0 fix: mls 명령 포맷 'mls? 5' (공백+ASCII) 시도
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 16:28:29 +09:00
dw.jang e6e9c296f2 fix: mls LED 명령 ASCII 포맷으로 변경 (buildCommand→buildCommandASCII)
기존: mls? + [0x05, 0x00] (2바이트 LE 파라미터) → LED 안 바뀜
변경: mls?5 (ASCII 숫자) → exe 프로그램과 동일 포맷

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 16:04:44 +09:00
dw.jang 73ceb40ed4 fix: lr_ratio 하한 1.0 제한 (500ml 팬텀에서 100ml로 과소평가 수정)
원인: CH4/CH5 lateral이 center 대비 짧아서 lr_ratio=0.32 계산
→ S = π/4 × D² × 0.32 → 용적 68% 과소평가

수정: computeLrRatio() 반환값에 .coerceAtLeast(1.0) 추가
원형(1.0)보다 좁은 방광 단면은 물리적으로 불가능하므로 하한 제한

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 15:53:16 +09:00
dw.jang c334b5f018 fix: CV threshold 단계적 완화 (5회 단위, 최대 0.30)
기존: cvThr = 0.15 + scanCount × 0.02 (무한 증가)
변경: 5회 단위 단계적 완화, 상한 0.30
  1~5회:  0.15 (원래 기준)
  6~10회: 0.20
  11~15회: 0.25
  16회+:  0.30 (최대)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 15:35:29 +09:00
dw.jang 1beb0737c6 feat: Placement 판정 결과 BLE 디버그 로거에 기록 + README 대폭 업데이트
BLE 로그 추가:
- DETACHED mean=12.3 std=8.7
- PLACEMENT_SEARCHING cv=0.234 dir=MOVE UP moderate score=35
- PLACEMENT_PASS cv=0.112 lr_dev=0.089 score=78

README 추가 섹션:
- 17. 미부착 감지 알고리즘 상세 (DetachmentDetection)
  - 원리, 상수, 실측 안전 마진 설명
- 18. Placement 전체 파이프라인 흐름도
  - Detachment → Echo → CV → LR → LED 판정
  - BLE 로그 출력 예시
- 향후 과제에 미부착 감지 완료 항목 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 15:27:39 +09:00
dw.jang ea19b74c00 feat: DetachmentDetection 포팅 + Placement LED 4/5/6 동적 제어
DetachmentDetection (detachment_detection.py 1:1 포팅):
- ADC [20:80] 구간에서 baseline([80:100] median) 차감
- mean(|y|) < 100 AND std(y) < 100 → 미부착(detached)
- center 4채널(CH0~CH3) 기준

PlacementGuide LED 제어:
- 미부착 → mls?(4) DETACH_WARNING + "Sensor detached" 메시지
- 탐색 중 (CV > threshold) → mls?(5) ALIGN_SEARCHING
- 최적 위치 (PASS) → mls?(6) ALIGN_COMPLETE
- 스캔 종료 → mls?(0) OFF

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 15:21:23 +09:00
dw.jang 994d5e0c46 fix: adaptive threshold 비활성화 (기본 false, 고정 1150 복원)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 15:06:13 +09:00
dw.jang 6889136783 feat: adaptive threshold 구현 (percentile + 고정값 blended)
detectLowEcho: 고정 1150 → adaptive threshold (기본 활성화)
  1. ringSkip(3) 이후 신호에서 q25/q50/q75 계산
  2. percentile 기반: q25 + iqr*0.3 ~ q50 - iqr*0.3
  3. 고정값(1150) 범위 제한: ×0.7 ~ ×1.5 (805~1725)
  4. 가중 평균: 고정 40% + adaptive 60%
  → 신호 레벨에 자동 적응하되 급격한 변동 방지

WaveformChart: threshold 점선도 adaptive 값으로 표시
useAdaptiveThreshold 플래그로 on/off 전환 가능

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 14:58:28 +09:00
dw.jang a02562eb31 docs: BLE 명령어 포맷, 자동측정 루프, LED 모드, 향후 과제 업데이트
- BLE 명령어 포맷: 공백 필요 패턴 (buildCommandASCII) 문서화
- 자동측정: IMU 1초 × 9 + 6ch 측정 10초 루프 설명
- LED 모드: state 코드 + Placement 연동 흐름
- 기기 정보: mid? → rid: 자동 조회 설명
- 향후 과제: 17개 완료 항목 + 5개 예정 항목

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 13:55:38 +09:00
dw.jang 76ec271352 fix: msp/mbb 명령어 뒤에 공백 추가 (mid?와 동일 포맷)
기기가 파라미터 없는 명령에도 공백을 요구함 (펌웨어 파서 특성)
- sendImuQuery: buildCommand("msp") → buildCommandASCII("msp", " ")
- sendFullMeasurement: buildCommand("mbb") → buildCommandASCII("mbb", " ")
- IMU 1초 쿼리 재활성화

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 13:49:30 +09:00
dw.jang a3c80bd074 fix: IMU(msp) 쿼리 비활성화 — 현재 기기(VBTFW0111) 미지원
msp? → rxs: cmd_not_supported 응답 확인
매 1초 불필요한 msp 전송 제거, 10초 간격 maa 측정만 유지
IMU 지원 기기 확인 후 재활성화 예정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 13:48:28 +09:00
dw.jang be0264d24c fix: Spot 측정 maa 복원 (mbb는 rbb 파싱 검증 후 전환)
mbb 응답에서 rbb: 패킷 구조가 불명확하여 collector 동작 불안정.
Spot/자동측정 모두 maa(sendChannelsOnly)로 안정화.
mbb는 로그로 rbb: 바이트 구조 확인 후 전환 예정.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 12:30:17 +09:00
dw.jang 9842644e23 fix: mbb 측정 복원 — PiezoPacketCollector가 rbb: 헤더를 skip하도록 수정
근본 원인: mbb? 응답에서 rbb: 헤더가 먼저 오는데 collector가 모르고 무시
→ onMultiChannelComplete 콜백 안 불림 → isMeasuring 영구 true → 버튼 비활성화

수정:
- PiezoPacketCollector.addPacket(): rbb: prefix 인식 → skip + 로그
- BleManager: rbb: 수신 시 piezoCollector.addPacket()에도 전달
- PiezoMonitoringView: sendChannelsOnly→sendFullMeasurement(mbb) 복원

흐름: mbb? → rbb:(skip) → reb:×6(수집) → raa:(완료) → 콜백 정상

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 12:14:27 +09:00
dw.jang bf2f16b207 fix: Spot 측정 mbb→maa 복원 (rbb 헤더가 collector 혼동 유발)
mbb 응답(rbb:→reb:×6→raa:)에서 rbb: 헤더가 piezoCollector를
혼동시켜 그래프가 안 뜨는 문제 발생.

- Spot 단일 측정: sendChannelsOnly(maa) 사용
- 자동 측정 10초째: measure()→maa 사용 (mbb는 파싱 검증 후 전환)
- IMU 전송 시 isMeasuring 체크 추가 (측정 중 충돌 방지)
- sendChannelsOnly() 함수 추가 (기존 sendAllChannels와 동일)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 12:09:02 +09:00
dw.jang fb9b950a1c feat: Piezo 상단바에 Placement Guide 복귀 버튼 추가
MyLocation 아이콘으로 Placement Guide로 돌아갈 수 있는 버튼 추가
(Home 버튼 옆, 센서 재배치가 필요할 때 사용)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 11:49:45 +09:00
dw.jang af6071e18b fix: mid? 명령 포맷 변경 — buildCommandASCII("mid", " ") 공백 포함
기기에서 rxs:mid? (unknown command) 응답 → 포맷 문제 가능성
buildCommand("mid") → buildCommandASCII("mid", " ") 로 변경하여 테스트

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 11:45:47 +09:00
dw.jang eb5affc6b8 feat: 자동측정 IMU 1초 + 전체측정(mbb) 10초 루프
자동측정 변경 (기존: 30초 maa → 신규: 1초 msp + 10초 mbb):
- 1~9초: msp(IMU query) → rsp(accel+gyro) 1초 간격
- 10초째: mbb(전체측정) → rbb(헤더) + reb×6 + raa
- 기존 maa → mbb(sendFullMeasurement)로 전환
- mbb 응답은 rbb: 헤더 후 reb:/raa: 동일 파이프라인

BLE 명령어 추가:
- sendImuQuery(): msp 전송
- sendFullMeasurement(): mbb 전송 (piezoCollector 연동)
- sendLedMode(state): mls 전송

응답 파싱 추가:
- rxs: → "cmd_not_supported" (mid? 미지원 기기 대응)
- rbb: → full measurement header
- rsp: → IMU data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 11:31:03 +09:00