{"version":3,"sources":["jsdelivr-header.js","/npm/laserweb@3.254.0/server-smoothie.js"],"names":[],"mappings":"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","file":"/npm/laserweb@3.254.0/server-smoothie.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/laserweb@3.254.0/server-smoothie.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\r\n\r\n    AUTHOR:  Peter van der Walt openhardwarecoza.github.io/donate\r\n\r\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as published by\r\n    the Free Software Foundation, either version 3 of the License.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\n*/\r\nvar config = require('./config');\r\nvar serialport = require(\"serialport\");\r\nvar SerialPort = serialport\r\nvar app = require('http').createServer(handler)\r\n  , io = require('socket.io').listen(app)\r\n  , fs = require('fs');\r\nvar static = require('node-static');\r\nvar EventEmitter = require('events').EventEmitter;\r\nvar url = require('url');\r\nvar qs = require('querystring');\r\nvar util = require('util');\r\nvar http = require('http');\r\nvar chalk = require('chalk');\r\nvar isConnected, port, isBlocked, lastsent = \"\", paused = false, blocked = false, queryLoop, queueCounter, connections = [];\r\nvar gcodeQueue; gcodeQueue = [];\r\nvar request = require('request'); // proxy for remote webcams\r\n\r\n\r\nrequire('dns').lookup(require('os').hostname(), function (err, add, fam) {\r\n    console.log(chalk.green(' '));\r\n    console.log(chalk.green('***************************************************************'));\r\n    console.log(chalk.white('                 ---- LaserWeb Started ----                    '));\r\n    console.log(chalk.green('***************************************************************'));\r\n    console.log(chalk.white('  Access the LaserWeb User Interface:                        '));\r\n    console.log(chalk.green('  1. Open Chrome                                              '));\r\n    console.log(chalk.green('  2. Go to : '), chalk.yellow(' http://'+add+':'+config.webPort+'/'));\r\n    console.log(chalk.green('***************************************************************'));\r\n    console.log(chalk.green(' '));\r\n    console.log(chalk.green(' '));\r\n    console.log(chalk.red('* Updates: '));\r\n    console.log(chalk.green('  Remember to check the commit log on'));\r\n    console.log(chalk.green(' '), chalk.yellow('https://github.com/openhardwarecoza/LaserWeb3/commits/master'));\r\n    console.log(chalk.green('  regularly, to know about updates and fixes, and then when ready'));\r\n    console.log(chalk.green('  update LaserWeb3 accordingly by running'), chalk.cyan(\"git pull\"));\r\n    console.log(chalk.green(' '));\r\n    console.log(chalk.red('* Support: '));\r\n    console.log(chalk.green('  If you need help / support, come over to '));\r\n    console.log(chalk.green(' '), chalk.yellow('https://plus.google.com/communities/115879488566665599508'));\r\n})\r\n\r\n\r\n\r\n// Webserver\r\napp.listen(config.webPort);\r\nvar fileServer = new static.Server('./public');\r\nfunction handler (req, res) {\r\n\r\n  var queryData = url.parse(req.url, true).query;\r\n      if (queryData.url) {\r\n        if (queryData.url != \"\") {\r\n          request({\r\n              url: queryData.url,  // proxy for remote webcams\r\n              callback: (err, res, body) => {\r\n                if (err) {\r\n                  // console.log(err)\r\n                  console.error(chalk.red('ERROR:'), chalk.yellow(' Remote Webcam Proxy error: '), chalk.white(\"\\\"\"+queryData.url+\"\\\"\"), chalk.yellow(' is not a valid URL: '));\r\n                }\r\n              }\r\n          }).on('error', function(e) {\r\n              res.end(e);\r\n          }).pipe(res);\r\n        }\r\n      } else {\r\n        fileServer.serve(req, res, function (err, result) {\r\n      \t\tif (err) {\r\n      \t\t\tconsole.error(chalk.red('ERROR:'), chalk.yellow(' fileServer error:'+req.url+' : '), err.message);\r\n      \t\t}\r\n      \t});\r\n      };\r\n}\r\nfunction ConvChar( str ) {\r\n  c = {'<':'&lt;', '>':'&gt;', '&':'&amp;', '\"':'&quot;', \"'\":'&#039;',\r\n       '#':'&#035;' };\r\n  return str.replace( /[<&>'\"#]/g, function(s) { return c[s]; } );\r\n}\r\n\r\n\r\n// Websocket <-> Serial\r\nio.sockets.on('connection', handleConnection);\r\n\r\n\r\nfunction handleConnection (socket) { // When we open a WS connection, send the list of ports\r\n\r\n  connections.push(socket);\r\n\r\n  serialport.list(function (err, ports) {\r\n    socket.emit(\"ports\", ports);\r\n  });\r\n\r\n  socket.on('firstLoad', function(data) {\r\n    socket.emit('config', config);\r\n  });\r\n\r\n  socket.on('stop', function(data) {\r\n    socket.emit(\"connectStatus\", 'stopped:'+port.path);\r\n    gcodeQueue.length = 0; // dump the queye\r\n    if (data == 0) {\r\n      port.write(data+\"\\n\"); // Ui sends the Laser Off command to us if configured, so lets turn laser off before unpausing... Probably safer (;\r\n      console.log('PAUSING:  Sending Laser Off Command as ' + data)\r\n    } else {\r\n      port.write(M5+\"\\n\")  //  Hopefully M5!\r\n      console.log('PAUSING: NO LASER OFF COMMAND CONFIGURED. PLEASE CHECK THAT BEAM IS OFF!  We tried the detault M5!  Configure your settings please!')\r\n    }\r\n  });\r\n\r\n  socket.on('pause', function(data) {\r\n    console.log(chalk.red('PAUSE'));\r\n    if (data == 0) {\r\n      port.write(data+\"\\n\"); // Ui sends the Laser Off command to us if configured, so lets turn laser off before unpausing... Probably safer (;\r\n      console.log('PAUSING:  Sending Laser Off Command as ' + data)\r\n    } else {\r\n      port.write(M5+\"\\n\")  //  Hopefully M5!\r\n      console.log('PAUSING: NO LASER OFF COMMAND CONFIGURED. PLEASE CHECK THAT BEAM IS OFF!  We tried the detault M5!  Configure your settings please!')\r\n    }\r\n    socket.emit(\"connectStatus\", 'paused:'+port.path);\r\n    paused = true;\r\n  });\r\n\r\n  socket.on('unpause', function(data) {\r\n    socket.emit(\"connectStatus\", 'unpaused:'+port.path);\r\n    paused = false;\r\n    send1Q()\r\n  });\r\n\r\n  socket.on('serialSend', function(data) {\r\n    data = data.split('\\n')\r\n    for (i=0; i<data.length; i++) {\r\n      addQ(data[i])\r\n    }\r\n  });\r\n\r\n  socket.on('refreshPorts', function(data) { // Or when asked\r\n    console.log(chalk.yellow('WARN:'), chalk.blue('Requesting Ports Refresh '));\r\n    serialport.list(function (err, ports) {\r\n    socket.emit(\"ports\", ports);\r\n    });\r\n  });\r\n\r\n  socket.on('closePort', function(data) { // If a user picks a port to connect to, open a Node SerialPort Instance to it\r\n    console.log(chalk.yellow('WARN:'), chalk.blue('Closing Port ' + port.path));\r\n    socket.emit(\"connectStatus\", 'closed:'+port.path);\r\n    port.close();\r\n\r\n  });\r\n\r\n  socket.on('areWeLive', function(data) { // If a user picks a port to connect to, open a Node SerialPort Instance to it\r\n    socket.broadcast.emit(\"activePorts\", port.path + ',' + port.options.baudRate);\r\n  });\r\n\r\n\r\n  socket.on('connectTo', function(data) { // If a user picks a port to connect to, open a Node SerialPort Instance to it\r\n    data = data.split(',');\r\n    console.log(chalk.yellow('WARN:'), chalk.blue('Connecting to Port ' + data));\r\n    if (!isConnected) {\r\n      port = new SerialPort(data[0], {  parser: serialport.parsers.readline(\"\\n\"), baudrate: parseInt(data[1]) });\r\n      socket.emit(\"connectStatus\", 'opening:'+port.path);\r\n      port.on('open', function() {\r\n        socket.broadcast.emit(\"activePorts\", port.path + ',' + port.options.baudRate);\r\n        socket.emit(\"connectStatus\", 'opened:'+port.path);\r\n        // port.write(\"?\\n\"); // Lets check if its LasaurGrbl?\r\n        // port.write(\"M115\\n\"); // Lets check if its Marlin?\r\n        port.write(\"version\\n\"); // Lets check if its Smoothieware?\r\n        // port.write(\"$fb\\n\"); // Lets check if its TinyG\r\n        console.log('Connected to ' + port.path + 'at ' + port.options.baudRate)\r\n        isConnected = true;\r\n        connectedTo = port.path;\r\n        queryLoop = setInterval(function() {\r\n          // console.log('StatusChkc')\r\n            port.write('?');\r\n            send1Q()\r\n        }, 100);\r\n        queueCounter = setInterval(function(){\r\n                 for (i in connections) {   // iterate over the array of connections\r\n                   connections[i].emit('qCount', gcodeQueue.length)\r\n                 };\r\n         },500);\r\n         for (i in connections) {   // iterate over the array of connections\r\n           connections[i].emit(\"activePorts\", port.path + ',' + port.options.baudRate);\r\n         };\r\n      });\r\n\r\n      port.on('close', function(err) { // open errors will be emitted as an error event\r\n        clearInterval(queueCounter);\r\n        clearInterval(queryLoop);\r\n        socket.emit(\"connectStatus\", 'closed:'+port.path);\r\n        isConnected = false;\r\n        connectedTo = false;\r\n      });\r\n\r\n      port.on('error', function(err) { // open errors will be emitted as an error event\r\n        console.log('Error: ', err.message);\r\n        socket.broadcast.emit(\"data\", data);\r\n      })\r\n      port.on(\"data\", function (data) {\r\n        console.log('Recv: ' + data)\r\n        if(data.indexOf(\"ok\") != -1 || data == \"start\\r\" || data.indexOf('<') == 0){\r\n            if (data.indexOf(\"ok\") == 0) { // Got an OK so we are clear to send\r\n              blocked = false;\r\n            }\r\n            for (i in connections) {   // iterate over the array of connections\r\n              connections[i].emit(\"data\", data);\r\n            };\r\n            // setTimeout(function(){\r\n                 if(paused !== true){\r\n                     send1Q()\r\n                 } else {\r\n                   for (i in connections) {   // iterate over the array of connections\r\n                     connections[i].emit(\"data\", 'paused...');\r\n                   };\r\n                 }\r\n            //  },1);\r\n\r\n\r\n         } else {\r\n             connections[i].emit(\"data\", data);\r\n         }\r\n      });\r\n    } else {\r\n      socket.emit(\"connectStatus\", 'resume:'+port.path);\r\n      port.write(\"?\\n\"); // Lets check if its LasaurGrbl?\r\n      port.write(\"M115\\n\"); // Lets check if its Marlin?\r\n      port.write(\"version\\n\"); // Lets check if its Smoothieware?\r\n      port.write(\"$fb\\n\"); // Lets check if its TinyG\r\n    }\r\n  });\r\n\r\n\r\n  };\r\n// End Websocket <-> Serial\r\n\r\n\r\n\r\n// Queue\r\nfunction addQ(gcode) {\r\n  gcodeQueue.push(gcode);\r\n}\r\n\r\nfunction jumpQ(gcode) {\r\n  gcodeQueue.unshift(gcode)\r\n}\r\n\r\nfunction send1Q() {\r\n  if (gcodeQueue.length > 0 && !blocked && !paused) {\r\n    var gcode = gcodeQueue.shift()\r\n    console.log('Sent: '  + gcode + ' Q: ' + gcodeQueue.length)\r\n    lastSent = gcode\r\n    port.write(gcode + '\\n');\r\n    blocked = true;\r\n  }\r\n}\r\n"]}