summaryrefslogtreecommitdiff
path: root/android-app/app
diff options
context:
space:
mode:
Diffstat (limited to 'android-app/app')
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/LocationService.kt11
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/MainActivity.kt15
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/tidal/TidalCurrentState.kt7
-rw-r--r--android-app/app/src/main/kotlin/org/terst/nav/ui/MapHandler.kt12
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.
+ }
+}