@signalk/nmea0183-signalk
Version:
A node.js/javascript parser for NMEA0183 sentences. Sentences are parsed to Signal K format.
105 lines (87 loc) • 3.19 kB
JavaScript
/**
* Copyright 2016 Signal K <info@signalk.org> and contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const utils = require('@signalk/nmea0183-utilities')
const moment = require('moment-timezone')
/*
RMC Sentence
http://www.gpsinformation.org/dale/nmea.htm#RMC
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
values:
- RMC Recommended Minimum sentence C
[0] 123519 Fix taken at 12:35:19 UTC
[1] A Status A=active or V=Void.
[2][3] 4807.038,N Latitude 48 deg 07.038' N
[4][5] 01131.000,E Longitude 11 deg 31.000' E
[6] 022.4 Speed over the ground in knots
[7] 084.4 Track angle in degrees True
[8] 230394 Date - 23rd of March 1994
[9][10] 003.1,W Magnetic Variation
- *6A The checksum data, always begins with *
*/
module.exports = function (input) {
const { id, sentence, parts, tags } = input
let latitude = null
let longitude = null
let speed = null
let track = null
let variation = null
const timestamp = utils.timestamp(parts[0], parts[8])
const age = moment.tz(timestamp, 'UTC').unix()
latitude = parts[2].trim().length > 0 && !isNaN(parts[2]) && "NS".includes(parts[3]) ? utils.coordinate(parts[2], parts[3]) : null
longitude = parts[4].trim().length > 0 && !isNaN(parts[4]) && "EW".includes(parts[5]) ? utils.coordinate(parts[4], parts[5]) : null
speed = parts[6].trim().length > 0 && !isNaN(parts[6]) && parts[6] >= 0 ? utils.transform(parts[6], 'knots', 'ms') : null
track = parts[7].trim().length > 0 && !isNaN(parts[7]) ? utils.transform(parts[7], 'deg', 'rad') : null
variation = parts[9].trim().length > 0 && !isNaN(parts[9]) && "EW".includes(parts[10]) ? utils.transform(utils.magneticVariaton(parts[9], parts[10]), 'deg', 'rad') : null
const delta = {
updates: [
{
source: tags.source,
timestamp: timestamp,
values: [
{
path: 'navigation.position',
value: {
longitude,
latitude,
},
},
{
path: 'navigation.courseOverGroundTrue',
value: track,
},
{
path: 'navigation.speedOverGround',
value: speed,
},
{
path: 'navigation.magneticVariation',
value: variation,
},
{
path: 'navigation.magneticVariationAgeOfService',
value: age,
},
{
path: 'navigation.datetime',
value: timestamp,
},
],
},
],
}
return delta
}