diff options
| author | Claudomator Agent <agent@claudomator> | 2026-03-14 02:23:25 +0000 |
|---|---|---|
| committer | Claudomator Agent <agent@claudomator> | 2026-03-14 02:23:25 +0000 |
| commit | e53fbe4e984f0f57f3ed73297adf8273bb523808 (patch) | |
| tree | b9a8a81900a07be819e328788bf3f5dc10bd91e2 /SESSION_STATE.md | |
| parent | f391940495f40f00794214be5d1a440cc14a8915 (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.md | 27 |
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) |
