Files

104 lines
1.8 KiB
JavaScript

import { parse, Helpers } from 'nmea'
let events = {}
const on = (eventName, callback) => {
if (!(eventName in events)) {
events[eventName] = []
}
events[eventName].push(callback)
}
const emit = (eventName, ...args) => {
if (!(eventName in events)) {
return
}
const cbs = events[eventName]
cbs.forEach(cb => {
cb.call(this, ...args)
});
}
const handle = (value) => {
if (value.length <= 0) return
emit('received', value)
nmeaObj = resetNMEAObj()
const strArr = value.split('\r\n')
for (let i = 0; i < strArr.length; i++) {
const element = strArr[i];
doHandle(element)
}
emit('handled', nmeaObj)
}
const doHandle = (value) => {
if (!verify(value)) {
return
}
const result = parse(value)
switch (result.sentence) {
case 'GGA':
nmeaObj.GGA = result
break;
case 'GLL':
nmeaObj.GLL = result
break;
case 'RMC':
nmeaObj.RMC = result
break;
case 'VTG':
nmeaObj.VTG = result
break;
case 'ZDA':
nmeaObj.ZDA = result
break;
case 'TXT':
nmeaObj.TXT = result
break;
case 'GSA':
nmeaObj.GSA.push(result)
break;
case 'GSV':
nmeaObj.GSV.push(result)
break;
}
}
const verify = (value) => {
if (!value) {
return false
}
const dollar_index = value.indexOf('$')
const star_index = value.indexOf('*')
if (value.indexOf('$') !== 0 || star_index <= dollar_index) {
return false
}
const [sentence, checksum, ] = value.split('*')
return Helpers.verifyChecksum(sentence, checksum)
}
const resetNMEAObj = () => {
return {
GGA: null,
GLL: null,
RMC: null,
VTG: null,
ZDA: null,
TXT: null,
GSA: [],
GSV: []
}
}
let nmeaObj = resetNMEAObj()
export default { on, handle }