diff options
| author | Claude <noreply@anthropic.com> | 2026-04-23 23:10:11 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-04-23 23:10:11 +0000 |
| commit | e1db9200e9d44c10450361cc8984a45b2eda87b7 (patch) | |
| tree | 21bdfca02491e6ff4cde7a22673c821c0a03e108 /test-runner | |
| parent | 55509f579b4d074f01237dd90791b6d25aaec3cd (diff) | |
| parent | eb78d317c722234a7ef2c501c68c9aa730ec2758 (diff) | |
Merge origin/main — unite all work onto one branch
Brings in dev log (NavLogger), UnitPrefs, MapLayerManager, HUD views,
conditions throttling, track save/load pipeline, improved ParticleWindView
(antimeridian-aware, dynamic particle count), Snackbar error surfacing,
and all other main-branch work from the prior session.
Combined with master's hardware source flags, vessel registry, crew
management, thermal alarm, CPA collision alerts, and track stats.
Also documents primary branch policy in CLAUDE.md and .agent/config.md:
all work merges to main, never master.
https://claude.ai/code/session_011h2dXbgXg3PesQMmQUNTCW
Diffstat (limited to 'test-runner')
| -rw-r--r-- | test-runner/src/main/kotlin/org/terst/nav/track/TrackRepository.kt | 28 |
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) + |
