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 }