From e53fbe4e984f0f57f3ed73297adf8273bb523808 Mon Sep 17 00:00:00 2001 From: Claudomator Agent Date: Sat, 14 Mar 2026 02:23:25 +0000 Subject: Add GpsPosition data class and NMEA RMC parser with tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- SESSION_STATE.md | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'SESSION_STATE.md') 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) -- cgit v1.2.3