diff --git a/css/main.css b/css/main.css index 9cac23aca2724c555d8e080b617fa0520279afa5..cae305c6921112f9315b5f40b11bc57a1963bfe6 100644 --- a/css/main.css +++ b/css/main.css @@ -195,7 +195,7 @@ hr { background-color: rgba(255, 255, 0, 0.35); } -#postWarning { +.postWarning { background-color: rgba(255,0,0,0.15); padding: 10px 15px 15px 15px; margin: 20px 0; diff --git a/js/menus/AnimationMenuView.js b/js/menus/AnimationMenuView.js index e6c25fcbe3dc8dbe04a440d73edfd38e082b47dc..ad37a9cf6f2598185532735ccf87e7145f7f94ce 100644 --- a/js/menus/AnimationMenuView.js +++ b/js/menus/AnimationMenuView.js @@ -123,7 +123,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'cam'], function($, _, Me <br/><a href="#" id="animationMenuSave" class=" btn btn-block btn-lg btn-default">Save</a><br/>\ <!--Assembly Time: <br/><br/>-->\ <% if (editsMadeToProgram && needsPostProcessing){ %>\ - <div id="postWarning">You have made the following changes that require post processing:<br/>\ + <div class="postWarning">You have made the following changes that require post processing:<br/>\ This will override edits you have made to the G-code. OK to override? <a href="#" class="overrideEdits btn btn-block btn-lg btn-danger">OK</a></div>\ <% } %>\ <div id="gcodeEditor"><%= dataOut %></div><br/>\ diff --git a/js/menus/MenuWrapperView.js b/js/menus/MenuWrapperView.js index 6d3b270dd66081ff27eab35c8a0ceb509b78e1ca..35b7db29528d8888885f32fcfce778bbd0d201d0 100644 --- a/js/menus/MenuWrapperView.js +++ b/js/menus/MenuWrapperView.js @@ -134,7 +134,8 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice'], function($, _, var property = $target.data("property"); var value = $target.data("value"); if (!property || !value) return; - this._getPropertyOwner($target).set(property, value); + var owner = this._getPropertyOwner($target, property, value); + if (owner) owner.set(property, value); }, _clickCheckbox: function(e){ @@ -161,11 +162,17 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice'], function($, _, lattice.getUItarget().clearCells(); }, - _getPropertyOwner: function($target){ + _getPropertyOwner: function($target, property, value){ if ($target.hasClass("lattice")) return lattice; if ($target.hasClass("compositeEditor")) return lattice.compositeEditor; if ($target.hasClass("assembler")) return globals.cam; if ($target.hasClass("appState")) return this.model; + if ($target.hasClass("serialComm")) { + require(['serialComm'], function(serialComm){ + serialComm._changeProperty(property, value); + }); + return null; + } console.warn("no owner found for " + $target); return null; }, diff --git a/js/menus/SetupCommMenuView.js b/js/menus/SetupCommMenuView.js index 2483ca780391f65704463d2b5890a742d3916baa..41cf52d5cdd51db86c05297908b70254a3541e56 100644 --- a/js/menus/SetupCommMenuView.js +++ b/js/menus/SetupCommMenuView.js @@ -16,15 +16,38 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'serialComm'], function($ _initialize: function(){ + this.listenTo(serialComm, "change", this.render); }, _makeTemplateJSON: function(){ - return _.extend(this.model.toJSON(), serialComm.toJSON()); + return _.extend(this.model.toJSON(), serialComm.toJSON(), {allBaudRates: [300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200]}); }, template: _.template('\ - Setup<br/>\ - Send Test Messages\ + <% if(error){ %> \ + <div class="postWarning">Error: <%= error%></div>\ + <% } %>\ + Status: <% if (portConnected){ %> Connected <% } else { %> Disconnected <% } %><br/><br/>\ + Baud Rate: \ + <div class="btn-group">\ + <button data-toggle="dropdown" class="btn dropdown-toggle" type="button"><%= baudRate %><span class="caret"></span></button>\ + <ul role="menu" class="dropdown-menu">\ + <% _.each(allBaudRates, function(rate){ %>\ + <li><a class="serialComm dropdownSelector" data-property="baudRate" data-value="<%= rate %>" href="#"><%= rate %></a></li>\ + <% }); %>\ + </ul>\ + </div><br/><br/>\ + Port: \ + <div class="btn-group">\ + <button data-toggle="dropdown" class="btn dropdown-toggle" type="button"><%= portName %><span class="caret"></span></button>\ + <ul role="menu" class="dropdown-menu">\ + <% _.each(availablePorts, function(port){ %>\ + <li><a class="serialComm dropdownSelector" data-property="portName" data-value="<%= port %>" href="#"><%= port %></a></li>\ + <% }); %>\ + </ul>\ + </div><br/><br/>\ + Test Message:<br/>\ + \ ') }); diff --git a/js/models/SerialComm.js b/js/models/SerialComm.js index 51f0b0f87948551dbc2e6080fd6fb5fe50a4e93a..c3c4d629f203640e288c103512b7c68439da4bc2 100644 --- a/js/models/SerialComm.js +++ b/js/models/SerialComm.js @@ -4,15 +4,60 @@ define(['underscore', 'backbone', 'socketio'], function(_, Backbone, io){ + var socket = io.connect('http://localhost:8080'); + var SerialComm = Backbone.Model.extend({ + defaults: { + connected: false, + portConnected: false, + availablePorts: [], + portName: null, + baudRate: 200, + error: null + }, + + initialize: function(){ + + + }, + + _changeProperty: function(property, value){ + if (property === null || property === undefined || value === null || value === undefined) return; + if (this.get(property) == value) return; + socket.emit(property, value); + this.set(property, value); + } + }); var serialComm = new SerialComm(); - var socket = io.connect('http://localhost:8080'); - socket.on('connected', function(){ - console.log("worked"); + socket.on('connected', function(data){ + console.log(data); + serialComm.set("connected", true, {silent:true}); + _.each(_.keys(data), function(key){ + serialComm.set(key, data[key], {silent:true}); + }); + serialComm.trigger("change"); + }); + + socket.on('disconnected', function(){ + serialComm.set("connected", false); + }); + + socket.on('portConnected', function(baudRate){ + serialComm.set("baudRate", baudRate); + serialComm.set("portConnected", true); + }); + + socket.on('portDisconnected', function(baudRate){ + if (serialComm.get("baudRate") != baudRate) return; + serialComm.set("portConnected", false); + }); + + socket.on("error", function(error){ + serialComm.set("error", error); }); diff --git a/node/nodeServer.js b/node/nodeServer.js index 62e99f0684f0c4cebd56648e10219974a2b49381..37815fd3c331276171b95592aa44c55b70fd1f5e 100644 --- a/node/nodeServer.js +++ b/node/nodeServer.js @@ -13,11 +13,7 @@ var io = require('socket.io').listen(8080); //var io = require('socket.io')(http); // list serial ports: -serialport.list(function (err, ports) { - ports.forEach(function(port) { - console.log(port.comName); - }); -}); + //defualts var portName = '/dev/cu.usbserial-DA01L12I'; @@ -28,41 +24,88 @@ var baudRate = 9600; //}); - io.on('connection', function(socket){ - console.log('a user connected'); - io.emit('connected'); -}); + var allPorts = []; + serialport.list(function(err, ports){ + ports.forEach(function(port) { + allPorts.push(port.comName); + }); + + socket.emit('connected', { + baudRate: baudRate, + portName: portName, + availablePorts: allPorts + }); + }); -var myPort = new SerialPort(portName, { - baudRate: baudRate, - parser:serialport.parsers.readline("\n") -// parser: serialport.parsers.raw -}); -myPort.on('open', onPortOpen); -myPort.on('data', onPortData); -myPort.on('close', onPortClose); -myPort.on('error', onPortError); + socket.on('baudRate', function(value){ + baudRate = value; + changePort(); + console.log(value); + }); + + socket.on('portName', function(value){ + if (allPorts.indexOf(value) < 0) { + onPortError("no available port called " + value); + return; + } + portName = value; + changePort(); + console.log(value); + }); + var currentPort = initPort(portName, baudRate); + + function initPort(_portName, _baudRate){ + var port = new SerialPort(_portName, { + baudRate: _baudRate, + parser:serialport.parsers.readline("\n") + // parser: serialport.parsers.raw + }, false); + + port.open(function(error){ + if (error) onPortError(error); + onPortOpen(); + port.on('data', onPortData); + port.on('close', onPortClose); + port.on('error', onPortError); + }); + return port; + } + + function changePort(_portName, _baudRate){ + if (currentPort) currentPort.close(function(error){ + if (error) onPortError(error); + }); + currentPort = initPort(_portName, _baudRate); + } + + function onPortOpen(){ + socket.emit("portConnected", baudRate); + } + + function onPortData(data){ + // console.log(data); + } + + function onPortClose(){ + console.log("portclosed"); + socket.emit("portDisconnected", baudRate); + } + + function onPortError(error){ + console.log("Serial port error " + error); + socket.emit("error", error); + } + +}); -function onPortOpen(){ - console.log("port open"); -} -function onPortData(data){ -// console.log(data); -} -function onPortClose(){ - console.log("port close"); -} -function onPortError(error){ - console.log("Serial port error " + error); -}