From a2d7acb6ab7f3aee1940b33b97c3785c593942db Mon Sep 17 00:00:00 2001 From: Amanda Ghassaei <amandaghassaei@gmail.com> Date: Fri, 19 Jun 2015 13:55:30 -0700 Subject: [PATCH] serial port talking --- css/main.css | 6 ++ js/lattice/CompositeEditorLattice.js | 1 + js/menus/SetupCommMenuView.js | 34 ++++++++- js/models/SerialComm.js | 21 +++-- node/nodeServer.js | 110 ++++++++++++++++++--------- 5 files changed, 126 insertions(+), 46 deletions(-) diff --git a/css/main.css b/css/main.css index 1bec8dbe..cea8b3f2 100644 --- a/css/main.css +++ b/css/main.css @@ -12,6 +12,12 @@ html, body { color: #888; } +pre { + display: inline; + border: none; + background-color: rgba(0,0,0,0); +} + .navbar { margin-bottom:0; z-index: 2; diff --git a/js/lattice/CompositeEditorLattice.js b/js/lattice/CompositeEditorLattice.js index 584de77c..9795dd74 100644 --- a/js/lattice/CompositeEditorLattice.js +++ b/js/lattice/CompositeEditorLattice.js @@ -77,6 +77,7 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre if (!materials[id]) materials[id] = {}; _.extend(materials[id], data);//todo trigger change on all instances if (materials[id].threeMaterial) materials[id].threeMaterial.color = new THREE.Color(this.get("color")); + else materials[id].threeMaterial = new THREE.MeshLambertMaterial({color:new THREE.Color(this.get("color")), shading:THREE.FlatShading}) }, deleteComposite: function(){ diff --git a/js/menus/SetupCommMenuView.js b/js/menus/SetupCommMenuView.js index add2509f..54112810 100644 --- a/js/menus/SetupCommMenuView.js +++ b/js/menus/SetupCommMenuView.js @@ -13,26 +13,50 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'serialComm'], function($ events: { "click #serialFlushBuffer": "_flushBuffer", "click #sendTestMessage": "_sendTestMessage", - "click #nodeSetupInstructions": "_setupInstructions" + "click #nodeSetupInstructions": "_setupInstructions", + "click #refreshPorts": "_refreshPorts" }, _initialize: function(){ this.listenTo(serialComm, "change", this.render); + this.listenTo(serialComm, "change:lastMessageReceived", this._updateIncomingMesage); + + this.inTimeout = false; }, - _sendTestMessage:function(e){ + _sendTestMessage: function(e){ e.preventDefault(); var message = $("#seriallTestMessage").val(); serialComm.send(message); }, + _updateIncomingMesage: function(){ + var message = serialComm.get("lastMessageReceived"); + var $message = $("#incomingSerialMessage"); + $message.html(message); + $message.css("background", "#ffff99"); + if (!this.inTimeout) { + this.inTimeout = true; + var self = this; + setTimeout(function(){ + $message.css("background", "white"); + self.inTimeout = false; + }, 100); + } + }, + _flushBuffer: function(e){ e.preventDefault(); serialComm.flushBuffer(); }, + _refreshPorts: function(e){ + e.preventDefault(); + serialComm.refreshPorts(); + }, + _setupInstructions: function(e){ e.preventDefault(); var self = this; @@ -50,7 +74,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'serialComm'], function($ template: _.template('\ <% if(error){ %> \ - <div class="postWarning"><%= error%></div>\ + <div class="postWarning"><%= error %></div>\ <% } %>\ <% if(connected){ %>\ Status: <% if (portConnected){ %> Connected <% } else { %> <span class="red">Disconnected</span> <% } %><br/><br/>\ @@ -71,7 +95,9 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'serialComm'], function($ <li><a class="serialComm dropdownSelector" data-property="portName" data-value="<%= port %>" href="#"><%= port %></a></li>\ <% }); %>\ </ul>\ - </div><br/><br/><br/>\ + </div>\ + <a href="#" id="refreshPorts" class="btn btn-lg btn-default"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></a><br/><br/>\ + Incoming: <pre id="incomingSerialMessage"></pre><br/><br/>\ Stream: <span id="serialDataStream"></span>\ <a href="#" id="sendTestMessage" class="btn btn-block btn-lg btn-default">Send Test Message:</a><br/>\ <input id="seriallTestMessage" value="<%= testMessage %>" placeholder="Test Message" class="form-control fullWidth unresponsiveInput" type="text"><br/><br/>\ diff --git a/js/models/SerialComm.js b/js/models/SerialComm.js index 82ca416e..41d9a45a 100644 --- a/js/models/SerialComm.js +++ b/js/models/SerialComm.js @@ -15,12 +15,15 @@ define(['underscore', 'backbone', 'socketio'], function(_, Backbone, io){ portName: "Select Port", baudRate: 200, error: null, - testMessage: "" + testMessage: "", + lastMessageReceived: "" }, initialize: function(){ + }, - + refreshPorts: function(){ + socket.emit('refreshPorts'); }, send: function(data){ @@ -31,7 +34,7 @@ define(['underscore', 'backbone', 'socketio'], function(_, Backbone, io){ socket.emit("flush"); }, - changeProperty: function(property, value){ + changeProperty: function(property, value){//portName, baudRate if (property === null || property === undefined || value === null || value === undefined) return; socket.emit(property, value);//always pass user interaction on this.set(property, value); @@ -49,23 +52,31 @@ define(['underscore', 'backbone', 'socketio'], function(_, Backbone, io){ serialComm.trigger("change"); }); - socket.on('disconnected', function(){ + socket.on('disconnected', function(){//todo this never happens serialComm.set("connected", false); }); + socket.on('dataIn', function(data){ + serialComm.set("lastMessageReceived", data, {silent:true}); + serialComm.trigger("change:lastMessageReceived"); + }); + socket.on('portConnected', function(data){ + console.log("connected port " + data.portName + " at " + data.baudRate); serialComm.set("baudRate", data.baudRate); serialComm.set("portName", data.portName) serialComm.set("portConnected", true); + serialComm.set("error", false); }); socket.on('portDisconnected', function(data){ + console.log("disconnected port " + data.portName + " at " + data.baudRate); if (serialComm.get("baudRate") != data.baudRate) return; if (serialComm.get("portName") != data.portName) return; serialComm.set("portConnected", false); }); - socket.on("error", function(error){ + socket.on("errorMsg", function(error){ serialComm.set("error", error); }); diff --git a/node/nodeServer.js b/node/nodeServer.js index 71ebe42b..2735839b 100644 --- a/node/nodeServer.js +++ b/node/nodeServer.js @@ -28,33 +28,25 @@ var baudRate = 9600; io.on('connection', function(socket){ var allPorts = []; - serialport.list(function(err, ports){ - ports.forEach(function(port) { - allPorts.push(port.comName); - }); - - if (!portName && allPorts.length>0) portName = allPorts[0]; - if (portName) currentPort = changePort(portName, baudRate); - - socket.emit('connected', { - baudRate: baudRate, - portName: portName, - availablePorts: allPorts - }); + refreshAvailablePorts(function(_allPorts, _portName, _baudRate){ + currentPort = changePort(_portName, _baudRate); }); + socket.on('baudRate', function(value){ - baudRate = value; - currentPort = changePort(portName, baudRate); + refreshAvailablePorts(function(){ + if (!checkThatPortExists(portName)) return; + currentPort = changePort(portName, value); + baudRate = value; + }); }); socket.on('portName', function(value){ - if (allPorts.indexOf(value) < 0) { - onPortError("no available port called " + value); - return; - } - portName = value; - currentPort = changePort(portName, baudRate); + refreshAvailablePorts(function(){ + if (!checkThatPortExists(value)) return; + currentPort = changePort(value, baudRate); + portName = value; + }); }); socket.on('dataOut', function(data){ @@ -62,13 +54,50 @@ io.on('connection', function(socket){ }); socket.on('flush', function(){ - console.log("flush"); + if (currentPort) currentPort.flush(function(){ + console.log("port " + portName + " flushed"); + }); + }); + + socket.on('refreshPorts', function(){ + console.log("refreshing ports list"); + allPorts = refreshAvailablePorts(); }); + 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); + }); + allPorts = _allPorts; + if (!portName && _allPorts.length>0) portName = _allPorts[0]; + if (callback) callback(allPorts, portName, baudRate); + + socket.emit('connected', { + baudRate: baudRate, + portName: portName, + availablePorts: _allPorts + }); + }); + } function initPort(_portName, _baudRate){ + + console.log("initing port " + _portName + " at " + _baudRate); var port = new SerialPort(_portName, { baudRate: _baudRate, parser:serialport.parsers.readline("\n") @@ -81,7 +110,7 @@ io.on('connection', function(socket){ currentPort = null; return; } - onPortOpen(); + onPortOpen(_portName, _baudRate); port.on('data', onPortData); port.on('close', onPortClose); port.on('error', onPortError); @@ -90,35 +119,42 @@ io.on('connection', function(socket){ } function changePort(_portName, _baudRate){ - if (!portName) { + console.log("change"); + if (!_portName) { onPortError("no port name specified"); return null; } - if (currentPort) currentPort.close(function(error){ - if (error) { - onPortError(error); - return null; - } - return initPort(_portName, _baudRate); - }); - else return initPort(_portName, _baudRate); + 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); } - function onPortOpen(){ - socket.emit("portConnected", {baudRate: baudRate, portName:portName}); + function onPortOpen(name, baud){ + socket.emit("portConnected", {baudRate:baud, portName:name}); } function onPortData(data){ - // console.log(data); +// console.log(data); + socket.emit("dataIn", data); } function onPortClose(){ - socket.emit("portDisconnected", {baudRate: baudRate, portName:portName}); +// console.log("port closed"); } function onPortError(error){ console.log("Serial port error " + error); - socket.emit("error", error); + socket.emit("errorMsg", error); } }); -- GitLab