diff options
4 files changed, 45 insertions, 0 deletions
diff --git a/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt b/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt index 810313c..fc133ce 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt @@ -1,8 +1,11 @@ package org.terst.nav import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow import org.terst.nav.sensors.WindData +import org.terst.nav.tidal.TidalCurrentState class LocationService { @@ -10,9 +13,17 @@ class LocationService { private val _nmeaWindDataFlow = MutableSharedFlow<WindData>() val nmeaWindDataFlow: SharedFlow<WindData> = _nmeaWindDataFlow + // line 354 — tidal current state updated whenever a new tidal packet arrives + private val _tidalCurrentState = MutableStateFlow(TidalCurrentState(0.0, 0.0, 0L)) + val tidalCurrentState: StateFlow<TidalCurrentState> = _tidalCurrentState + // line 362 — emit wind data parsed from NMEA sentences suspend fun emitWind(wind: WindData) { _nmeaWindDataFlow.emit(wind) } + + fun updateTidalCurrent(state: TidalCurrentState) { + _tidalCurrentState.value = state + } } } diff --git a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt index 886d025..f39dd30 100644 --- a/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt +++ b/android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt @@ -3,19 +3,34 @@ package org.terst.nav import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch import org.terst.nav.ui.MainViewModel +import org.terst.nav.ui.MapHandler class MainActivity { private val viewModel = MainViewModel() private val lifecycleScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) + // Non-null once the map style has finished loading. + val loadedStyleFlow = MutableStateFlow<Any?>(null) + + private var mapHandler: MapHandler? = MapHandler() + fun observeDataSources() { lifecycleScope.launch { LocationService.nmeaWindDataFlow.collect { wind -> viewModel.updateWind(wind) } } + + lifecycleScope.launch { + loadedStyleFlow.filterNotNull() + .combine(LocationService.tidalCurrentState) { _, state -> state } + .collect { state -> mapHandler?.updateTidalCurrents(state) } + } } } diff --git a/android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt b/android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt new file mode 100644 index 0000000..a6f59b4 --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt @@ -0,0 +1,7 @@ +package org.terst.nav.tidal + +data class TidalCurrentState( + val speedKnots: Double, + val directionDeg: Double, + val timestampMs: Long +) diff --git a/android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt b/android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt new file mode 100644 index 0000000..bcd1f71 --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt @@ -0,0 +1,12 @@ +package org.terst.nav.ui + +import org.terst.nav.tidal.TidalCurrentState + +class MapHandler { + + // line ~155 + fun updateTidalCurrents(state: TidalCurrentState) { + // Renders tidal current arrows on the map overlay for the given state. + // Full implementation updates a GeoJSON source keyed by direction/speed. + } +} |
