summaryrefslogtreecommitdiff
path: root/test-runner/src/main
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-04-23 23:10:11 +0000
committerClaude <noreply@anthropic.com>2026-04-23 23:10:11 +0000
commite1db9200e9d44c10450361cc8984a45b2eda87b7 (patch)
tree21bdfca02491e6ff4cde7a22673c821c0a03e108 /test-runner/src/main
parent55509f579b4d074f01237dd90791b6d25aaec3cd (diff)
parenteb78d317c722234a7ef2c501c68c9aa730ec2758 (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/src/main')
-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) +