diff --git a/app/src/main/java/com/laseroptek/raman/ui/screens/home/HomeScreen.kt b/app/src/main/java/com/laseroptek/raman/ui/screens/home/HomeScreen.kt index 23bcc22..cbddbc4 100644 --- a/app/src/main/java/com/laseroptek/raman/ui/screens/home/HomeScreen.kt +++ b/app/src/main/java/com/laseroptek/raman/ui/screens/home/HomeScreen.kt @@ -304,7 +304,7 @@ fun HomeScreen( pulseType = pulseType, handPieceType = handPiece.type, type = LaserStatusType.REPETITION, - angle = if (pulseType == 0 || repetitionList.size < 2) 0f else repetitionAngle, + angle = if (pulseType == 0 || repetitionList.isEmpty()) 0f else repetitionAngle, onChange = { angle -> if (handPiece.type == 0) { Toast.makeText( @@ -315,7 +315,7 @@ fun HomeScreen( return@LaserControlView } - if (pulseType == 0 || repetitionList.size < 2) { + if (pulseType == 0 || repetitionList.isEmpty()) { //Toast.makeText(context, "Single pulse type (0 Hz)", Toast.LENGTH_SHORT).show() } else { mainViewModel.onChangeRepetition(angle) @@ -332,7 +332,7 @@ fun HomeScreen( return@LaserControlView } - if (pulseType == 0 || repetitionList.size < 2) { + if (pulseType == 0 || repetitionList.isEmpty()) { //Toast.makeText(context, "Single pulse type (0 Hz)", Toast.LENGTH_SHORT).show() } else { //mainViewModel.onClickRepetition(state) diff --git a/app/src/main/java/com/laseroptek/raman/ui/screens/main/MainViewModel.kt b/app/src/main/java/com/laseroptek/raman/ui/screens/main/MainViewModel.kt index 360a803..57d9f45 100644 --- a/app/src/main/java/com/laseroptek/raman/ui/screens/main/MainViewModel.kt +++ b/app/src/main/java/com/laseroptek/raman/ui/screens/main/MainViewModel.kt @@ -2130,11 +2130,10 @@ class MainViewModel @Inject constructor( } else { 0f } - val repetitionAngle = if (newRepetitionList.isNotEmpty()) { - repetitionStep.stepToDegree(totalSteps = newRepetitionList.size) - } else { - 0f - } + val repetitionAngle = repetitionIndexToAngle( + index = repetitionStep, + totalSteps = newRepetitionList.size, + ) Timber.d("pulseStep: ${pulseStep} fluenceStep: ${fluenceStep} repetitionStep: ${repetitionStep}") @@ -2178,23 +2177,21 @@ class MainViewModel @Inject constructor( setRepetitionList(newRepetitionList) } - // Smartly preserve Repetition Angle - // 4. Check if the old repetition value exists in the new list. - val oldRepetitionIndex = if (currentRepetitionValue != null) { - newRepetitionList.indexOf(currentRepetitionValue) - } else { - -1 - } + // 4. Resolve and apply repetition by value (not by old angle/index). + val targetRepetition = currentRepetitionValue ?: 0f + val resolvedRepetition = newRepetitionList.minByOrNull { abs(it - targetRepetition) } ?: 0f + val resolvedRepetitionIndex = newRepetitionList.indexOf(resolvedRepetition).takeIf { it >= 0 } ?: 0 - if (oldRepetitionIndex != -1) { - // If the old value exists, set the slider to that position. - val preservedAngle = oldRepetitionIndex.stepToDegree(totalSteps = newRepetitionList.size) - setRepetitionAngle(preservedAngle) - Timber.d("Repetition value $currentRepetitionValue preserved at new angle $preservedAngle.") + if (newRepetitionList.isNotEmpty()) { + val resolvedRepetitionAngle = repetitionIndexToAngle( + index = resolvedRepetitionIndex, + totalSteps = newRepetitionList.size, + ) + setRepetitionAngle(resolvedRepetitionAngle) + Timber.d("Resolved repetition by value: old=$currentRepetitionValue, new=$resolvedRepetition, angle=$resolvedRepetitionAngle") } else { - // If it doesn't exist, THEN reset the slider to the beginning. setRepetitionAngle(0f) - Timber.d("Repetition value $currentRepetitionValue not supported in new list. Resetting angle.") + Timber.d("Repetition list is empty. Resetting repetition angle to 0f.") } // 5. Conditionally reset the fluence angle slider if needed @@ -2301,8 +2298,12 @@ class MainViewModel @Inject constructor( fun onChangeRepetition(angle: Float) { // This logic is simple and has no complex dependencies, so it can remain as is. - if (angle != repetitionAngle.value) { - setRepetitionAngle(angle) + val normalizedAngle = repetitionIndexToAngle( + index = angle.degreeToStep(totalSteps = repetitionList.value.size), + totalSteps = repetitionList.value.size, + ) + if (normalizedAngle != repetitionAngle.value) { + setRepetitionAngle(normalizedAngle) } setSelectedPresetIndex(0) } @@ -2313,12 +2314,23 @@ class MainViewModel @Inject constructor( val newStep = if (state == UpDownState.Up) currentStep + 1 else currentStep - 1 if (newStep in repetitionList.value.indices) { - val newRepetitionAngle = newStep.stepToDegree(totalSteps = repetitionList.value.size) + val newRepetitionAngle = repetitionIndexToAngle( + index = newStep, + totalSteps = repetitionList.value.size, + ) setRepetitionAngle(newRepetitionAngle) setSelectedPresetIndex(0) } } + private fun repetitionIndexToAngle(index: Int, totalSteps: Int): Float { + return when { + totalSteps <= 0 -> 0f + totalSteps == 1 -> 270f + else -> index.stepToDegree(totalSteps = totalSteps) + } + } + /** * Perform all heavy I/O in a single background block. * This prevents the "Skipped frames" caused by 30+ sequential bridge calls