summaryrefslogtreecommitdiff
path: root/test-runner
diff options
context:
space:
mode:
Diffstat (limited to 'test-runner')
-rw-r--r--test-runner/src/main/kotlin/org/terst/nav/track/TrackRepository.kt28
1 files changed, 16 insertions, 12 deletions
diff --git a/test-runner/src/main/kotlin/org/terst/nav/track/TrackRepository.kt b/test-runner/src/main/kotlin/org/terst/nav/track/TrackRepository.kt
index a68e315..98d0bf3 100644
--- a/test-runner/src/main/kotlin/org/terst/nav/track/TrackRepository.kt
+++ b/test-runner/src/main/kotlin/org/terst/nav/track/TrackRepository.kt
@@ -10,41 +10,45 @@ class TrackRepository {
var isRecording: Boolean = false
private set
- private val points = mutableListOf<TrackPoint>()
+ private val activePoints = mutableListOf<TrackPoint>()
+ private val pastTracks = mutableListOf<List<TrackPoint>>()
fun startTrack() {
- points.clear()
+ activePoints.clear()
isRecording = true
}
fun stopTrack() {
+ if (isRecording && activePoints.isNotEmpty()) {
+ pastTracks.add(activePoints.toList())
+ }
isRecording = false
}
fun addPoint(point: TrackPoint): Boolean {
if (!isRecording) return false
- points.add(point)
+ activePoints.add(point)
return true
}
- fun getPoints(): List<TrackPoint> = points.toList()
+ fun getPoints(): List<TrackPoint> = activePoints.toList()
+
+ fun getPastTracks(): List<List<TrackPoint>> = pastTracks.toList()
fun computeStats(): TrackStats? {
- if (points.size < 2) return null
+ if (activePoints.size < 2) return null
var distNm = 0.0
- for (i in 1 until points.size) {
- distNm += haversineNm(points[i - 1].lat, points[i - 1].lon, points[i].lat, points[i].lon)
+ for (i in 1 until activePoints.size) {
+ distNm += haversineNm(activePoints[i - 1].lat, activePoints[i - 1].lon, activePoints[i].lat, activePoints[i].lon)
}
- val durationMs = points.last().timestampMs - points.first().timestampMs
- val avgSog = if (durationMs > 0) {
- points.map { it.sogKnots }.average()
- } else 0.0
+ val durationMs = activePoints.last().timestampMs - activePoints.first().timestampMs
+ val avgSog = if (durationMs > 0) activePoints.map { it.sogKnots }.average() else 0.0
return TrackStats(distNm, durationMs, avgSog)
}
companion object {
fun haversineNm(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double {
- val r = 3440.065 // Earth radius in nautical miles
+ val r = 3440.065
val dLat = Math.toRadians(lat2 - lat1)
val dLon = Math.toRadians(lon2 - lon1)
val a = sin(dLat / 2) * sin(dLat / 2) +