UNPKG

dronestatus

Version:

AR.Drone 2.0 status in the browser via WebSocket

77 lines (61 loc) 1.95 kB
var events = require('events'), status = new events.EventEmitter(); status.listen = function listen(server, options) { var ws = require('ws'), path = require('path'), drone = require('ar-drone'), browserify = require('browserify')(); options = options || {}; // Create server if port number was provided if (typeof server === 'number') { var port = server; server = require('http').createServer(); server.listen(port); } // Serve static files var url = '/dronestatus/nodecopter-client.js', listeners = server.listeners('request').slice(0); browserify.add(path.join(__dirname, 'client.js')); server.removeAllListeners('request'); server.on('request', function (req, res) { if (req.url.indexOf(url) === 0) { res.setHeader('Content-Type', 'application/javascript'); browserify.bundle().pipe(res); } else { for (var i=0, l=listeners.length; i<l; i++) { listeners[i].call(server, req, res); } } }); // Connect to drone and listen to navdata var control = options.udpControl || new drone.Client.UdpControl(options), navdata = options.udpNavdataStream || new drone.Client.UdpNavdataStream(options); control.ctrl(5, 0); control.config('general:navdata_demo', 'TRUE'); control.flush(); navdata.resume(); navdata.on('error', function (err) { console.log('[dronestatus] There was an error: %s', err.message); navdata.destroy(); }); // Setup web-socket var wss = new ws.Server({server: server, path: '/dronestatus'}), _ws = null; wss.on('connection', function (ws) { console.log('[dronestatus] WebSocket connection established'); _ws = ws; ws.once('close', function () { console.log('[dronestatus] WebSocket connection lost'); _ws = null; }); }); // Handle data navdata.on('data', function (data) { status.emit('change', data); // Send over web-socket if connected if (_ws !== null) { _ws.send(JSON.stringify(data)); } }); }; module.exports = status;