var grblSettingCodes = { 0: "Step pulse time, microseconds", 1: "Step idle delay, milliseconds", 2: "Step pulse invert, mask", 3: "Step direction invert, mask", 4: "Invert step enable pin, boolean", 5: "Invert limit pins, boolean", 6: "Invert probe pin, boolean", 10: "Status report options, mask", 11: "Junction deviation, millimeters", 12: "Arc tolerance, millimeters", 13: "Report in inches, boolean", 20: "Soft limits enable, boolean", 21: "Hard limits enable, boolean", 22: "Homing cycle enable, boolean", 23: "Homing direction invert, mask", 24: "Homing locate feed rate, mm/min", 25: "Homing search seek rate, mm/min", 26: "Homing switch debounce delay, milliseconds", 27: "Homing switch pull-off distance, millimeters", 30: "Maximum spindle speed, RPM", 31: "Minimum spindle speed, RPM", 32: "Laser-mode enable, boolean", 100: "X-axis steps per millimeter", 101: "Y-axis steps per millimeter", 102: "Z-axis steps per millimeter", 110: "X-axis maximum rate, mm/min", 111: "Y-axis maximum rate, mm/min", 112: "Z-axis maximum rate, mm/min", 120: "X-axis acceleration, mm/sec^2", 121: "Y-axis acceleration, mm/sec^2", 122: "Z-axis acceleration, mm/sec^2", 130: "X-axis maximum travel, millimeters", 131: "Y-axis maximum travel, millimeters", 132: "Z-axis maximum travel, millimeters" }; function grblSettings(data) { // console.log(data) var template = `` grblconfig = data.split('\n') for (i = 0; i < grblconfig.length; i++) { var key = grblconfig[i].split('=')[0]; var param = grblconfig[i].split('=')[1] grblParams[key] = param } // $('#grblconfig').show(); // grblPopulate(); // $('#grblSaveBtn').removeAttr('disabled'); // $('#grblFirmwareBtn').removeAttr('disabled'); $('#grblSettings').show() } function grblPopulate() { $('#grblconfig').show(); $('#grblconfig').empty(); var template = `
` $('#grblconfig').append(template) setTimeout(function() { $("#val-32-input").val(parseInt(grblParams['$32'])).trigger("change"); $("#val-20-input").val(parseInt(grblParams['$20'])).trigger("change"); $("#val-21-input").val(parseInt(grblParams['$21'])).trigger("change"); $("#val-22-input").val(parseInt(grblParams['$22'])).trigger("change"); $("#val-23-input").val(parseInt(grblParams['$23'])).trigger("change"); $("#val-5-input").val(parseInt(grblParams['$5'])).trigger("change"); $("#val-6-input").val(parseInt(grblParams['$6'])).trigger("change"); $("#val-2-input").val(parseInt(grblParams['$2'])).trigger("change"); $("#val-3-input").val(parseInt(grblParams['$3'])).trigger("change"); $("#val-4-input").val(parseInt(grblParams['$4'])).trigger("change"); $("#val-10-input").val(parseInt(grblParams['$10'])).trigger("change"); }, 100);; $('#grblSettingsTable').on('keyup paste click', 'input, select', function() { checkifchanged() }); // Event Handlers for Switch Checkboxes setTimeout(function() { $('#limitsinstalled:checkbox').change(function() { enableLimits(); }); $('#xdirinvert:checkbox').change(function() { changeDirInvert(); }); $('#ydirinvert:checkbox').change(function() { changeDirInvert(); }); $('#zdirinvert:checkbox').change(function() { changeDirInvert(); }); // populare Direction Invert Checkboxes displayDirInvert() }, 100) $('#grblSettingsBadge').hide(); if (grblParams['$21'] == 1 && grblParams['$22'] == 1) { $('#limitsinstalled:checkbox').prop('checked', true); } else { $('#limitsinstalled:checkbox').prop('checked', false); } } function checkifchanged() { var hasChanged = false; for (var key in grblParams) { if (grblParams.hasOwnProperty(key)) { var j = key.substring(1) var newVal = $("#val-" + j + "-input").val(); // Only send values that changed if (parseFloat(newVal) != parseFloat(grblParams[key])) { hasChanged = true; $("#val-" + j + "-input").parent().addClass('alert') } else { $("#val-" + j + "-input").parent().removeClass('alert') } } } if (hasChanged) { $('#grblSettingsBadge').fadeIn('slow'); $('#saveBtn').attr('disabled', false).removeClass('disabled'); $('#saveBtnIcon').removeClass('fg-gray').addClass('fg-grayBlue'); } else { $('#grblSettingsBadge').fadeOut('slow'); $('#saveBtn').attr('disabled', true).addClass('disabled'); $('#saveBtnIcon').removeClass('fg-grayBlue').addClass('fg-gray'); } } function grblSaveSettings() { var commands = "" for (var key in grblParams) { if (grblParams.hasOwnProperty(key)) { var j = key.substring(1) var newVal = $("#val-" + j + "-input").val(); // Only send values that changed if (parseFloat(newVal) != parseFloat(grblParams[key])) { // console.log(key + ' was ' + grblParams[key] + ' but now, its ' + newVal); commands += key + '=' + newVal + "\n" // sendGcode(key + '=' + newVal); } } } console.log("commands", commands) socket.emit('runJob', commands); grblParams = {}; Metro.dialog.create({ title: "Configuration Updated. Reset Grbl?", content: "
Some changes in the Grbl Configuration only take effect after a restart/reset of the controller. Would you like to Reset the controller now?
", actions: [{ caption: "Yes", cls: "js-dialog-close secondary", onclick: function() { setTimeout(function() { sendGcode(String.fromCharCode(0x18)); setTimeout(function() { refreshGrblSettings() }, 1000); }, 400); } }, { caption: "Later", cls: "js-dialog-close", onclick: function() { console.log("Do nothing") refreshGrblSettings(); } } ] }); $('#grblSettingsBadge').hide(); } function refreshGrblSettings() { $('#saveBtn').attr('disabled', true).addClass('disabled'); $('#saveBtnIcon').removeClass('fg-grayBlue').addClass('fg-gray'); grblParams = {}; $('#grblconfig').empty(); $('#grblconfig').append("
Please Wait...

Requesting updated parameters from the controller firmware...
"); setTimeout(function() { sendGcode('$$'); setTimeout(function() { grblPopulate(); }, 500); }, 50); } function enableLimits() { var grblParams_lim = { $21: "0", //"Hard limits enable, boolean" $22: "0", //"Homing cycle enable, boolean" } var hasLimits = $('#limitsinstalled').is(':checked'); if (hasLimits) { grblParams_lim.$21 = "1"; //"Hard limits enable, boolean" grblParams_lim.$22 = "1"; //"Homing cycle enable, boolean" } else { grblParams_lim.$21 = "0"; //"Hard limits enable, boolean" grblParams_lim.$22 = "0"; //"Homing cycle enable, boolean" } for (var key in grblParams_lim) { if (grblParams_lim.hasOwnProperty(key)) { var j = key.substring(1) var newVal = $("#val-" + j + "-input").val(); // console.log("$" + j + " = " + newVal) $("#val-" + j + "-input").val(parseFloat(grblParams_lim[key])) } } checkifchanged(); } // Calc Grbl 1.1 Invert Masks // Call: calcDecFromMask(true, false, false) // Return: 1 function calcDecFromMask(x, y, z) { var string = "0000000" + (z ? "1" : "0") + (y ? "1" : "0") + (x ? "1" : "0"); // console.log(string) return parseInt(string, 2); } // Calc Grbl 1.1 Invert Masks // Call: calcMaskFromDec("4") // Returns: {x: false, y: false, z: true} function calcMaskFromDec(dec) { var num = parseInt(dec) num = num.toString(2) num = ("000" + num).substr(-3, 3) // console.log(num) var invertmask = { x: (num.charAt(2) == 0 ? false : true), y: (num.charAt(1) == 0 ? false : true), z: (num.charAt(0) == 0 ? false : true) } return invertmask } function changeDirInvert() { var xticked = $('#xdirinvert').is(':checked'); var yticked = $('#ydirinvert').is(':checked'); var zticked = $('#zdirinvert').is(':checked'); var value = calcDecFromMask(xticked, yticked, zticked) $("#val-3-input").val(value).trigger("change"); checkifchanged(); } function displayDirInvert() { var dir = calcMaskFromDec($("#val-3-input").val()) $('#xdirinvert:checkbox').prop('checked', dir.x); $('#ydirinvert:checkbox').prop('checked', dir.y); $('#zdirinvert:checkbox').prop('checked', dir.z); checkifchanged(); }