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: &nbsp;&nbsp;<% 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>\
+            &nbsp;&nbsp;<a href="#" id="refreshPorts" class="btn btn-lg btn-default"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></a><br/><br/>\
+        Incoming: &nbsp;&nbsp;<pre id="incomingSerialMessage"></pre><br/><br/>\
         Stream: &nbsp;&nbsp;<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