dw.jang 92852a1168 feat(ble): 저장된 기기 삭제를 즉시 폰 쪽부터 지우고, 연결 직후 끊김 반복을 "기기 초기화 필요"로 알린다
사용자 앱 e7189afb 와 같은 변경을 임상 앱에 옮긴다. 2026-08-04 의 삭제 흐름은 "확인 → 14초
재연결 → 실패 시 강제 삭제" 였다. 지우려는 기기는 대개 이미 연결이 안 되는 기기라 그 14초는
정의상 실패했고, 사용자에게는 "삭제가 안 된다"로 읽혔다(10-06 사용적합성평가 · 10-07 임상 폰).
기기 쪽 본드는 연결된 채 msr? 를 보내거나 기기 15초 초기화로만 지워진다는 제약은 그대로
두고(기기 변경 없음), 앱 쪽 순서를 바꾼다.

  · 삭제는 항상 즉시 폰 쪽을 지운다. 기다리는 단계가 기본 경로에 없다.
  · 지금 연결돼 있으면 기기 쪽도 같이 지운다(msr?). 사용자가 고를 일이 없다.
  · 방금(5초 안) 광고를 본 기기만 7초 접속해 양쪽을 지우려 하고(BleManager.lastSeenAgoMs
    신설), 그 사이 [기다리지 않고 삭제] 가 있다(abortUnbondSmart). 닿지 않으면 폰에서만
    지우고 파란 알림으로 "기기 15초 초기화 필요" 를 말한다.
  · 폰에서만 지운 주소는 ResetNeededStore 에 남기고, 새 기기 목록에 다시 보이면 신호 세기
    자리에 "초기화하지 않았다면 연결이 거절됩니다" 를 붙인다. 그 기기와 GATT 연결이 성립하면
    지운다(이 앱에는 본드 수신기가 없어 연결 성공 분기에서 거둔다).
  · 본드 불일치 감지(FastFailDetector): connectGatt 뒤 1.5초 안에 실패가 같은 주소로 2번
    연속이면 BOND_MISMATCH_SUSPECTED. 자동 재시도를 멈추고 기기 15초 초기화를 안내한다.
    폰에 본드가 남아 있을 때만 [이 폰의 본딩 정보 초기화] 를 함께 준다(isAddressBonded 신설).
  · 강제 삭제 뒤 옛 오류 배너가 남던 것도 같이 지운다(사용자 앱 9c115871).

문구: unpair_* 를 상황별 세 가지로 갈고 안 쓰는 6개는 지웠다. FastFailDetectorTest 6건.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 13:53:43 +09:00

VesiscanClinicalAndroid

VesiScan 병원 임상 측정 앱 (Android · Kotlin · Compose). 정해진 프로토콜로 환자 데이터를 받아 폰에 저장하고 labdb 로 올리는 사내·병원 임상 전용 앱이다. 일반 사용자 앱이 아니다.

  • applicationId com.medithings.vesiscan.demo · 플레이버 demo(임상) / dev
  • 빌드 · 설치: ./gradlew :app:assembleDemoDebug → adb install -r app/build/outputs/apk/demo/debug/app-demo-debug.apk
  • 단위시험: ./gradlew :app:testDemoDebugUnitTest
  • local.properties 는 커밋하지 않는다(local.properties.template 참조)

어디서 왔나

구저장소 medithings-rnd/VesiscanBasicAndroid 의 demo-final 브랜치를 히스토리째 (2026-03-09 초기 커밋부터) 떼어 2026-10-01 에 이 저장소의 main 으로 옮겼다. 그 브랜치는 구저장소에 보관만 하고 더 쓰지 않는다. 일반 사용자 앱은 vesiscan_pre_product/vesiscan_android_user.

화면 흐름 (병원 임상)

연결 → labdb 등록 확인 → 환자명 · 자세 → 그 자세의 정렬(치골 위 0~4cm 탐색 → N cm 확인 → N cm 에서 바로 좌우) → 마킹·떼기·크래들 → 재부착 확인 → 채움 정도마다 측정 → 다음 자세는 정렬부터 다시. 자세한 것은 docs/CLINICAL_ALGORITHM.md §3.6, labdb 적재 모양은 docs/LABDB_DATATYPES.md (600 측정 · 601 정렬).

데이터

폰 Downloads/VesiScan_Hospital/{날짜}_{환자}/ 에 조합별 CSV + IMU, align_{자세}/ 에 그 자세의 정렬 원시·요약(2026-10-01 이전은 align/). labdb 업로드 마커(*.labdb.json, align_*/.labdb_align.json)로 재시도 대상을 가린다.

S
Description
No description provided
Readme 20 MiB
Languages
Kotlin 97.1%
Python 2.9%