@signalk/nmea0183-signalk
Version:
A node.js/javascript parser for NMEA0183 sentences. Sentences are parsed to Signal K format.
150 lines • 5.64 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.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const utils = __importStar(require("@signalk/nmea0183-utilities"));
const nmea_casts_1 = require("../lib/nmea-casts");
/*
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 *
*/
const RMC = function (input, _session) {
const { 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]);
// seconds since epoch; Date.parse avoids an extra Date allocation
const age = Math.floor(Date.parse(timestamp) / 1000);
// NMEA numeric fields are transported as strings. `coord` already
// validates the pole letter (returns null for unexpected chars), so we
// only need the non-empty/numeric guards here.
latitude =
parts[2].trim().length > 0 && !isNaN(Number(parts[2]))
? (0, nmea_casts_1.coord)(parts[2], parts[3])
: null;
longitude =
parts[4].trim().length > 0 && !isNaN(Number(parts[4]))
? (0, nmea_casts_1.coord)(parts[4], parts[5])
: null;
speed =
parts[6].trim().length > 0 &&
!isNaN(Number(parts[6])) &&
Number(parts[6]) >= 0
? utils.transform(parts[6], 'knots', 'ms')
: null;
track =
parts[7].trim().length > 0 && !isNaN(Number(parts[7]))
? utils.transform(parts[7], 'deg', 'rad')
: null;
{
const degs = parts[9].trim().length > 0 && !isNaN(Number(parts[9]))
? (0, nmea_casts_1.magVar)(parts[9], parts[10])
: null;
variation = degs === null ? null : utils.transform(degs, 'deg', 'rad');
}
let position = null;
if (utils.isValidPosition(latitude, longitude)) {
position = {
latitude: latitude,
longitude: longitude
};
}
const delta = {
updates: [
{
source: tags.source,
timestamp: timestamp,
values: [
{
path: 'navigation.position',
value: position
},
{
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;
};
exports.default = RMC;
//# sourceMappingURL=RMC.js.map