Created
November 4, 2016 13:18
-
-
Save capnmidnight/3612b71da4920b55bca2358f86408742 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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