From 1331955ecbf52cd198e564b0637ab42e114bcdcb Mon Sep 17 00:00:00 2001
From: Amanda Ghassaei <amandaghassaei@gmail.com>
Date: Thu, 10 Sep 2015 23:26:42 -0400
Subject: [PATCH] serial monitor features

---
 js/SerialMonitor/SerialMonitor.js     | 28 +++++++++++++++++++++++++++
 js/SerialMonitor/SerialMonitorView.js | 22 +++++++++++++++++++--
 js/menus/CommParentMenu.js            |  1 -
 js/menus/templates/SendMenuView.html  |  2 +-
 js/models/SerialComm.js               |  5 +++++
 node/nodeServer.js                    |  1 +
 6 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/js/SerialMonitor/SerialMonitor.js b/js/SerialMonitor/SerialMonitor.js
index e2f623c0..936e9610 100644
--- a/js/SerialMonitor/SerialMonitor.js
+++ b/js/SerialMonitor/SerialMonitor.js
@@ -9,6 +9,34 @@ define(['backbone'], function(Backbone){
 
         defaults: {
             autoscroll: true
+        },
+
+        history: [],
+        historyIndex: -1,
+
+        appendOutput: function(message){
+            this.history.unshift(message);
+            this.historyIndex = -1;
+            if (this.history.length>50) this.history.pop();
+        },
+
+        getPrevHistElem: function(){
+            this.historyIndex++;
+            if (this.historyIndex < 0) this.historyIndex = 0;
+            if (this.history.length == 0) return "";
+            if (this.history.length <= this.historyIndex) this.historyIndex = this.history.length-1;
+            return this.history[this.historyIndex];
+        },
+
+        getNewerHistElem: function(){
+            if (this.history.length == 0) return "";
+            this.historyIndex --;
+            if (this.historyIndex < 0) {
+                this.historyIndex = -1;
+                return "";
+            }
+            if (this.history.length <= this.historyIndex) this.historyIndex = this.history.length-1;
+            return this.history[this.historyIndex];
         }
 
     });
diff --git a/js/SerialMonitor/SerialMonitorView.js b/js/SerialMonitor/SerialMonitorView.js
index 27e6fcea..09267d4e 100644
--- a/js/SerialMonitor/SerialMonitorView.js
+++ b/js/SerialMonitor/SerialMonitorView.js
@@ -10,6 +10,9 @@ define(['jquery', 'underscore', 'commParentMenu', 'serialComm', 'text!SerialMoni
 
         el: "#serialMonitorView",
 
+        parentEvents: {
+        },
+
         events: {
             "click #clearMonitor":                         "render",
             "change input:checkbox":                       "_clickCheckbox"
@@ -17,14 +20,27 @@ define(['jquery', 'underscore', 'commParentMenu', 'serialComm', 'text!SerialMoni
 
         __initialize: function(){
 
+            _.bindAll(this, "_onKeyUp");
+            $(document).bind('keyup', {}, this._onKeyUp);
+
+            this.listenTo(serialComm, "change:lastMessageSent", this._updateOutgoingMessage);
             this.listenTo(serialComm, "change:baudRate change:portName", this.render);
             this.listenTo(serialComm, "change:connected", function(){
                 if (!serialComm.get("connected")) this._close();
-            })
+            });
 
             this.render();
         },
 
+        _onKeyUp: function(e){
+            var $output = $("#sendSerialMessage");
+            if ($output.is(":focus")){
+                if (e.keyCode == 38) $output.val(this.model.getPrevHistElem());
+                else if (e.keyCode == 40) $output.val(this.model.getNewerHistElem());
+                else if (e.keyCode == 13) this._sendMessage(e);
+            }
+        },
+
         _clickCheckbox: function(e){
             e.preventDefault();
             var $target = $(e.target);
@@ -63,8 +79,10 @@ define(['jquery', 'underscore', 'commParentMenu', 'serialComm', 'text!SerialMoni
             return this.model.toJSON();
         },
 
-        __sendMessage: function(message){
+        _updateOutgoingMessage: function(){
+            var message = serialComm.get("lastMessageSent");
             this._addOutputData("<span class='outgoing'>" + message + "</span><br/>");
+            this.model.appendOutput(message);
         },
 
         _updateIncomingMessage: function(){
diff --git a/js/menus/CommParentMenu.js b/js/menus/CommParentMenu.js
index 350e98e5..34c7e90f 100644
--- a/js/menus/CommParentMenu.js
+++ b/js/menus/CommParentMenu.js
@@ -37,7 +37,6 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'serialComm', 'commPlist'
             $("#sendSerialMessage").val("");
             if (message == "") return;
             serialComm.send(message);
-            if (this.__sendMessage) this.__sendMessage(message);
         },
 
         _updateIncomingMessage: function(){
diff --git a/js/menus/templates/SendMenuView.html b/js/menus/templates/SendMenuView.html
index 76c22f25..7cbcb7ea 100644
--- a/js/menus/templates/SendMenuView.html
+++ b/js/menus/templates/SendMenuView.html
@@ -9,7 +9,7 @@
             <a href="#" id="streamCommands" class="btn btn-block btn-lg btn-success">Stream</a>
         <% } %>
         <br/>
-        Incoming: &nbsp;&nbsp;<pre id="incomingSerialMessage"></pre><br/><br/>
+        Incoming: &nbsp;&nbsp;<pre id="incomingSerialMessage"><br/></pre><br/>
         Out: &nbsp;&nbsp;<input id="sendSerialMessage" value="" placeholder="Send Message" class="seventyFiveWidth form-control unresponsiveInput" type="text"><br/><br/>
         Next Line: &nbsp;&nbsp;<input id="nextLine" value="" placeholder="##" class="intInput form-control unresponsiveInput" type="text">
         <a href="#" id="previousLineButton" class="btn btn-lg btn-default">Prev</a>
diff --git a/js/models/SerialComm.js b/js/models/SerialComm.js
index 1f9949a8..86691d98 100644
--- a/js/models/SerialComm.js
+++ b/js/models/SerialComm.js
@@ -77,6 +77,11 @@ define(['underscore', 'backbone', 'socketio'], function(_, Backbone, io){
             serialComm.trigger("change:lastMessageReceived");
         });
 
+        socket.on('dataSent', function(data){
+            serialComm.set("lastMessageSent", data, {silent:true});
+            serialComm.trigger("change:lastMessageSent");
+        });
+
         socket.on('portConnected', function(data){
             console.log("connected port " + data.portName + " at " + data.baudRate);
             serialComm.set("baudRate", data.baudRate);
diff --git a/node/nodeServer.js b/node/nodeServer.js
index 6f7312a9..2e2f4696 100644
--- a/node/nodeServer.js
+++ b/node/nodeServer.js
@@ -50,6 +50,7 @@ io.on('connection', function(socket){
     });
 
     socket.on('dataOut', function(data){
+        io.emit('dataSent', data);
         data += '\n';
         console.log("Sending data: " + data);
         currentPort.write(new Buffer(data), function(err, res) {
-- 
GitLab