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 }