Files
gnss-tool-kit/src/main/api/NMEAHandler.js

89 lines
1.6 KiB
JavaScript
Raw Normal View History

import nmea 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)
const strArr = value.split('\r\n')
for (let i = 0; i < strArr.length; i++) {
const element = strArr[i];
doHandle(element)
}
emit('handled', nmeaObj)
nmeaObj = resetNMEAObj()
}
const doHandle = (value) => {
if (!verify(value)) {
return
}
const result = nmea.parse(value)
switch (result.sentence) {
case 'RMC':
nmeaObj.RMC = result
break;
case 'GGA':
nmeaObj.GGA = result
break;
case 'GSA':
if (result.talker_id === 'BD') nmeaObj.GSA.push(result)
break;
case 'GSV':
if (result.talker_id === 'BD') nmeaObj.GSV.push(result)
break;
case 'TXT':
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 nmea.Helpers.verifyChecksum(sentence, checksum)
}
const resetNMEAObj = () => {
return {
'RMC': null,
'GGA': null,
'GSA': [],
'GSV': []
}
}
let nmeaObj = resetNMEAObj()
module.exports = { on, handle }