OpenBuilds-CONTROL/app/js/websocket.js

1183 wiersze
41 KiB
JavaScript
Czysty Wina Historia

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

var socket, laststatus;;
var server = ''; //192.168.14.100';
var programBoard = {};
var grblParams = {}
var smoothieParams = {}
var nostatusyet = true;
var safeToUpdateSliders = false;
var laststatus
var simstopped = false;
var bellstate = false;
var toast = Metro.toast.create;
var unit = "mm"
var waitingForStatus = false;
var openDialogs = [];
$(document).ready(function() {
initSocket();
$("#command").inputHistory({
enter: function() {
$("#sendCommand").click();
}
});
$("form").submit(function() {
return false;
});
});
function showGrbl(bool) {
if (bool) {
setTimeout(function() {
sendGcode('$$')
}, 500);
setTimeout(function() {
sendGcode('$I')
}, 700);
setTimeout(function() {
sendGcode('$G')
}, 900);
$("#grblButtons").show()
$("#firmwarename").html('Grbl')
} else {
$("#grblButtons").hide()
$("#firmwarename").html('')
}
if (localStorage.getItem('jogOverride')) {
jogOverride(localStorage.getItem('jogOverride'))
}
if (laststatus !== undefined) {
$("#firmwareversionstatus").html(laststatus.machine.firmware.platform + " " + laststatus.machine.firmware.version);
};
}
function printLogModern(icon, source, string, printLogCls) {
if (!disableSerialLog) {
if (document.getElementById("console") !== null) {
if (string.isString) {
string = string.replace(/\r\n|\n|\r/, "<br />");
}
if ($('#console p').length > 300) {
// remove oldest if already at 300 lines
$('#console p').first().remove();
}
var template = '<p class="pf">';
if (icon) {
template += icon
}
var time = new Date();
template += '<span class="fg-dark">[' + (time.getHours() < 10 ? '0' : '') + time.getHours() + ":" + (time.getMinutes() < 10 ? '0' : '') + time.getMinutes() + ":" + (time.getSeconds() < 10 ? '0' : '') + time.getSeconds() + ']</span> ';
if (source) {
template += "<span class='fg-darkRed'>[ " + source + " ] </span>"
} else {
template += "<span class='fg-darkRed'>[ ] </span>"
}
if (string) {
template += "<span class='" + printLogCls + "'>" + string + "</span>"
}
$('#console').append(template);
$('#console').scrollTop(($("#console")[0].scrollHeight - $("#console").height()) + 20);
}
}
};
function printLog(string) {
if (!disableSerialLog) {
if (document.getElementById("console") !== null) {
if (string.isString) {
// split(/\r\n|\n|\r/);
string = string.replace(/\r\n|\n|\r/, "<br />");
}
if ($('#console p').length > 100) {
// remove oldest if already at 300 lines
$('#console p').first().remove();
}
var template = '<p class="pf">';
var time = new Date();
template += '<span class="fg-dark">[' + (time.getHours() < 10 ? '0' : '') + time.getHours() + ":" + (time.getMinutes() < 10 ? '0' : '') + time.getMinutes() + ":" + (time.getSeconds() < 10 ? '0' : '') + time.getSeconds() + ']</span> ';
template += string;
$('#console').append(template);
$('#console').scrollTop(($("#console")[0].scrollHeight - $("#console").height()) + 20);
}
}
};
function initSocket() {
socket = io.connect(server, {
'timeout': 60000,
'connect timeout': 60000
}); // socket.io init
var icon = ''
var source = "websocket"
var string = "Bidirectional Websocket Interface Started Succesfully"
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
setTimeout(function() {
populatePortsMenu();
populateDrivesMenu();
}, 2000);
socket.on('disconnect', function() {
console.log("WEBSOCKET DISCONNECTED")
var icon = ''
var source = "websocket"
var string = "Disconnected. OpenBuilds CONTROL probably quit or crashed"
var printLogCls = "fg-darkRed"
printLogModern(icon, source, string, printLogCls)
$("#websocketstatus").html("Disconnected")
});
socket.on('connect', function() {
$("#websocketstatus").html("Connected")
});
socket.on('gcodeupload', function(data) {
var icon = ''
var source = "api"
var string = "Received new GCODE from API"
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
if (data.gcode.length > 10000000) {
gcode = data.gcode
editor.session.setValue("GCODE " + data.filename + " is too large (" + (data.gcode.length / 1024).toFixed(0) + "kB) to load into the GCODE Editor. \nIf you need to edit it inside CONTROL, please use a standalone text editing application and reload it ");
} else {
editor.session.setValue(data.gcode);
gcode = false;
}
loadedFileName = data.filename;
setWindowTitle()
parseGcodeInWebWorker(data.gcode)
$('#controlTab').click()
if (webgl) {
$('#gcodeviewertab').click();
} else {
$('#gcodeeditortab').click()
}
jobNeedsHoming();
});
socket.on('gcodeupload', function(data) {
var icon = ''
var source = "api"
var string = "API called window into focus"
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
});
socket.on('integrationpopup', function(data) {
var icon = ''
var source = "api"
var string = "Integration called from " + data
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
$('#controlTab').click()
$('#consoletab').click()
});
socket.on('updatedata', function(data) {
// console.log(data.length, data)
var icon = ''
var source = data.command
var string = data.response
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
});
socket.on('updateready', function(data) {
// 0 = not connected
// 1 = Connected, but not Playing yet
// 2 = Connected, but not Playing yet
// 3 = Busy Streaming GCODE
// 4 = Paused
// 5 = Alarm State
// 6 = Firmware Upgrade State
if (laststatus.comms.connectionStatus < 3 && !continuousJogRunning) {
$('#availVersion').html(data)
getReleaseStats()
getChangelog();
Metro.dialog.open('#downloadUpdate')
}
});
socket.on('updateprogress', function(data) {
$('#downloadprogress').html(data + "%");
});
socket.on('data', function(data) {
// console.log(data)
var toPrint = escapeHTML(data.response);
var lineColor = "fg-dark"
if (data.type == "error") {
lineColor = "fg-darkRed"
} else if (data.type == "success") {
lineColor = "fg-darkGreen"
} else if (data.type == "info") {
lineColor = "fg-dark"
}
// Parse Grbl Settings Feedback
if (data.response.indexOf('$') === 0) {
if (typeof grblSettings !== 'undefined') {
grblSettings(data.response)
var key = data.response.split('=')[0].substr(1);
if (grblSettingsTemplate2[key] !== undefined) {
var descr = grblSettingsTemplate2[key].title
} else {
var descr = "unknown"
}
toPrint = data.response + " ;" + descr
var icon = ''
var source = data.command
var string = toPrint
var printLogCls = lineColor
printLogModern(icon, source, string, printLogCls)
}
} else {
var icon = ''
var source = data.command
var string = toPrint
var printLogCls = lineColor
printLogModern(icon, source, string, printLogCls)
};
});
socket.on("grbl", function(data) {
showGrbl(true)
});
socket.on("jobComplete", function(data) {
// Jobstats.js
if (data.completed && data.jobStartTime && data.jobEndTime) {
console.log("jobComplete", data)
var runTime = data.jobEndTime - data.jobStartTime; // in Milliseconds
$('#timeRemaining').html("DONE: " + msToTime(runTime));
if (object && object.userData != undefined) {
var estimateTime = object.userData.totalTime; // in Minutes
} else {
var estimateTime = 0;
}
var startDate = new Date(data.jobStartTime);
var startDateString = startDate.toString();
var endDate = new Date(data.jobEndTime);
var endDateString = endDate.toString();
var completionStatus = "complete"
if (data.failed) {
completionStatus = "incomplete"
}
console.log("Completed: " + completionStatus + " / Filename: " + loadedFileName + " / Estimated Runtime: " + timeConvert(estimateTime) + " / Streaming Runtime: " + msToTime(runTime) + " / Start Date: " + startDateString + " / End Date: " + endDateString)
var completedJob = {
"completed": !data.failed, // Did job complete?
"filename": loadedFileName, // File Name
"estruntime": estimateTime, // in Minutes
"streamruntime": runTime,
"startdate": data.jobStartTime,
"enddate": data.jobEndTime
}
storeJob(completedJob);
}
// With jobCompletedMsg Message
if (data.jobCompletedMsg && data.jobCompletedMsg.length > 0) {
if (data.jobStartTime && data.jobEndTime) {
var runTime = data.jobEndTime - data.jobStartTime;
$("#completeMsgDiv").html("Job completed in " + msToTime(runTime) + "<hr>" + data.jobCompletedMsg);
$('#timeRemaining').html("DONE: " + msToTime(runTime));
} else {
$("#completeMsgDiv").html(data.jobCompletedMsg);
$('#timeRemaining').html("DONE: " + msToTime(runTime));
}
Metro.dialog.open("#completeMsgModal");
var icon = ''
var source = "JOB COMPLETE"
var string = "Job completed in " + msToTime(runTime) + " / " + data.jobCompletedMsg
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
$('#timeRemaining').html("DONE: " + msToTime(runTime));
} else if (data.jobStartTime && data.jobEndTime) {
// Without jobCompletedMsg Message (Normal Job)
var runTime = data.jobEndTime - data.jobStartTime;
var icon = ''
var source = "JOB COMPLETE"
var string = "Job completed in " + msToTime(runTime)
var printLogCls = "fg-darkGreen"
printLogModern(icon, source, string, printLogCls)
$('#timeRemaining').html("DONE: " + msToTime(runTime));
}
// Focus Button
setTimeout(function() {
$('#jobCompleteBtnOk').focus();
}, 200)
// Cleanup
lastJobStartTime = false;
// if (typeof object !== 'undefined' && object.userData != undefined) {
// var timeremain = object.userData.totalTime;
// if (!isNaN(timeremain)) {
// $('#timeRemaining').html(timeConvert(timeremain) + " / " + timeConvert(timeremain));
// }
// }
});
socket.on("machinename", function(data) {
if (typeof setMachineButton !== 'undefined') {
setMachineButton(data)
}
});
socket.on("queueCount", function(data) {
// calc percentage
var left = data[0]
var total = data[1]
var done = total - left;
var donepercent = done / total * 100
var progressbar = $("#progressbar").data("progress");
if (progressbar) {
progressbar.val(donepercent);
}
if (laststatus) {
if (laststatus.comms.connectionStatus == 3) {
editor.gotoLine(data[1] - data[0]);
}
if (typeof object !== 'undefined' && done > 0) {
if (object.userData !== 'undefined' && object.userData && object.userData.linePoints.length > 2) {
var timeremain = object.userData.totalTime;
if (!isNaN(timeremain)) {
if (lastJobStartTime) {
$('#timeRemaining').html(timeConvert((new Date().getTime() - lastJobStartTime) / 1000 / 60) + " / " + timeConvert(timeremain));
}
}
}
} else {
$('#timeRemaining').empty();
}
}
$('#gcodesent').html("Job Queue: " + data[0]);
})
socket.on('toastErrorAlarm', function(data) {
console.log(data)
var icon = ''
var source = "ALARM"
var string = data
var printLogCls = "fg-darkRed"
printLogModern(icon, source, string, printLogCls)
var dialog = Metro.dialog.create({
clsDialog: 'dark',
title: "<i class='fas fa-exclamation-triangle'></i> Grbl Alarm:",
content: "<i class='fas fa-exclamation-triangle fg-darkRed'></i> " + data,
actions: [{
caption: "Clear Alarm",
cls: "js-dialog-close alert closeAlarmBtn",
onclick: function() {
socket.emit('clearAlarm', 2)
}
},
{
caption: "Cancel",
cls: "js-dialog-close",
onclick: function() {
//
}
}
]
});
if (data.indexOf("ALARM: 6") == -1 && data.indexOf("ALARM: 7") == -1 && data.indexOf("ALARM: 8") == -1 && data.indexOf("ALARM: 9") == -1 && data.indexOf("ALARM: 10") == -1) {
openDialogs.push(dialog);
}
setTimeout(function() {
$(".closeAlarmBtn").focus();
}, 200, )
//
});
socket.on('toastError', function(data) {
console.log(data)
var icon = ''
var source = "ERROR"
var string = data
var printLogCls = "fg-darkRed"
printLogModern(icon, source, string, printLogCls)
var dialog = Metro.dialog.create({
title: "<i class='fas fa-exclamation-triangle'></i> Grbl Error:",
content: "<i class='fas fa-exclamation-triangle fg-darkRed'></i> " + data,
clsDialog: 'dark',
actions: [{
caption: "OK",
cls: "js-dialog-close alert closeErrorBtn",
onclick: function() {
socket.emit('clearAlarm', 2)
}
}]
});
openDialogs.push(dialog);
setTimeout(function() {
$(".closeErrorBtn").focus();
}, 200, )
//
});
socket.on("errorsCleared", function(data) {
if (data) {
for (i = 0; i < openDialogs.length; i++) {
Metro.dialog.close(openDialogs[i]);
}
openDialogs.length = 0;
}
})
socket.on('progStatus', function(data) {
$('#controlTab').click();
$('#consoletab').click();
console.log(data.port, data.string)
var string = data.string
if (string) {
if (string.indexOf('flash complete') != -1) {
setTimeout(function() {
populatePortsMenu();
}, 400)
}
string = string.replace('flash complete.', "<span class='fg-darkRed'><i class='fas fa-times fa-fw fg-darkRed fa-fw'> </i> FLASH FAILED!</span> ");
string = string.replace('', "<span class='fg-darkGreen'><i class='fas fa-check fa-fw fg-darkGreen fa-fw'></i> ");
string = string.replace('', "</span>");
if (string.indexOf("Hash of data verified") != -1) {
string = "<span class='fg-darkGreen'><i class='fas fa-check fa-fw fg-darkGreen fa-fw'></i>" + string + "</span>"
}
if (string.indexOf("could not open port") != -1) {
string = "<span class='fg-darkRed'><i class='fas fa-times fa-fw fg-darkRed fa-fw'></i>" + string + "</span>"
}
if (string.indexOf("something went wrong") != -1) {
string = "<span class='fg-darkRed'><i class='fas fa-times fa-fw fg-darkRed fa-fw'></i>" + string + "</span>"
}
if (string.indexOf("fatal error occurred") != -1) {
string = "<span class='fg-darkRed'><i class='fas fa-times fa-fw fg-darkRed fa-fw'></i>" + string + "</span>"
}
if (string.indexOf("A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header") != -1) {
string = "<span class='fg-darkRed'>" + string + ": Make sure the Interface is in BOOTLOADER MODE. See https://docs.openbuilds.com/doku.php?id=docs:interface:firmware-update-control"
}
var icon = ''
var source = " Firmware Upgrade"
//var string = string
var printLogCls = "fg-dark"
printLogModern(icon, source, string, printLogCls)
if (data.code != undefined) {
var icon = ''
var source = " Firmware Upgrade"
if (data.code == 0) {
var string = "<i class='fas fa-check fa-fw fg-darkGreen fa-fw'></i> <b>Firmware Update COMPLETED!</b> Please click the Reset button on the device now, to reboot it with the new firmware. "
var printLogCls = "fg-darkGreen"
} else {
var string = "<i class='fas fa-times fa-fw fg-darkRed fa-fw'></i> <b>Firmware Update FAILED!</b> Please review the logs above, or try again"
var printLogCls = "fg-darkRed"
}
printLogModern(icon, source, string, printLogCls)
populatePortsMenu()
}
}
});
socket.on('status', function(status) {
if (nostatusyet) {
// $('#windowtitle').html("OpenBuilds CONTROL v" + status.driver.version)
setWindowTitle(status)
if (status.driver.operatingsystem == "rpi") {
$('#windowtitlebar').hide();
}
}
nostatusyet = false;
// if (!_.isEqual(status, laststatus)) {
if (laststatus !== undefined) {
if (!isJogWidget) {
if (!_.isEqual(status.machine.position.offset, laststatus.machine.position.offset) || machineCoordinateSpace == false) {
drawMachineCoordinates(status);
}
}
if (!_.isEqual(status.comms.interfaces.ports, laststatus.comms.interfaces.ports)) {
var string = "Detected a change in available ports: ";
for (i = 0; i < status.comms.interfaces.ports.length; i++) {
string += "[" + status.comms.interfaces.ports[i].path + "]"
}
if (!status.comms.interfaces.ports.length) {
string += "[ No devices connected ]"
}
var icon = ''
var source = "usb ports"
//var string = string
var printLogCls = "fg-dark"
printLogModern(icon, source, string, printLogCls)
laststatus.comms.interfaces.ports = status.comms.interfaces.ports;
populatePortsMenu();
}
if (!_.isEqual(status.comms.interfaces.networkDevices, laststatus.comms.interfaces.networkDevices)) {
var string = "Detected a change in IP devices: ";
for (i = 0; i < status.comms.interfaces.networkDevices.length; i++) {
string += "[" + status.comms.interfaces.networkDevices[i].ip + "]"
}
if (!status.comms.interfaces.networkDevices.length) {
string += "[ No IP devices ]"
}
var icon = ''
var source = "network ports"
//var string = string
var printLogCls = "fg-dark"
printLogModern(icon, source, string, printLogCls)
laststatus.comms.interfaces.networkDevices = status.comms.interfaces.networkDevices;
populatePortsMenu();
}
if (!_.isEqual(status.interface.diskdrives, laststatus.interface.diskdrives)) {
var string = "Detected a change in available disk drives: ";
for (i = 0; i < status.interface.diskdrives.length; i++) {
if (status.interface.diskdrives[i].isUSB || !status.interface.diskdrives[i].isSystem) {
string += "[" + status.interface.diskdrives[i].mountpoints[0].path + "], "
}
}
var icon = ''
var source = "usb drives"
//var string = string
var printLogCls = "fg-dark"
printLogModern(icon, source, string, printLogCls)
laststatus.interface.diskdrives = status.interface.diskdrives;
populateDrivesMenu();
}
}
if (status.comms.runStatus.indexOf("Door") == 0) {
var doorType = status.comms.runStatus.split(":")[1]
var doorMsg = "";
if (doorType == 0) {
doorMsg += "Closed: Ready to Resume"
}
if (doorType == 1) {
doorMsg += "Open: Paused"
}
if (doorType == 2) {
doorMsg += "De-energising"
}
if (doorType == 3) {
doorMsg += "Re-energising"
}
$('#runStatus').html("Door : " + doorMsg);
var icon = ''
var source = "door"
var printLogCls = "fg-dark"
} else {
$('#runStatus').html("Controller: " + status.comms.runStatus);
}
if (!disableDROupdates) {
if (unit == "mm") {
var xpos = status.machine.position.work.x.toFixed(2) + unit;
var ypos = status.machine.position.work.y.toFixed(2) + unit;
var zpos = status.machine.position.work.z.toFixed(2) + unit;
$(" #xPos ").attr('title', 'X Machine: ' + (status.machine.position.work.x + status.machine.position.offset.x).toFixed(2) + unit + "/ X Work: " + xpos);
$(" #yPos ").attr('title', 'Y Machine: ' + (status.machine.position.work.y + status.machine.position.offset.y).toFixed(2) + unit + "/ Y Work: " + ypos);
$(" #zPos ").attr('title', 'Z Machine: ' + (status.machine.position.work.z + status.machine.position.offset.z).toFixed(2) + unit + "/ Z Work: " + zpos);
} else if (unit == "in") {
var xpos = (status.machine.position.work.x / 25.4).toFixed(3) + unit;
var ypos = (status.machine.position.work.y / 25.4).toFixed(3) + unit;
var zpos = (status.machine.position.work.z / 25.4).toFixed(3) + unit;
$(" #xPos ").attr('title', 'X Machine: ' + ((status.machine.position.work.x / 25.4) + (status.machine.position.offset.x / 25.4)).toFixed(3) + unit + "/ X Work: " + xpos);
$(" #yPos ").attr('title', 'Y Machine: ' + ((status.machine.position.work.y / 25.4) + (status.machine.position.offset.y / 25.4)).toFixed(3) + unit + "/ Y Work: " + ypos);
$(" #zPos ").attr('title', 'Z Machine: ' + ((status.machine.position.work.z / 25.4) + (status.machine.position.offset.z / 25.4)).toFixed(3) + unit + "/ Z Work: " + zpos);
}
if ($('#xPos').html() != xpos) {
$('#xPos').html(xpos);
}
if ($('#yPos').html() != ypos) {
$('#yPos').html(ypos);
}
if ($('#zPos').html() != zpos) {
$('#zPos').html(zpos);
}
} else {
$('#xPos').html('disabled');
$('#yPos').html('disabled');
$('#zPos').html('disabled');
}
if (webgl) {
if (!disable3Drealtimepos) {
if (!isJogWidget) {
if (!simRunning) {
cone.position.x = status.machine.position.work.x
cone.position.y = status.machine.position.work.y
cone.position.z = status.machine.position.work.z
}
}
}
}
if (safeToUpdateSliders) {
if ($('#fro').data('slider') && $('#tro').data('slider')) {
$('#fro').data('slider').val(status.machine.overrides.feedOverride)
$('#tro').data('slider').val(status.machine.overrides.spindleOverride)
}
}
if (unit == "mm") {
$("#realFeed").html(status.machine.overrides.realFeed + "mm/min");
//$("#realSpeed").html("S=" + status.machine.overrides.realSpindle);
} else if (unit == "in") {
$("#realFeed").html((status.machine.overrides.realFeed / 25.4).toFixed(0) + "in/min");
//$("#realSpeed").html(("S=" + status.machine.overrides.realSpindle / 25.4).toFixed(0) + "in/min");
}
//console.log(JSON.stringify(status.machine.overrides, null, 4));
// Windows Power Management
if (status.driver.operatingsystem == "windows") {
$("#powerSettingsCard").show();
if (status.driver.powersettings.usbselectiveAC == false) {
$('#selectivesuspendAC').removeClass('alert').addClass('success').html('DISABLED')
} else if (status.driver.powersettings.usbselectiveAC == null) {
$('#selectivesuspendAC').removeClass('success').addClass('alert').html('UNKNOWN')
} else if (status.driver.powersettings.usbselectiveAC == true) {
$('#selectivesuspendAC').removeClass('success').addClass('alert').html('ENABLED')
}
if (status.driver.powersettings.usbselectiveDC == false) {
$('#selectivesuspendDC').removeClass('alert').addClass('success').html('DISABLED')
} else if (status.driver.powersettings.usbselectiveDC == null) {
$('#selectivesuspendDC').removeClass('success').addClass('alert').html('UNKNOWN')
} else if (status.driver.powersettings.usbselectiveDC == true) {
$('#selectivesuspendDC').removeClass('success').addClass('alert').html('ENABLED')
}
} else {
$("#powerSettingsCard").hide();
}
// Grbl Pins Input Status
$('.pinstatus').removeClass('alert').addClass('success').html('OFF')
$('#holdpin').html('HOLD/DOOR:OFF')
$('#resetpin').html('RST:OFF')
$('#startpin').html('START:OFF')
if (status.machine.inputs.length > 0) {
for (i = 0; i < status.machine.inputs.length; i++) {
switch (status.machine.inputs[i]) {
case 'X':
// console.log('PIN: X-LIMIT');
$('.xpin').removeClass('success').addClass('alert').html('TRIGGERED')
break;
case 'Y':
// console.log('PIN: Y-LIMIT');
$('.ypin').removeClass('success').addClass('alert').html('TRIGGERED')
break;
case 'Z':
// console.log('PIN: Z-LIMIT');
$('.zpin').removeClass('success').addClass('alert').html('TRIGGERED')
break;
case 'P':
// console.log('PIN: PROBE');
$('.prbpin').removeClass('success').addClass('alert').html('TRIGGERED')
break;
case 'D':
// console.log('PIN: DOOR');
$('.doorpin').removeClass('success').addClass('alert').html('DOOR OPEN')
break;
case 'H':
// console.log('PIN: HOLD');
$('.holdpin').removeClass('success').addClass('alert').html('HOLD/DOOR:ON')
break;
case 'R':
// console.log('PIN: SOFTRESET');
$('.resetpin').removeClass('success').addClass('alert').html('RST:ON')
break;
case 'S':
// console.log('PIN: CYCLESTART');
$('.startpin').removeClass('success').addClass('alert').html('START:ON')
break;
}
}
}
$('#driverver').html("v" + status.driver.version);
if (!status.machine.firmware.type) {
$('#firmwarever').html("NOCOMM");
} else {
$('#firmwarever').html(status.machine.firmware.type + " v" + status.machine.firmware.version);
}
$('#commblocked').html(status.comms.blocked ? "BLOCKED" : "Ready");
var string = '';
switch (status.comms.connectionStatus) {
case 0:
string += "Not Connected"
break;
case 2:
string += "Connected"
break;
case 3:
string += "Streaming"
break;
case 4:
string += "Paused"
break;
case 5:
string += "Alarmed"
break;
}
$('#commstatus').html(string);
$('#drvqueue').html(status.comms.queue);
if (status.comms.interfaces.activePort) {
$('#activeportstatus').html(status.comms.interfaces.activePort)
} else {
$('#activeportstatus').html("none")
}
// Set the Connection Toolbar option
setConnectBar(status.comms.connectionStatus, status);
setControlBar(status.comms.connectionStatus, status)
setJogPanel(status.comms.connectionStatus, status)
setConsole(status.comms.connectionStatus, status)
if (status.comms.connectionStatus != 5) {
bellstate = false
};
if (status.comms.connectionStatus == 0) {
showGrbl(false)
}
var updateWCS = false
if (laststatus == undefined) {
var updateWCS = true
} else {
if (status.machine.modals.coordinatesys != laststatus.machine.modals.coordinatesys) {
var updateWCS = true
}
}
if (updateWCS) {
$('#wcsBtn').html(`<span class="fas fa-fw fa-layer-group icon fg-darkGray"></span>` + status.machine.modals.coordinatesys)
$('.wcsItem').removeClass('checked')
switch (status.machine.modals.coordinatesys) {
case "G54":
$('.wcsItemG54').addClass('checked')
break;
case "G55":
$('.wcsItemG55').addClass('checked')
break;
case "G56":
$('.wcsItemG56').addClass('checked')
break;
case "G57":
$('.wcsItemG57').addClass('checked')
break;
case "G58":
$('.wcsItemG58').addClass('checked')
break;
case "G59":
$('.wcsItemG59').addClass('checked')
break;
}
}
laststatus = status;
waitingForStatus = false;
});
socket.on('features', function(data) {
// console.log('FEATURES', data)
for (i = 0; i < data.length; i++) {
switch (data[i]) {
case 'Q':
// console.log('SPINDLE_IS_SERVO Enabled')
$('#enServo').removeClass('alert').addClass('success').html('ON')
$(".servo-active").show()
break;
case 'V': // Variable spindle enabled
// console.log('Variable spindle enabled')
$('#enVariableSpindle').removeClass('alert').addClass('success').html('ON')
break;
case 'N': // Line numbers enabled
// console.log('Line numbers enabled')
$('#enLineNumbers').removeClass('alert').addClass('success').html('ON')
break;
case 'M': // Mist coolant enabled
// console.log('Mist coolant enabled')
$('#menuMisting').show();
$('#enMisting').removeClass('alert').addClass('success').html('ON')
break;
case 'C': // CoreXY enabled
// console.log('CoreXY enabled')
$('#enCoreXY').removeClass('alert').addClass('success').html('ON')
break;
case 'P': // Parking motion enabled
// console.log('Parking motion enabled')
$('#enParking').removeClass('alert').addClass('success').html('ON')
break;
case 'Z': // Homing force origin enabled
// console.log('Homing force origin enabled')
$('#enHomingOrigin').removeClass('alert').addClass('success').html('ON')
break;
case 'H': // Homing single axis enabled
// console.log('Homing single axis enabled')
$('#enSingleAxisHome').removeClass('alert').addClass('success').html('ON')
break;
case 'T': // Two limit switches on axis enabled
// console.log('Two limit switches on axis enabled')
$('#enTwoLimits').removeClass('alert').addClass('success').html('ON')
break;
case 'A': // Allow feed rate overrides in probe cycles
// console.log('Allow feed rate overrides in probe cycles')
$('#enFeedOVProbe').removeClass('alert').addClass('success').html('ON')
break;
case '$': // Restore EEPROM $ settings disabled
// console.log('Restore EEPROM $ settings disabled')
$('#enEepromSettingsDisable').removeClass('alert').addClass('success').html('ON')
break;
case '#': // Restore EEPROM parameter data disabled
// console.log('Restore EEPROM parameter data disabled')
$('#enEepromParamsDisable').removeClass('alert').addClass('success').html('ON')
break;
case 'I': // Build info write user string disabled
// console.log('Build info write user string disabled')
$('#enBuildInfoDisabled').removeClass('alert').addClass('success').html('ON')
break;
case 'E': // Force sync upon EEPROM write disabled
// console.log('Force sync upon EEPROM write disabled')
$('#enForceSyncEeprom').removeClass('alert').addClass('success').html('ON')
break;
case 'W': // Force sync upon work coordinate offset change disabled
// console.log('Force sync upon work coordinate offset change disabled')
$('#enForceSyncWco').removeClass('alert').addClass('success').html('ON')
break;
case 'L': // Homing init lock sets Grbl into an alarm state upon power up
// console.log('Homing init lock sets Grbl into an alarm state upon power up')
$('#enHomingInitLock').removeClass('alert').addClass('success').html('ON')
break;
}
}
})
socket.on("interfaceOutdated", function(status) {
console.log("interfaceOutdated", status)
openFlashingTool();
var select = $("#flashController").data("select").val("interface")
//status.interface.firmware.installedVersion
//status.interface.firmware.availVersion
var template = `We've detected that you are connected to an OpenBuilds Interface on port ` + status.comms.interfaces.activePort + `.<p>
It's firmware is currently out of date. You are running <code>v` + status.interface.firmware.installedVersion + `</code> and you can now update to <code>v` + status.interface.firmware.availVersion + `</code>.
Use the wizard below to update the firmware:
<hr>
`
$("#FlashDialogMsg").html(template);
})
$('#sendCommand').on('click', function() {
var commandValue = $('#command').val();
sendGcode(commandValue);
// $('#command').val('');
});
$('#command').on('keypress', function(e) {
if (e.which === 13) {
$(this).attr("disabled", "disabled");
var commandValue = $('#command').val();
sendGcode(commandValue);
$('#command').val('');
$(this).removeAttr("disabled");
}
});
var bellflash = setInterval(function() {
if (!nostatusyet) {
if (laststatus) {
if (laststatus.comms.connectionStatus == 5) {
if (bellstate == false) {
$('#navbell').hide();
$('#navbellBtn1').hide();
$('#navbellBtn2').hide();
$('#navbellBtn3').hide();
bellstate = true
} else {
$('#navbell').show();
$('#navbellBtn1').show();
$('#navbellBtn2').show();
$('#navbellBtn3').show();
bellstate = false
}
} else {
$('#navbell').hide();
$('#navbellBtn1').hide();
$('#navbellBtn2').hide();
$('#navbellBtn3').hide();
}
}
}
}, 200);
};
function selectPort(port) {
$('#consoletab').click();
if (port == undefined) {
port = $("#portUSB").val()
}
if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(port)) {
var data = {
ip: port,
port: false,
baud: false,
type: "telnet"
};
localStorage.setItem("lastip", port);
} else {
var data = {
port: port,
baud: 115200,
type: "usb"
};
}
if (port.length > 1) {
socket.emit('connectTo', data);
} else {
printLog("[connect] No Ports/IP selected/entered")
}
// socket.emit('connectTo', 'usb,' + $("#portUSB").val() + ',' + '115200');
};
function closePort() {
socket.emit('closePort', 1);
populatePortsMenu();
$('#controlTab').click();
$('#consoletab').click();
}
function populateDrivesMenu() {
if (laststatus) {
var response = `<select id="select1" data-role="select" class="mt-4"><optgroup label="USB Flashdrives">`
var usbDrives = []
for (i = 0; i < laststatus.interface.diskdrives.length; i++) {
if (laststatus.interface.diskdrives[i].isUSB || !laststatus.interface.diskdrives[i].isSystem) {
usbDrives.push(laststatus.interface.diskdrives[i])
}
};
if (!usbDrives.length > 0) {
response += `<option value="">Waiting for USB Flashdrive</option>`
} else {
for (i = 0; i < usbDrives.length; i++) {
response += `<option value="` + usbDrives[i].mountpoints[0].path + `">` + usbDrives[i].mountpoints[0].path + ` ` + usbDrives[i].description + `</option>`;
};
}
response += `</optgroup></select>`
var select = $("#UsbDriveList").data("select");
if (select) {
select.data(response);
if (!usbDrives.length > 0) {
$('#UsbDriveList').parent(".select").addClass('disabled')
$("#copyToUsbBtn").attr('disabled', true);
} else {
$('#UsbDriveList').parent(".select").removeClass('disabled')
$("#copyToUsbBtn").attr('disabled', false);
}
}
}
}
function populatePortsMenu() {
if (laststatus) {
var response = ``
if (!laststatus.comms.interfaces.ports.length) {
response += `<optgroup label="USB/Serial Ports">`
response += `<option value="">No USB/Serial Ports</option>`
} else {
response += `<optgroup label="USB Ports">`
for (i = 0; i < laststatus.comms.interfaces.ports.length; i++) {
var port = friendlyPort(i)
response += `<option value="` + laststatus.comms.interfaces.ports[i].path + `">` + port.note + " " + laststatus.comms.interfaces.ports[i].path.replace("/dev/tty.", "") + `</option>`;
};
}
response += `</optgroup>`
// Set USB Ports menu for Firmware Flashing tool before we add the Network ports - you cannot flash over the network
var select2 = $("#portUSB2").data("select");
if (select2) {
select2.data(response);
}
$('#portUSB2').parent(".select").removeClass('disabled')
// Add the Network Ports to the list then populate the Machine Connection selection
// if (!laststatus.comms.interfaces.networkDevices.length) {
// response += `<optgroup label="Network Ports">`
// response += `<option value="">No Network Ports</option>`
// } else {
// response += `<optgroup label="Network Ports">`
// for (i = 0; i < laststatus.comms.interfaces.networkDevices.length; i++) {
// if (laststatus.comms.interfaces.networkDevices[i].type) {
// response += `<option value="` + laststatus.comms.interfaces.networkDevices[i].ip + `">` + laststatus.comms.interfaces.networkDevices[i].ip + " [ " + laststatus.comms.interfaces.networkDevices[i].type + ` ]</option>`;
// } else {
// response += `<option value="` + laststatus.comms.interfaces.networkDevices[i].ip + `">` + laststatus.comms.interfaces.networkDevices[i].ip + `</option>`;
// }
// };
// }
// response += `</optgroup>`
var select = $("#portUSB").data("select");
select.data(response);
$('#portUSB').parent(".select").removeClass('disabled')
$("#connectBtn").attr('disabled', false);
}
}
function sendGcode(gcode) {
if (gcode) {
socket.emit('runCommand', gcode);
}
}
function feedOverride(step) {
if (socket) {
socket.emit('feedOverride', step);
$('#fro').data('slider').buff(((step - 10) * 100) / (200 - 10))
}
}
function spindleOverride(step) {
if (socket) {
socket.emit('spindleOverride', step);
$('#tro').data('slider').buff(((step - 10) * 100) / (200 - 10))
}
}
function friendlyPort(i) {
// var likely = false;
var img = 'usb.png';
var note = '';
var manufacturer = laststatus.comms.interfaces.ports[i].manufacturer
if (manufacturer == `(Standard port types)`) {
img = 'serial.png'
note = 'Motherboard Serial Port';
} else if (laststatus.comms.interfaces.ports[i].productId && laststatus.comms.interfaces.ports[i].vendorId) {
if (laststatus.comms.interfaces.ports[i].productId == '6015' && laststatus.comms.interfaces.ports[i].vendorId == '1D50') {
// found Smoothieboard
img = 'smoothieboard.png';
note = 'Smoothieware USB Port';
}
if (laststatus.comms.interfaces.ports[i].productId == '6001' && laststatus.comms.interfaces.ports[i].vendorId == '0403') {
// found FTDI FT232
img = 'usb.png';
note = 'FTDI USB to Serial';
}
if (laststatus.comms.interfaces.ports[i].productId == '6015' && laststatus.comms.interfaces.ports[i].vendorId == '0403') {
// found FTDI FT230x
img = 'usb.png';
note = 'FTDI USD to Serial';
}
if (laststatus.comms.interfaces.ports[i].productId == '606D' && laststatus.comms.interfaces.ports[i].vendorId == '1D50') {
// found TinyG G2
img = 'usb.png';
note = 'Tiny G2';
}
if (laststatus.comms.interfaces.ports[i].productId == '003D' && laststatus.comms.interfaces.ports[i].vendorId == '2341') {
// found Arduino Due Prog Port
img = 'due.png';
note = 'Arduino Due Prog';
}
if (laststatus.comms.interfaces.ports[i].productId == '0043' && laststatus.comms.interfaces.ports[i].vendorId == '2341' || laststatus.comms.interfaces.ports[i].productId == '0001' && laststatus.comms.interfaces.ports[i].vendorId == '2341' || laststatus.comms.interfaces.ports[i].productId == '0043' && laststatus.comms.interfaces.ports[i].vendorId == '2A03') {
// found Arduino Uno
img = 'uno.png';
note = 'Arduino Uno';
}
if (laststatus.comms.interfaces.ports[i].productId == '2341' && laststatus.comms.interfaces.ports[i].vendorId == '0042') {
// found Arduino Mega
img = 'mega.png';
note = 'Arduino Mega';
}
if (laststatus.comms.interfaces.ports[i].productId == '7523' && laststatus.comms.interfaces.ports[i].vendorId == '1A86') {
// found CH340
img = 'uno.png';
note = 'CH340 Arduino Fake';
}
if (laststatus.comms.interfaces.ports[i].productId == 'EA60' && laststatus.comms.interfaces.ports[i].vendorId == '10C4') {
// found CP2102
img = 'nodemcu.png';
note = 'NodeMCU';
}
if (laststatus.comms.interfaces.ports[i].productId == '2303' && laststatus.comms.interfaces.ports[i].vendorId == '067B') {
// found CP2102
// img = 'nodemcu.png';
note = 'Prolific USB to Serial';
}
} else {
img = "usb.png";
}
return {
img: img,
note: note
};
}
function escapeHTML(html) {
return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}
function msToTime(duration) {
var milliseconds = parseInt((duration % 1000) / 100),
seconds = Math.floor((duration / 1000) % 60),
minutes = Math.floor((duration / (1000 * 60)) % 60),
hours = Math.floor((duration / (1000 * 60 * 60)) % 24);
hours = (hours < 10) ? "0" + hours : hours;
minutes = (minutes < 10) ? "0" + minutes : minutes;
seconds = (seconds < 10) ? "0" + seconds : seconds;
return hours + "h" + minutes + "m";
}