From 3892bb2396c9e25398fbfef78c20f42e84c79209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Crist=C3=B3bal=20Contreras=20Rubio?= Date: Tue, 23 Jul 2024 10:22:09 +0200 Subject: [PATCH] NMEA-PARSER: v2.1.1 added GGA metadata --- packages/nmea-parser/package.json | 2 +- packages/nmea-parser/src/nmea-metadata.ts | 38 ++++++++++++++++++++--- packages/nmea-parser/tests/index.test.ts | 13 ++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/packages/nmea-parser/package.json b/packages/nmea-parser/package.json index 6a7963c..4555c30 100644 --- a/packages/nmea-parser/package.json +++ b/packages/nmea-parser/package.json @@ -1,6 +1,6 @@ { "name": "@coremarine/nmea-parser", - "version": "2.1.0", + "version": "2.1.1", "description": "Library to parse NMEA 0183 sentences", "author": "CoreMarine", "license": "MIT", diff --git a/packages/nmea-parser/src/nmea-metadata.ts b/packages/nmea-parser/src/nmea-metadata.ts index 8d2616b..79f879f 100644 --- a/packages/nmea-parser/src/nmea-metadata.ts +++ b/packages/nmea-parser/src/nmea-metadata.ts @@ -1,6 +1,25 @@ -import { Float64, NMEASentence, Uint8 } from './types' +import { Float64, NMEASentence, Uint32, Uint8 } from './types' const metadataGGA = (sentence: NMEASentence): NMEASentence => { + const getUTCPosition = /** + * Description placeholder + * + * @param {string} utcPosition hhmmss.ss where hh hours, mm minutes and ss.ss seconds + * @returns {Uint32 | null} + */ + (utcPosition: string): Uint32 | null => { + if (utcPosition.length !== 9) { return null } + if (isNaN(Number(utcPosition))) { return null } + const hours = Number(utcPosition.slice(0, 2)) + const minutes = Number(utcPosition.slice(2, 4)) + const seconds = Number(utcPosition.slice(4, 6)) + const millis = Number(utcPosition.slice(7)) + + const date = new Date() + date.setHours(hours, minutes, seconds, millis) + return date.getTime() + } + const getLatitudeDegrees = (latitude: string, letter: string): Float64 => { const [left, minutesRight] = latitude.split('.') const degrees = left.slice(0, -2) @@ -39,12 +58,22 @@ const metadataGGA = (sentence: NMEASentence): NMEASentence => { } sentence.payload.forEach((field, index) => { + // UTC Position + if (field.name === 'utc_position') { + const utcPosition = field.value as string + const timestamp = getUTCPosition(utcPosition) + if (timestamp !== null) { + sentence.payload[index].metadata = { timestamp } + sentence.metadata = { ...sentence.metadata, timestamp } + } + } // Latitude if (field.name === 'latitude') { const latitude = field.value as string const letter = sentence.payload[index + 1].value as string const degrees = getLatitudeDegrees(latitude, letter) - sentence.metadata = { latitude: degrees } + sentence.payload[index].metadata = { degrees } + sentence.metadata = { ...sentence.metadata, latitude: degrees } return } // Longitude @@ -52,12 +81,13 @@ const metadataGGA = (sentence: NMEASentence): NMEASentence => { const longitude = field.value as string const letter = sentence.payload[index + 1].value as string const degrees = getLongitudeDegrees(longitude, letter) - sentence.metadata = { longitude: degrees } + sentence.payload[index].metadata = { degrees } + sentence.metadata = { ...sentence.metadata, longitude: degrees } return } // Quality if (field.name === 'quality') { - sentence.metadata = { quality: getQuality(field.value as Uint8) } + sentence.metadata = { ...sentence.metadata, quality: getQuality(field.value as Uint8) } // return } // Rest diff --git a/packages/nmea-parser/tests/index.test.ts b/packages/nmea-parser/tests/index.test.ts index 0a761be..9ba2799 100644 --- a/packages/nmea-parser/tests/index.test.ts +++ b/packages/nmea-parser/tests/index.test.ts @@ -246,3 +246,16 @@ describe('Parser', () => { }) }) }) + +test('GGA sentence', () => { + const sample = '$INGGA,132247.95,7118.690092,N,02215.039776,E,2,12,0.8,66.48,M,26.96,M,20.0,1006*56\r\n' + const parser = new Parser() + const output = parser.parseData(sample) + expect(output).toHaveLength(1) + const gga = output[0] + expect(gga).toHaveProperty('metadata') + expect(gga.metadata).toHaveProperty('timestamp') + expect(gga.metadata).toHaveProperty('latitude') + expect(gga.metadata).toHaveProperty('longitude') + expect(gga.metadata).toHaveProperty('quality') +}) \ No newline at end of file