diff --git a/.project b/.project new file mode 100644 index 0000000..ed4e7dc --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + bancroft + + + + + + + + diff --git a/bancroft.js b/bancroft.js new file mode 100644 index 0000000..86b8b52 --- /dev/null +++ b/bancroft.js @@ -0,0 +1,82 @@ +var spawn = require('child_process').spawn, sys = require('sys'), events = require('events'), fs = require('fs'); + +var Bancroft = function (options) { + var emitter = events.EventEmitter.call(this); + var opts = mixin(options, { + 'port' : 2947, + 'hostname' : 'localhost' + }); + var net = require('net'); + + var serviceSocket = new net.Socket(); + serviceSocket.setEncoding('ascii'); + serviceSocket.on("data", function (payload) { + + var info = payload.split('\n'); + for ( var index = 0; index < info.length; index++) { + if (info[index]) { + var data = JSON.parse(info[index]); + console.log('got', data); + if (data.class === 'VERSION') { + emitter.emit('connect', { + 'release' : data.release, + 'version' : data.version + }); + } else if (data.class === 'TPV') { + emitter.emit('location', data); + } else if (data.class === 'SKY') { + emitter.emit('satellite', data); + } + } + } + /* serviceSocket.write('?POLL;\n'); */ + + }); + serviceSocket.on("close", function (err) { + emitter.emit('disconnect', err); + }); + + serviceSocket.on('connect', function (socket) { + serviceSocket.write('?WATCH={"enable":true,"json":true}\n'); + serviceSocket.write('?POLL;\n'); + }); + + serviceSocket.connect(opts.port, opts.hostname); + + return this; +}; + +var mixin = function (source, destination) { + + if (typeof (source) == "object") { + for ( var prop in source) { + if ((typeof (source[prop]) == "object") && (source[prop] instanceof Array)) { + if (destination[prop] === undefined) { + destination[prop] = []; + } + for ( var index = 0; index < source[prop].length; index += 1) { + if (typeof (source[prop][index]) == "object") { + if (destination[prop][index] === undefined) { + destination[prop][index] = {}; + } + destination[prop].push(mixin(source[prop][index], destination[prop][index])); + } else { + destination[prop].push(source[prop][index]); + } + } + } else if (typeof (source[prop]) == "object") { + if (destination[prop] === undefined) { + destination[prop] = {}; + } + mixin(source[prop], destination[prop]); + } else { + destination[prop] = source[prop]; + } + } + } + + return destination; +}; + +sys.inherits(Bancroft, events.EventEmitter); +module.exports = Bancroft; diff --git a/package.json b/package.json new file mode 100644 index 0000000..104b6fa --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "author": "Pascal Deschenes (http://blog.rassemblr.com)", + "name": "bancroft", + "description": "gpsd client", + "version": "0.0.1", + "repository": { + "url": "" + }, + "main": "bancroft", + "engines": { + "node": "v0.4.5" + }, + "dependencies": {}, + "devDependencies": {} +} diff --git a/test.js b/test.js new file mode 100644 index 0000000..931ea4c --- /dev/null +++ b/test.js @@ -0,0 +1,15 @@ +var Bancroft = require('./bancroft.js'); + +var bancroft = new Bancroft(); +bancroft.on('connect', function () { + console.log('connected'); +}); +bancroft.on('location', function (location) { + console.log('got location'); +}); +bancroft.on('satellite', function (location) { + console.log('got satellite'); +}); +bancroft.on('disconnect', function (err) { + console.log('disconnected'); +}); diff --git a/test/out.dat b/test/out.dat new file mode 100644 index 0000000..905b437 --- /dev/null +++ b/test/out.dat @@ -0,0 +1,14 @@ + +{"class":"VERSION","release":"2.95","rev":"2010-12-03T21:16:23","proto_major":3,"proto_minor":3} +{"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/ttyUSB0"}]} +{"class":"WATCH","enable":true,"json":true,"nmea":false,"raw":0,"scaled":false,"timing":false} + + +{"class":"TPV","tag":"GLL","device":"/dev/ttyUSB0","time":1311042294.000,"ept":0.005,"lat":45.457871667,"lon":-73.569558333,"alt":74.700,"epv":23.000,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3} +{"class":"SKY","tag":"GSV","device":"/dev/ttyUSB0","vdop":1.00,"hdop":6.70,"pdop":6.80,"satellites":[{"PRN":2,"el":50,"az":268,"ss":0,"used":false},{"PRN":4,"el":76,"az":37,"ss":50,"used":true},{"PRN":5,"el":15,"az":204,"ss":0,"used":false},{"PRN":10,"el":58,"az":166,"ss":0,"used":false},{"PRN":12,"el":39,"az":297,"ss":38,"used":true},{"PRN":13,"el":17,"az":94,"ss":0,"used":false},{"PRN":17,"el":44,"az":119,"ss":0,"used":false},{"PRN":20,"el":9,"az":42,"ss":0,"used":false},{"PRN":23,"el":18,"az":63,"ss":40,"used":true},{"PRN":25,"el":13,"az":323,"ss":0,"used":false}]} +{"class":"TPV","tag":"GLL","device":"/dev/ttyUSB0","time":1311042296.000,"ept":0.005,"lat":45.457868333,"lon":-73.569558333,"alt":74.700,"epv":23.000,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3} +{"class":"TPV","tag":"GLL","device":"/dev/ttyUSB0","time":1311042298.000,"ept":0.005,"lat":45.457863333,"lon":-73.569560000,"alt":74.700,"epv":23.000,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3} +{"class":"TPV","tag":"GLL","device":"/dev/ttyUSB0","time":1311042300.000,"ept":0.005,"lat":45.457856667,"lon":-73.569560000,"alt":74.700,"epv":23.000,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3} +{"class":"SKY","tag":"GSV","device":"/dev/ttyUSB0","vdop":1.00,"hdop":6.70,"pdop":6.80,"satellites":[{"PRN":2,"el":50,"az":268,"ss":0,"used":false},{"PRN":4,"el":76,"az":37,"ss":50,"used":true},{"PRN":5,"el":15,"az":204,"ss":0,"used":false},{"PRN":10,"el":58,"az":166,"ss":0,"used":false},{"PRN":12,"el":39,"az":297,"ss":37,"used":true},{"PRN":13,"el":17,"az":94,"ss":0,"used":false},{"PRN":17,"el":44,"az":119,"ss":0,"used":false},{"PRN":20,"el":9,"az":42,"ss":0,"used":false},{"PRN":23,"el":18,"az":63,"ss":40,"used":true},{"PRN":25,"el":13,"az":323,"ss":0,"used":false}]} +{"class":"TPV","tag":"GLL","device":"/dev/ttyUSB0","time":1311042302.000,"ept":0.005,"lat":45.457848333,"lon":-73.569560000,"alt":74.700,"epv":23.000,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3} +