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"
$(document).ready(function() {
initSocket();
$("#command").inputHistory({
enter: function() {
$("#sendCommand").click();
}
});
$("form").submit(function() {
return false;
});
});
function printLog(string) {
if (document.getElementById("console") !== null) {
if (string.isString) {
// split(/\r\n|\n|\r/);
string = string.replace(/\r\n|\n|\r/, "
");
}
if ($('#console p').length > 100) {
// remove oldest if already at 300 lines
$('#console p').first().remove();
}
var template = '
';
var time = new Date();
template += '[' + (time.getHours() < 10 ? '0' : '') + time.getHours() + ":" + (time.getMinutes() < 10 ? '0' : '') + time.getMinutes() + ":" + (time.getSeconds() < 10 ? '0' : '') + time.getSeconds() + '] ';
template += string;
$('#console').append(template);
$('#console').scrollTop(($("#console")[0].scrollHeight - $("#console").height()) + 20);
}
}
function initSocket() {
socket = io.connect(server); // socket.io init
printLog("[ Websocket ] Bidirectional Websocket Interface Started")
setTimeout(function() {
populatePortsMenu();
}, 2000);
socket.on('disconnect', function() {
console.log("WEBSOCKET DISCONNECTED")
printLog("[ Websocket ] Disconnected. OpenBuilds CONTROL probably quit or crashed")
$("#websocketstatus").html("Disconnected")
});
socket.on('connect', function() {
$("#websocketstatus").html("Connected")
});
socket.on('gcodeupload', function(data) {
printLog("Received new GCODE from API")
editor.session.setValue(data);
parseGcodeInWebWorker(data)
$('#controlTab').click()
if (webgl) {
$('#gcodeviewertab').click();
} else {
$('#gcodeeditortab').click()
}
});
socket.on('gcodeupload', function(data) {
printLog("Activated window");
});
socket.on('integrationpopup', function(data) {
printLog("Integration called from " + data)
// editor.session.setValue(data);
$('#controlTab').click()
$('#consoletab').click()
// gcodeeditortab
});
socket.on('updatedata', function(data) {
// console.log(data.length, data)
var toPrint = data.response;
printLog("[ " + data.command + " ] " + toPrint + "")
});
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) {
$('#availVersion').html(data)
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);
// Parse Grbl Settings Feedback
if (data.response.indexOf('$') === 0) {
if (typeof grblSettings !== 'undefined') {
grblSettings(data.response)
var key = data.response.split('=')[0].substr(1);
var descr = grblSettingCodes[key];
toPrint = data.response + " ;" + descr
printLog("[ " + data.command + " ] " + toPrint + "")
}
} else {
printLog("[ " + data.command + " ] " + toPrint + "")
};
});
socket.on("grbl", function(data) {
showGrbl(true)
});
socket.on("prbResult", function(data) {
z0proberesult(data)
});
function showGrbl(bool) {
if (bool) {
sendGcode('$$')
sendGcode('$I')
$("#grblButtons").show()
$("#firmwarename").html('Grbl')
} else {
$("#grblButtons").hide()
$("#firmwarename").html('')
}
}
socket.on("machinename", function(data) {
if (typeof setMachineButton !== 'undefined') {
setMachineButton(data)
}
});
socket.on("queueCount", function(data) {
// calc percentage
var left = parseInt(data[0])
var total = parseInt(data[1])
var done = total - left;
var donepercent = parseInt(done / total * 100)
var progressbar = $("#progressbar").data("progress");
if (progressbar) {
progressbar.val(donepercent);
}
if (laststatus) {
if (laststatus.comms.connectionStatus == 3) {
editor.gotoLine(parseInt(data[1]) - parseInt(data[0]));
}
if (typeof object !== 'undefined' && done > 0) {
if (object.userData !== 'undefined' && object.userData.lines.length > 2) {
var timeremain = object.userData.lines[object.userData.lines.length - 1].p2.timeMinsSum - object.userData.lines[done].p2.timeMinsSum;
}
if (!isNaN(timeremain)) {
var mins_num = parseFloat(timeremain, 10); // don't forget the second param
var hours = Math.floor(mins_num / 60);
var minutes = Math.floor((mins_num - ((hours * 3600)) / 60));
var seconds = Math.floor((mins_num * 60) - (hours * 3600) - (minutes * 60));
// Appends 0 when unit is less than 10
if (hours < 10) {
hours = "0" + hours;
}
if (minutes < 10) {
minutes = "0" + minutes;
}
if (seconds < 10) {
seconds = "0" + seconds;
}
var formattedTime = hours + ':' + minutes + ':' + seconds;
console.log('Remaining time: ', formattedTime)
// output formattedTime to UI here
$('#timeRemaining').html(" / " + formattedTime);
}
} else {
$('#timeRemaining').empty();
}
}
$('#gcodesent').html("Job Queue: " + parseInt(data[0]));
})
socket.on('toastErrorAlarm', function(data) {
console.log("toast", data)
// toast(" " + data, null, 2300, "bg-red fg-white");
Metro.dialog.create({
clsDialog: 'dark',
title: " Grbl Alarm:",
content: " " + 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() {
//
}
}
]
});
//
});
socket.on('toastError', function(data) {
// console.log("toast", data)
// toast(" " + data, null, 2300, "bg-red fg-white");
Metro.dialog.create({
title: " Grbl Error:",
content: " " + data,
clsDialog: 'dark'
});
//
});
socket.on('toastSuccess', function(data) {
console.log("toast", data)
toast(" " + data, null, 2300, "bg-green fg-white");
//
});
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('[31mflash complete.[39m', " FLASH FAILED! ");
string = string.replace('[32m', " ");
string = string.replace('[39m', "");
printLog("[ Firmware Upgrade ] " + string)
// $('#sendCommand').click();
}
});
socket.on('status', function(status) {
if (nostatusyet) {
$('#windowtitle').html("OpenBuilds CONTROL v" + status.driver.version)
if (status.driver.operatingsystem == "rpi") {
$('#windowtitlebar').hide();
}
}
nostatusyet = false;
// if (!_.isEqual(status, laststatus)) {
if (laststatus !== undefined) {
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].comName + "]"
}
if (!status.comms.interfaces.ports.length) {
string += "[ No devices connected ]"
}
printLog(string)
laststatus.comms.interfaces.ports = status.comms.interfaces.ports;
populatePortsMenu();
}
}
$('#runStatus').html("Controller: " + status.comms.runStatus);
if (unit == "mm") {
var xpos = status.machine.position.work.x + unit;
var ypos = status.machine.position.work.y + unit;
var zpos = status.machine.position.work.z + unit;
} else if (unit == "in") {
var xpos = (status.machine.position.work.x / 25.4).toFixed(2) + unit;
var ypos = (status.machine.position.work.y / 25.4).toFixed(2) + unit;
var zpos = (status.machine.position.work.z / 25.4).toFixed(2) + unit;
}
if ($('#xPos').html() != xpos) {
$('#xPos').html(xpos);
}
if ($('#yPos').html() != ypos) {
$('#yPos').html(ypos);
}
if ($('#zPos').html() != zpos) {
$('#zPos').html(zpos);
}
if (webgl) {
if (!isJogWidget) {
if (!simRunning) {
if (object) {
if (object.userData.inch) {
cone.position.x = status.machine.position.work.x * 0.0393701
cone.position.y = status.machine.position.work.y * 0.0393701
cone.position.z = (parseFloat(status.machine.position.work.z * 0.0393701) + 20)
} else {
cone.position.x = status.machine.position.work.x
cone.position.y = status.machine.position.work.y
cone.position.z = (parseFloat(status.machine.position.work.z) + 20)
}
}
}
}
}
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)
}
}
// Grbl Pins Input Status
$('.pinstatus').removeClass('alert').addClass('success').html('OFF')
$('#holdpin').html('HOLD: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('ON')
break;
case 'Y':
// console.log('PIN: Y-LIMIT');
$('#ypin').removeClass('success').addClass('alert').html('ON')
break;
case 'Z':
// console.log('PIN: Z-LIMIT');
$('#zpin').removeClass('success').addClass('alert').html('ON')
break;
case 'P':
// console.log('PIN: PROBE');
$('#prbpin').removeClass('success').addClass('alert').html('ON')
break;
case 'D':
// console.log('PIN: DOOR');
$('#doorpin').removeClass('success').addClass('alert').html('ON')
break;
case 'H':
// console.log('PIN: HOLD');
$('#holdpin').removeClass('success').addClass('alert').html('HOLD: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)
}
laststatus = status;
});
socket.on('features', function(data) {
console.log('FEATURES', data)
for (i=0; i