<feed xmlns='http://www.w3.org/2005/Atom'>
<title>nav.git/test-runner/src/test/kotlin/org/terst/nav/ais/CpaAlertTest.kt, branch main</title>
<subtitle>nav — android navigation app
</subtitle>
<id>https://git.terst.org/nav.git/atom?h=main</id>
<link rel='self' href='https://git.terst.org/nav.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/'/>
<updated>2026-04-22T08:45:55+00:00</updated>
<entry>
<title>feat: CPA/TCPA collision alerts and live track stats</title>
<updated>2026-04-22T08:45:55+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-22T08:45:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=87f9cb753da3325d13fdbc442d526567e056d6e1'/>
<id>urn:sha1:87f9cb753da3325d13fdbc442d526567e056d6e1</id>
<content type='text'>
CPA/TCPA alerts:
- CpaAlert data class with severity (CAUTION/WARNING/DANGER) and label()
- CpaThresholds: 0.5/1.0/2.0 nm, max TCPA 30 min
- MainViewModel.updateCpaAlerts() runs on every GPS update and AIS
  sentence; skips stationary contacts; filters TCPA ≤ 0 or &gt; 30 min;
  sorts by TCPA ascending
- SafetyFragment: new COLLISION AVOIDANCE card shows live alert list,
  color-coded by severity; clears to "No traffic alerts" when safe
- MainActivity: observes cpaAlerts → safetyFragment.updateCpaAlerts()

Track stats:
- TrackStats data class: distanceNm, durationMs, avgSogKnots,
  durationFormatted (m:ss / h:mm:ss)
- TrackRepository.haversineNm() + computeStats() using point timestamps
- MainViewModel exposes trackStats StateFlow, cleared on stopTrack()
- activity_main: dark pill overlay bar (tv_track_stats) above map
- MainActivity: shows "● REC  0.00nm  m:ss  x.xkt avg" while recording

Tests: 95 total, all GREEN (+16 new — 9 TrackStats, 7 CpaAlert)

https://claude.ai/code/session_011h2dXbgXg3PesQMmQUNTCW
</content>
</entry>
</feed>
