104 lines
1.8 KiB
JavaScript
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 }
|