diff --git a/app/src/main/java/com/example/medilightv2android/AppState.kt b/app/src/main/java/com/example/medilightv2android/AppState.kt index 466d0ac..a01627a 100644 --- a/app/src/main/java/com/example/medilightv2android/AppState.kt +++ b/app/src/main/java/com/example/medilightv2android/AppState.kt @@ -231,6 +231,10 @@ class AppState(private val context: Context) { storage.catheterizationLevel = threshold } + fun savePiezoSettings() { + storage.piezoSettings = piezoSettings + } + val estimatedVolume: Int get() { if (BladderLevel.MAX_LEVEL <= 0) return 0 diff --git a/app/src/main/java/com/example/medilightv2android/models/PiezoSettings.kt b/app/src/main/java/com/example/medilightv2android/models/PiezoSettings.kt index ad15430..5a46da7 100644 --- a/app/src/main/java/com/example/medilightv2android/models/PiezoSettings.kt +++ b/app/src/main/java/com/example/medilightv2android/models/PiezoSettings.kt @@ -15,9 +15,9 @@ data class PiezoSettings( var posture: Posture = Posture.SITTING, var sensorPosition: SensorPosition = SensorPosition.LOWER_ABDOMEN, var maxVolume: Int = 500, - // BV calculation tweak — anterior-wall pull-in magnitude in millimetres. - // The stored value is always non-negative; BV calculation applies it as a - // negative (probe-ward) shift on the ant index. Default 0 keeps legacy - // behaviour. + // Charles 833c110: BV calculation tweak — anterior-wall pull-in magnitude in millimetres. var antOffsetMm: Int = 0, + // 우리 4ae25d9: Auto Scan 측정 사이클 목표 간격 (ms). + // BleManager.canSendMaa() time gate와 동일 값이 기본. 600ms 미만은 throttle이 막음. + var autoScanIntervalMs: Int = 600 ) diff --git a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt index ea909e2..f12c290 100644 --- a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt +++ b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt @@ -59,6 +59,7 @@ import com.example.medilightv2android.ui.components.ScanLogDialog import com.example.medilightv2android.R import com.example.medilightv2android.ui.theme.* import androidx.compose.ui.res.stringResource +import kotlin.math.roundToInt @Composable fun PiezoMonitoringView(appState: AppState) { @@ -532,8 +533,8 @@ fun PiezoMonitoringView(appState: AppState) { } // Auto-measure: 측정 완료 대기 + 최소 간격 보장 - // FW VBTFW0116 + MTU 247 + CONN_PRIORITY HIGH 조합에서 응답 ~330ms. - // BleManager throttle 600ms와 동기화해 사이클당 ~0.6~0.7s로 회전. + // 간격은 piezoSettings.autoScanIntervalMs (사용자 설정, 600~5000ms). + // BleManager throttle(600ms)이 하한이라 600 미만은 무의미. LaunchedEffect(isAutoMeasuring) { if (isAutoMeasuring) { while (isAutoMeasuring) { @@ -545,7 +546,8 @@ fun PiezoMonitoringView(appState: AppState) { } autoTickCount++ val elapsed = System.currentTimeMillis() - measureStartMs - val remaining = 600L - elapsed + val targetIntervalMs = appState.piezoSettings.autoScanIntervalMs.toLong() + val remaining = targetIntervalMs - elapsed if (remaining > 0) kotlinx.coroutines.delay(remaining) } kotlinx.coroutines.delay(50) @@ -1377,6 +1379,25 @@ fun PiezoMonitoringView(appState: AppState) { colors = SliderDefaults.colors(thumbColor = MlPrimary, activeTrackColor = MlPrimary) ) + HorizontalDivider(modifier = Modifier.padding(vertical = dividerPadding)) + + // Auto Scan Interval — 측정 사이클 간격 (ms). 슬라이더 600~5000, 200 단위. + Row(verticalAlignment = Alignment.CenterVertically) { + Text("Auto Scan Interval", fontSize = labelSize, fontWeight = FontWeight.SemiBold) + Spacer(modifier = Modifier.weight(1f)) + Text("${appState.piezoSettings.autoScanIntervalMs} ms", fontSize = labelSize, fontWeight = FontWeight.Bold, color = MlPrimary) + } + Slider( + value = appState.piezoSettings.autoScanIntervalMs.toFloat(), + onValueChange = { + val snapped = ((it / 200f).roundToInt() * 200).coerceIn(600, 5000) + appState.piezoSettings = appState.piezoSettings.copy(autoScanIntervalMs = snapped) + }, + valueRange = 600f..5000f, + steps = 21, + colors = SliderDefaults.colors(thumbColor = MlPrimary, activeTrackColor = MlPrimary) + ) + // ── 개발자 전용 설정 ── if (appState.isDevMode) { HorizontalDivider(modifier = Modifier.padding(vertical = dividerPadding)) @@ -1583,7 +1604,7 @@ fun PiezoMonitoringView(appState: AppState) { Spacer(modifier = Modifier.width(8.dp)) Button( onClick = { - appState.savePiezoSettingsNow() + appState.savePiezoSettingsNow() // Charles 함수명 통일 showSettings = false }, shape = RoundedCornerShape(10.dp),