diff options
author | Sineos <monk@gmx.net> | 2019-06-14 08:18:56 +0300 |
---|---|---|
committer | Scott Lahteine <thinkyhead@users.noreply.github.com> | 2019-06-14 08:18:56 +0300 |
commit | 7d63880900c78f805afb54db33075b4c20ae0da8 (patch) | |
tree | 842ebacc27fe5e9df049ba9818f5f375a017e29e /_tools | |
parent | c801db3de14e9c9376013cd3a3ec132b51e0967a (diff) |
Linear Advance Calibration - Catch NaN (#221)
Diffstat (limited to '_tools')
-rw-r--r-- | _tools/lin_advance/k-factor.html | 61 | ||||
-rw-r--r-- | _tools/lin_advance/k-factor.js | 83 |
2 files changed, 94 insertions, 50 deletions
diff --git a/_tools/lin_advance/k-factor.html b/_tools/lin_advance/k-factor.html index 85be69d1..be338231 100644 --- a/_tools/lin_advance/k-factor.html +++ b/_tools/lin_advance/k-factor.html @@ -31,32 +31,32 @@ category: [ tools ] </tr> <tr> <td><label for="FIL_DIA">Filament Diameter:</label></td> - <td><input name="FIL_DIA" type="number" id="FIL_DIA" step="any" value="1.75" /></td> + <td><input name="FIL_DIA" id="FIL_DIA" step="any" value="1.75" onblur="validateInput()" /></td> <td>Diameter of the used filament (mm)</td> </tr> <tr> <td><label for="NOZ_DIA">Nozzle Diameter:</label></td> - <td><input name="NOZ_DIA" type="number" id="NOZ_DIA" step="any" value="0.4" /></td> + <td><input name="NOZ_DIA" id="NOZ_DIA" step="any" value="0.4" onblur="validateInput()" /></td> <td>Diameter of the nozzle (mm)</td> </tr> <tr> <td><label for="NOZZLE_TEMP">Nozzle Temperature:</label></td> - <td><input name="NOZZLE_TEMP" type="number" id="NOZZLE_TEMP" step="any" value="205" /></td> + <td><input name="NOZZLE_TEMP" id="NOZZLE_TEMP" step="any" value="205" onblur="validateInput()" /></td> <td>Nozzle Temperature (°C)</td> </tr> <tr> <td><label for="BED_TEMP">Bed Temperature:</label></td> - <td><input name="BED_TEMP" type="number" id="BED_TEMP" step="any" value="60" /></td> + <td><input name="BED_TEMP" id="BED_TEMP" step="any" value="60" onblur="validateInput()" /></td> <td>Bed Temperature (°C)</td> </tr> <tr> <td><label for="RETRACTION">Retraction Distance:</label></td> - <td><input name="RETRACTION" type="number" id="RETRACTION" step="any" value="1" /></td> + <td><input name="RETRACTION" id="RETRACTION" step="any" value="1" onblur="validateInput()" /></td> <td>Retraction distance (mm)</td> </tr> <tr> <td><label for="LAYER_HEIGHT">Layer Height:</label></td> - <td><input name="LAYER_HEIGHT" type="number" id="LAYER_HEIGHT" step="0.1" value="0.2" /></td> + <td><input name="LAYER_HEIGHT" id="LAYER_HEIGHT" step="0.1" value="0.2" onblur="validateInput()" /></td> <td>Layer Height (mm)</td> </tr> <tr> @@ -72,12 +72,12 @@ category: [ tools ] </tr> <tr> <td><label for="BEDSIZE_X">Bed Size X:</label></td> - <td><input name="BEDSIZE_X" type="number" id="BEDSIZE_X" step="any" value="200" /></td> + <td><input name="BEDSIZE_X" id="BEDSIZE_X" step="any" value="200" onblur="validateInput()" /></td> <td id="shape">Size (mm) of the bed in X</td> </tr> <tr> <td><label for="BEDSIZE_Y">Bed Size Y:</label></td> - <td><input name="BEDSIZE_Y" type="number" id="BEDSIZE_Y" step="any" value="200" /></td> + <td><input name="BEDSIZE_Y" id="BEDSIZE_Y" step="any" value="200" onblur="validateInput()" /></td> <td>Size (mm) of the bed in Y</td> </tr> <tr> @@ -95,47 +95,47 @@ category: [ tools ] </tr> <tr> <td><label for="SLOW_SPEED">Slow Printing Speed:</label></td> - <td><input name="SLOW_SPEED" type="number" id="SLOW_SPEED" step="any" value="20" /></td> + <td><input name="SLOW_SPEED" id="SLOW_SPEED" step="any" value="20" onblur="validateInput()" /></td> <td>Slow printing speed</td> </tr> <tr> <td><label for="FAST_SPEED">Fast Printing Speed:</label></td> - <td><input name="FAST_SPEED" type="number" id="FAST_SPEED" step="any" value="70" /></td> + <td><input name="FAST_SPEED" id="FAST_SPEED" step="any" value="70" onblur="validateInput()" /></td> <td>Fast printing speed. This should differ noticeably from Slow Speed</td> </tr> <tr> <td><label for="MOVE_SPEED">Movement Speed:</label></td> - <td><input name="MOVE_SPEED" type="number" id="MOVE_SPEED" step="any" value="120" /></td> + <td><input name="MOVE_SPEED" id="MOVE_SPEED" step="any" value="120" onblur="validateInput()" /></td> <td>Movement speed</td> </tr> <tr> <td><label for="RETRACT_SPEED">Retract Speed:</label></td> - <td><input name="RETRACT_SPEED" type="number" id="RETRACT_SPEED" step="any" value="30" /></td> + <td><input name="RETRACT_SPEED" id="RETRACT_SPEED" step="any" value="30" onblur="validateInput()" /></td> <td>Retract Speed of the extruder</td> </tr> <tr> <td><label for="PRINT_ACCL">Acceleration:</label></td> - <td><input name="PRINT_ACCL" type="number" id="PRINT_ACCL" step="any" value="500" /></td> + <td><input name="PRINT_ACCL" id="PRINT_ACCL" step="any" value="500" onblur="validateInput()" /></td> <td>Set printing acceleration (mm/s^2)</td> </tr> <tr> <td><label for="X_JERK">Jerk X:</label></td> - <td><input name="X_JERK" type="number" id="X_JERK" step="1" value="-1" /></td> + <td><input name="X_JERK" id="X_JERK" step="1" value="-1" onblur="validateInput()" /></td> <td>Set the Jerk for the X-axis. -1 to use firmware default</td> </tr> <tr> <td><label for="Y_JERK">Jerk Y:</label></td> - <td><input name="Y_JERK" type="number" id="Y_JERK" step="1" value="-1" /></td> + <td><input name="Y_JERK" id="Y_JERK" step="1" value="-1" onblur="validateInput()" /></td> <td>Set the Jerk for the Y-axis. -1 to use firmware default</td> </tr> <tr> <td><label for="Z_JERK">Jerk Z:</label></td> - <td><input name="Z_JERK" type="number" id="Z_JERK" step="1" value="-1" /></td> + <td><input name="Z_JERK" id="Z_JERK" step="1" value="-1" onblur="validateInput()" /></td> <td>Set the Jerk for the Z-axis. -1 to use firmware default</td> </tr> <tr> <td><label for="E_JERK">Jerk E:</label></td> - <td><input name="E_JERK" type="number" id="E_JERK" step="1" value="-1" /></td> + <td><input name="E_JERK" id="E_JERK" step="1" value="-1" onblur="validateInput()" /></td> <td>Set the Jerk for the Extruder. -1 to use firmware default</td> </tr> <tr> @@ -159,32 +159,32 @@ category: [ tools ] </tr> <tr> <td><label for="K_START">Starting Value for K:</label></td> - <td><input name="K_START" type="number" id="K_START" step="any" value="0" onblur="validateInput()" /></td> + <td><input name="K_START" id="K_START" step="any" value="0" onblur="validateInput()" /></td> <td id="start_factor">Starting value for the K-factor. Usually 0 but for bowden setups you might want to start higher, e.g. 30</td> </tr> <tr> <td><label for="K_END">Ending Value for K:</label></td> - <td><input name="K_END" type="number" id="K_END" step="any" value="2" onblur="validateInput()" /></td> + <td><input name="K_END" id="K_END" step="any" value="2" onblur="validateInput()" /></td> <td id="end_factor">Ending value of the K-factor. Bowden setups may be higher than 100</td> </tr> <tr> <td><label for="K_STEP">K-factor Stepping:</label></td> - <td><input name="K_STEP" type="number" id="K_STEP" step="any" value="0.2" onblur="validateInput()" /></td> + <td><input name="K_STEP" id="K_STEP" step="any" value="0.2" onblur="validateInput()" /></td> <td id="step_factor">Stepping of the K-factor in the test pattern. Needs to be an exact divisor of the K-factor Range (End - Start)</td> </tr> <tr> <td><label for="SLOW_LENGTH">Slow Speed Length:</label></td> - <td><input name="SLOW_LENGTH" type="number" id="SLOW_LENGTH" step="1" value="20" onblur="validateInput()" /></td> + <td><input name="SLOW_LENGTH" id="SLOW_LENGTH" step="1" value="20" onblur="validateInput()" /></td> <td>Length of the Slow Speed test-line (mm)</td> </tr> <tr> <td><label for="FAST_LENGTH">Fast Speed Length:</label></td> - <td><input name="FAST_LENGTH" type="number" id="FAST_LENGTH" step="1" value="40" onblur="validateInput()" /></td> + <td><input name="FAST_LENGTH" id="FAST_LENGTH" step="1" value="40" onblur="validateInput()" /></td> <td>Length of the Fast Speed test-line (mm)</td> </tr> <tr> <td><label for="SPACE_LINE">Test Line Spacing:</label></td> - <td><input name="SPACE_LINE" type="number" id="SPACE_LINE" step="0.1" value="5" onblur="validateInput()" /></td> + <td><input name="SPACE_LINE" id="SPACE_LINE" step="0.1" value="5" onblur="validateInput()" /></td> <td>Distance between the test lines. This will impact print size</td> </tr> <tr> @@ -216,12 +216,12 @@ category: [ tools ] </tr> <tr> <td><label for="NOZ_LIN_R">Nozzle Line Ratio:</label></td> - <td><input name="NOZ_LIN_R" type="number" id="NOZ_LIN_R" step="0.1" value="1.2" /></td> + <td><input name="NOZ_LIN_R" id="NOZ_LIN_R" step="0.1" value="1.2" onblur="validateInput()" /></td> <td>Ratio between extruded line width and nozzle diameter. Should be between 1.05 and 1.2</td> </tr> <tr> <td><label for="OFFSET_Z">Z-Offset:</label></td> - <td><input name="OFFSET_Z" type="number" id="OFFSET_Z" step="any" value="0" /></td> + <td><input name="OFFSET_Z" id="OFFSET_Z" step="any" value="0" onblur="validateInput()" /></td> <td>Offset the Z-axis for manual Layer adjustment</td> </tr> <tr> @@ -243,7 +243,7 @@ category: [ tools ] </tr> <tr> <td><label for="EXTRUSION_MULT">Extrusion Multiplier:</label></td> - <td><input name="EXTRUSION_MULT" type="number" id="EXTRUSION_MULT" step="0.1" value="1.0" /></td> + <td><input name="EXTRUSION_MULT" id="EXTRUSION_MULT" step="0.1" value="1.0" onblur="validateInput()" /></td> <td>Usually 1.0</td> </tr> <tr> @@ -253,17 +253,17 @@ category: [ tools ] </tr> <tr> <td><label for="PRIME_EXT">Prime Extrusion Multiplier:</label></td> - <td><input name="PRIME_EXT" type="number" id="PRIME_EXT" step="0.1" value="2.5" /></td> + <td><input name="PRIME_EXT" id="PRIME_EXT" step="0.1" value="2.5" onblur="validateInput()" /></td> <td>The default of 2.5 results in roughly 1mm of filament for 10mm line length</td> </tr> <tr> <td height="24"><label for="PRIME_SPEED">Prime Printing Speed:</label></td> - <td><input name="PRIME_SPEED" type="number" id="PRIME_SPEED" step="any" value="30" /></td> + <td><input name="PRIME_SPEED" id="PRIME_SPEED" step="any" value="30" onblur="validateInput()" /></td> <td>Speed of the prime move</td> </tr> <tr> <td><label for="DWELL_PRIME">Dwell Time:</label></td> - <td><input name="DWELL_PRIME" type="number" id="DWELL_PRIME" step="0.1" value="2" /></td> + <td><input name="DWELL_PRIME" id="DWELL_PRIME" step="0.1" value="2" onblur="validateInput()" /></td> <td>Inserts a pause of x seconds before starting the test pattern to bleed off any residual nozzle pressure</td> </tr> <tr class="calibpat2"> @@ -272,7 +272,8 @@ category: [ tools ] <input name="button3" type="button" id="button3" onclick="setLocalStorage()" value="Save as default" /> </p> <p id="warning1" style="display: none;">warning</p> - <p id="warning2" style="display: none;">warning</p></td> + <p id="warning2" style="display: none;">warning</p> + <p id="warning3" style="display: none;">warning</p></td> <td><p> <input name="button2" type="button" id="button2" onclick="saveTextAsFile()" value="Download as file" /> </p></td> diff --git a/_tools/lin_advance/k-factor.js b/_tools/lin_advance/k-factor.js index 02df0bc2..ef722f5a 100644 --- a/_tools/lin_advance/k-factor.js +++ b/_tools/lin_advance/k-factor.js @@ -1,6 +1,6 @@ /** * K-Factor Calibration Pattern - * Copright (C) 2018 Sineos [https://github.com/Sineos] + * Copyright (C) 2019 Sineos [https://github.com/Sineos] * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -184,7 +184,7 @@ function genGcode() { 'M190 S' + BED_TEMP + ' ; set bed temperature and wait\n' + 'M109 S' + NOZZLE_TEMP + ' ; block waiting for nozzle temp\n' + 'G28 ; home all axes with heated bed\n' + - (BED_LEVELING != "0" ? BED_LEVELING + '; Activate bed leveling compensation\n' : '') + + (BED_LEVELING !== '0' ? BED_LEVELING + '; Activate bed leveling compensation\n' : '') + 'G21 ; set units to millimeters\n' + 'M204 P' + ACCELERATION + ' ; set acceleration\n' + (JERK_X !== -1 ? 'M205 X' + JERK_X + ' ; set X jerk\n' : '') + @@ -908,39 +908,81 @@ function toggleRetract() { // sanity checks for pattern / bed size function validateInput() { - var selectShape = document.getElementById('SHAPE_BED'), + var testNaN = { + // do not use parseInt or parseFloat for validating, since both + // functions will have special parsing characteristics leading to + // false numeric validation + BEDSIZE_X: document.getElementById('BEDSIZE_X').value, + BEDSIZE_Y: document.getElementById('BEDSIZE_Y').value, + K_START: document.getElementById('K_START').value, + K_END: document.getElementById('K_END').value, + K_STEP: document.getElementById('K_STEP').value, + SPACE_LINE: document.getElementById('SPACE_LINE').value, + SLOW_SPEED: document.getElementById('SLOW_SPEED').value, + FAST_SPEED: document.getElementById('FAST_SPEED').value, + SLOW_LENGTH: document.getElementById('SLOW_LENGTH').value, + FAST_LENGTH: document.getElementById('FAST_LENGTH').value, + FIL_DIA: document.getElementById('FIL_DIA').value, + NOZ_DIA: document.getElementById('NOZ_DIA').value, + NOZ_LIN_R: document.getElementById('NOZ_LIN_R').value, + LAYER_HEIGHT: document.getElementById('LAYER_HEIGHT').value, + EXTRUSION_MULT: document.getElementById('EXTRUSION_MULT').value, + PRIME_EXT: document.getElementById('PRIME_EXT').value, + OFFSET_Z: document.getElementById('OFFSET_Z').value, + X_JERK: document.getElementById('X_JERK').value, + Y_JERK: document.getElementById('Y_JERK').value, + Z_JERK: document.getElementById('Z_JERK').value, + E_JERK: document.getElementById('E_JERK').value, + NOZZLE_TEMP: document.getElementById('NOZZLE_TEMP').value, + BED_TEMP: document.getElementById('BED_TEMP').value, + MOVE_SPEED: document.getElementById('MOVE_SPEED').value, + RETRACT_SPEED: document.getElementById('RETRACT_SPEED').value, + PRINT_ACCL: document.getElementById('PRINT_ACCL').value, + RETRACTION: document.getElementById('RETRACTION').value, + PRIME_SPEED: document.getElementById('PRIME_SPEED').value, + DWELL_PRIME: document.getElementById('DWELL_PRIME').value + }, + selectShape = document.getElementById('SHAPE_BED'), bedShape = selectShape.options[selectShape.selectedIndex].value, - bedX = parseInt(document.getElementById('BEDSIZE_X').value), - bedY = parseInt(document.getElementById('BEDSIZE_Y').value), - kStart = parseFloat(document.getElementById('K_START').value), - kEnd = parseFloat(document.getElementById('K_END').value), - kStep = parseFloat(document.getElementById('K_STEP').value), selectDir = document.getElementById('DIR_PRINT'), printDir = selectDir.options[selectDir.selectedIndex].value, - lineSpacing = parseFloat(document.getElementById('SPACE_LINE').value), usePrime = document.getElementById('PRIME').checked, - lengthSlow = parseFloat(document.getElementById('SLOW_LENGTH').value), - lengthFast = parseFloat(document.getElementById('FAST_LENGTH').value), useLineNo = document.getElementById('LINE_NO').checked, - sizeY = ((kEnd - kStart) / kStep * lineSpacing) + 25, // +25 with ref marking - sizeX = (2 * lengthSlow) + lengthFast + (usePrime ? 10 : 0) + (useLineNo ? 8 : 0), + sizeY = ((parseFloat(testNaN['K_END']) - parseFloat(testNaN['K_START'])) / parseFloat(testNaN['K_STEP']) * parseFloat(testNaN['SPACE_LINE'])) + 25, // +25 with ref marking + sizeX = (2 * parseFloat(testNaN['SLOW_LENGTH'])) + parseFloat(testNaN['FAST_LENGTH']) + (usePrime ? 10 : 0) + (useLineNo ? 8 : 0), printDirRad = printDir * Math.PI / 180, fitWidth = Math.round10(Math.abs(sizeX * Math.cos(printDirRad)) + Math.abs(sizeY * Math.sin(printDirRad)), 0), fitHeight = Math.round10(Math.abs(sizeX * Math.sin(printDirRad)) + Math.abs(sizeY * Math.cos(printDirRad)), 0), - decimals = getDecimals(kStep), + decimals = getDecimals(parseFloat(testNaN['K_STEP'])), invalidDiv = 0; //Start clean - $('#K_START, #K_END, #K_STEP, #SPACE_LINE, #SLOW_LENGTH, #FAST_LENGTH').each(function() { + $('#K_START, #K_END, #K_STEP, #SPACE_LINE, #SLOW_LENGTH, #FAST_LENGTH, #FIL_DIA, #NOZ_DIA, #LAYER_HEIGHT, #EXTRUSION_MULT, #PRIME_EXT, #OFFSET_Z, #NOZ_LIN_R, \ + #NOZZLE_TEMP, #BED_TEMP, #MOVE_SPEED, #RETRACT_SPEED, #PRINT_ACCL, #RETRACTION, #PRIME_SPEED, #DWELL_PRIME, #FAST_SPEED, #SLOW_SPEED, #X_JERK, #Y_JERK, #Z_JERK, #E_JERK').each(function() { $(this)[0].setCustomValidity(''); $('label[for=' + $(this).attr('id') + ']').removeClass('calibpat_invalidSize'); $('label[for=' + $(this).attr('id') + ']').removeClass('calibpat_invalidDiv'); + $('label[for=' + $(this).attr('id') + ']').removeClass('calibpat_invalidNumber'); }); $('#warning1').hide(); $('#warning2').hide(); + $('#warning3').hide(); + $('#button').prop('disabled', false); + + // Check for proper numerical values + Object.keys(testNaN).forEach(function(k) { + if ((isNaN(testNaN[k]) && !isFinite(testNaN[k])) || testNaN[k].trim().length === 0) { + $('label[for=' + k + ']').addClass('calibpat_invalidNumber'); + $('#' + k)[0].setCustomValidity('The value is not a proper number.'); + $('#warning3').text('Some values are not proper numbers. Check highlighted Settings.'); + $('#warning3').addClass('calibpat_invalidNumber'); + $('#warning3').show(); + $('#button').prop('disabled', true); + } + }); // Check if K-Factor Stepping is a multiple of the K-Factor Range - if ((Math.round10(kEnd - kStart, -3) * Math.pow(10, decimals)) % (kStep * Math.pow(10, decimals)) !== 0) { + if ((Math.round10(parseFloat(testNaN['K_END']) - parseFloat(testNaN['K_START']), -3) * Math.pow(10, decimals)) % (parseFloat(testNaN['K_STEP']) * Math.pow(10, decimals)) !== 0) { $('label[for=K_START]').addClass('calibpat_invalidDiv'); $('#K_START')[0].setCustomValidity('Your K-Factor range cannot be cleanly divided.'); $('label[for=K_END]').addClass('calibpat_invalidDiv'); @@ -950,11 +992,12 @@ function validateInput() { $('#warning1').text('Your K-Factor range cannot be cleanly divided. Check highlighted Pattern Settings.'); $('#warning1').addClass('calibpat_invalidDiv'); $('#warning1').show(); + $('#button').prop('disabled', true); invalidDiv = 1; } // Check if pattern settings exceed bed size - if (bedShape === 'Round' && (Math.sqrt(Math.pow(fitWidth, 2) + Math.pow(fitHeight, 2)) > bedX - 5) && fitHeight > fitWidth) { + if (bedShape === 'Round' && (Math.sqrt(Math.pow(fitWidth, 2) + Math.pow(fitHeight, 2)) > (parseInt(testNaN['BEDSIZE_X']) - 5)) && fitHeight > fitWidth) { $('label[for=K_START]').addClass('calibpat_invalidSize'); $('#K_START')[0].setCustomValidity('Your Pattern size (x: ' + fitWidth + ', y: ' + fitHeight + ') exceeds your bed\'s diameter.'); $('label[for=K_END]').addClass('calibpat_invalidSize'); @@ -968,7 +1011,7 @@ function validateInput() { $((invalidDiv ? '#warning2' : '#warning1')).show(); } - if (bedShape === 'Round' && (Math.sqrt(Math.pow(fitWidth, 2) + Math.pow(fitHeight, 2)) > bedX - 5) && fitWidth > fitHeight) { + if (bedShape === 'Round' && (Math.sqrt(Math.pow(fitWidth, 2) + Math.pow(fitHeight, 2)) > (parseInt(testNaN['BEDSIZE_X']) - 5)) && fitWidth > fitHeight) { $('label[for=SLOW_LENGTH]').addClass('calibpat_invalidSize'); $('#SLOW_LENGTH')[0].setCustomValidity('Your Pattern size (x: ' + fitWidth + ', y: ' + fitHeight + ') exceeds your bed\'s diameter.'); $('label[for=FAST_LENGTH]').addClass('calibpat_invalidSize'); @@ -978,7 +1021,7 @@ function validateInput() { $((invalidDiv ? '#warning2' : '#warning1')).show(); } - if (bedShape === 'Rect' && fitWidth > bedX - 5) { + if (bedShape === 'Rect' && fitWidth > (parseInt(testNaN['BEDSIZE_X']) - 5)) { $('label[for=SLOW_LENGTH]').addClass('calibpat_invalidSize'); $('#SLOW_LENGTH')[0].setCustomValidity('Your Pattern size (x: ' + fitWidth + ', y: ' + fitHeight + ') exceeds your X bed size.'); $('label[for=FAST_LENGTH]').addClass('calibpat_invalidSize'); @@ -988,7 +1031,7 @@ function validateInput() { $((invalidDiv ? '#warning2' : '#warning1')).show(); } - if (bedShape === 'Rect' && fitHeight > bedY - 5) { + if (bedShape === 'Rect' && fitHeight > (parseInt(testNaN['BEDSIZE_Y']) - 5)) { $('label[for=K_START]').addClass('calibpat_invalidSize'); $('#K_START')[0].setCustomValidity('Your Pattern size (x: ' + fitWidth + ', y: ' + fitHeight + ') exceeds your Y bed size.'); $('label[for=K_END]').addClass('calibpat_invalidSize'); |