From 9ab36d999efbb64efdf3f514f90490f634298553 Mon Sep 17 00:00:00 2001 From: peteruithoven Date: Wed, 16 Oct 2013 18:00:01 +0200 Subject: [PATCH 1/4] reset the status check when printer state is overruled --- js/Printer.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/js/Printer.js b/js/Printer.js index 0c15017..dbbfa87 100644 --- a/js/Printer.js +++ b/js/Printer.js @@ -267,5 +267,13 @@ function Printer() { self.state = newState; $(document).trigger(Printer.UPDATE); + + this.resetStatusCheckInterval(); + } + this.resetStatusCheckInterval = function() { + console.log("resetStatusCheckInterval"); + clearTimeout(self.checkStatusDelay); + clearTimeout(self.retryCheckStatusDelay); + self.checkStatusDelay = setTimeout(function() { self.checkStatus() }, self.checkStatusInterval); } } \ No newline at end of file From d5aef3bf951fe5353e6a88426fb454ffbbeac7e1 Mon Sep 17 00:00:00 2001 From: peteruithoven Date: Wed, 16 Oct 2013 18:27:10 +0200 Subject: [PATCH 2/4] stop status checks on override and start them again when there is a first response --- js/Printer.js | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/js/Printer.js b/js/Printer.js index dbbfa87..7d38027 100644 --- a/js/Printer.js +++ b/js/Printer.js @@ -61,7 +61,7 @@ function Printer() { console.log(" wifiboxURL: ",this.wifiboxURL); if(autoUpdate) { - this.checkStatus(); + this.startStatusCheckInterval(); } } @@ -163,6 +163,12 @@ function Printer() { } } } + // after we know the first gcode packed has bin received or failed + // (and the driver had time to update the printer.state) + // we start checking the status again + if(sendIndex == 0) { + self.startStatusCheckInterval(); + } } }).fail(function() { console.log("Printer:sendPrintPart: failed"); @@ -171,6 +177,11 @@ function Printer() { console.log("request printer:sendPrintPart failed retry"); self.sendPrintPart(sendIndex, sendLength) },self.retryDelay); // retry after delay + + // after we know the gcode packed has bin received or failed + // (and the driver had time to update the printer.state) + // we start checking the status again + self.startStatusCheckInterval(); }); } else { console.log ("Printer >> f:sendPrintPart() >> communicateWithWifibox is false, so not executing this function"); @@ -188,17 +199,38 @@ function Printer() { timeout: this.timeoutTime, success: function(data){ console.log("Printer:stop response: ", data); + + // after we know the stop has bin received or failed + // (and the driver had time to update the printer.state) + // we start checking the status again + self.startStatusCheckInterval(); } }).fail(function() { console.log("Printer:stop: failed"); clearTimeout(self.retryStopDelay); self.retryStopDelay = setTimeout(function() { self.stop() },self.retryDelay); // retry after delay + + // after we know the stop has bin received or failed + // (and the driver had time to update the printer.state) + // we start checking the status again + self.startStatusCheckInterval(); }); } else { console.log ("Printer >> f:communicateWithWifibox() >> communicateWithWifibox is false, so not executing this function"); } } - + this.startStatusCheckInterval = function() { + console.log("Printer:startStatusCheckInterval"); + self.checkStatus(); + clearTimeout(self.checkStatusDelay); + clearTimeout(self.retryCheckStatusDelay); + self.checkStatusDelay = setTimeout(function() { self.checkStatus() }, self.checkStatusInterval); + } + this.stopStatusCheckInterval = function() { + console.log("Printer:stopStatusCheckInterval"); + clearTimeout(self.checkStatusDelay); + clearTimeout(self.retryCheckStatusDelay); + } this.checkStatus = function() { console.log("Printer:checkStatus"); this.stateOverruled = false; @@ -268,12 +300,6 @@ function Printer() { $(document).trigger(Printer.UPDATE); - this.resetStatusCheckInterval(); - } - this.resetStatusCheckInterval = function() { - console.log("resetStatusCheckInterval"); - clearTimeout(self.checkStatusDelay); - clearTimeout(self.retryCheckStatusDelay); - self.checkStatusDelay = setTimeout(function() { self.checkStatus() }, self.checkStatusInterval); + this.stopStatusCheckInterval(); } } \ No newline at end of file From b1ded5d41bb4b234c0715dfdf28a54486658b393 Mon Sep 17 00:00:00 2001 From: peteruithoven Date: Wed, 16 Oct 2013 18:32:24 +0200 Subject: [PATCH 3/4] Removing confirm --- js/Printer.js | 2 +- js/buttonbehaviors.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/Printer.js b/js/Printer.js index 7d38027..5149dd6 100644 --- a/js/Printer.js +++ b/js/Printer.js @@ -151,7 +151,7 @@ function Printer() { if (completed) { console.log("Printer:sendPrintPart:gcode sending completed"); this.gcode = []; - btnStop.css("display","block"); + btnStop.css("display","block"); // hack //self.targetTemperature = settings["printer.temperature"]; // slight hack } else { // only if the state hasn't bin changed (by for example pressing stop) we send more gcode diff --git a/js/buttonbehaviors.js b/js/buttonbehaviors.js index 7edc448..6bc6ef7 100644 --- a/js/buttonbehaviors.js +++ b/js/buttonbehaviors.js @@ -192,7 +192,7 @@ function initButtonBehavior() { } function stopPrint() { console.log("f:stopPrint() >> sendPrintCommands = " + sendPrintCommands); - if (!confirm("Weet je zeker dat je huidige print wilt stoppen?")) return; + //if (!confirm("Weet je zeker dat je huidige print wilt stoppen?")) return; if (sendPrintCommands) printer.stop(); //setState(Printer.STOPPING_STATE,printer.hasControl); printer.overruleState(Printer.STOPPING_STATE); @@ -218,7 +218,7 @@ function print(e) { //setState(Printer.BUFFERING_STATE,printer.hasControl); printer.overruleState(Printer.BUFFERING_STATE); - btnStop.css("display","none"); + btnStop.css("display","none"); // hack // we put the gcode generation in a little delay // so that for example the print button is disabled right away From ff14078d466bcd039e8303310f5ed28241519c57 Mon Sep 17 00:00:00 2001 From: peteruithoven Date: Wed, 16 Oct 2013 22:25:15 +0200 Subject: [PATCH 4/4] Check gcode generation feasibility check to prevent iPad/iPhone crashes --- js/buttonbehaviors.js | 13 ++++++++----- js/gcodeGenerating.js | 33 ++++++++++++++++++--------------- js/main.js | 2 +- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/js/buttonbehaviors.js b/js/buttonbehaviors.js index 6bc6ef7..1a97e3b 100644 --- a/js/buttonbehaviors.js +++ b/js/buttonbehaviors.js @@ -212,7 +212,6 @@ function print(e) { //$(".btnPrint").css("display","none"); - if (_points.length > 2) { //setState(Printer.BUFFERING_STATE,printer.hasControl); @@ -224,11 +223,15 @@ function print(e) { // so that for example the print button is disabled right away clearTimeout(gcodeGenerateDelayer); gcodeGenerateDelayer = setTimeout(function() { + var gcode = generate_gcode(); - //startPrint(gencode); - - if (sendPrintCommands) { - printer.print(gcode); + if (sendPrintCommands) { + if(gcode.length > 0) { + printer.print(gcode); + } else { + printer.overruleState(Printer.IDLE_STATE); + printer.startStatusCheckInterval(); + } } else { console.log("sendPrintCommands is false: not sending print command to 3dprinter"); } diff --git a/js/gcodeGenerating.js b/js/gcodeGenerating.js index 6aee8ee..32908fc 100644 --- a/js/gcodeGenerating.js +++ b/js/gcodeGenerating.js @@ -25,8 +25,10 @@ gcodeEnd.push("G90"); // absolute positioning gcodeEnd.push("M117 Done "); // display message (20 characters to clear whole screen)*/ +var MAX_POINTS_TO_PRINT = 400000; //80000; //40000; var gcode = []; -function generate_gcode(callback) { + +function generate_gcode() { console.log("f:generategcode()"); var startGcode = []; @@ -124,7 +126,6 @@ function generate_gcode(callback) { // copy array without reference -> http://stackoverflow.com/questions/9885821/copying-of-an-array-of-objects-to-another-array-without-object-reference-in-java var points = JSON.parse(JSON.stringify(_points)); - console.log("f:generategcode() >> points.length: " + points.length); // console.log("f:generategcode() >> paths: " + paths.toString()); // console.log("paths.toString(): " + paths.toString()); @@ -153,6 +154,19 @@ function generate_gcode(callback) { console.log("f:generategcode() >> layers: " + layers); if (layers == Infinity) return; + // check feasibility of design + var pointsToPrint = points.length * layers*(objectHeight/maxObjectHeight) + //console.log(" points.length: ",points.length); + //console.log(" numLayers: ",(layers*(objectHeight/maxObjectHeight))); + //console.log(" pointsToPrint: ",pointsToPrint); + //console.log(" MAX_POINTS_TO_PRINT: ",MAX_POINTS_TO_PRINT); + + if(pointsToPrint > MAX_POINTS_TO_PRINT) { + alert("Sorry, your doodle to to complex and / or to high"); + console.log("WARNING: to many points to convert to gcode"); + return []; + } + for (var layer = 0; layer < layers; layer++) { var p = JSON.parse(JSON.stringify(points)); // [].concat(points); @@ -262,21 +276,10 @@ function generate_gcode(callback) { break; } } - // add gcode end commands gcode = gcode.concat(endGcode); - - // debug -// var _gc = gc.join("\n"); -// console.log("f:generategcode() >> _gc = " + _gc); - - // Return the gcode array, joined to one string with '\n' (line break) as the join parameter - // This should result in a nice long string with line breaks - if (callback == undefined) { - return gcode; - } else { - // post - } + + return gcode; } function scaleFunction(percent) { diff --git a/js/main.js b/js/main.js index 6420c12..af40ed3 100644 --- a/js/main.js +++ b/js/main.js @@ -108,4 +108,4 @@ function settingsLoaded() { function setDebugText(text) { $("#debug_display").text(text); -} +} \ No newline at end of file