diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarState.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarState.kt index 7ab37096..e1c99882 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarState.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarState.kt @@ -132,5 +132,12 @@ sealed interface RadarAction { // Calculator actions data class ChangeCalculatorOffset(val offsetKHz: String) : RadarAction + + /** + * The transponder currently driving the calculator (null when the satellite has + * no linear transponder). The per-satellite offset follows it instead of the + * transceiver selection, so it loads and saves even when nothing is selected. + */ + data class CalculatorTransponderChanged(val catnum: Int?) : RadarAction data class UpdateCalculatorFrequency(val txHz: Long?, val rxHz: Long?) : RadarAction } diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt index 642acc00..d7debb68 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt @@ -69,6 +69,7 @@ class RadarViewModel( private val stationPos = settingsRepo.stationPosition.value private val magDeclination = sensorsRepo.getMagDeclination(stationPos) private var transponders: List = emptyList() + private var calculatorCatnum: Int? = null private var sstvDecoder: SstvDecoder? = null private var sstvRecordingJob: Job? = null private var cwDecoder: CwDecoder? = null @@ -158,12 +159,8 @@ class RadarViewModel( transponders = allRadios.filter { it.downlinkLow != null } if (allRadios.isNotEmpty()) { val firstUuid = allRadios.first().uuid - val offsetKHz = allRadios.first().catnum?.let { settingsRepo.getSatelliteOffset(it) } ?: "" _uiState.update { - it.copy( - transceivers = it.transceivers.copy(selectedUuid = firstUuid), - calculatorOffsetKHz = offsetKHz - ) + it.copy(transceivers = it.transceivers.copy(selectedUuid = firstUuid)) } transponders.find { it.uuid == firstUuid }?.let { trackingService.setTransponder(it) } } @@ -241,15 +238,8 @@ class RadarViewModel( // Compute toggle state before the update so we don't read post-update value val isTogglingOff = _uiState.value.transceivers.selectedUuid == action.uuid val newUuid = if (isTogglingOff) null else action.uuid - val offsetKHz = if (!isTogglingOff) { - transponders.find { it.uuid == action.uuid } - ?.catnum?.let { settingsRepo.getSatelliteOffset(it) } ?: "" - } else "" _uiState.update { - it.copy( - transceivers = it.transceivers.copy(selectedUuid = newUuid), - calculatorOffsetKHz = offsetKHz - ) + it.copy(transceivers = it.transceivers.copy(selectedUuid = newUuid)) } // Only update the tracking service when selecting a different transponder to // avoid resetting a user-adjusted TX base on re-expand @@ -319,7 +309,9 @@ class RadarViewModel( _uiState.update { it.copy(cw = it.cw.copy(isExpanded = action.expanded)) } } is RadarAction.ChangeCalculatorOffset -> { - val catnum = _uiState.value.transceivers.selectedUuid?.let { uuid -> + // Keyed by the transponder driving the calculator, so the offset saves + // even when no transceiver is selected (or selection was toggled off) + val catnum = calculatorCatnum ?: _uiState.value.transceivers.selectedUuid?.let { uuid -> transponders.find { it.uuid == uuid }?.catnum } if (catnum != null) { @@ -327,6 +319,11 @@ class RadarViewModel( } _uiState.update { it.copy(calculatorOffsetKHz = action.offsetKHz) } } + is RadarAction.CalculatorTransponderChanged -> { + calculatorCatnum = action.catnum + val offsetKHz = action.catnum?.let { settingsRepo.getSatelliteOffset(it) } ?: "" + _uiState.update { it.copy(calculatorOffsetKHz = offsetKHz) } + } is RadarAction.UpdateCalculatorFrequency -> { _uiState.update { if (it.calculatorTxHz == action.txHz && it.calculatorRxHz == action.rxHz) it diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt index c5f9cc85..a6f8b9cf 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/TransceiversPage.kt @@ -176,6 +176,13 @@ fun CalculatorPage( ?: calculatorTransceivers.firstOrNull() } + // Keep the per-satellite offset in sync with the transponder driving the + // calculator: load the saved value on open/satellite change, and remember + // its catnum so editing saves even when no transceiver is selected + LaunchedEffect(selectedTransceiver?.uuid) { + onAction(RadarAction.CalculatorTransponderChanged(selectedTransceiver?.catnum)) + } + if (selectedTransceiver == null) { EmptyTransceiversContent(modifier) return