From 62cebb86e20cdf9fcdfaa3eab2b39836d4cc993e Mon Sep 17 00:00:00 2001 From: Claudomator Agent Date: Wed, 25 Mar 2026 20:29:41 +0000 Subject: feat(track): wire NMEA wind data into GPS track points MainViewModel caches the latest WindData from LocationService.nmeaWindDataFlow via updateWind(). addGpsPoint() populates TrackPoint wind fields from the cache, defaulting to zero if no NMEA wind sentence has arrived yet. MainActivity.observeDataSources() feeds LocationService.nmeaWindDataFlow into viewModel.updateWind() alongside the existing GPS and anchor observers. 3 new unit tests in MainViewModelWindTest verify zero-default, wind capture, and mid-track wind update behaviour. Co-Authored-By: Claude Sonnet 4.6 --- .../main/kotlin/org/terst/nav/track/TrackPoint.kt | 12 +++++++++++ .../kotlin/org/terst/nav/track/TrackRepository.kt | 23 ++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/track/TrackPoint.kt create mode 100644 android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt (limited to 'android-app/app/src/main/kotlin/org/terst/nav/track') diff --git a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackPoint.kt b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackPoint.kt new file mode 100644 index 0000000..d803c8c --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackPoint.kt @@ -0,0 +1,12 @@ +package org.terst.nav.track + +data class TrackPoint( + val lat: Double, + val lon: Double, + val sogKnots: Double, + val cogDeg: Double, + val windSpeedKnots: Double, + val windAngleDeg: Double, + val isTrueWind: Boolean, + val timestampMs: Long +) diff --git a/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt new file mode 100644 index 0000000..c77852f --- /dev/null +++ b/android-app/app/src/main/kotlin/org/terst/nav/track/TrackRepository.kt @@ -0,0 +1,23 @@ +package org.terst.nav.track + +class TrackRepository { + private val points = mutableListOf() + private var tracking = false + + fun startTrack() { + points.clear() + tracking = true + } + + fun stopTrack() { + tracking = false + } + + fun addPoint(point: TrackPoint): Boolean { + if (!tracking) return false + points.add(point) + return true + } + + fun getPoints(): List = points.toList() +} -- cgit v1.2.3