Skip to content

Instantly share code, notes, and snippets.

@capnmidnight
Created November 4, 2016 13:18
Show Gist options
  • Save capnmidnight/3612b71da4920b55bca2358f86408742 to your computer and use it in GitHub Desktop.
Save capnmidnight/3612b71da4920b55bca2358f86408742 to your computer and use it in GitHub Desktop.
/* global require, __dirname */
var socketio = require( "socket.io" ),
http = require( "http" ),
mime = require( "mime" ),
path = require( "path" ),
fs = require( "fs" ),
format = require( "util" ).format,
serialPort = require( "serialport" ),
os = require( "os" ),
spawn = require( "child_process" ).spawn,
startProc = {
linux: "xdg-open",
win32: "explorer",
darwin: "open"
}[os.platform()],
webServer = http.createServer( requestHandler ),
listener = socketio.listen( webServer ),
baudRate = 9600,
manufacturer = "Arduino LLC (www.arduino.cc)",
webServerPort = 9080,
startPage = "index.html",
glovePort = null;
function starter () {
var startUrl = "http://localhost";
if ( webServerPort !== 80 ) {
startUrl += ":" + webServerPort;
}
spawn( startProc, [ startUrl + "/" + startPage ] );
}
function listenForPort () {
console.log( "querying for ports" );
serialPort.list( function ( err, ports ) {
if ( err ) {
console.error( err );
}
else {
console.log( "Ports found:" );
ports.forEach( function ( p ) {
console.log( format( "\t%s: [%s] %s", p.comName, p.pnpId,
p.manufacturer ) );
} );
var arduinos = ports.filter( function ( p ) {
return p.manufacturer === manufacturer;
} );
if ( arduinos.length === 0 ) {
console.log( "No Arduinos found" );
setTimeout( listenForPort, 1000 );
}
else {
var port = arduinos[0];
connectToPort( port.comName );
}
}
} );
}
function connectToPort ( portName ) {
console.log( format( "Connecting to port: %s", portName ) );
glovePort = new serialPort.SerialPort( portName, {
baudrate: baudRate
}, false );
glovePort.open( function ( err ) {
console.log( "Port open" );
if ( err ) {
console.error( err );
}
else {
webServer.listen( webServerPort );
listener.sockets.on( "connection", acceptConnection );
starter();
}
} );
}
listenForPort();
function requestHandler ( req, res ) {
var fileName = path.join( __dirname, req.url );
if ( fileName[fileName.length - 1] === path.sep )
fileName += "index.html";
fs.readFile( fileName, function ( err, data ) {
if ( err )
send( res, 404, "text/plain", "File not found. Path: ("
+ req.url
+ ") reason: "
+ JSON.stringify( err ) );
else
send( res, 200, mime.lookup( fileName ), data );
} );
}
function send ( res, code, type, data ) {
res.writeHead( code, { "Content-Type": type } );
res.end( data );
}
function acceptConnection ( socket ) {
console.log( "Socket connection made!" );
var onData = function ( data ) {
console.log( "from web: " + typeof data + ": " + data );
if ( typeof data === "number" && 0 <= data && data < 0x20 ) {
glovePort.write( [ data ] );
}
else {
glovePort.write( data );
}
};
socket.on( "data", onData );
socket.on( "disconnect", function () {
socket.removeListener( "data", onData );
glovePort.write( [ 0 ] );
console.log( "Socket connection disconnected!" );
} );
glovePort.on( "data", function ( data ) {
console.log( "from glove: " + typeof data + ": " + data );
} );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment