summaryrefslogtreecommitdiff
path: root/SESSION_STATE.md
diff options
context:
space:
mode:
authorClaudomator Agent <agent@claudomator>2026-03-14 02:23:25 +0000
committerClaudomator Agent <agent@claudomator>2026-03-14 02:23:25 +0000
commite53fbe4e984f0f57f3ed73297adf8273bb523808 (patch)
treeb9a8a81900a07be819e328788bf3f5dc10bd91e2 /SESSION_STATE.md
parentf391940495f40f00794214be5d1a440cc14a8915 (diff)
Add GpsPosition data class and NMEA RMC parser with tests
- NmeaParser: parses $GPRMC (and any *RMC) sentence → GpsPosition - Null for void status (V), malformed input, non-RMC sentence - SOG/COG default to 0.0 when empty; S/W give negative lat/lon - Timestamp from HHMMSS + DDMMYY fields as Unix epoch millis UTC - No Android dependencies - GpsPositionTest: value holding and data-class equality (2 tests) - NmeaParserTest: 11 tests covering valid parse, void/malformed/empty, hemisphere signs, decimal precision - All 22 unit tests verified GREEN via kotlinc + JUnitCore Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'SESSION_STATE.md')
-rw-r--r--SESSION_STATE.md27
1 files changed, 23 insertions, 4 deletions
diff --git a/SESSION_STATE.md b/SESSION_STATE.md
index fd7f0e1..ef52c00 100644
--- a/SESSION_STATE.md
+++ b/SESSION_STATE.md
@@ -1,7 +1,7 @@
# SESSION_STATE.md
## Current Task Goal
-GPS provider abstraction layer — COMPLETE
+GPS navigation implementation: position model, SOG/COG, NMEA RMC parser — COMPLETE
## Completed Items
@@ -45,10 +45,29 @@ GPS provider abstraction layer — COMPLETE
Full Gradle build requires fixing directory permissions: `chown -R www-data:www-data app/build app/.kotlin`
- Pre-existing XML layout error in `activity_main.xml:300` (unrelated to GPS work)
+### [APPROVED] NmeaParser — RMC parser
+- File: `app/src/main/kotlin/org/terst/nav/nmea/NmeaParser.kt`
+- Parses any `*RMC` sentence (GP, GN, etc.)
+- Returns `null` for void status (V), malformed input, wrong sentence type
+- SOG/COG default to 0.0 when fields are empty
+- Latitude: positive = North, negative = South
+- Longitude: positive = East, negative = West
+- Timestamp: HHMMSS + DDMMYY → Unix epoch millis UTC (YY < 70 → 2000+YY)
+- No Android dependencies — pure JVM
+
+### [APPROVED] GpsPositionTest + NmeaParserTest (22 tests — all GREEN)
+- `app/src/test/kotlin/org/terst/nav/gps/GpsPositionTest.kt` (2 tests)
+- `app/src/test/kotlin/org/terst/nav/nmea/NmeaParserTest.kt` (11 tests)
+- `app/src/test/kotlin/org/terst/nav/gps/GpsProviderTest.kt` (9 tests, pre-existing)
+- All verified via direct `kotlinc` (1.9.22) + `JUnitCore` invocation
+
## Next 3 Specific Steps
-1. **UI instrument display** — `MainActivity.kt`: subscribe to `DeviceGpsProvider`, display SOG/COG in instrument panel
-2. **NmeaGpsProvider** — `app/src/main/kotlin/org/terst/nav/gps/NmeaGpsProvider.kt`: implement `GpsProvider` parsing NMEA RMC sentences over TCP/UDP
-3. **Fix build permissions** — `chown -R www-data:www-data /workspace/nav/android-app/app/build /workspace/nav/android-app/app/.kotlin` to enable full Gradle unit test runs
+1. **DeviceGpsProvider** (`app/src/main/kotlin/org/terst/nav/gps/DeviceGpsProvider.kt`)
+ — Implement using FusedLocationProviderClient; SOG = speed × 1.94384 knots
+2. **NmeaGpsProvider** — `GpsProvider` implementation parsing NMEA RMC over TCP/UDP socket
+ using `NmeaParser`
+3. **Fix build permissions** — `chown -R www-data:www-data /workspace/nav/android-app/app/build`
+ to enable full Gradle unit test runs
## Scripts Added
- None (tests run via direct JVM invocation)