package com.example.medilightv2android.models import java.text.SimpleDateFormat import java.util.Date import java.util.Locale /** * 임상 R&D 측정 — "한 측정 단위" 모델. * * 한 ClinicalSession = 한 라벨 = 한 폴더 = 한 측정 사이클. * 사용자가 BLE 연결 후 매번 자세/위치를 입력하고 측정 진행 → Back 시 폴더 finalize. * * 디바이스 식별자는 BLE 연결된 기기 이름(예: VBT26050202)을 자동으로 사용. * * 데이터 구조 (한 측정당): * Downloads/VesiScan_Sessions/{folderName}/ * ├─ meta.json * ├─ adc.csv * ├─ placements.jsonl (alignment) or events.jsonl (BV) * └─ ble.log */ enum class ClinicalPosture(val label: String) { SUPINE("Supine"), SITTING("Sitting"), STANDING("Standing") } /** * 측정 단계. * - ALIGN_0CM ~ ALIGN_4CM: 정렬모드 알고리즘 개발용 (기기 아래 끝 기준 치골 위 0~4cm) * - BV: cradle 부착 후 본측정 (방광 추정 알고리즘 개발용) */ enum class ClinicalStep(val label: String, val description: String, val isAlignment: Boolean) { ALIGN_0CM("0 cm", "기기 아래 끝이 치골 바로 위", true), ALIGN_1CM("1 cm", "치골 위로 1 cm", true), ALIGN_2CM("2 cm", "치골 위로 2 cm", true), ALIGN_3CM("3 cm", "치골 위로 3 cm", true), ALIGN_4CM("4 cm", "치골 위로 4 cm", true), BV("BV", "Cradle 부착 후 본측정", false) } data class ClinicalSession( val deviceName: String, // BLE 기기 이름 (예: "VBT26050202") val posture: ClinicalPosture, val step: ClinicalStep, val examiner: String = "", val notes: String = "", val startedAt: Long = System.currentTimeMillis(), var endedAt: Long? = null ) { private val folderFmt = SimpleDateFormat("yyyy-MM-dd_HHmmss", Locale.US) /** "VBT26050202_SUPINE_ALIGN_0CM_2026-05-28_14-30-15" */ val folderName: String get() = "${deviceName}_${posture.name}_${step.name}_${folderFmt.format(Date(startedAt))}" /** clinical_label 컬럼/필드 값 (라벨링 자동) */ val label: String get() = "${deviceName}_${posture.name}_${step.name}" }