Skip to content
Snippets Groups Projects
nodeServer.js 4.29 KiB
Newer Older
/**
 * Created by aghassaei on 6/17/15.
 */

var serialport = require('serialport');
SerialPort = serialport.SerialPort;// make a local instance
//var http = require('http');
//var app = http.createServer();
var io = require('socket.io').listen(8080);
//var app = require('express')();
//var http = require('http').Server(app);
//var io = require('socket.io')(http);

// list serial ports:
Amanda Ghassaei's avatar
Amanda Ghassaei committed
//defaults
var portName = null;
var currentPort = null;
var baudRate = 9600;

//io.sockets.on('connection', function (socket) {
//    socket.emit('baudRate', baudRate);
//});


io.on('connection', function(socket){

Amanda Ghassaei's avatar
Amanda Ghassaei committed
    var allPorts = [];
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    refreshAvailablePorts(function(_allPorts, _portName, _baudRate){
        currentPort = changePort(_portName, _baudRate);
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    });
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    socket.on('baudRate', function(value){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        refreshAvailablePorts(function(){
            if (!checkThatPortExists(portName)) return;
            currentPort = changePort(portName, value);
            baudRate = value;
        });
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    });

    socket.on('portName', function(value){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        refreshAvailablePorts(function(){
            if (!checkThatPortExists(value)) return;
            currentPort = changePort(value, baudRate);
            portName = value;
        });
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    });

    socket.on('dataOut', function(data){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        console.log("Sending data: " + data);
        currentPort.write(new Buffer([parseInt(data)]));
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    });

    socket.on('flush', function(){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        if (currentPort) currentPort.flush(function(){
            console.log("port " + portName + " flushed");
        });
    });

    socket.on('refreshPorts', function(){
        console.log("refreshing ports list");
        allPorts = refreshAvailablePorts();
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    });
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    function checkThatPortExists(_portName){
        if (allPorts.indexOf(_portName) < 0) {
            onPortError("no available port called " + _portName);
            return false;
        }
        return true;
    }




    function refreshAvailablePorts(callback){
        var _allPorts = [];
        serialport.list(function(err, ports){
            ports.forEach(function(port) {
                _allPorts.push(port.comName);
            });
Amanda Ghassaei's avatar
Amanda Ghassaei committed
            allPorts = _allPorts;
Amanda Ghassaei's avatar
Amanda Ghassaei committed
            if (!portName && _allPorts.length>0) portName = _allPorts[0];
            if (callback) callback(allPorts, portName, baudRate);

            socket.emit('connected', {
                baudRate: baudRate,
                portName: portName,
                availablePorts: _allPorts
            });
        });
    }
Amanda Ghassaei's avatar
Amanda Ghassaei committed

    function initPort(_portName, _baudRate){
Amanda Ghassaei's avatar
Amanda Ghassaei committed

        console.log("initing port " + _portName + " at " + _baudRate);
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        var port = new SerialPort(_portName, {
           baudRate: _baudRate,
           parser:serialport.parsers.readline("\n")
        //       parser: serialport.parsers.raw
        }, false);

        port.open(function(error){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
            if (error) {
                onPortError(error);
                currentPort = null;
                return;
            }
Amanda Ghassaei's avatar
Amanda Ghassaei committed
            onPortOpen(_portName, _baudRate);
Amanda Ghassaei's avatar
Amanda Ghassaei committed
            port.on('data', onPortData);
            port.on('close', onPortClose);
            port.on('error', onPortError);
        });
        return port;
    }

    function changePort(_portName, _baudRate){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        console.log("change");
        if (!_portName) {
Amanda Ghassaei's avatar
Amanda Ghassaei committed
            onPortError("no port name specified");
            return null;
        }
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        if (currentPort) {
            var oldBaud = baudRate;
            var oldName = portName;
            console.log("disconnecting port " + oldName + " at " + oldBaud);
            if (currentPort.isOpen()) currentPort.close(function(error){
                if (error) {
                    onPortError(error);
                    return null;
                }
                socket.emit("portDisconnected", {baudRate:oldBaud, portName:oldName});
            });
        }
        return initPort(_portName, _baudRate);
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    function onPortOpen(name, baud){
        socket.emit("portConnected", {baudRate:baud, portName:name});
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    }

    function onPortData(data){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
//        console.log(data);
        socket.emit("dataIn", data);
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    }

    function onPortClose(){
Amanda Ghassaei's avatar
Amanda Ghassaei committed
//        console.log("port closed");
Amanda Ghassaei's avatar
Amanda Ghassaei committed
    }

    function onPortError(error){
        console.log("Serial port error " + error);
Amanda Ghassaei's avatar
Amanda Ghassaei committed
        socket.emit("errorMsg", error);