diff options
author | David Crocker <dcrocker@eschertech.com> | 2016-03-11 21:03:41 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2016-03-11 21:03:41 +0300 |
commit | 8d99d640b847847da077f7f5b7c9c75d223dae9a (patch) | |
tree | 0d91cf60a5cfdfda3de991680c62146f73eac3cd /SD-image | |
parent | 206f85c69039d87813a58e5ac192576e407d0910 (diff) |
Version 1.09x-beta3
Merged in chrishamm's changes to Network, PrintMonitor, and his support
for firmware updates from SD card
Fixed print monitor issue that threw out the layer count and time
estimates when there was an initial extruder priming move in the start
gcode
Diffstat (limited to 'SD-image')
-rw-r--r-- | SD-image/sys-CoreXY/iap.bin | bin | 0 -> 30280 bytes | |||
-rw-r--r-- | SD-image/sys-Fisher/iap.bin | bin | 0 -> 30280 bytes | |||
-rw-r--r-- | SD-image/sys-Huxley/iap.bin | bin | 0 -> 30280 bytes | |||
-rw-r--r-- | SD-image/sys-MiniKossel/iap.bin | bin | 0 -> 30280 bytes | |||
-rw-r--r-- | SD-image/sys-Ormerod1/iap.bin | bin | 0 -> 30280 bytes | |||
-rw-r--r-- | SD-image/sys-Ormerod2/iap.bin | bin | 0 -> 30280 bytes | |||
-rw-r--r-- | SD-image/www/.gitattributes | 22 | ||||
-rw-r--r-- | SD-image/www/css/defaults.css | 1 | ||||
-rw-r--r-- | SD-image/www/js/jquery.autosize.js | 274 | ||||
-rw-r--r-- | SD-image/www/js/jquery.autosize.min.js | 6 | ||||
-rw-r--r-- | SD-image/www/js/jquery.textarea_autosize.js | 54 | ||||
-rw-r--r-- | SD-image/www/js/jquery.textarea_autosize.min.js | 1 | ||||
-rw-r--r-- | SD-image/www/js/model.js | 197 | ||||
-rw-r--r-- | SD-image/www/js/viewmodel.js | 17 | ||||
-rw-r--r-- | SD-image/www/language.xml | 23 | ||||
-rw-r--r-- | SD-image/www/reprap.htm | 255 |
16 files changed, 352 insertions, 498 deletions
diff --git a/SD-image/sys-CoreXY/iap.bin b/SD-image/sys-CoreXY/iap.bin Binary files differnew file mode 100644 index 00000000..f7949880 --- /dev/null +++ b/SD-image/sys-CoreXY/iap.bin diff --git a/SD-image/sys-Fisher/iap.bin b/SD-image/sys-Fisher/iap.bin Binary files differnew file mode 100644 index 00000000..f7949880 --- /dev/null +++ b/SD-image/sys-Fisher/iap.bin diff --git a/SD-image/sys-Huxley/iap.bin b/SD-image/sys-Huxley/iap.bin Binary files differnew file mode 100644 index 00000000..f7949880 --- /dev/null +++ b/SD-image/sys-Huxley/iap.bin diff --git a/SD-image/sys-MiniKossel/iap.bin b/SD-image/sys-MiniKossel/iap.bin Binary files differnew file mode 100644 index 00000000..f7949880 --- /dev/null +++ b/SD-image/sys-MiniKossel/iap.bin diff --git a/SD-image/sys-Ormerod1/iap.bin b/SD-image/sys-Ormerod1/iap.bin Binary files differnew file mode 100644 index 00000000..f7949880 --- /dev/null +++ b/SD-image/sys-Ormerod1/iap.bin diff --git a/SD-image/sys-Ormerod2/iap.bin b/SD-image/sys-Ormerod2/iap.bin Binary files differnew file mode 100644 index 00000000..f7949880 --- /dev/null +++ b/SD-image/sys-Ormerod2/iap.bin diff --git a/SD-image/www/.gitattributes b/SD-image/www/.gitattributes deleted file mode 100644 index 412eeda7..00000000 --- a/SD-image/www/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/SD-image/www/css/defaults.css b/SD-image/www/css/defaults.css index 687547c3..ba4e3458 100644 --- a/SD-image/www/css/defaults.css +++ b/SD-image/www/css/defaults.css @@ -978,6 +978,7 @@ label[for="dropdown_language"] { #text_config { background-color: inherit; border: 0px; + margin-bottom: 15px; min-height: 200px; resize: none; width: 100%; diff --git a/SD-image/www/js/jquery.autosize.js b/SD-image/www/js/jquery.autosize.js deleted file mode 100644 index 4a7bc8fd..00000000 --- a/SD-image/www/js/jquery.autosize.js +++ /dev/null @@ -1,274 +0,0 @@ -/*! - Autosize 1.18.13 - license: MIT - http://www.jacklmoore.com/autosize -*/ -(function ($) { - var - defaults = { - className: 'autosizejs', - id: 'autosizejs', - append: '\n', - callback: false, - resizeDelay: 10, - placeholder: true - }, - - // border:0 is unnecessary, but avoids a bug in Firefox on OSX - copy = '<textarea tabindex="-1" style="position:absolute; top:-999px; left:0; right:auto; bottom:auto; border:0; padding: 0; -moz-box-sizing:content-box; -webkit-box-sizing:content-box; box-sizing:content-box; word-wrap:break-word; height:0 !important; min-height:0 !important; overflow:hidden; transition:none; -webkit-transition:none; -moz-transition:none;"/>', - - // line-height is conditionally included because IE7/IE8/old Opera do not return the correct value. - typographyStyles = [ - 'fontFamily', - 'fontSize', - 'fontWeight', - 'fontStyle', - 'letterSpacing', - 'textTransform', - 'wordSpacing', - 'textIndent', - 'whiteSpace' - ], - - // to keep track which textarea is being mirrored when adjust() is called. - mirrored, - - // the mirror element, which is used to calculate what size the mirrored element should be. - mirror = $(copy).data('autosize', true)[0]; - - // test that line-height can be accurately copied. - mirror.style.lineHeight = '99px'; - if ($(mirror).css('lineHeight') === '99px') { - typographyStyles.push('lineHeight'); - } - mirror.style.lineHeight = ''; - - $.fn.autosize = function (options) { - if (!this.length) { - return this; - } - - options = $.extend({}, defaults, options || {}); - - if (mirror.parentNode !== document.body) { - $(document.body).append(mirror); - } - - return this.each(function () { - var - ta = this, - $ta = $(ta), - maxHeight, - minHeight, - boxOffset = 0, - callback = $.isFunction(options.callback), - originalStyles = { - height: ta.style.height, - overflow: ta.style.overflow, - overflowY: ta.style.overflowY, - wordWrap: ta.style.wordWrap, - resize: ta.style.resize - }, - timeout, - width = $ta.width(), - taResize = $ta.css('resize'); - - if ($ta.data('autosize')) { - // exit if autosize has already been applied, or if the textarea is the mirror element. - return; - } - $ta.data('autosize', true); - - if ($ta.css('box-sizing') === 'border-box' || $ta.css('-moz-box-sizing') === 'border-box' || $ta.css('-webkit-box-sizing') === 'border-box'){ - boxOffset = $ta.outerHeight() - $ta.height(); - } - - // IE8 and lower return 'auto', which parses to NaN, if no min-height is set. - minHeight = Math.max(parseInt($ta.css('minHeight'), 10) - boxOffset || 0, $ta.height()); - - $ta.css({ - overflow: 'hidden', - overflowY: 'hidden', - wordWrap: 'break-word' // horizontal overflow is hidden, so break-word is necessary for handling words longer than the textarea width - }); - - if (taResize === 'vertical') { - $ta.css('resize','none'); - } else if (taResize === 'both') { - $ta.css('resize', 'horizontal'); - } - - // The mirror width must exactly match the textarea width, so using getBoundingClientRect because it doesn't round the sub-pixel value. - // window.getComputedStyle, getBoundingClientRect returning a width are unsupported, but also unneeded in IE8 and lower. - function setWidth() { - var width; - var style = window.getComputedStyle ? window.getComputedStyle(ta, null) : false; - - if (style) { - - width = ta.getBoundingClientRect().width; - - if (width === 0 || typeof width !== 'number') { - width = parseInt(style.width,10); - } - - $.each(['paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth'], function(i,val){ - width -= parseInt(style[val],10); - }); - } else { - width = $ta.width(); - } - - mirror.style.width = Math.max(width,0) + 'px'; - } - - function initMirror() { - var styles = {}; - - mirrored = ta; - mirror.className = options.className; - mirror.id = options.id; - maxHeight = parseInt($ta.css('maxHeight'), 10); - - // mirror is a duplicate textarea located off-screen that - // is automatically updated to contain the same text as the - // original textarea. mirror always has a height of 0. - // This gives a cross-browser supported way getting the actual - // height of the text, through the scrollTop property. - $.each(typographyStyles, function(i,val){ - styles[val] = $ta.css(val); - }); - - $(mirror).css(styles).attr('wrap', $ta.attr('wrap')); - - setWidth(); - - // Chrome-specific fix: - // When the textarea y-overflow is hidden, Chrome doesn't reflow the text to account for the space - // made available by removing the scrollbar. This workaround triggers the reflow for Chrome. - if (window.chrome) { - var width = ta.style.width; - ta.style.width = '0px'; - var ignore = ta.offsetWidth; - ta.style.width = width; - } - } - - // Using mainly bare JS in this function because it is going - // to fire very often while typing, and needs to very efficient. - function adjust() { - var height, original; - - if (mirrored !== ta) { - initMirror(); - } else { - setWidth(); - } - - if (!ta.value && options.placeholder) { - // If the textarea is empty, copy the placeholder text into - // the mirror control and use that for sizing so that we - // don't end up with placeholder getting trimmed. - mirror.value = ($ta.attr("placeholder") || ''); - } else { - mirror.value = ta.value; - } - - mirror.value += options.append || ''; - mirror.style.overflowY = ta.style.overflowY; - original = parseInt(ta.style.height,10); - - // Setting scrollTop to zero is needed in IE8 and lower for the next step to be accurately applied - mirror.scrollTop = 0; - - mirror.scrollTop = 9e4; - - // Using scrollTop rather than scrollHeight because scrollHeight is non-standard and includes padding. - height = mirror.scrollTop; - - if (maxHeight && height > maxHeight) { - ta.style.overflowY = 'scroll'; - height = maxHeight; - } else { - ta.style.overflowY = 'hidden'; - if (height < minHeight) { - height = minHeight; - } - } - - height += boxOffset; - - if (original !== height) { - ta.style.height = height + 'px'; - if (callback) { - options.callback.call(ta,ta); - } - $ta.trigger('autosize.resized'); - } - } - - function resize () { - clearTimeout(timeout); - timeout = setTimeout(function(){ - var newWidth = $ta.width(); - - if (newWidth !== width) { - width = newWidth; - adjust(); - } - }, parseInt(options.resizeDelay,10)); - } - - if ('onpropertychange' in ta) { - if ('oninput' in ta) { - // Detects IE9. IE9 does not fire onpropertychange or oninput for deletions, - // so binding to onkeyup to catch most of those occasions. There is no way that I - // know of to detect something like 'cut' in IE9. - $ta.on('input.autosize keyup.autosize', adjust); - } else { - // IE7 / IE8 - $ta.on('propertychange.autosize', function(){ - if(event.propertyName === 'value'){ - adjust(); - } - }); - } - } else { - // Modern Browsers - $ta.on('input.autosize', adjust); - } - - // Set options.resizeDelay to false if using fixed-width textarea elements. - // Uses a timeout and width check to reduce the amount of times adjust needs to be called after window resize. - - if (options.resizeDelay !== false) { - $(window).on('resize.autosize', resize); - } - - // Event for manual triggering if needed. - // Should only be needed when the value of the textarea is changed through JavaScript rather than user input. - $ta.on('autosize.resize', adjust); - - // Event for manual triggering that also forces the styles to update as well. - // Should only be needed if one of typography styles of the textarea change, and the textarea is already the target of the adjust method. - $ta.on('autosize.resizeIncludeStyle', function() { - mirrored = null; - adjust(); - }); - - $ta.on('autosize.destroy', function(){ - mirrored = null; - clearTimeout(timeout); - $(window).off('resize', resize); - $ta - .off('autosize') - .off('.autosize') - .css(originalStyles) - .removeData('autosize'); - }); - - // Call adjust in case the textarea already contains text. - adjust(); - }); - }; -}(jQuery || $)); // jQuery or jQuery-like library, such as Zepto diff --git a/SD-image/www/js/jquery.autosize.min.js b/SD-image/www/js/jquery.autosize.min.js deleted file mode 100644 index 9a29f696..00000000 --- a/SD-image/www/js/jquery.autosize.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - Autosize 1.18.13 - license: MIT - http://www.jacklmoore.com/autosize -*/ -(function(e){var t,o={className:"autosizejs",id:"autosizejs",append:"\n",callback:!1,resizeDelay:10,placeholder:!0},i='<textarea tabindex="-1" style="position:absolute; top:-999px; left:0; right:auto; bottom:auto; border:0; padding: 0; -moz-box-sizing:content-box; -webkit-box-sizing:content-box; box-sizing:content-box; word-wrap:break-word; height:0 !important; min-height:0 !important; overflow:hidden; transition:none; -webkit-transition:none; -moz-transition:none;"/>',n=["fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent","whiteSpace"],s=e(i).data("autosize",!0)[0];s.style.lineHeight="99px","99px"===e(s).css("lineHeight")&&n.push("lineHeight"),s.style.lineHeight="",e.fn.autosize=function(i){return this.length?(i=e.extend({},o,i||{}),s.parentNode!==document.body&&e(document.body).append(s),this.each(function(){function o(){var t,o=window.getComputedStyle?window.getComputedStyle(u,null):!1;o?(t=u.getBoundingClientRect().width,(0===t||"number"!=typeof t)&&(t=parseInt(o.width,10)),e.each(["paddingLeft","paddingRight","borderLeftWidth","borderRightWidth"],function(e,i){t-=parseInt(o[i],10)})):t=p.width(),s.style.width=Math.max(t,0)+"px"}function a(){var a={};if(t=u,s.className=i.className,s.id=i.id,d=parseInt(p.css("maxHeight"),10),e.each(n,function(e,t){a[t]=p.css(t)}),e(s).css(a).attr("wrap",p.attr("wrap")),o(),window.chrome){var r=u.style.width;u.style.width="0px",u.offsetWidth,u.style.width=r}}function r(){var e,n;t!==u?a():o(),s.value=!u.value&&i.placeholder?p.attr("placeholder")||"":u.value,s.value+=i.append||"",s.style.overflowY=u.style.overflowY,n=parseInt(u.style.height,10),s.scrollTop=0,s.scrollTop=9e4,e=s.scrollTop,d&&e>d?(u.style.overflowY="scroll",e=d):(u.style.overflowY="hidden",c>e&&(e=c)),e+=w,n!==e&&(u.style.height=e+"px",f&&i.callback.call(u,u),p.trigger("autosize.resized"))}function l(){clearTimeout(h),h=setTimeout(function(){var e=p.width();e!==g&&(g=e,r())},parseInt(i.resizeDelay,10))}var d,c,h,u=this,p=e(u),w=0,f=e.isFunction(i.callback),z={height:u.style.height,overflow:u.style.overflow,overflowY:u.style.overflowY,wordWrap:u.style.wordWrap,resize:u.style.resize},g=p.width(),y=p.css("resize");p.data("autosize")||(p.data("autosize",!0),("border-box"===p.css("box-sizing")||"border-box"===p.css("-moz-box-sizing")||"border-box"===p.css("-webkit-box-sizing"))&&(w=p.outerHeight()-p.height()),c=Math.max(parseInt(p.css("minHeight"),10)-w||0,p.height()),p.css({overflow:"hidden",overflowY:"hidden",wordWrap:"break-word"}),"vertical"===y?p.css("resize","none"):"both"===y&&p.css("resize","horizontal"),"onpropertychange"in u?"oninput"in u?p.on("input.autosize keyup.autosize",r):p.on("propertychange.autosize",function(){"value"===event.propertyName&&r()}):p.on("input.autosize",r),i.resizeDelay!==!1&&e(window).on("resize.autosize",l),p.on("autosize.resize",r),p.on("autosize.resizeIncludeStyle",function(){t=null,r()}),p.on("autosize.destroy",function(){t=null,clearTimeout(h),e(window).off("resize",l),p.off("autosize").off(".autosize").css(z).removeData("autosize")}),r())})):this}})(jQuery||$);
\ No newline at end of file diff --git a/SD-image/www/js/jquery.textarea_autosize.js b/SD-image/www/js/jquery.textarea_autosize.js new file mode 100644 index 00000000..2801b379 --- /dev/null +++ b/SD-image/www/js/jquery.textarea_autosize.js @@ -0,0 +1,54 @@ +/*! + * jQuery Textarea AutoSize plugin + * Author: Javier Julio + * Licensed under the MIT license + */ +;(function ($, window, document, undefined) { + + var pluginName = "textareaAutoSize"; + var pluginDataName = "plugin_" + pluginName; + + var containsText = function (value) { + return (value.replace(/\s/g, '').length > 0); + }; + + function Plugin(element, options) { + this.element = element; + this.$element = $(element); + this.init(); + } + + Plugin.prototype = { + init: function() { + var height = this.$element.outerHeight(); + var diff = parseInt(this.$element.css('paddingBottom')) + + parseInt(this.$element.css('paddingTop')) || 0; + + if (containsText(this.element.value)) { + this.$element.height(this.element.scrollHeight - diff); + } + + // keyup is required for IE to properly reset height when deleting text + this.$element.on('input keyup', function(event) { + var $window = $(window); + var currentScrollPosition = $window.scrollTop(); + + $(this) + .height(0) + .height(this.scrollHeight - diff); + + $window.scrollTop(currentScrollPosition); + }); + } + }; + + $.fn[pluginName] = function (options) { + this.each(function() { + if (!$.data(this, pluginDataName)) { + $.data(this, pluginDataName, new Plugin(this, options)); + } + }); + return this; + }; + +})(jQuery, window, document); diff --git a/SD-image/www/js/jquery.textarea_autosize.min.js b/SD-image/www/js/jquery.textarea_autosize.min.js new file mode 100644 index 00000000..650dacd8 --- /dev/null +++ b/SD-image/www/js/jquery.textarea_autosize.min.js @@ -0,0 +1 @@ +!function(t,e,i,n){function h(e,i){this.element=e,this.$element=t(e),this.init()}var s="textareaAutoSize",o="plugin_"+s,l=function(t){return t.replace(/\s/g,"").length>0};h.prototype={init:function(){var i=(this.$element.outerHeight(),parseInt(this.$element.css("paddingBottom"))+parseInt(this.$element.css("paddingTop"))||0);l(this.element.value)&&this.$element.height(this.element.scrollHeight-i),this.$element.on("input keyup",function(n){var h=t(e),s=h.scrollTop();t(this).height(0).height(this.scrollHeight-i),h.scrollTop(s)})}},t.fn[s]=function(e){return this.each(function(){t.data(this,o)||t.data(this,o,new h(this,e))}),this}}(jQuery,window,document); diff --git a/SD-image/www/js/model.js b/SD-image/www/js/model.js index 33816737..d260a54e 100644 --- a/SD-image/www/js/model.js +++ b/SD-image/www/js/model.js @@ -1,4 +1,4 @@ -/* Interface logic for the Duet Web Control v1.08 +/* Interface logic for the Duet Web Control v1.10 * * written by Christian Hammacher * @@ -6,7 +6,7 @@ * see http://www.gnu.org/licenses/gpl-2.0.html */ -var jsVersion = 1.08; +var jsVersion = "1.10"; var sessionPassword = "reprap"; var translationWarning = false; // Set this to "true" if you want to look for missing translation entries @@ -17,6 +17,7 @@ var settings = { updateInterval: 250, // in ms haltedReconnectDelay: 5000, // in ms + updateReconnectDelay: 15000, // in ms extendedStatusInterval: 10, // nth status request will include extended values maxRequestTime: 8000, // time to wait for a status response in ms @@ -25,6 +26,7 @@ var settings = { uppercaseGCode: true, // convert G-Codes to upper-case before sending them useKiB: true, // display file sizes in KiB instead of KB showFanControl: false, // show fan controls + showFanRPM: false, // show fan RPM in sensors showATXControl: false, // show ATX control confirmStop: false, // ask for confirmation when pressing Emergency STOP useDarkTheme: false, // load dark theme by Fotomas @@ -317,6 +319,10 @@ function updateStatus() { // Status var printing = false, paused = false; switch (status.status) { + case 'F': // Flashing new firmware + setStatusLabel("Updating", "success"); + break; + case 'H': // Halted setStatusLabel("Halted", "danger"); break; @@ -619,11 +625,7 @@ function updateStatus() { $("#td_warmup_time").html(convertSeconds(status.warmUpDuration)); } } else if (!printHasFinished) { - if (status.printDuration > 0) { - $("#td_warmup_time").html(convertSeconds(status.printDuration)); - } else { - $("#td_warmup_time").html("n/a"); - } + $("#td_warmup_time").html("n/a"); } // Current Layer Time @@ -684,14 +686,20 @@ function updateStatus() { drawTemperatureChart(); // Set timer for next status update - if (status.status != 'H') { - setTimeout(updateStatus, settings.updateInterval); - } else { - updateTaskLive = false; + if (status.status == 'F') { + isConnected = updateTaskLive = false; + log("info", "<strong>" + T("Updating Firmware...") + "</strong>"); + setTimeout(function() { + connect(sessionPassword, false); + }, settings.updateReconnectDelay); + } else if (status.status == 'H') { + isConnected = updateTaskLive = false; log("danger", "<strong>" + T("Emergency Stop!") + "</strong>"); setTimeout(function() { connect(sessionPassword, false); }, settings.haltedReconnectDelay); + } else { + setTimeout(updateStatus, settings.updateInterval); } // Save the last status response @@ -711,7 +719,8 @@ function getConfigFile() { success: function(response) { if (response != "") { configFile = response; - $("#text_config").val(response).prop("readonly", false); + $("#div_config > h1").addClass("hidden"); + $("#text_config").val(response).prop("readonly", false).trigger("input"); $("#row_save_settings").removeClass("hidden"); } } @@ -729,9 +738,10 @@ function getConfigResponse() { if (configFile == undefined) { if (response.hasOwnProperty("configFile")) { $("#div_config > h1").addClass("hidden"); - $("#text_config").removeClass("hidden").prop("readonly", true).val(response.configFile); + $("#text_config").removeClass("hidden").prop("readonly", true).val(response.configFile).trigger("input"); } else { - $("#div_config > h1").text(T("loading")); + $("#div_config > h1").removeClass("hidden").text(T("loading")); + $("#text_config").addClass("hidden"); } } @@ -1027,6 +1037,9 @@ function loadSettings(usingCookie) { if (loadedSettings.hasOwnProperty("haltedReconnectDelay")) { settings.haltedReconnectDelay = loadedSettings.haltedReconnectDelay; } + if (loadedSettings.hasOwnProperty("updatedReconnectDelay")) { + settings.updateReconnectDelay = loadedSettings.updateReconnectDelay; + } if (loadedSettings.hasOwnProperty("extendedStatusInterval")) { settings.extendedStatusInterval = loadedSettings.extendedStatusInterval; } @@ -1056,6 +1069,9 @@ function loadSettings(usingCookie) { if (loadedSettings.hasOwnProperty("showFanControl")) { settings.showFanControl = loadedSettings.showFanControl; } + if (loadedSettings.hasOwnProperty("showFanRPM")) { + settings.showFanRPM = loadedSettings.showFanRPM; + } if (loadedSettings.hasOwnProperty("showATXControl")) { settings.showATXControl = loadedSettings.showATXControl; } @@ -1107,6 +1123,7 @@ function saveSettings() { settings.uppercaseGCode = $("#uppercase_gcode").is(":checked"); settings.useKiB = $("#use_kib").is(":checked"); settings.showFanControl = $("#fan_sliders").is(":checked"); + settings.showFanRPM = $("#fan_rpm_display").is(":checked"); settings.showATXControl = $("#show_atx").is(":checked"); settings.confirmStop = $("#confirm_stop").is(":checked"); settings.useDarkTheme = $("#dark_theme").is(":checked"); @@ -1119,7 +1136,8 @@ function saveSettings() { // UI Timing settings.updateInterval = checkBoundaries($("#update_interval").val(), defaultSettings.updateInterval, 50); settings.extendedStatusInterval = checkBoundaries($("#extended_status_interval").val(), defaultSettings.extendedStatusInterval, 1, 99999); - settings.haltedReconnectDelay = checkBoundaries($("#reconnect_delay").val(), defaultSettings.haltedReconnectDelay, 1000); + settings.haltedReconnectDelay = checkBoundaries($("#reconnect_halt_delay").val(), defaultSettings.haltedReconnectDelay, 1000); + settings.updateReconnectDelay = checkBoundaries($("#reconnect_update_delay").val(), defaultSettings.updateReconnectDelay, 1000); settings.maxRequestTime = checkBoundaries($("#ajax_timeout").val(), defaultSettings.maxRequestTime, 100); settings.webcamInterval = checkBoundaries($("#webcam_interval").val(), defaultSettings.maxRequestTime, 100); @@ -1165,7 +1183,7 @@ function saveSettings() { configFile = $("#text_config").val(); var uploadFile = new File([configFile], "config.g", { type: "application/octet-stream" }); - startUpload("generic", [uploadFile]); + startUpload("generic", [uploadFile], false); } // Save Settings @@ -1204,6 +1222,13 @@ function applySettings() { $(".fan-control").addClass("hidden"); } + // Show/Hide Fan RPM + if (settings.showFanRPM) { + $(".fan-rpm").removeClass("hidden"); + } else { + $(".fan-rpm").addClass("hidden"); + } + // Show/Hide ATX Power if (settings.showATXControl) { $(".atx-control").removeClass("hidden"); @@ -1246,6 +1271,7 @@ function applySettings() { $("#uppercase_gcode").prop("checked", settings.uppercaseGCode); $("#use_kib").prop("checked", settings.useKiB); $("#fan_sliders").prop("checked", settings.showFanControl); + $("#fan_rpm_display").prop("checked", settings.showFanRPM); $("#show_atx").prop("checked", settings.showATXControl); $("#confirm_stop").prop("checked", settings.confirmStop); $("#dark_theme").prop("checked", settings.useDarkTheme); @@ -1254,7 +1280,8 @@ function applySettings() { // UI Timing $("#update_interval").val(settings.updateInterval); $("#extended_status_interval").val(settings.extendedStatusInterval); - $("#reconnect_delay").val(settings.haltedReconnectDelay); + $("#reconnect_halt_delay").val(settings.haltedReconnectDelay); + $("#reconnect_update_delay").val(settings.updateReconnectDelay); $("#ajax_timeout").val(settings.maxRequestTime); $("#webcam_interval").val(settings.webcamInterval); @@ -1287,9 +1314,9 @@ function applySettings() { var uploadType, uploadFiles, uploadRows, uploadedFileCount; var uploadTotalBytes, uploadedTotalBytes; var uploadStartTime, uploadRequest, uploadFileSize, uploadFileName, uploadPosition; -var uploadIncludedConfig; +var uploadedDWC, uploadIncludedConfig, uploadFirmwareFile; -function startUpload(type, files) { +function startUpload(type, files, fromCallback) { // Initialize some values stopUpdates(); isUploading = true; @@ -1300,7 +1327,11 @@ function startUpload(type, files) { uploadTotalBytes += this.size; }); uploadRows = []; + if (!fromCallback) { + uploadedDWC = false; + } uploadIncludedConfig = false; + uploadFirmwareFile = undefined; // Safety check for Upload and Print if (type == "print" && files.length > 1) { @@ -1309,45 +1340,49 @@ function startUpload(type, files) { } // Unzip files if necessary - var containsZip = false; - $.each(files, function() { - if (this.name.match("\\.zip$")) { - var fileReader = new FileReader(); - fileReader.onload = (function(theFile) { - return function(e) { - try { - var zip = new JSZip(e.target.result); - - var zipFiles = []; - $.each(zip.files, function(index, zipEntry) { - if (!zipEntry.dir && zipEntry.name.match("\/\\.git") == null) { - var zipName = zipEntry.name.split("/"); - zipName = zipName[zipName.length - 1]; - - var unpackedFile = new File([zipEntry.asArrayBuffer()], zipName, { type: "application/octet-stream", lastModified: zipEntry.date }); - zipFiles.push(unpackedFile); - } - }); + if (type == "macro" || type == "generic") { + var containsZip = false; + $.each(files, function() { + if (this.name.toLowerCase().match("\\.zip$") != null) { + uploadedDWC |= this.name.toLowerCase().match("^duetwebcontrol.*\\.zip") != null; + + var fileReader = new FileReader(); + fileReader.onload = (function(theFile) { + return function(e) { + try { + var zip = new JSZip(e.target.result); + + var zipFiles = []; + $.each(zip.files, function(index, zipEntry) { + if (!zipEntry.dir && zipEntry.name.match("\/\\.git") == null && zipEntry.name.match("README") == null) { + var zipName = zipEntry.name.split("/"); + zipName = zipName[zipName.length - 1]; + + var unpackedFile = new File([zipEntry.asArrayBuffer()], zipName, { type: "application/octet-stream", lastModified: zipEntry.date }); + zipFiles.push(unpackedFile); + } + }); - if (zipFiles.length == 0) { - showMessage("exclamation-sign", T("Error"), T("The archive {0} does not contain any files!", theFile.name), "md"); - } else { - startUpload(type, zipFiles); + if (zipFiles.length == 0) { + showMessage("exclamation-sign", T("Error"), T("The archive {0} does not contain any files!", theFile.name), "md"); + } else { + startUpload(type, zipFiles, true); + } + } catch(e) { + showMessage("exclamation-sign", T("Error"), T("Could not read contents of file {0}!", theFile.name), "md"); } - } catch(e) { - showMessage("exclamation-sign", T("Error"), T("Could not read contents of file {0}!", theFile.name), "md"); } - } - })(this); - fileReader.readAsArrayBuffer(this); + })(this); + fileReader.readAsArrayBuffer(this); - containsZip = true; - return false; + containsZip = true; + return false; + } + }); + if (containsZip) { + // We're relying on an async task which will trigger this method again when required + return; } - }); - if (containsZip) { - // We're relying on an async task which will trigger this method again when required - return; } // Reset modal dialog @@ -1359,7 +1394,13 @@ function startUpload(type, files) { // Add files to the table $("#table_upload_files > tbody").remove(); $.each(files, function() { - uploadIncludedConfig |= (this.name == "config.g") && (type == "generic"); + if (type == "generic") { + uploadIncludedConfig |= (this.name == "config.g"); + if (this.name.toUpperCase().match("^REPRAPFIRMWARE.*\.BIN") != null) { + uploadFirmwareFile = this.name; + } + } + var row = '<tr><td><span class="glyphicon glyphicon-asterisk"></span> ' + this.name + '</td>'; row += '<td>' + formatSize(this.size) + '</td>'; row += '<td><div class="progress"><div class="progress-bar progress-bar-info progress-bar-striped" role="progressbar"><span></span></div></div></td></tr>'; @@ -1553,13 +1594,53 @@ function uploadHasFinished() { } } - // Ask for software reset if it's safe to do - if (uploadIncludedConfig && lastStatusResponse != undefined && lastStatusResponse.status == 'I') { - showConfirmationDialog(T("Reboot Duet?"), T("You have just uploaded a config file. Would you like to perform a software reset now?"), function() { - sendGCode("M999"); + // Ask for page reload if DWC has been updated + if (uploadedDWC) { + $("#modal_upload").modal("hide"); + showConfirmationDialog(T("Reload Page?"), T("You have just updated Duet Web Control. Would you like to reload the page now?"), function() { + location.reload(); }); } + // Ask for software reset if it's safe to do + else if (lastStatusResponse != undefined && lastStatusResponse.status == 'I') { + if (uploadIncludedConfig) { + $("#modal_upload").modal("hide"); + showConfirmationDialog(T("Reboot Duet?"), T("You have just uploaded a config file. Would you like to perform a software reset now?"), function() { + sendGCode("M999"); + }); + } + + if (uploadFirmwareFile != undefined) + { + $("#modal_upload").modal("hide"); + showConfirmationDialog(T("Perform Firmware Update?"), T("You have just uploaded a firmware file. Would you like to update your Duet now?"), function() { + if (uploadFirmwareFile.toUpperCase() != "REPRAPFIRMWARE.BIN") + { + // Firmware update filename is hardcoded in the IAP binary, so try to rename this one first + $.ajax("rr_move?old=" + encodeURIComponent("/sys/" + uploadFirmwareFile) + "&new=" + encodeURIComponent("/sys/RepRapFirmware.bin"), { + dataType: "json", + row: draggingObject, + success: function(response) { + if (response.err == 0) { + // Flashing can be performed now + sendGCode("M997"); + } else { + // Something went wrong + showMessage("exclamation-sign", T("Error"), T("Could not rename firmware file!"), "md"); + } + } + }); + } + else + { + // Filename is okay, start flashing immediately + sendGCode("M997"); + } + }); + } + } + // Start polling again startUpdates(); } diff --git a/SD-image/www/js/viewmodel.js b/SD-image/www/js/viewmodel.js index a4dc076a..4b328107 100644 --- a/SD-image/www/js/viewmodel.js +++ b/SD-image/www/js/viewmodel.js @@ -1,4 +1,4 @@ -/* Interface logic for the Duet Web Control v1.08 +/* Interface logic for the Duet Web Control v1.10 * * written by Christian Hammacher * @@ -69,8 +69,8 @@ $(document).ready(function() { resetGuiData(); updateGui(); - $("#web_version").append(", JS: " + jsVersion.toFixed(2)); - $("#text_config").autosize(); + $("#web_version").append(", JS: " + jsVersion); + $("#text_config").textareaAutoSize(); loadSettings(false); }); @@ -341,10 +341,10 @@ function updateWebcam(externalTrigger) { webcamUpdating = false; } else { var newURL = settings.webcamURL; - if (newURL.indexOf("?") != -1) { - newURL = newURL + "?dummy=" + Math.random(); + if (newURL.indexOf("?") == -1) { + newURL += "?dummy=" + Math.random(); } else { - newURL = newURL + "&dummy=" + Math.random(); + newURL += "&dummy=" + Math.random(); } $("#img_webcam").attr("src", newURL); @@ -990,7 +990,7 @@ $("#btn_reset_settings").click(function(e) { var files = e.originalEvent.dataTransfer.files; if (files != null && files.length > 0) { // Start new file upload - startUpload($(this).data("type"), files); + startUpload($(this).data("type"), files, false); } }); }); @@ -1071,7 +1071,7 @@ $("input[name='temp_selection']:radio").change(function() { $("#input_file_upload").change(function(e) { if (this.files.length > 0) { // For POST uploads, we need file blobs - startUpload($(this).data("type"), this.files); + startUpload($(this).data("type"), this.files, false); } }); @@ -1217,6 +1217,7 @@ $('a[href="#page_general"], a[href="#page_listitems"]').on('shown.bs.tab', funct $('a[href="#page_config"]').on('shown.bs.tab', function() { $("#row_save_settings, #btn_reset_settings").addClass("hidden"); + $("#text_config").trigger("input"); getConfigFile(); }); diff --git a/SD-image/www/language.xml b/SD-image/www/language.xml index 8597a805..1b3db060 100644 --- a/SD-image/www/language.xml +++ b/SD-image/www/language.xml @@ -111,7 +111,7 @@ <string t="Status Update Interval:">Aktualisierungsrate für Statusupdates:</string> <string t="Extended Status Update after every:">Erweiterte Statusupdates nach jeder:</string> <string t="th response">ten Antwort</string> - <string t="Reconnect Delay on Halt:">Wiederverbindungsverzögerung nach NOT-AUS</string> + <string t="Reconnect Delay on Halt:">Wiederverbindungsverzögerung nach NOT-AUS:</string> <string t="AJAX Timeout:">AJAX-Timeout:</string> <string t="Send G-Code...">G-Code senden...</string> <string t="Web Interface by Christian Hammacher">Web Interface von Christian Hammacher</string> @@ -364,6 +364,19 @@ <string t="URL must point to an image file"></string> <string t="Webcam Update Interval:">Webcam Updateintervall:</string> <string t="Interval at which the webcam image on the Print Status page will be updated">Intervall nach dem das Webcam-Bild auf der Druckstatus-Seite aktualisiert wird</string> + + <!-- New in v1.10 --> + <string t="Updating">Aktualisiere</string> + <string t="Updating Firmware...">Aktualisiere Firmware...</string> + <string t="Perform Firmware Update?">Firmwareaktualisierung durchführen?</string> + <string t="You have just uploaded a firmware file. Would you like to update your Duet now?">Sie haben gerade eine Firmwaredatei hochgeladen. Möchten Sie jetzt ihr Duet aktualisieren?</string> + <string t="Could not rename firmware file!">Konnte Firmwaredatei nicht umbenennen!</string> + <string t="Display fan RPM of a 4-pin PWM cooling fan in the sensors area">Umdrehungsanzahl pro Minute eines 4-pin PWM-Lüfters im Sensorenbereich anzeigen</string> + <string t="Show Fan RPM in Sensors">Lüfterumdrehungen pro Minute anzeigen</string> + <string t="Reconnect Delay on Firmware Update:">Wiederverbindungsverzögerung bei Firmwareaktualisierung:</string> + <string t="Time to wait for a reconnect when a new firmware is about to be flashed">Abzuwartende Zeit wenn eine neue Firmware geflasht wird</string> + <string t="Reload Page?">Seite neu laden?</string> + <string t="You have just updated Duet Web Control. Would you like to reload the page now?">Sie haben gerade Duet Web Control aktualisiert. Möchten Sie die Seite jetzt neu laden?</string> </de> <es name="Espanol"> <!-- JavaScript Strings --> @@ -473,7 +486,7 @@ <string t="Status Update Interval:">Intervalo de actualización del estado:</string> <string t="Extended Status Update after every:">Actualización completa de estado cada:</string> <string t="th response">ésima respuesta</string> - <string t="Reconnect Delay on Halt:">Retraso de reconexión tras Parada</string> + <string t="Reconnect Delay on Halt:">Retraso de reconexión tras Parada:</string> <string t="AJAX Timeout:">Error AJAX:</string> <string t="Send G-Code...">Enviar G-Code...</string> <string t="Web Interface by Christian Hammacher">Interfaz Web de Christian Hammacher</string> @@ -798,7 +811,7 @@ <string t="Status Update Interval:">Intervalle de mise à jour d'état:</string> <string t="Extended Status Update after every:">Mise à jour complète de l'état après chaque:</string> <string t="th response">ème réponse</string> - <string t="Reconnect Delay on Halt:">Délai de reconnection après interruption</string> + <string t="Reconnect Delay on Halt:">Délai de reconnection après interruption:</string> <string t="AJAX Timeout:">AJAX-Timeout:</string> <string t="Send G-Code...">Envoie G-Code...</string> <string t="Web Interface by Christian Hammacher">Web Interface par Christian Hammacher</string> @@ -1151,7 +1164,7 @@ <string t="Status Update Interval:">Uppdateringsintervall för status:</string> <string t="Extended Status Update after every:">Utökad status efter:</string> <string t="th response">svar</string> - <string t="Reconnect Delay on Halt:">Anslutningsfördröjning efter stopp</string> + <string t="Reconnect Delay on Halt:">Anslutningsfördröjning efter stopp:</string> <string t="AJAX Timeout:">AJAX-timeout:</string> <string t="Send G-Code...">Skicka G-kod...</string> <string t="Web Interface by Christian Hammacher">Webgränssnitt av Christian Hammacher</string> @@ -1504,7 +1517,7 @@ <string t="Status Update Interval:">状态更新间隔:</string> <string t="Extended Status Update after every:">每次后延续更新状态:</string> <string t="th response">响应 </string> - <string t="Reconnect Delay on Halt:">中间停止后再连接</string> + <string t="Reconnect Delay on Halt:">中间停止后再连接:</string> <string t="AJAX Timeout:">AJAX 超时:</string> <string t="Send G-Code...">发送G-Code ...</string> <string t="Web Interface by Christian Hammacher">Christian Hammacher网络控制界面版本,西安锐普3D打印机公司(RepRapPro China)翻译 </string> diff --git a/SD-image/www/reprap.htm b/SD-image/www/reprap.htm index 5ffee930..82221ac4 100644 --- a/SD-image/www/reprap.htm +++ b/SD-image/www/reprap.htm @@ -1,10 +1,10 @@ <!DOCTYPE html> -<!-- Duet Web Control v1.08 - - written by Christian Hammacher - - licensed under the terms of the GPL v2 - see http://www.gnu.org/licenses/gpl-2.0.html +<!-- Duet Web Control v1.10 + + written by Christian Hammacher + + licensed under the terms of the GPL v2 + see http://www.gnu.org/licenses/gpl-2.0.html --> <html lang="en"> <head> @@ -13,9 +13,9 @@ <meta name="viewport" content="width=device-width"> <meta name="description" content="Web Interface for Duet Electronics (+ Extension)"> <meta name="author" content="Christian Hammacher"> - + <title id="title">Duet Web Control</title> - + <!-- Favicon --> <link rel="shortcut icon" href="favicon.ico"> <!-- CSS --> @@ -24,7 +24,7 @@ <link href="css/bootstrap-slider.min.css" rel="stylesheet"> <link href="css/defaults.css" rel="stylesheet"> </head> - + <body> <!-- Navigation Bar --> <nav class="navbar navbar-default"> @@ -43,14 +43,13 @@ </button> </div> <span class="label label-default label-status pull-right navbar-label visible-xs">Disconnected</span> - + <a class="navbar-brand visible-xs"> - <!-- <img class="brand-sm" src="img/rrp_small.png"> --> <span class="machine-name">Duet Web Control</span> <abbr title="Some axes are not homed" class="hidden home-warning"><span class="glyphicon glyphicon-alert"></span></abbr> </a> </div> - + <!-- Regular navbar entries --> <div class="collapse navbar-collapse"> <button type="button" class="btn btn-connect btn-info navbar-btn navbar-left"><span class="glyphicon glyphicon-log-in"></span> <span>Connect</span></button> @@ -59,7 +58,7 @@ <span class="glyphicon glyphicon-dashboard"></span> </button> </div> - + <form class="navbar-form padding-small navbar-left hidden-sm gcode-input"> <div class="input-group"> <input type="text" class="form-control" placeholder="Send G-Code..." disabled> @@ -71,27 +70,22 @@ </div> <button type="submit" class="btn btn-default disabled" title="Send G-Code from input"><span class="glyphicon glyphicon-send"></span> Send</button> </form> - + <button type="button" class="btn btn-default btn-upload navbar-btn padding-small navbar-left hidden-xs hidden-sm disabled" title="Upload & Print one or more G-Code files (drag&drop is supported as well)" data-type="print" data-style="btn-default"><span class="glyphicon glyphicon-cloud-upload"></span> Upload & Print</button> - + <button type="button" class="btn btn-danger btn-emergency-stop navbar-btn navbar-right disabled" title="Enforces an immediate software reset (M112+M999)">Emergency STOP</button> <span class="label label-default label-status navbar-label navbar-right">Disconnected</span> - + <ul class="nav nav-justified hidden-xs"> <li> <a href="#" class="navbar-brand"> - <!-- - <img class="brand-sm" src="img/rrp_small.png"> - <img class="brand-lg" src="img/rrp_large.png"> - <span class="brand-lg">-</span> - --> <span class="machine-name">Duet Web Control</span> <abbr title="Some axes are not homed" class="hidden home-warning small"><span class="glyphicon glyphicon-alert"></span></abbr> </a> </li> </ul> </div> - + <!-- Collapsed navbar entries for mobile devices --> <div class="nav collapse" id="mobile-navbar"> <form class="gcode-input"> @@ -137,7 +131,7 @@ </div> </div> </nav> - + <!-- Main Content --> <div class="container-fluid"> <!-- Info Panels --> @@ -176,7 +170,7 @@ </ul> </div> </div> - + <table class="table table-bordered table-condensed table-centered-cells" id="table_heaters"> <tr> <th></th> @@ -184,7 +178,7 @@ <th>Active</th> <th>Standby</th> </tr> - + <tr id="tr_head_1"> <th> <a href="#">Heater 1<span class="caret hidden"></span></a> @@ -212,7 +206,7 @@ </div> </td> </tr> - + <tr id="tr_head_2"> <th> <a href="#">Heater 2<span class="caret hidden"></span></a> @@ -240,7 +234,7 @@ </div> </td> </tr> - + <tr id="tr_head_3" class="hidden"> <th> <a href="#">Heater 3<span class="caret hidden"></span></a> @@ -268,7 +262,7 @@ </div> </td> </tr> - + <tr id="tr_head_4" class="hidden"> <th> <a href="#">Heater 4<span class="caret hidden"></span></a> @@ -296,7 +290,7 @@ </div> </td> </tr> - + <tr id="tr_head_5" class="hidden"> <th> <a href="#">Heater 5<span class="caret hidden"></span></a> @@ -324,7 +318,7 @@ </div> </td> </tr> - + <tr id="tr_head_6" class="hidden"> <th> <a href="#">Heater 6<span class="caret hidden"></span></a> @@ -352,7 +346,7 @@ </div> </td> </tr> - + <tr id="tr_bed"> <th> <a href="#">Bed</a> @@ -371,7 +365,7 @@ </td> <td></td> </tr> - + <tr id="tr_chamber" class="hidden"> <th> Chamber @@ -393,14 +387,14 @@ </table> </div> </div> - + <!-- Temperature Chart --> <div class="hidden-xs hidden-sm col-md-3 col-lg-3" id="div_temp_chart"> <div class="panel panel-info panel-status"> <div class="panel-heading"> <span>Temperature Chart</span> </div> - + <div class="panel-body panel-chart"> <div id="chart_temp" title="Time vs. Temperature"> <!-- See JS --> @@ -408,14 +402,14 @@ </div> </div> </div> - + <!-- Machine Status --> <div class="col-xs-12 col-sm-7 col-md-4 col-lg-5" id="div_status"> <div class="panel panel-info panel-status"> <div class="panel-heading"> <span>Machine Status</span> </div> - + <table class="table table-bordered table-condensed table-centered-cells table-status"> <tr> <th rowspan="2" class="th-status">Head Position</th> @@ -429,7 +423,7 @@ <td id="td_z">n/a</td> </tr> </table> - + <table class="table table-bordered table-condensed table-centered-cells table-status"> <tr> <th rowspan="2" class="th-status"> @@ -456,22 +450,22 @@ <td id="td_extr_6" class="hidden-md hidden extr-6">n/a</td> </tr> </table> - + <table class="table table-bordered table-condensed table-centered-cells table-status"> <tr> <th rowspan="2" class="th-status">Sensors</th> <th>Z-Probe</th> - <th class="fan-control">Fan RPM</th> + <th class="fan-rpm hidden">Fan RPM</th> </tr> <tr> <td id="td_probe" title="Current Z-Probe reading on a scale between 0 and 1024">n/a</td> - <td id="td_fanrpm" class="fan-control" title="Current Fan RPM (needs a 4-pin PWM fan and proper wiring)">n/a</td> + <td id="td_fanrpm" class="fan-rpm hidden" title="Current Fan RPM (needs a 4-pin PWM fan and proper wiring)">n/a</td> </tr> </table> </div> </div> </div> - + <!-- Content --> <div class="row"> <!-- Sidebar --> @@ -490,7 +484,7 @@ <li class="navitem navitem-help hidden"><a class="navlink" href="#" data-target="help"><span class="glyphicon glyphicon-question-sign"></span> Help</a></li> </ul> </div> - + <!-- Page Contents --> <div class="col-xs-12 col-sm-9 col-md-10 col-lg-10" id="main_content"> <!-- Control Page --> @@ -503,7 +497,7 @@ <span>Head Movement</span> <button data-gcode="G32" class="pull-right btn btn-primary btn-xs gcode visible-lg disabled" id="btn_bed_compensation" title="Perform automatic bed compensation / calibration (G32)">Auto Bed Compensation</button> </div> - + <div class="panel-body"> <div class="hidden-lg btn-group btn-group-justified" id="mobile_home_buttons"> <div class="btn-group" role="group"><button data-home="all" class="btn btn-primary disabled">Home All</button></div> @@ -584,17 +578,17 @@ </table> </div> </div> - + <div class="alert alert-warning hidden home-warning"> <span class="glyphicon glyphicon-warning-sign"></span> <span id="unhomed_warning">The following axes are not homed: <strong id="unhomed_axes">X, Y, Z</strong></span> </div> - + <div class="panel panel-default" id="panel_extrude"> <div class="panel-heading"> <span>Extruder Control</span> </div> - + <div class="panel-body"> <div class="col-xs-5 no-horizontal-padding"> <label>Feed amount in mm:</label> @@ -619,7 +613,7 @@ </label> </div> </div> - + <div class="col-xs-5"> <label>Feedrate in mm/sec:</label> <div class="btn-group btn-group-justified" data-toggle="buttons"> @@ -640,7 +634,7 @@ </label> </div> </div> - + <div class="col-xs-2 no-horizontal-padding"> <div class="btn-group-vertical btn-group-vertical-justified"> <div class="btn-group"> @@ -654,20 +648,20 @@ </div> </div> </div> - + <div class="col-xs-6 col-sm-6 col-md-4 col-lg-3 col-right"> <div class="panel panel-default" id="panel_macro_buttons"> <div class="panel-heading"> <span>User-Defined Macros</span> </div> - + <div class="panel-body text-center"> <h4 class="text-muted">Go to the Macros page to define your own actions</h4> <div class="btn-group-vertical btn-group-vertical-justified"></div> </div> </div> </div> - + <div class="col-xs-6 col-sm-6 col-md-4 col-lg-3 col-right"> <div class="panel panel-default" id="panel_control_misc"> <div class="panel-heading"> @@ -704,7 +698,7 @@ </div> </div> </div> - + <!-- Print Status --> <div id="page_print" class="page"> <div class="row row-progress hidden"> @@ -722,7 +716,7 @@ </div> </div> </div> - + <div class="row"> <div class="col-xs-12 col-sm-12 col-md-6 col-md-push-3 col-lg-7 col-lg-push-2"> <div id="panel_webcam" class="panel panel-default hidden"> @@ -745,12 +739,12 @@ </div> </div> </div> - + <div id="panel_print_info" class="panel panel-default"> <div class="panel-heading"> <span>Collected Data</span> </div> - + <table class="table table-bordered table-condensed"> <tr> <th>Warm-Up Time</th> @@ -766,12 +760,12 @@ </tr> </table> </div> - + <div class="panel panel-default"> <div class="panel-heading"> <span>Estimations</span> </div> - + <table class="table table-bordered table-condensed" id="table_estimations"> <tr> <th>Based on</th> @@ -794,7 +788,7 @@ </table> </div> </div> - + <div class="col-xs-6 col-sm-6 col-md-3 col-md-pull-6 col-lg-2 col-lg-pull-7 col-left"> <div class="panel panel-default" id="panel_print_control"> <div class="panel-heading"> @@ -809,17 +803,17 @@ <button class="btn btn-danger" id="btn_cancel" title="Cancel paused print (M0)">Cancel</button> </div> </div> - + <div class="checkbox fan-control disabled"> <label title="Enforce a predefined fan value"> <input type="checkbox" id="override_fan" disabled/> Override Fan Value </label> </div> - + <div class="fan-control"> <input id="slider_fan_print" type="text" title="Set current fan value (via M106)" disabled/> </div> - + <div class="checkbox disabled"> <label title="Run M1 when the print has finished"> <input type="checkbox" id="auto_sleep" disabled/> Enable Auto-Sleep @@ -827,7 +821,7 @@ </div> </div> </div> - + <div class="panel panel-default"> <div class="panel-heading"> <span>File Information</span> @@ -848,7 +842,7 @@ </div> </div> </div> - + <div class="col-xs-6 col-sm-6 col-md-3 col-lg-3 col-right"> <div class="panel panel-default"> <div class="panel-heading"> @@ -859,7 +853,7 @@ </div> </div> </div> - + <div class="col-xs-6 col-sm-6 col-md-3 col-lg-3 col-right"> <div class="panel panel-default"> <div class="panel-heading"> @@ -909,7 +903,7 @@ </div> </div> </div> - + <!-- G-Code Console --> <div id="page_console" class="page"> <div class="row"> @@ -940,7 +934,7 @@ </div> </form> </div> - + <div class="row"> <div class="col-md-12"> <div class="container-fluid" id="console_log"> @@ -948,7 +942,7 @@ </div> </div> </div> - + <!-- G-Code Files --> <div id="page_files" class="page"> <div class="row"> @@ -971,7 +965,7 @@ </table> <h1 class="text-center text-muted">Connect to your Duet to display G-Code files</h1> - + <table class="table table-bordered table-files table-hover table-striped hidden" id="table_gcode_files"> <thead> <tr> @@ -990,7 +984,7 @@ </div> </div> </div> - + <!-- Macro Files --> <div id="page_macros" class="page"> <div class="row"> @@ -1011,10 +1005,10 @@ </td> </tr> </table> - + <h1 class="text-center text-muted">Connect to your Duet to display Macro files</h1> </div> - + <div class="col-xs-12 col-sm-10 col-sm-push-1 col-md-8 col-md-push-2 col-lg-6 col-lg-push-3"> <table class="table table-bordered table-files table-hover table-striped hidden" id="table_macro_files"> <thead> @@ -1030,7 +1024,7 @@ </div> </div> </div> - + <!-- Settings --> <div id="page_settings" class="page"> <form id="frm_settings"> @@ -1042,7 +1036,7 @@ <li><a href="#page_machine" data-toggle="tab">Machine Properties</a></li> <li><a href="#page_tools" data-toggle="tab">Tools</a></li> </ul> - + <!-- Page Selector (Mobile) --> <ul class="nav nav-tabs visible-xs visible-sm"> <li class="active"><a href="#page_general" data-toggle="tab">General</a></li> @@ -1056,7 +1050,7 @@ </ul> </li> </ul> - + <div class="tab-content"> <!-- General Settings --> <div class="tab-pane row active" id="page_general"> @@ -1077,7 +1071,7 @@ </tr> <tr> <th>Web Interface Version:</th> - <td id="web_version">HTML: 1.08</td> + <td id="web_version">HTML: 1.10</td> </tr> </table> <span>Web Interface by Christian Hammacher<br/>Licensed under the terms of the <a href="http://www.gnu.org/licenses/gpl-2.0.html" target="blank">GPL v2</a></span> @@ -1086,6 +1080,16 @@ </div> </div> + <div class="panel panel-default"> + <div class="panel-heading"> + <span>Webcam Integration</span> + </div> + <div class="panel-body"> + <label for="webcam_url">Optional URL to an external Webcam:</label> + <input id="webcam_url" class="form-control" type="text" title="URL must point to an image file"> + </div> + </div> + <div class="panel panel-default hidden-xs hidden-sm"> <div class="panel-heading"> <span>File Upload for /sys and /www Directories</span> @@ -1098,24 +1102,14 @@ </div> </div> </div> - - <div class="panel panel-default"> - <div class="panel-heading"> - <span>Webcam Integration</span> - </div> - <div class="panel-body"> - <label for="webcam_url">Optional URL to an external Webcam:</label> - <input id="webcam_url" class="form-control" type="text" title="URL must point to an image file"> - </div> - </div> </div> - + <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4"> <div class="panel panel-default"> <div class="panel-heading"> <span>Appearance and Behavior</span> </div> - + <div class="panel-body"> <div class="checkbox"> <label title="Connect automatically to the Duet once the web interface is ready"> @@ -1148,6 +1142,11 @@ </label> </div> <div class="checkbox"> + <label title="Display fan RPM of a 4-pin PWM cooling fan in the sensors area"> + <input type="checkbox" id="fan_rpm_display" checked /> Show Fan RPM in Sensors + </label> + </div> + <div class="checkbox"> <label title="Show a small panel on the Control page to toggle ATX power"> <input type="checkbox" id="show_atx" checked /> Show ATX Power control </label> @@ -1162,13 +1161,13 @@ <input type="checkbox" id="dark_theme" /> Use dark theme </label> </div> - + <label id="label_feedrate" for="move_feedrate">Default Move Button Feedrate:</label> <div class="input-group"> <input type="number" id="move_feedrate" class="form-control" title="Default Feedrate for Head Movement controls" value="6000"> <span class="input-group-addon">mm/min</span> </div> - + <label id="label_language">Language:</label> <div class="dropdown" id="dropdown_language"> <button class="btn btn-default dropdown-toggle" type="button" id="btn_language" data-language="en" data-toggle="dropdown"> @@ -1182,32 +1181,38 @@ </div> </div> </div> - + <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 col-right"> <div class="panel panel-default" id="panel_ui_timing"> <div class="panel-heading"> <span>UI Timing</span> </div> - + <div class="panel-body"> <label for="update_interval">Status Update Interval:</label> <div class="input-group"> <input type="number" id="update_interval" class="form-control" title="Interval at which status updates are requested"> <span class="input-group-addon">ms</span> </div> - + <label for="extended_status_interval">Extended Status Update after every:</label> <div class="input-group"> <input type="number" id="extended_status_interval" class="form-control" title="Extended status updates are requested after each n-th status response"> <span class="input-group-addon">th response</span> </div> - - <label for="reconnect_delay">Reconnect Delay on Halt:</label> + + <label for="reconnect_halt_delay">Reconnect Delay on Halt:</label> + <div class="input-group"> + <input type="number" id="reconnect_halt_delay" class="form-control" title="Time to wait for a reconnect after an emergency stop was reported"> + <span class="input-group-addon">ms</span> + </div> + + <label for="reconnect_update_delay">Reconnect Delay on Firmware Update:</label> <div class="input-group"> - <input type="number" id="reconnect_delay" class="form-control" title="Time to wait for a reconnect after an emergency stop was reported"> + <input type="number" id="reconnect_update_delay" class="form-control" title="Time to wait for a reconnect when a new firmware is about to be flashed"> <span class="input-group-addon">ms</span> </div> - + <label for="ajax_timeout">AJAX Timeout:</label> <div class="input-group"> <input type="number" id="ajax_timeout" class="form-control" title="Maximum time to wait for an AJAX request"> @@ -1223,7 +1228,7 @@ </div> </div> </div> - + <!-- List Items --> <div class="tab-pane row" id="page_listitems"> <div class="col-md-4 col-lg-4 col-left"> @@ -1241,7 +1246,7 @@ </thead> </table> </div> - + <div class="panel panel-default"> <div class="panel-heading"> <span>Add new G-Code</span> @@ -1284,13 +1289,13 @@ <input type="radio" name="temp_selection" value="standby">Standby Temperatures </label> </div> - + <ul class="list-group temp-list" id="ul_active_temps"></ul> - + <ul class="list-group temp-list hidden" id="ul_standby_temps"></ul> </div> </div> - + <div class="panel panel-default"> <div class="panel-heading"> <span>Add new Temperature</span> @@ -1322,7 +1327,7 @@ <ul class="list-group temp-list" id="ul_bed_temps"></ul> </div> </div> - + <div class="panel panel-default"> <div class="panel-heading"> <span>Add new Temperature</span> @@ -1346,7 +1351,7 @@ </div> </div> </div> - + <!-- Configuration File --> <div class="tab-pane row" id="page_config"> <div class="col-md-12" id="div_config"> @@ -1354,7 +1359,7 @@ <textarea readonly id="text_config" class="hidden"></textarea> </div> </div> - + <!-- Machine Properties --> <div class="tab-pane row" id="page_machine"> <div class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> @@ -1497,13 +1502,13 @@ <dt>Motor Idle Timeout:</dt> <dd id="dd_idle_timeout">n/a</dd> </dl> - + <button id="btn_fw_diagnostics" type="button" class="btn btn-info"><span class="glyphicon glyphicon-dashboard"></span> Firmware Diagnostics</button> </div> </div> </div> </div> - + <!-- Tools --> <div class="tab-pane row" id="page_tools"> <div class="col-sm-12 col-md-7 col-lg-6"> @@ -1578,7 +1583,7 @@ </div> </div> </div> - + <div class="row" id="row_save_settings"> <div class="col-md-12 text-center"> <button type="submit" class="btn btn-lg btn-primary" title="Apply new settings from this page"><span class="glyphicon glyphicon-ok"></span> Apply Settings</button> @@ -1589,13 +1594,13 @@ </div> </div> </div> - + <!-- Sidebar Continuation --> <div class="row"> <div class="col-sm-3 col-md-2 col-lg-2 sidebar sidebar-continuation"></div> </div> </div> - + <!-- Modal dialogs --> <div class="modal fade" id="modal_pass_input"> <div class="modal-dialog modal-md"> @@ -1619,7 +1624,7 @@ </div> </div> </div> - + <div class="modal fade" id="modal_confirmation"> <div class="modal-dialog modal-md"> <div class="modal-content"> @@ -1637,7 +1642,7 @@ </div> </div> </div> - + <div class="modal fade" id="modal_textinput"> <div class="modal-dialog modal-sm"> <div class="modal-content"> @@ -1660,7 +1665,7 @@ </div> </div> </div> - + <div class="modal fade" id="modal_message"> <div class="modal-dialog modal-md"> <div class="modal-content"> @@ -1677,7 +1682,7 @@ </div> </div> </div> - + <input type="file" id="input_file_upload" class="hidden" multiple> <div class="modal fade" id="modal_upload" data-backdrop="static"> <div class="modal-dialog modal-md"> @@ -1708,18 +1713,18 @@ <div id="layer_tooltip"></div> <!-- Bootstrap core JavaScript - ================================================== --> - <!-- Placed at the end of the document so the pages load faster --> - <script src="js/jquery-2.1.3.min.js"></script> - <script src="js/jquery.autosize.min.js"></script> - <script src="js/jquery.flot.min.js"></script> - <script src="js/jquery.flot.resize.min.js"></script> - <script src="js/jquery.flot.navigate.min.js"></script> - <script src="js/bootstrap.min.js"></script> - <script src="js/bootstrap-slider.min.js"></script> - <script src="js/jszip.min.js"></script> - <script src="js/model.js"></script> - <script src="js/viewmodel.js"></script> + ================================================== --> + <!-- Placed at the end of the document so the pages load faster --> + <script src="js/jquery-2.1.3.min.js"></script> + <script src="js/jquery.textarea_autosize.min.js"></script> + <script src="js/jquery.flot.min.js"></script> + <script src="js/jquery.flot.resize.min.js"></script> + <script src="js/jquery.flot.navigate.min.js"></script> + <script src="js/bootstrap.min.js"></script> + <script src="js/bootstrap-slider.min.js"></script> + <script src="js/jszip.min.js"></script> + <script src="js/model.js"></script> + <script src="js/viewmodel.js"></script> </body> </html> <!-- vim: ts=4 sw=4 |